Fix nodedef_gen and make texturing work maybe

master
sfan5 2017-02-12 19:41:46 +01:00
parent bd1e45fe26
commit 0dc15ea360
6 changed files with 129 additions and 438 deletions

1
.gitignore vendored
View File

@ -1,3 +1,4 @@
*~
*.bak
nodes.txt

View File

@ -1,46 +1,54 @@
local function nd_get_tiles(nd)
local tiles
if nd.tiles then
tiles = nd.tiles
elseif nd.tile_images then
tiles = nd.tile_images
end
--if type(tiles) == 'table' then
-- tiles = tiles.name
--end
if tiles == nil then
tiles = {}
local tiles = nd.tiles or nd.tile_images or {}
for k,v in ipairs(tiles) do
if type(v) == 'table' then
tiles[k] = v.name
end
end
return tiles
end
local function nd_get_drawtype(nd)
return nd.drawtype or "normal"
end
local drawtype_map = {
["normal"] = "cube",
["plantlike"] = "plant",
-- do these actually work?
["glasslike"] = "cube",
["allfaces"] = "cube",
["allfaces_optional"] = "cube",
}
minetest.register_chatcommand("dump", {
params = "",
description = "",
func = function(plname, param)
local n = 0
local out, err = io.open('nodes.pre.txt', 'wb')
minetest.mkdir("out")
local out, err = io.open('out/nodes.pre.txt', 'wb')
if not out then
return minetest.chat_send_player(plname, 'io.open: ' .. err)
end
for nn, nd in pairs(minetest.registered_nodes) do
if nd.drawtype == nil or nd.drawtype == "normal" then
local tiles = nd_get_tiles(nd)
local texprefix = nn:gsub(":", "__")
--[[
for i, t in ipairs(tiles) do
minetest.generateAndSaveTexture(t, texprefix .. i .. ".png")
end
--]]
if #tiles == 1 then
out:write(nn .. " cube - - - texture=" .. texprefix .. ".png " .. texprefix .. ".png\n")
minetest.generateAndSaveTexture(tiles[1], texprefix .. ".png")
n = n + 1
else
-- TODO
local tiles = nd_get_tiles(nd)
local mapped = drawtype_map[nd_get_drawtype(nd)]
if mapped ~= nil and #tiles > 0 then
local texfilename = nn:gsub(":", "__") .. ".png"
local usable_tex
if #tiles == 1 then -- TODO multiple tiles
usable_tex = texfilename
end
minetest.generateAndSaveTexture(tiles[1], "out/" .. texfilename)
usable_tex = usable_tex and ("texture=" .. usable_tex) or ":"
out:write(string.format("%s %s - - - %s %s\n", nn, mapped, usable_tex, texfilename))
n = n + 1
end
end
out:close()
minetest.chat_send_player(plname, n .. " nodes dumped.")
end,

81
nodedef_gen/minetest.diff Normal file
View File

@ -0,0 +1,81 @@
diff --git a/src/game.cpp b/src/game.cpp
index 1735737d..1f1d8826 100644
--- a/src/game.cpp
+++ b/src/game.cpp
@@ -1876,6 +1876,9 @@ void Game::shutdown()
****************************************************************************/
/****************************************************************************/
+IWritableTextureSource *g_tsrc;
+video::IVideoDriver *g_driver;
+
bool Game::init(
const std::string &map_dir,
std::string *address,
@@ -1883,8 +1886,10 @@ bool Game::init(
const SubgameSpec &gamespec)
{
showOverlayMessage(wgettext("Loading..."), 0, 0);
+ g_driver = driver;
texture_src = createTextureSource(device);
+ g_tsrc = texture_src;
shader_src = createShaderSource(device);
itemdef_manager = createItemDefManager();
diff --git a/src/script/lua_api/l_util.cpp b/src/script/lua_api/l_util.cpp
index c2679164..af3f145a 100644
--- a/src/script/lua_api/l_util.cpp
+++ b/src/script/lua_api/l_util.cpp
@@ -35,6 +35,7 @@ with this program; if not, write to the Free Software Foundation, Inc.,
#include "util/base64.h"
#include "config.h"
#include "version.h"
+#include "client/tile.h"
#include <algorithm>
@@ -486,6 +487,21 @@ int ModApiUtil::l_get_version(lua_State *L)
return 1;
}
+extern IWritableTextureSource *g_tsrc;
+extern irr::video::IVideoDriver *g_driver;
+
+// generateAndSaveTexture(texture_name, out_filename)
+int ModApiUtil::l_generateAndSaveTexture(lua_State *L)
+{
+ std::string texname = luaL_checkstring(L, 1);
+ std::string outfile = luaL_checkstring(L, 2);
+
+ irr::video::IImage *img = g_tsrc->generateImage(texname);
+ g_driver->writeImageToFile(img, outfile.c_str());
+
+ return 0;
+}
+
void ModApiUtil::Initialize(lua_State *L, int top)
{
@@ -524,6 +540,7 @@ void ModApiUtil::Initialize(lua_State *L, int top)
API_FCT(decode_base64);
API_FCT(get_version);
+ API_FCT(generateAndSaveTexture);
}
void ModApiUtil::InitializeAsync(AsyncEngine& engine)
diff --git a/src/script/lua_api/l_util.h b/src/script/lua_api/l_util.h
index 9910704b..8ac49848 100644
--- a/src/script/lua_api/l_util.h
+++ b/src/script/lua_api/l_util.h
@@ -107,6 +107,9 @@ class ModApiUtil : public ModApiBase {
// get_version()
static int l_get_version(lua_State *L);
+ // generateAndSaveTexture(texture_name, out_filename)
+ static int l_generateAndSaveTexture(lua_State *L);
+
public:
static void Initialize(lua_State *L, int top);

View File

@ -1,114 +0,0 @@
From e6e2c06760597fd712fe2cc7c56751bcb6a0036c Mon Sep 17 00:00:00 2001
From: sfan5 <sfan5@live.de>
Date: Fri, 3 Oct 2014 11:24:16 +0200
Subject: [PATCH] Add minetest.generateAndSaveTexture
---
src/game.cpp | 5 +++++
src/script/lua_api/l_util.cpp | 18 ++++++++++++++++++
src/script/lua_api/l_util.h | 3 +++
src/tile.h | 1 +
4 files changed, 27 insertions(+)
diff --git a/src/game.cpp b/src/game.cpp
index a8f6bc9..f4ef64f 100644
--- a/src/game.cpp
+++ b/src/game.cpp
@@ -1119,6 +1119,9 @@ static void updateChat(Client& client, f32 dtime, bool show_debug,
show_chat && recent_chat_count != 0 && !show_profiler);
}
+IWritableTextureSource *g_tsrc;
+video::IVideoDriver *g_driver;
+
/******************************************************************************/
void the_game(bool &kill, bool random_input, InputHandler *input,
IrrlichtDevice *device, gui::IGUIFont* font, std::string map_dir,
@@ -1130,6 +1133,7 @@ void the_game(bool &kill, bool random_input, InputHandler *input,
{
GUIFormSpecMenu* current_formspec = 0;
video::IVideoDriver* driver = device->getVideoDriver();
+ g_driver = driver;
scene::ISceneManager* smgr = device->getSceneManager();
// Calculate text height using the font
@@ -1147,6 +1151,7 @@ void the_game(bool &kill, bool random_input, InputHandler *input,
// Create texture source
IWritableTextureSource *tsrc = createTextureSource(device);
+ g_tsrc = tsrc;
// Create shader source
IWritableShaderSource *shsrc = createShaderSource(device);
diff --git a/src/script/lua_api/l_util.cpp b/src/script/lua_api/l_util.cpp
index eb6c183..91fe581 100644
--- a/src/script/lua_api/l_util.cpp
+++ b/src/script/lua_api/l_util.cpp
@@ -30,6 +30,7 @@ with this program; if not, write to the Free Software Foundation, Inc.,
#include "tool.h"
#include "filesys.h"
#include "settings.h"
+#include "tile.h"
#include "main.h" //required for g_settings, g_settings_path
// debug(...)
@@ -320,6 +321,21 @@ int ModApiUtil::l_decompress(lua_State *L)
return 1;
}
+extern IWritableTextureSource *g_tsrc;
+extern irr::video::IVideoDriver *g_driver;
+
+// generateAndSaveTexture(texture_name, out_filename)
+int ModApiUtil::l_generateAndSaveTexture(lua_State *L)
+{
+ std::string texname = luaL_checkstring(L, 1);
+ std::string outfile = luaL_checkstring(L, 2);
+
+ irr::video::IImage *img = g_tsrc->generateImage(texname);
+ g_driver->writeImageToFile(img, outfile.c_str());
+
+ return 0;
+}
+
void ModApiUtil::Initialize(lua_State *L, int top)
{
API_FCT(debug);
@@ -345,6 +361,8 @@ void ModApiUtil::Initialize(lua_State *L, int top)
API_FCT(compress);
API_FCT(decompress);
+
+ API_FCT(generateAndSaveTexture);
}
void ModApiUtil::InitializeAsync(AsyncEngine& engine)
diff --git a/src/script/lua_api/l_util.h b/src/script/lua_api/l_util.h
index e824323..d656171 100644
--- a/src/script/lua_api/l_util.h
+++ b/src/script/lua_api/l_util.h
@@ -87,6 +87,9 @@ class ModApiUtil : public ModApiBase {
// decompress(data, method, ...)
static int l_decompress(lua_State *L);
+ // generateAndSaveTexture(texture_name, out_filename)
+ static int l_generateAndSaveTexture(lua_State *L);
+
public:
static void Initialize(lua_State *L, int top);
diff --git a/src/tile.h b/src/tile.h
index 78aaef0..7bd0b60 100644
--- a/src/tile.h
+++ b/src/tile.h
@@ -123,6 +123,7 @@ class IWritableTextureSource : public ITextureSource
virtual bool isKnownSourceImage(const std::string &name)=0;
virtual video::ITexture* generateTextureFromMesh(
const TextureFromMeshParams &params)=0;
+ virtual video::IImage* generateImage(const std::string &name)=0;
virtual void processQueue()=0;
virtual void insertSourceImage(const std::string &name, video::IImage *img)=0;
--
2.1.2

View File

@ -1,28 +1,26 @@
#!/usr/bin/env python
#!/usr/bin/env python3
import sys
from PIL import Image
def avg2(a, b):
return int((a + b) / 2.0)
def avg2t3i0(a, b):
return tuple(avg2(t[0], t[1]) for t in zip(a[:3], b[:3]))
def mix(a, b):
return (
(a[0] + b[0]) / 2,
(a[1] + b[1]) / 2,
(a[2] + b[2]) / 2
)
def avgcolor(name):
inp = Image.open(name)
inp = inp.convert('RGBA')
inp = Image.open(name).convert('RGBA')
ind = inp.load()
avgc = -1
avgc = None
for x in range(inp.size[0]):
for y in range(inp.size[1]):
pxl = ind[x, y]
if pxl[3] < 128:
continue
if avgc == -1:
avgc = pxl[:3]
else:
avgc = avg2t3i0(avgc, pxl)
if avgc == -1:
pxl = pxl[:3]
avgc = pxl if avgc is None else mix(avgc, pxl)
if avgc is None:
return "0 0 0"
else:
return "%d %d %d" % avgc
@ -33,7 +31,7 @@ else:
fin = open(sys.argv[1], "r")
fout = open(sys.argv[2], "w")
for line in fin:
line = line[:-1] # cut off the \n
line = line.rstrip("\n")
# nodename modelname r g b params texture
# ^ ^ ^ ^^^^^^^
a = line.split(" ")

283
nodes.txt
View File

@ -1,283 +0,0 @@
beds:bed_top_red cube 131 22 22 :
beds:bed_bottom_blue cube 10 11 122 :
beds:bed_bottom_grey cube 147 147 147 :
beds:bed_bottom_white cube 215 215 215 :
beds:bed_bottom_green cube 12 92 10 :
beds:bed_bottom_orange cube 217 123 10 :
beds:bed_top_blue cube 11 12 122 :
beds:bed_bottom_violet cube 129 10 180 :
beds:bed_top_green cube 13 92 11 :
beds:bed_bottom_black cube 10 10 10 :
beds:bed_bottom_yellow cube 215 214 0 :
beds:bed_bottom_red cube 131 21 21 :
beds:bed_top_white cube 215 215 215 :
beds:bed_top_yellow cube 215 214 0 :
beds:bed_top_violet cube 129 11 180 :
beds:bed_top_grey cube 147 147 147 :
beds:bed_top_black cube 11 11 11 :
beds:bed_top_orange cube 216 123 11 :
nuke:hardcore_mese_tnt cube 173 173 0 :
nuke:iron_tnt cube 158 158 157 :
nuke:hardcore_iron_tnt cube 158 158 157 :
nuke:mese_tnt cube 173 173 0 :
christmas:present_green_violet cube 189 36 157 :
christmas:present_blue_green cube 62 186 50 :
christmas:present_orange_green cube 62 186 50 :
christmas:tree cube 45 36 24 :
christmas:present_orange_violet cube 189 36 157 :
christmas:present_blue_orange cube 245 207 20 :
christmas:present_blue_violet cube 189 36 157 :
christmas:star cube 236 252 55 :
christmas:present_green_orange cube 245 207 20 :
christmas:leaves cube 33 54 30 :
snow:moss cube 51 64 29 :
snow:snow5 cube 225 227 255 :
snow:snow3 cube 225 227 255 :
snow:needles_decorated cube 7 50 19 :
snow:needles cube 6 49 18 :
snow:snow8 cube 225 227 255 :
snow:star cube 214 142 0 :
snow:snow cube 225 227 255 :
snow:xmas_tree cube 87 88 28 :
snow:sapling_pine cube 3 54 20 :
snow:snow6 cube 225 227 255 :
snow:snow_block cube 225 227 255 :
snow:snow7 cube 225 227 255 :
snow:snow_brick cube 223 225 253 :
snow:dirt_with_snow cube 225 227 255 :
snow:snow4 cube 225 227 255 :
snow:snow2 cube 225 227 255 :
snow:ice cube 155 155 254 :
stairs:stair_wood_tile_full cube 78 64 44 :
stairs:stair_mossycobble cube 102 116 85 :
stairs:slab_jungle_wood cube 51 35 12 :
stairs:slab_wood_tile_center cube 128 100 57 :
stairs:stair_wood_tile cube 78 65 44 :
stairs:stair_cobble cube 133 133 133 :
stairs:slab_invisible cube 0 0 0 :
stairs:stair_stonebrick cube 104 100 99 :
stairs:slab_iron_glass cube 222 222 222 :
stairs:stair_wood cube 128 100 57 :
stairs:stair_stone cube 91 88 87 :
stairs:stair_obsidian cube 16 16 16 :
stairs:stair_copperblock cube 110 86 60 :
stairs:stair_super_glow_glass cube 255 255 120 :
stairs:slab_iron_stone cube 134 134 134 :
stairs:stair_stone_tile cube 97 97 97 :
stairs:stair_desert_stone cube 122 74 57 :
stairs:slab_bronzeblock cube 116 70 26 :
stairs:stair_goldblock cube 126 116 35 :
stairs:stair_iron_checker cube 142 142 142 :
stairs:stair_steelblock cube 153 153 153 :
stairs:slab_coal_stone cube 70 70 70 :
stairs:slab_obsidian_glass cube 16 17 17 :
stairs:stair_sandstone cube 180 162 121 :
stairs:stair_iron_stone cube 134 134 134 :
stairs:slab_steelblock cube 153 153 153 :
stairs:stair_split_stone_tile cube 97 97 97 :
stairs:stair_brick cube 156 157 151 :
stairs:stair_sandstonebrick cube 160 144 108 :
stairs:slab_mossycobble cube 102 116 85 :
stairs:stair_glass cube 192 192 227 :
stairs:slab_cactus_checker cube 130 138 130 :
stairs:slab_jungletree cube 120 106 78 :
stairs:stair_coal_stone cube 70 70 70 :
stairs:slab_junglewood cube 51 35 12 :
stairs:stair_jungletree cube 120 106 78 :
stairs:slab_wood cube 128 100 57 :
stairs:stair_iron_stone_bricks cube 104 98 97 :
stairs:stair_coal_checker cube 133 133 133 :
stairs:stair_plankstone cube 66 51 23 :
stairs:stair_obsidian_glass cube 16 17 17 :
stairs:slab_desert_stone cube 122 74 57 :
stairs:slab_iron_stone_bricks cube 104 98 97 :
stairs:slab_glass cube 192 192 227 :
stairs:stair_bronzeblock cube 116 70 26 :
stairs:slab_desert_stonebrick cube 105 64 49 :
stairs:slab_tree cube 66 52 35 :
stairs:slab_stone cube 91 88 87 :
stairs:stair_cactus_checker cube 130 138 130 :
stairs:slab_diamondblock cube 103 195 201 :
stairs:slab_super_glow_glass cube 255 255 120 :
stairs:slab_cobble cube 133 133 133 :
stairs:stair_tree cube 66 52 35 :
stairs:slab_wood_tile cube 78 65 44 :
stairs:slab_glow_glass cube 255 226 114 :
stairs:slab_wood_tile_full cube 78 64 44 :
stairs:stair_coal_stone_bricks cube 79 76 75 :
stairs:slab_coal_glass cube 130 130 130 :
stairs:stair_coal_glass cube 130 130 130 :
stairs:slab_brick cube 156 157 151 :
stairs:slab_stone_tile cube 97 97 97 :
stairs:slab_goldblock cube 126 116 35 :
stairs:slab_plankstone cube 66 51 23 :
stairs:slab_coal_stone_bricks cube 79 76 75 :
stairs:stair_jungle_wood cube 51 35 12 :
stairs:stair_circle_stone_bricks cube 91 88 87 :
stairs:slab_iron_checker cube 142 142 142 :
stairs:stair_wood_tile_center cube 128 100 57 :
stairs:slab_stonebrick cube 104 100 99 :
stairs:slab_sandstonebrick cube 160 144 108 :
stairs:stair_invisible cube 0 0 0 :
stairs:stair_iron_glass cube 222 222 222 :
stairs:stair_desert_stonebrick cube 105 64 49 :
stairs:stair_diamondblock cube 103 195 201 :
stairs:slab_sandstone cube 180 162 121 :
stairs:slab_copperblock cube 110 86 60 :
stairs:stair_glow_glass cube 255 226 114 :
stairs:stair_junglewood cube 51 35 12 :
stairs:slab_circle_stone_bricks cube 91 88 87 :
stairs:slab_obsidian cube 16 16 16 :
stairs:slab_coal_checker cube 133 133 133 :
stairs:slab_split_stone_tile cube 97 97 97 :
mg:savannawood cube 128 113 57 :
mg:pineleaves cube 16 30 14 :
mg:savannasapling cube 32 36 13 :
mg:pinewood cube 120 93 66 :
mg:pinetree cube 26 21 14 :
mg:savannaleaves cube 70 62 41 :
mg:pinesapling cube 12 12 5 :
mg:savannatree cube 52 51 37 :
mg:dirt_with_dry_grass cube 114 99 53 :
bones:bones cube 74 74 74 :
default:glass cube 192 192 227 : 64
default:water_flowing cube 39 66 106 : 128
default:junglesapling cube 37 34 14 :
default:sandstonebrick cube 160 144 108 :
default:furnace_active cube 97 93 91 :
default:sign_wall cube 163 141 106 :
default:lava_source cube 255 100 0 :
default:goldblock cube 126 116 35 :
default:obsidian_glass cube 16 17 17 : 64
default:stone_with_copper cube 91 88 87 :
default:grass_1 plant 72 109 32 :
default:papyrus cube 98 173 32 :
default:ice cube 155 155 254 :
default:wood cube 128 100 57 :
default:stone_with_mese cube 91 88 87 :
default:diamondblock cube 103 195 201 :
default:coalblock cube 58 58 58 :
default:stone_with_gold cube 91 88 87 :
default:apple cube 50 0 0 :
default:grass_4 plant 73 112 33 :
default:dirt_with_grass_footsteps cube 101 138 35 :
default:desert_stonebrick cube 105 64 49 :
default:cloud cube 255 255 255 :
default:stone_with_iron cube 91 88 87 :
default:bronzeblock cube 116 70 26 :
default:dirt_with_snow cube 225 227 255 :
default:fence_wood cube 128 100 57 :
default:desert_sand cube 209 165 97 :
default:steelblock cube 153 153 153 :
default:rail cube 114 82 33 :
default:nyancat_rainbow cube 58 19 128 :
default:lava_flowing cube 255 100 0 :
default:sapling cube 63 59 40 :
default:snow cube 225 227 255 :
default:furnace cube 97 93 91 :
default:desert_stone cube 122 74 57 :
default:tree cube 66 52 35 :
default:jungletree cube 120 106 78 :
default:cactus cube 132 143 108 :
default:water_source cube 39 66 106 : 128
default:mese cube 200 202 0 :
default:stone_with_coal cube 91 88 87 :
default:nyancat cube 38 16 66 :
default:snowblock cube 225 227 255 :
default:stonebrick cube 104 100 99 :
default:jungleleaves cube 18 25 14 :
default:sandstone cube 180 162 121 :
default:dirt_with_grass cube 72 107 44 :
default:brick cube 156 157 151 :
default:junglegrass cube 82 133 35 :
default:cobble cube 133 133 133 :
default:grass_3 plant 71 109 32 :
default:stone cube 91 88 87 :
default:sand cube 219 209 167 :
default:obsidian cube 16 16 16 :
default:bookshelf cube 128 100 57 :
default:leaves cube 30 47 28 :
default:grass_5 plant 73 112 33 :
default:ladder cube 153 109 39 :
default:dirt cube 122 83 58 :
default:mossycobble cube 102 116 85 :
default:stone_with_diamond cube 91 88 87 :
default:grass_2 plant 71 109 32 :
default:chest cube 238 219 171 :
default:gravel cube 92 84 76 :
default:torch cube 213 154 84 :
default:clay cube 178 178 178 :
default:chest_locked cube 238 219 171 :
default:copperblock cube 110 86 60 :
default:dry_shrub cube 117 75 14 :
default:junglewood cube 51 35 12 :
signs:sign_yard cube 163 141 106 :
signs:sign_post cube 4 2 0 :
junglegrass:shortest cube 55 92 21 :
junglegrass:short cube 49 89 15 :
junglegrass:medium cube 83 135 36 :
doors:door_wood_t_2 cube 87 64 30 :
doors:door_wood_b_1 cube 87 64 30 :
doors:door_wood_t_1 cube 87 64 30 :
doors:door_steel_t_1 cube 162 162 162 :
doors:door_steel_t_2 cube 162 162 162 :
doors:door_steel_b_1 cube 162 162 162 :
doors:door_wood_b_2 cube 87 64 30 :
doors:door_steel_b_2 cube 162 162 162 :
poisonivy:climbing cube 91 143 24 :
poisonivy:sproutling cube 111 166 30 :
poisonivy:seedling cube 127 190 34 :
wool:magenta cube 210 3 121 texture=wool_magenta.png
wool:blue cube 0 78 152 texture=wool_blue.png
wool:cyan cube 0 142 150 :
wool:orange cube 220 91 24 texture=wool_orange.png
wool:grey cube 141 141 141 :
wool:dark_grey cube 65 65 65 :
wool:pink cube 255 144 144 :
wool:white cube 228 228 228 :
wool:violet cube 96 2 177 :
wool:black cube 33 33 33 :
wool:green cube 99 230 28 :
wool:brown cube 95 49 0 :
wool:yellow cube 253 237 16 texture=wool_yellow.png
wool:dark_green cube 36 109 0 :
wool:red cube 180 20 20 :
fire:basic_flame cube 147 47 11 :
vessels:glass_bottle cube 211 212 211 :
vessels:steel_bottle cube 109 109 109 :
vessels:drinking_glass cube 220 220 220 :
flowers:rose cube 159 9 0 :
flowers:potted_tulip cube 114 41 22 :
flowers:viola cube 108 83 106 :
flowers:tulip cube 91 146 5 :
flowers:geranium cube 54 72 184 :
flowers:potted_dandelion_yellow cube 116 43 22 :
flowers:waterlily cube 46 108 0 :
flowers:waterlily_225 cube 49 110 2 :
flowers:dandelion_yellow cube 147 178 3 :
flowers:potted_geranium cube 76 60 124 :
flowers:dandelion_white cube 136 179 95 :
flowers:potted_rose cube 115 40 22 :
flowers:waterlily_675 cube 165 194 103 :
flowers:waterlily_45 cube 150 179 101 :
flowers:potted_dandelion_white cube 116 43 25 :
flowers:seaweed cube 28 112 11 :
flowers:potted_viola cube 115 41 24 :
farming:wheat_6 cube 165 151 74 :
farming:cotton_4 cube 58 46 27 :
farming:cotton_7 cube 194 189 185 :
farming:soil_wet cube 73 40 19 :
farming:cotton_3 cube 57 48 27 :
farming:wheat_1 cube 130 186 84 :
farming:wheat_7 cube 178 159 81 :
farming:cotton_5 cube 65 49 31 :
farming:soil cube 110 75 53 :
farming:wheat_8 cube 177 160 81 :
farming:wheat_2 cube 142 190 86 :
farming:wheat_4 cube 168 186 83 :
farming:wheat_5 cube 177 166 79 :
farming:wheat_3 cube 148 185 83 :
farming:cotton_1 cube 66 61 31 :
farming:cotton_2 cube 59 51 28 :
farming:cotton_6 cube 75 60 44 :
farming:cotton_8 cube 228 226 225 :