From 547e44d1b510b21d32afb49d7fb7d0d8b5937151 Mon Sep 17 00:00:00 2001
From: Vanessa Dannenberg <vanessa.e.dannenberg@gmail.com>
Date: Fri, 26 Mar 2021 23:43:35 -0400
Subject: [PATCH] update homedecor and unified dyes

---
 build-date                                    |    2 +-
 mods/homedecor_common/nodeboxes.lua           |    7 +-
 mods/homedecor_furniture/init.lua             |  254 ---
 mods/homedecor_furniture_medieval/init.lua    |   18 +
 mods/homedecor_kitchen/init.lua               |  274 ++-
 .../models/homedecor_kitchen_cabinet.obj      |   50 +
 .../models/homedecor_kitchen_cabinet_half.obj |   52 +
 .../models/homedecor_kitchen_sink.obj         |  265 ++-
 .../homedecor_kitchen_cabinet_bevel.png       |  Bin 87 -> 112 bytes
 ...omedecor_kitchen_cabinet_colored_front.png |  Bin 0 -> 244 bytes
 ...cor_kitchen_cabinet_colored_front_half.png |  Bin 0 -> 190 bytes
 ...hen_cabinet_colored_front_with_drawers.png |  Bin 0 -> 254 bytes
 .../homedecor_kitchen_cabinet_front.png       |  Bin 315 -> 532 bytes
 .../homedecor_kitchen_cabinet_front_half.png  |  Bin 265 -> 381 bytes
 ...cor_kitchen_cabinet_front_with_drawers.png |  Bin 0 -> 561 bytes
 .../homedecor_kitchen_cabinet_half_bevel.png  |  Bin 0 -> 109 bytes
 .../textures/homedecor_kitchen_sink_top.png   |  Bin 358 -> 286 bytes
 mods/homedecor_lighting/init.lua              |    8 +
 mods/homedecor_tables/misc.lua                |  357 ++--
 mods/homedecor_tables/mod.conf                |    1 +
 .../models/homedecor_table_large_square.obj   |  107 +
 .../models/homedecor_table_small_round.obj    | 1754 ++++++++++++++---
 .../models/homedecor_table_small_square.obj   |  180 +-
 .../textures/homedecor_glass_face_clean.png   |  Bin 74 -> 0 bytes
 ...es.png => homedecor_glass_table_edges.png} |  Bin
 .../homedecor_glass_table_large_inv.png       |  Bin 2457 -> 0 bytes
 .../homedecor_glass_table_large_square.png    |  Bin 0 -> 604 bytes
 ...homedecor_glass_table_large_square_inv.png |  Bin 0 -> 315 bytes
 .../homedecor_glass_table_large_tb.png        |  Bin 146 -> 0 bytes
 .../homedecor_glass_table_small_round.png     |  Bin 241 -> 597 bytes
 .../homedecor_glass_table_small_round_inv.png |  Bin 3865 -> 713 bytes
 .../homedecor_glass_table_small_square.png    |  Bin 358 -> 642 bytes
 ...homedecor_glass_table_small_square_inv.png |  Bin 3938 -> 334 bytes
 .../textures/homedecor_table_legs_brass.png   |  Bin 331 -> 476 bytes
 .../textures/homedecor_table_legs_wood.png    |  Bin 0 -> 357 bytes
 .../homedecor_table_legs_wrought_iron.png     |  Bin 325 -> 439 bytes
 .../homedecor_utility_table_edges.png         |  Bin 465 -> 0 bytes
 .../textures/homedecor_utility_table_legs.png |  Bin 338 -> 0 bytes
 .../homedecor_utility_table_legs_inv.png      |  Bin 4371 -> 0 bytes
 .../textures/homedecor_utility_table_tb.png   |  Bin 576 -> 0 bytes
 .../textures/homedecor_wood_table_edges.png   |  Bin 0 -> 204 bytes
 .../homedecor_wood_table_large_edges.png      |  Bin 465 -> 0 bytes
 .../homedecor_wood_table_large_inv.png        |  Bin 4095 -> 0 bytes
 .../homedecor_wood_table_large_square.png     |  Bin 0 -> 1217 bytes
 .../homedecor_wood_table_large_square_inv.png |  Bin 0 -> 652 bytes
 .../homedecor_wood_table_large_tb.png         |  Bin 529 -> 0 bytes
 .../homedecor_wood_table_small_round.png      |  Bin 573 -> 2294 bytes
 .../homedecor_wood_table_small_round_inv.png  |  Bin 5201 -> 2007 bytes
 .../homedecor_wood_table_small_square.png     |  Bin 982 -> 1467 bytes
 .../homedecor_wood_table_small_square_inv.png |  Bin 4200 -> 901 bytes
 mods/unifieddyes/airbrush.lua                 |  498 +++++
 mods/unifieddyes/aliases.lua                  |   23 +
 mods/unifieddyes/api.lua                      |  494 +++++
 mods/unifieddyes/color-tables.lua             |  237 +++
 mods/unifieddyes/dyes-crafting.lua            |  309 +++
 mods/unifieddyes/init.lua                     | 1568 +--------------
 56 files changed, 4016 insertions(+), 2442 deletions(-)
 create mode 100644 mods/homedecor_kitchen/models/homedecor_kitchen_cabinet.obj
 create mode 100644 mods/homedecor_kitchen/models/homedecor_kitchen_cabinet_half.obj
 create mode 100644 mods/homedecor_kitchen/textures/homedecor_kitchen_cabinet_colored_front.png
 create mode 100644 mods/homedecor_kitchen/textures/homedecor_kitchen_cabinet_colored_front_half.png
 create mode 100644 mods/homedecor_kitchen/textures/homedecor_kitchen_cabinet_colored_front_with_drawers.png
 create mode 100644 mods/homedecor_kitchen/textures/homedecor_kitchen_cabinet_front_with_drawers.png
 create mode 100644 mods/homedecor_kitchen/textures/homedecor_kitchen_cabinet_half_bevel.png
 create mode 100644 mods/homedecor_tables/models/homedecor_table_large_square.obj
 delete mode 100644 mods/homedecor_tables/textures/homedecor_glass_face_clean.png
 rename mods/homedecor_tables/textures/{homedecor_glass_table_large_edges.png => homedecor_glass_table_edges.png} (100%)
 delete mode 100644 mods/homedecor_tables/textures/homedecor_glass_table_large_inv.png
 create mode 100644 mods/homedecor_tables/textures/homedecor_glass_table_large_square.png
 create mode 100644 mods/homedecor_tables/textures/homedecor_glass_table_large_square_inv.png
 delete mode 100644 mods/homedecor_tables/textures/homedecor_glass_table_large_tb.png
 create mode 100644 mods/homedecor_tables/textures/homedecor_table_legs_wood.png
 delete mode 100644 mods/homedecor_tables/textures/homedecor_utility_table_edges.png
 delete mode 100644 mods/homedecor_tables/textures/homedecor_utility_table_legs.png
 delete mode 100644 mods/homedecor_tables/textures/homedecor_utility_table_legs_inv.png
 delete mode 100644 mods/homedecor_tables/textures/homedecor_utility_table_tb.png
 create mode 100644 mods/homedecor_tables/textures/homedecor_wood_table_edges.png
 delete mode 100644 mods/homedecor_tables/textures/homedecor_wood_table_large_edges.png
 delete mode 100644 mods/homedecor_tables/textures/homedecor_wood_table_large_inv.png
 create mode 100644 mods/homedecor_tables/textures/homedecor_wood_table_large_square.png
 create mode 100644 mods/homedecor_tables/textures/homedecor_wood_table_large_square_inv.png
 delete mode 100644 mods/homedecor_tables/textures/homedecor_wood_table_large_tb.png
 create mode 100644 mods/unifieddyes/airbrush.lua
 create mode 100644 mods/unifieddyes/aliases.lua
 create mode 100644 mods/unifieddyes/api.lua
 create mode 100644 mods/unifieddyes/color-tables.lua
 create mode 100644 mods/unifieddyes/dyes-crafting.lua

diff --git a/build-date b/build-date
index b412a4f0..c5ec98b1 100644
--- a/build-date
+++ b/build-date
@@ -1 +1 @@
-20210325-1929
+20210326-2343
diff --git a/mods/homedecor_common/nodeboxes.lua b/mods/homedecor_common/nodeboxes.lua
index 0fafe1ab..6960072b 100644
--- a/mods/homedecor_common/nodeboxes.lua
+++ b/mods/homedecor_common/nodeboxes.lua
@@ -9,16 +9,17 @@ homedecor.box = {
 	-- bottom slab (starting from -y) with height optionally shifted upwards
 	slab_y = function(height, shift) return { -0.5, -0.5+(shift or 0), -0.5, 0.5, -0.5+height+(shift or 0), 0.5 } end,
 	-- slab starting from -z (+z with negative depth)
-	slab_z = function(depth)
+	slab_z = function(depth, shift)
 		-- for consistency with the other functions here, we have to assume that a "z" slab starts from -z and extends by depth,
 		-- but since conventionally a lot of nodes place slabs against +z for player convenience, we define
 		-- a "negative" depth as a depth extending from the other side, i.e. +z
+		local s = shift or 0
 		if depth > 0 then
 			-- slab starting from -z
-			return { -0.5, -0.5, -0.5, 0.5, 0.5, -0.5+depth }
+			return { -0.5, -0.5, -0.5+s, 0.5, 0.5, -0.5+depth+s }
 		else
 			-- slab starting from +z (z1=0.5-(-depth))
-			return { -0.5, -0.5, 0.5+depth, 0.5, 0.5, 0.5 }
+			return { -0.5, -0.5, 0.5+depth+s, 0.5, 0.5, 0.5+s }
 		end
 	end,
 	bar_y = function(radius) return {-radius, -0.5, -radius, radius, 0.5, radius} end,
diff --git a/mods/homedecor_furniture/init.lua b/mods/homedecor_furniture/init.lua
index 5c317ddb..bcb9dea4 100644
--- a/mods/homedecor_furniture/init.lua
+++ b/mods/homedecor_furniture/init.lua
@@ -1,38 +1,5 @@
 local S = minetest.get_translator("homedecor_furniture")
 
-local table_colors = {
-	{ "",           S("Table"),           homedecor.plain_wood },
-	{ "_mahogany",  S("Mahogany Table"),  homedecor.mahogany_wood },
-	{ "_white",     S("White Table"),     homedecor.white_wood }
-}
-
-for _, t in ipairs(table_colors) do
-	local suffix, desc, texture = unpack(t)
-
-	homedecor.register("table"..suffix, {
-		description = desc,
-		tiles = { texture },
-		node_box = {
-			type = "fixed",
-			fixed = {
-				{ -0.4, -0.5, -0.4, -0.3,  0.4, -0.3 },
-				{  0.3, -0.5, -0.4,  0.4,  0.4, -0.3 },
-				{ -0.4, -0.5,  0.3, -0.3,  0.4,  0.4 },
-				{  0.3, -0.5,  0.3,  0.4,  0.4,  0.4 },
-				{ -0.5,  0.4, -0.5,  0.5,  0.5,  0.5 },
-				{ -0.4, -0.2, -0.3, -0.3, -0.1,  0.3 },
-				{  0.3, -0.2, -0.4,  0.4, -0.1,  0.3 },
-				{ -0.3, -0.2, -0.4,  0.4, -0.1, -0.3 },
-				{ -0.3, -0.2,  0.3,  0.3, -0.1,  0.4 },
-			},
-		},
-		groups = {snappy=2,choppy=2,oddly_breakable_by_hand=2},
-		sounds = default.node_sound_wood_defaults(),
-	})
-end
-
-
-
 local ob_cbox = {
 	type = "fixed",
 	fixed = { -0.5, -0.5, 0, 0.5, 0.5, 0.5 }
@@ -69,224 +36,3 @@ homedecor.register("wall_shelf", {
 		}
 	}
 })
-
--- Crafts
-
-
-minetest.register_craft({
-	output = "homedecor:table",
-	recipe = {
-		{ "group:wood","group:wood", "group:wood" },
-		{ "group:stick", "", "group:stick" },
-	},
-})
-
-minetest.register_craft({
-	type = "shapeless",
-	output = "homedecor:table_mahogany",
-	recipe = {
-		"homedecor:table",
-		"dye:brown",
-	},
-})
-
-minetest.register_craft({
-	type = "shapeless",
-	output = "homedecor:table_mahogany",
-	recipe = {
-		"homedecor:table",
-		"unifieddyes:dark_orange",
-	},
-})
-
-minetest.register_craft({
-	type = "shapeless",
-	output = "homedecor:table_white",
-	recipe = {
-		"homedecor:table",
-		"dye:white",
-	},
-})
-
-minetest.register_craft({
-	type = "fuel",
-	recipe = "homedecor:table",
-	burntime = 30,
-})
-
-minetest.register_craft({
-	type = "fuel",
-	recipe = "homedecor:table_mahogany",
-	burntime = 30,
-})
-
-minetest.register_craft({
-	type = "fuel",
-	recipe = "homedecor:table_white",
-	burntime = 30,
-})
-
-minetest.register_craft({
-	output = "homedecor:standing_lamp_off",
-	recipe = {
-		{"homedecor:table_lamp_off"},
-		{"group:stick"},
-		{"group:stick"},
-	},
-})
-
-unifieddyes.register_color_craft({
-	output = "homedecor:standing_lamp_off",
-	palette = "extended",
-	type = "shapeless",
-	neutral_node = "homedecor:standing_lamp_off",
-	recipe = {
-		"NEUTRAL_NODE",
-		"MAIN_DYE"
-	}
-})
-
-minetest.register_craft({
-	type = "fuel",
-	recipe = "homedecor:table_lamp_off",
-	burntime = 10,
-})
-
-minetest.register_craft({
-	output = "homedecor:table_lamp_off",
-	recipe = {
-		{ "wool:white", "default:torch", "wool:white"},
-		{ "", "group:stick", ""},
-		{ "", "stairs:slab_wood", "" },
-	},
-})
-
-minetest.register_craft({
-	output = "homedecor:table_lamp_off",
-	recipe = {
-		{ "cottages:wool", "default:torch", "cottages:wool"},
-		{ "", "group:stick", ""},
-		{ "", "stairs:slab_wood", "" },
-	},
-})
-
-minetest.register_craft({
-	output = "homedecor:table_lamp_off",
-	recipe = {
-		{ "wool:white", "default:torch", "wool:white"},
-		{ "", "group:stick", ""},
-		{ "", "moreblocks:slab_wood", "" },
-	},
-})
-
-minetest.register_craft({
-	output = "homedecor:table_lamp_off",
-	recipe = {
-		{ "cottages:wool", "default:torch", "cottages:wool"},
-		{ "", "group:stick", ""},
-		{ "", "moreblocks:slab_wood", "" },
-	},
-})
-
-unifieddyes.register_color_craft({
-	output = "homedecor:table_lamp_off",
-	palette = "extended",
-	type = "shapeless",
-	neutral_node = "homedecor:table_lamp_off",
-	recipe = {
-		"NEUTRAL_NODE",
-		"MAIN_DYE"
-	}
-})
-
-minetest.register_craft({
-	output = "homedecor:toilet",
-	recipe = {
-		{ "","","bucket:bucket_water"},
-		{ "group:marble","group:marble", "group:marble" },
-		{ "", "bucket:bucket_empty", "" },
-	},
-})
-
-minetest.register_craft({
-	output = "homedecor:sink",
-	recipe = {
-		{ "group:marble","bucket:bucket_empty", "group:marble" },
-		{ "", "group:marble", "" }
-	},
-})
-
-minetest.register_craft({
-	output = "homedecor:taps",
-	recipe = {
-		{ "default:steel_ingot","bucket:bucket_water", "default:steel_ingot" },
-	},
-})
-
-minetest.register_craft({
-	output = "homedecor:taps_brass",
-	recipe = {
-		{ "technic:brass_ingot","bucket:bucket_water", "technic:brass_ingot" },
-	},
-})
-
-minetest.register_craft({
-	output = "homedecor:shower_tray",
-	recipe = {
-		{ "group:marble","bucket:bucket_empty", "group:marble" },
-	},
-})
-
-minetest.register_craft({
-	output = "homedecor:shower_head",
-	recipe = {
-		{"default:steel_ingot", "bucket:bucket_water"},
-	},
-})
-
-minetest.register_craft({
-	output = "homedecor:bathtub_clawfoot_brass_taps",
-	recipe = {
-		{ "homedecor:taps_brass", "", "" },
-		{ "group:marble", "", "group:marble" },
-		{"default:steel_ingot", "group:marble", "default:steel_ingot"},
-	},
-})
-
-minetest.register_craft({
-	output = "homedecor:bathtub_clawfoot_chrome_taps",
-	recipe = {
-		{ "homedecor:taps", "", "" },
-		{ "group:marble", "", "group:marble" },
-		{"default:steel_ingot", "group:marble", "default:steel_ingot"},
-	},
-})
-
-minetest.register_craft({
-	output = "homedecor:bars 6",
-	recipe = {
-		{ "default:steel_ingot","default:steel_ingot","default:steel_ingot" },
-		{ "homedecor:pole_wrought_iron","homedecor:pole_wrought_iron","homedecor:pole_wrought_iron" },
-	},
-})
-
-minetest.register_craft({
-	output = "homedecor:L_binding_bars 3",
-	recipe = {
-		{ "homedecor:bars","" },
-		{ "homedecor:bars","homedecor:bars" },
-	},
-})
-
-minetest.register_craft({
-	output = "homedecor:torch_wall 10",
-	recipe = {
-		{ "default:coal_lump" },
-		{ "default:steel_ingot" },
-	},
-})
-
--- Aliases for 3dforniture mod.
-
-minetest.register_alias("3dforniture:table", "homedecor:table")
-minetest.register_alias('table', 'homedecor:table')
diff --git a/mods/homedecor_furniture_medieval/init.lua b/mods/homedecor_furniture_medieval/init.lua
index efb331f0..7db474ac 100644
--- a/mods/homedecor_furniture_medieval/init.lua
+++ b/mods/homedecor_furniture_medieval/init.lua
@@ -57,6 +57,24 @@ homedecor.register("chains", {
 	sounds = default.node_sound_stone_defaults(),
 })
 
+-- Crafts
+
+minetest.register_craft({
+	output = "homedecor:bars 6",
+	recipe = {
+		{ "default:steel_ingot","default:steel_ingot","default:steel_ingot" },
+		{ "homedecor:pole_wrought_iron","homedecor:pole_wrought_iron","homedecor:pole_wrought_iron" },
+	},
+})
+
+minetest.register_craft({
+	output = "homedecor:L_binding_bars 3",
+	recipe = {
+		{ "homedecor:bars","" },
+		{ "homedecor:bars","homedecor:bars" },
+	},
+})
+
 minetest.register_alias("3dforniture:bars", "homedecor:bars")
 minetest.register_alias("3dforniture:L_binding_bars", "homedecor:L_binding_bars")
 minetest.register_alias("3dforniture:chains", "homedecor:chains")
diff --git a/mods/homedecor_kitchen/init.lua b/mods/homedecor_kitchen/init.lua
index 7197b8a6..d4d7303c 100644
--- a/mods/homedecor_kitchen/init.lua
+++ b/mods/homedecor_kitchen/init.lua
@@ -137,13 +137,20 @@ homedecor.register("dishwasher_"..m, {
 end
 
 local cabinet_sides = "(default_wood.png^[transformR90)^homedecor_kitchen_cabinet_bevel.png"
-local cabinet_bottom = "(default_wood.png^[colorize:#000000:100)"
-	.."^(homedecor_kitchen_cabinet_bevel.png^[colorize:#46321580)"
+local cabinet_sides_colored = "(homedecor_generic_wood_plain.png^[transformR90)^homedecor_kitchen_cabinet_bevel.png"
+
+local ic_cabinet_sides = string.gsub(cabinet_sides, "%^", "&")
+local ic_cabinet_sides_colored = string.gsub(cabinet_sides_colored, "%^", "&")
+
+local cabinet_bottom = "(default_wood.png^[colorize:#000000:100)^homedecor_kitchen_cabinet_bevel.png"
+local cabinet_bottom_colored = "homedecor_generic_wood_plain.png^homedecor_kitchen_cabinet_bevel.png"
 
 local function N_(x) return x end
 
 local counter_materials = { "", N_("granite"), N_("marble"), N_("steel") }
 
+homedecor.kitchen_convert_nodes = {}
+
 for _, mat in ipairs(counter_materials) do
 
 	local desc = S("Kitchen Cabinet")
@@ -151,29 +158,138 @@ for _, mat in ipairs(counter_materials) do
 
 	if mat ~= "" then
 		desc = S("Kitchen Cabinet (@1 top)", S(mat))
+		desc2 = S("Kitchen Cabinet with drawers (@1 top)", S(mat))
 		material = "_"..mat
 	end
 
-	homedecor.register("kitchen_cabinet"..material, {
+	homedecor.register("kitchen_cabinet_colorable"..material, {
 		description = desc,
-		tiles = { 'homedecor_kitchen_cabinet_top'..material..'.png',
-				cabinet_bottom,
-				cabinet_sides,
-				cabinet_sides,
-				cabinet_sides,
-				'homedecor_kitchen_cabinet_front.png'},
-		groups = { snappy = 3 },
+		tiles = {
+			'homedecor_kitchen_cabinet_top'..material..'.png',
+			cabinet_bottom,
+			cabinet_sides,
+			cabinet_sides,
+			cabinet_sides,
+			'homedecor_kitchen_cabinet_front.png^homedecor_kitchen_cabinet_bevel.png'
+		},
+		inventory_image = "[inventorycube"
+			.."{homedecor_kitchen_cabinet_top"..material..".png"
+			.."{homedecor_kitchen_cabinet_front.png"
+			.."{"..ic_cabinet_sides,
+		mesh = "homedecor_kitchen_cabinet.obj",
+		paramtype2 = "wallmounted",
+		palette = "unifieddyes_palette_colorwallmounted.png",
+		airbrush_replacement_node = "homedecor:kitchen_cabinet_colored"..material,
+		place_param2 = 0,
+		groups = { snappy = 3, ud_param2_colorable = 1},
 		sounds = default.node_sound_wood_defaults(),
 		infotext=S("Kitchen Cabinet"),
 		inventory = {
 			size=24,
 			lockable=true,
 		},
+		after_place_node = function(pos, placer, itemstack, pointed_thing)
+			unifieddyes.fix_rotation_nsew(pos, placer, itemstack, pointed_thing)
+		end
 	})
+
+	homedecor.register("kitchen_cabinet_colored"..material, {
+		description = desc,
+		tiles = {
+			{name = 'homedecor_kitchen_cabinet_top'..material..'.png', color = 0xFFFFFFFF},
+			{name = cabinet_bottom, color = 0xFFFFFFFF },
+			cabinet_sides_colored,
+			cabinet_sides_colored,
+			cabinet_sides_colored,
+			'homedecor_kitchen_cabinet_colored_front.png^homedecor_kitchen_cabinet_bevel.png'
+		},
+		inventory_image = "[inventorycube"
+			.."{homedecor_kitchen_cabinet_top"..material..".png"
+			.."{homedecor_kitchen_cabinet_front.png"
+			.."{"..ic_cabinet_sides_colored,
+		mesh = "homedecor_kitchen_cabinet.obj",
+		paramtype2 = "colorwallmounted",
+		palette = "unifieddyes_palette_colorwallmounted.png",
+		groups = { snappy = 3, ud_param2_colorable = 1, not_in_creative_inventory = 1 },
+		sounds = default.node_sound_wood_defaults(),
+		infotext=S("Kitchen Cabinet"),
+		inventory = {
+			size=24,
+			lockable=true,
+		},
+		after_place_node = function(pos, placer, itemstack, pointed_thing)
+			unifieddyes.fix_rotation_nsew(pos, placer, itemstack, pointed_thing)
+		end
+	})
+
+	homedecor.register("kitchen_cabinet_colorable_with_drawers"..material, {
+		description = desc2,
+		tiles = {
+			'homedecor_kitchen_cabinet_top'..material..'.png',
+			cabinet_bottom,
+			cabinet_sides,
+			cabinet_sides,
+			cabinet_sides,
+			'homedecor_kitchen_cabinet_front_with_drawers.png^homedecor_kitchen_cabinet_bevel.png'
+		},
+		inventory_image = "[inventorycube"
+			.."{homedecor_kitchen_cabinet_top"..material..".png"
+			.."{homedecor_kitchen_cabinet_front_with_drawers.png"
+			.."{"..ic_cabinet_sides,
+		mesh = "homedecor_kitchen_cabinet.obj",
+		paramtype2 = "wallmounted",
+		palette = "unifieddyes_palette_colorwallmounted.png",
+		airbrush_replacement_node = "homedecor:kitchen_cabinet_colored_with_drawers"..material,
+		place_param2 = 0,
+		groups = { snappy = 3, ud_param2_colorable = 1},
+		sounds = default.node_sound_wood_defaults(),
+		infotext=S("Kitchen Cabinet with drawers"),
+		inventory = {
+			size=24,
+			lockable=true,
+		},
+		after_place_node = function(pos, placer, itemstack, pointed_thing)
+			unifieddyes.fix_rotation_nsew(pos, placer, itemstack, pointed_thing)
+		end
+	})
+
+	homedecor.register("kitchen_cabinet_colored_with_drawers"..material, {
+		description = desc2,
+		tiles = {
+			{name = 'homedecor_kitchen_cabinet_top'..material..'.png', color = 0xFFFFFFFF},
+			{name = cabinet_bottom, color = 0xFFFFFFFF },
+			cabinet_sides_colored,
+			cabinet_sides_colored,
+			cabinet_sides_colored,
+			'homedecor_kitchen_cabinet_colored_front_with_drawers.png^homedecor_kitchen_cabinet_bevel.png'
+		},
+		inventory_image = "[inventorycube"
+			.."{homedecor_kitchen_cabinet_top"..material..".png"
+			.."{homedecor_kitchen_cabinet_colored_front_with_drawers.png"
+			.."{"..ic_cabinet_sides_colored,
+		mesh = "homedecor_kitchen_cabinet.obj",
+		paramtype2 = "colorwallmounted",
+		palette = "unifieddyes_palette_colorwallmounted.png",
+		groups = { snappy = 3, ud_param2_colorable = 1, not_in_creative_inventory = 1 },
+		sounds = default.node_sound_wood_defaults(),
+		infotext=S("Kitchen Cabinet with drawers"),
+		inventory = {
+			size=24,
+			lockable=true,
+		},
+		after_place_node = function(pos, placer, itemstack, pointed_thing)
+			unifieddyes.fix_rotation_nsew(pos, placer, itemstack, pointed_thing)
+		end
+	})
+
+	homedecor.kitchen_convert_nodes[#homedecor.kitchen_convert_nodes + 1] = "homedecor:kitchen_cabinet"..material
+	homedecor.kitchen_convert_nodes[#homedecor.kitchen_convert_nodes + 1] = "homedecor:kitchen_cabinet_locked"..material
+
 end
 
-local kitchen_cabinet_half_box = homedecor.nodebox.slab_y(0.5, 0.5)
-homedecor.register("kitchen_cabinet_half", {
+local kitchen_cabinet_half_box = homedecor.nodebox.slab_z(0.5, 0.5)
+
+homedecor.register("kitchen_cabinet_colorable_half", {
 	description = S('Half-height Kitchen Cabinet (on ceiling)'),
 	tiles = {
 		cabinet_sides,
@@ -181,29 +297,77 @@ homedecor.register("kitchen_cabinet_half", {
 		cabinet_sides,
 		cabinet_sides,
 		cabinet_sides,
-		'homedecor_kitchen_cabinet_front_half.png'
+		'homedecor_kitchen_cabinet_front_half.png^homedecor_kitchen_cabinet_half_bevel.png'
 	},
+	mesh = "homedecor_kitchen_cabinet_half.obj",
+	paramtype2 = "wallmounted",
+	palette = "unifieddyes_palette_colorwallmounted.png",
+	airbrush_replacement_node = "homedecor:kitchen_cabinet_colored_half",
+	place_param2 = 0,
 	selection_box = kitchen_cabinet_half_box,
 	node_box = kitchen_cabinet_half_box,
-	groups = { snappy = 3 },
+	groups = { snappy = 3, ud_param2_colorable = 1 },
 	sounds = default.node_sound_wood_defaults(),
 	infotext=S("Kitchen Cabinet"),
 	inventory = {
 		size=12,
 		lockable=true,
 	},
+	after_place_node = function(pos, placer, itemstack, pointed_thing)
+		unifieddyes.fix_rotation_nsew(pos, placer, itemstack, pointed_thing)
+	end
 })
 
-homedecor.register("kitchen_cabinet_with_sink", {
+homedecor.kitchen_convert_nodes[#homedecor.kitchen_convert_nodes + 1] = "homedecor:kitchen_cabinet_half"
+homedecor.kitchen_convert_nodes[#homedecor.kitchen_convert_nodes + 1] = "homedecor:kitchen_cabinet_half_locked"
+
+homedecor.register("kitchen_cabinet_colored_half", {
+	description = S('Half-height Kitchen Cabinet (on ceiling)'),
+	tiles = {
+		{ name = cabinet_sides, color = 0xFFFFFFFF },
+		cabinet_bottom_colored,
+		cabinet_sides_colored,
+		cabinet_sides_colored,
+		cabinet_sides_colored,
+		'homedecor_kitchen_cabinet_colored_front_half.png^homedecor_kitchen_cabinet_half_bevel.png'
+	},
+	mesh = "homedecor_kitchen_cabinet_half.obj",
+	paramtype2 = "colorwallmounted",
+	palette = "unifieddyes_palette_colorwallmounted.png",
+	selection_box = kitchen_cabinet_half_box,
+	node_box = kitchen_cabinet_half_box,
+	groups = { snappy = 3, ud_param2_colorable = 1, not_in_creative_inventory = 1  },
+	sounds = default.node_sound_wood_defaults(),
+	infotext=S("Kitchen Cabinet"),
+	inventory = {
+		size=12,
+		lockable=true,
+	},
+	after_place_node = function(pos, placer, itemstack, pointed_thing)
+		unifieddyes.fix_rotation_nsew(pos, placer, itemstack, pointed_thing)
+	end
+})
+
+homedecor.register("kitchen_cabinet_colorable_with_sink", {
 	description = S("Kitchen Cabinet with sink"),
 	mesh = "homedecor_kitchen_sink.obj",
 	tiles = {
 		"homedecor_kitchen_sink_top.png",
-		"homedecor_kitchen_cabinet_front.png",
+		cabinet_bottom,
 		cabinet_sides,
-		cabinet_bottom
+		cabinet_sides,
+		cabinet_sides,
+		"homedecor_kitchen_cabinet_front.png^homedecor_kitchen_cabinet_bevel.png"
 	},
-	groups = { snappy = 3 },
+		inventory_image = "[inventorycube"
+			.."{homedecor_kitchen_sink_top.png"
+			.."{homedecor_kitchen_cabinet_front.png"
+			.."{"..ic_cabinet_sides,
+	paramtype2 = "wallmounted",
+	palette = "unifieddyes_palette_colorwallmounted.png",
+	airbrush_replacement_node = "homedecor:kitchen_cabinet_colored_with_sink",
+	place_param2 = 0,
+	groups = { snappy = 3, ud_param2_colorable = 1 },
 	sounds = default.node_sound_wood_defaults(),
 	infotext=S("Under-sink cabinet"),
 	inventory = {
@@ -222,6 +386,54 @@ homedecor.register("kitchen_cabinet_with_sink", {
 	},
 	on_destruct = function(pos)
 		homedecor.stop_particle_spawner({x=pos.x, y=pos.y+1, z=pos.z})
+	end,
+	after_place_node = function(pos, placer, itemstack, pointed_thing)
+		unifieddyes.fix_rotation_nsew(pos, placer, itemstack, pointed_thing)
+	end
+})
+
+homedecor.kitchen_convert_nodes[#homedecor.kitchen_convert_nodes + 1] = "homedecor:kitchen_cabinet_with_sink"
+homedecor.kitchen_convert_nodes[#homedecor.kitchen_convert_nodes + 1] = "homedecor:kitchen_cabinet_with_sink_locked"
+
+homedecor.register("kitchen_cabinet_colored_with_sink", {
+	description = S("Kitchen Cabinet with sink"),
+	mesh = "homedecor_kitchen_sink.obj",
+	tiles = {
+		{ name = "homedecor_kitchen_sink_top.png", color = 0xFFFFFFFF },
+		{ name = cabinet_bottom, color = 0xFFFFFFFF},
+		cabinet_sides_colored,
+		cabinet_sides_colored,
+		cabinet_sides_colored,
+		"homedecor_kitchen_cabinet_colored_front.png^homedecor_kitchen_cabinet_bevel.png",
+	},
+		inventory_image = "[inventorycube"
+			.."{homedecor_kitchen_sink_top.png"
+			.."{homedecor_kitchen_cabinet_front.png"
+			.."{"..ic_cabinet_sides_colored,
+	paramtype2 = "colorwallmounted",
+	palette = "unifieddyes_palette_colorwallmounted.png",
+	groups = { snappy = 3, ud_param2_colorable = 1,  not_in_creative_inventory = 1 },
+	sounds = default.node_sound_wood_defaults(),
+	infotext=S("Under-sink cabinet"),
+	inventory = {
+		size=16,
+		lockable=true,
+	},
+	node_box = {
+		type = "fixed",
+		fixed = {
+			{ -8/16, -8/16, -8/16,  8/16, 6/16,  8/16 },
+			{ -8/16,  6/16, -8/16, -6/16, 8/16,  8/16 },
+			{  6/16,  6/16, -8/16,  8/16, 8/16,  8/16 },
+			{ -8/16,  6/16, -8/16,  8/16, 8/16, -6/16 },
+			{ -8/16,  6/16,  6/16,  8/16, 8/16,  8/16 },
+		}
+	},
+	on_destruct = function(pos)
+		homedecor.stop_particle_spawner({x=pos.x, y=pos.y+1, z=pos.z})
+	end,
+	after_place_node = function(pos, placer, itemstack, pointed_thing)
+		unifieddyes.fix_rotation_nsew(pos, placer, itemstack, pointed_thing)
 	end
 })
 
@@ -555,3 +767,29 @@ minetest.register_craft({
 		{ "homedecor:toilet_paper", "homedecor:toilet_paper" }
     },
 })
+
+minetest.register_lbm({
+	name = ":homedecor:convert_kitchen_cabinets",
+	label = "Convert homedecor kitchen cabinets to use [color]wallmounted",
+	run_at_every_load = false,
+	nodenames = homedecor.kitchen_convert_nodes,
+	action = function(pos, node)
+		local name = node.name
+		local newname = string.gsub(name, "_cabinet", "_cabinet_colorable")
+
+		local old_fdir = math.floor(node.param2 % 32)
+		local new_fdir = 3
+
+		if old_fdir == 0 then
+			new_fdir = 3
+		elseif old_fdir == 1 then
+			new_fdir = 4
+		elseif old_fdir == 2 then
+			new_fdir = 2
+		elseif old_fdir == 3 then
+			new_fdir = 5
+		end
+
+		minetest.swap_node(pos, { name = newname, param2 = new_fdir })
+	end
+})
diff --git a/mods/homedecor_kitchen/models/homedecor_kitchen_cabinet.obj b/mods/homedecor_kitchen/models/homedecor_kitchen_cabinet.obj
new file mode 100644
index 00000000..86f0be0b
--- /dev/null
+++ b/mods/homedecor_kitchen/models/homedecor_kitchen_cabinet.obj
@@ -0,0 +1,50 @@
+# Blender v2.83.5 OBJ File: 'kitchen_cabinet.blend'
+# www.blender.org
+o Cube_Cube.001
+v 0.500000 -0.500000 -0.500000
+v 0.500000 -0.500000 0.500000
+v -0.500000 -0.500000 -0.500000
+v -0.500000 -0.500000 0.500000
+v 0.500000 0.500000 -0.500000
+v 0.500000 0.500000 0.500000
+v -0.500000 0.500000 -0.500000
+v -0.500000 0.500000 0.500000
+vt 1.000000 1.000000
+vt 0.000000 1.000000
+vt 0.000000 0.000000
+vt 1.000000 0.000000
+vt 1.000000 0.000000
+vt 1.000000 1.000000
+vt 0.000000 1.000000
+vt 0.000000 0.000000
+vt 0.000000 0.000000
+vt 0.000000 1.000000
+vt 1.000000 -0.000000
+vt 1.000000 1.000000
+vt -0.000000 0.000000
+vt 1.000000 -0.000000
+vt 1.000000 1.000000
+vt 0.000000 1.000000
+vt 1.000000 1.000000
+vt 0.000000 1.000000
+vt -0.000000 0.000000
+vt 1.000000 -0.000000
+vn 0.0000 0.0000 1.0000
+vn 0.0000 0.0000 -1.0000
+vn 0.0000 1.0000 0.0000
+vn 0.0000 -1.0000 0.0000
+vn -1.0000 0.0000 0.0000
+vn 1.0000 0.0000 0.0000
+g Cube_Cube.001_top
+s off
+f 8/1/1 4/2/1 2/3/1 6/4/1
+g Cube_Cube.001_bottom
+f 7/5/2 5/6/2 1/7/2 3/8/2
+g Cube_Cube.001_right
+f 5/9/3 7/5/3 8/1/3 6/10/3
+g Cube_Cube.001_left
+f 4/2/4 3/8/4 1/11/4 2/12/4
+g Cube_Cube.001_back
+f 7/13/5 3/14/5 4/15/5 8/16/5
+g Cube_Cube.001_front
+f 6/17/6 2/18/6 1/19/6 5/20/6
diff --git a/mods/homedecor_kitchen/models/homedecor_kitchen_cabinet_half.obj b/mods/homedecor_kitchen/models/homedecor_kitchen_cabinet_half.obj
new file mode 100644
index 00000000..39c0b0e4
--- /dev/null
+++ b/mods/homedecor_kitchen/models/homedecor_kitchen_cabinet_half.obj
@@ -0,0 +1,52 @@
+# Blender v2.83.5 OBJ File: 'kitchen_cabinet_half.blend'
+# www.blender.org
+o Cube_Cube.001
+v 0.500000 -0.500000 0.500000
+v -0.500000 -0.500000 -0.000000
+v -0.500000 -0.500000 0.500000
+v 0.500000 0.500000 -0.000000
+v 0.500000 0.500000 0.500000
+v -0.500000 0.500000 -0.000000
+v -0.500000 0.500000 0.500000
+v 0.500000 -0.500000 0.000000
+vt 0.000000 0.000000
+vt 1.000000 0.000000
+vt 1.000000 1.000000
+vt 0.000000 1.000000
+vt 0.000000 0.000000
+vt 1.000000 0.000000
+vt 1.000000 1.000000
+vt 0.000000 1.000000
+vt 0.000000 1.000000
+vt 0.000000 0.500000
+vt 1.000000 0.500000
+vt 1.000000 1.000000
+vt -0.000000 0.500000
+vt 1.000000 0.500000
+vt 1.000000 1.000000
+vt 0.000000 1.000000
+vt -0.000000 0.500000
+vt 1.000000 0.500000
+vt 1.000000 1.000000
+vt 0.000000 1.000000
+vt -0.000000 0.500000
+vt 1.000000 0.500000
+vn 0.0000 0.0000 1.0000
+vn 0.0000 -0.0000 -1.0000
+vn 0.0000 1.0000 0.0000
+vn 0.0000 -1.0000 0.0000
+vn -1.0000 0.0000 0.0000
+vn 1.0000 -0.0000 0.0000
+g Cube_Cube.001_top
+s off
+f 1/1/1 5/2/1 7/3/1 3/4/1
+g Cube_Cube.001_bottom
+f 2/5/2 6/6/2 4/7/2 8/8/2
+g Cube_Cube.001_right
+f 7/3/3 5/9/3 4/10/3 6/11/3
+g Cube_Cube.001_left
+f 1/12/4 3/4/4 2/13/4 8/14/4
+g Cube_Cube.001_back
+f 3/15/5 7/16/5 6/17/5 2/18/5
+g Cube_Cube.001_front
+f 5/19/6 1/20/6 8/21/6 4/22/6
diff --git a/mods/homedecor_kitchen/models/homedecor_kitchen_sink.obj b/mods/homedecor_kitchen/models/homedecor_kitchen_sink.obj
index 832fae10..bb80812d 100644
--- a/mods/homedecor_kitchen/models/homedecor_kitchen_sink.obj
+++ b/mods/homedecor_kitchen/models/homedecor_kitchen_sink.obj
@@ -1,101 +1,166 @@
-v -0.5 -0.5 -0.5
-v 0.5 -0.5 -0.5
-v 0.5 -0.5 0.5
-v -0.5 -0.5 0.5
-v -0.5 0.5 0.5
-v -0.5 0.5 -0.5
-v 0.5 0.5 -0.5
-v 0.5 0.5 0.5
-v -0.387 0.5 0.388
-v -0.387 0.5 -0.387
-v 0.388 0.5 -0.387
-v 0.388 0.5 0.388
-v -0.387 0.4 0.388
-v -0.387 0.4 -0.387
-v 0.388 0.4 -0.387
-v 0.388 0.4 0.388
-v 0.063 0.4 -0.062
-v 0.063 0.4 0.063
-v -0.062 0.4 -0.062
-v -0.062 0.4 0.063
-v 0.063 0.313 0.063
-v 0.063 0.313 -0.062
-v -0.062 0.313 0.063
-v -0.062 0.313 -0.062
-vt 0.469 0.906
-vt 0.469 0.531
-vt 0.531 0.469
-vt 0.531 0.969
-vt 0.031 0.969
-vt 0.094 0.906
-vt 0.031 0.469
-vt 0.094 0.531
-vt 0.813 0.5
-vt 0.813 0.938
-vt 0.781 0.938
-vt 0.781 0.5
-vt 0.688 0.5
-vt 0.719 0.5
-vt 0.719 0.938
-vt 0.688 0.938
-vt 0.906 0.5
-vt 0.906 0.938
-vt 0.875 0.938
-vt 0.875 0.5
-vt 0.594 0.5
-vt 0.625 0.5
-vt 0.625 0.938
-vt 0.594 0.938
-vt 0.313 0.75
-vt 0.313 0.688
-vt 0.25 0.688
-vt 0.25 0.75
-vt 0.219 0.375
-vt 0.219 0.313
-vt 0.25 0.313
-vt 0.25 0.375
-vt 0.25 0.406
-vt 0.313 0.375
-vt 0.313 0.406
-vt 0.313 0.313
-vt 0.344 0.313
-vt 0.344 0.375
-vt 0.25 0.281
-vt 0.313 0.281
-vt 0 0
-vt 1 0
-vt 1 1
-vt 0 1
-vn 0 1 0
-vn -1 0 0
-vn 0 0 -1
-vn 1 0 0
-vn 0 0 1
-vn 0 -1 0
-g 1
+# Blender v2.83.5 OBJ File: 'kitchen_sink.blend'
+# www.blender.org
+o Cube_Cube.001
+v 0.500000 -0.500000 -0.500000
+v 0.500000 -0.500000 0.500000
+v -0.500000 -0.500000 -0.500000
+v -0.500000 -0.500000 0.500000
+v 0.500000 0.500000 -0.500000
+v 0.500000 0.500000 0.500000
+v -0.500000 0.500000 -0.500000
+v -0.500000 0.500000 0.500000
+v 0.000000 -0.500000 0.500000
+v 0.000000 0.500000 0.500000
+v 0.000000 0.062500 0.437500
+v -0.062500 0.062500 0.375000
+v 0.062500 0.062500 0.375000
+v 0.062500 -0.062500 0.437500
+v 0.000000 -0.062500 0.437500
+v 0.062500 -0.062500 0.375000
+v -0.062500 -0.062500 0.437500
+v -0.062500 0.062500 0.437500
+v -0.062500 -0.062500 0.375000
+v 0.000000 0.375000 0.437500
+v 0.062500 0.062500 0.437500
+v 0.000000 -0.375000 0.437500
+v -0.375000 -0.375000 0.437500
+v -0.375000 0.375000 0.500000
+v -0.375000 0.375000 0.437500
+v 0.375000 0.375000 0.437500
+v 0.000000 0.375000 0.500000
+v 0.375000 0.375000 0.500000
+v 0.000000 -0.375000 0.500000
+v 0.375000 -0.375000 0.500000
+v 0.375000 -0.375000 0.437500
+v -0.375000 -0.375000 0.500000
+vt 0.437500 0.375000
+vt 0.562500 0.437500
+vt 0.437500 0.437500
+vt 0.125000 0.875000
+vt 0.875000 0.875000
+vt 1.000000 1.000000
+vt 0.625000 0.500000
+vt 0.625000 0.562500
+vt 0.562500 0.562500
+vt 0.875000 0.062500
+vt 0.125000 0.125000
+vt 0.125000 0.062500
+vt 0.875000 0.875000
+vt 0.437500 0.562500
+vt 0.562500 0.562500
+vt 0.875000 0.125000
+vt 0.125000 0.125000
+vt 0.000000 0.000000
+vt 0.375000 0.500000
+vt 0.375000 0.437500
+vt 0.437500 0.625000
+vt 0.437500 0.562500
+vt 0.875000 0.500000
+vt 0.875000 0.125000
+vt 0.937500 0.500000
+vt 0.125000 0.500000
+vt 0.125000 0.875000
+vt 0.062500 0.875000
+vt 0.562500 0.437500
+vt 0.437500 0.437500
+vt 0.125000 0.937500
+vt 0.875000 0.937500
+vt 0.937500 0.125000
+vt 0.937500 0.875000
+vt 0.062500 0.500000
+vt 0.062500 0.125000
+vt 0.562500 0.375000
+vt 0.625000 0.437500
+vt 0.375000 0.562500
+vt 0.562500 0.625000
+vt 0.562500 0.500000
+vt 0.437500 0.500000
+vt 0.000000 1.000000
+vt 0.000000 0.500000
+vt 0.125000 0.500000
+vt 0.875000 0.500000
+vt 1.000000 0.500000
+vt 1.000000 0.000000
+vt 1.000000 1.000000
+vt 0.000000 1.000000
+vt 0.000000 0.000000
+vt 1.000000 0.000000
+vt 0.500000 1.000000
+vt 0.000000 1.000000
+vt 0.000000 0.000000
+vt 0.500000 1.000000
+vt 1.000000 -0.000000
+vt 1.000000 1.000000
+vt -0.000000 0.000000
+vt 1.000000 -0.000000
+vt 1.000000 1.000000
+vt 0.000000 1.000000
+vt -0.000000 0.000000
+vt 1.000000 -0.000000
+vt 1.000000 1.000000
+vt 0.000000 1.000000
+vn -1.0000 0.0000 0.0000
+vn 0.0000 0.0000 1.0000
+vn -0.0000 -1.0000 0.0000
+vn 0.0000 1.0000 -0.0000
+vn 1.0000 0.0000 0.0000
+vn 0.0000 0.0000 -1.0000
+g Cube_Cube.001_top
 s off
-f 9/1/1 10/2/1 6/3/1 5/4/1
-f 5/4/1 8/5/1 12/6/1 9/1/1
-f 7/7/1 6/3/1 10/2/1 11/8/1
-f 8/5/1 7/7/1 11/8/1 12/6/1
-f 15/9/2 16/10/2 12/11/2 11/12/2
-f 16/13/3 13/14/3 9/15/3 12/16/3
-f 13/17/4 14/18/4 10/19/4 9/20/4
-f 14/21/5 15/22/5 11/23/5 10/24/5
-f 13/2/1 16/1/1 18/25/1 20/26/1
-f 19/27/1 14/8/1 13/2/1 20/26/1
-f 17/28/1 15/6/1 14/8/1 19/27/1
-f 16/1/1 15/6/1 17/28/1 18/25/1
-f 17/29/2 22/30/2 21/31/2 18/32/2
-f 18/33/3 21/32/3 23/34/3 20/35/3
-f 20/34/4 23/36/4 24/37/4 19/38/4
-f 19/31/5 24/39/5 22/40/5 17/36/5
-f 24/27/1 23/26/1 21/25/1 22/28/1
-g 2
-f 2/41/3 1/42/3 6/43/3 7/44/3
-g 3
-f 1/41/2 4/42/2 5/43/2 6/44/2
-f 2/42/4 7/43/4 8/44/4 3/41/4
-f 4/41/5 3/42/5 8/43/5 5/44/5
-g 4
-f 1/43/6 2/44/6 3/41/6 4/42/6
+f 14/1/1 13/2/1 16/3/1
+f 32/4/2 24/5/2 8/6/2
+f 11/7/3 18/8/3 12/9/3
+f 28/10/1 31/11/1 30/12/1
+f 25/13/2 17/14/2 18/15/2
+f 28/16/2 30/17/2 2/18/2
+f 15/19/4 14/20/4 16/3/4
+f 12/9/5 17/21/5 19/22/5
+f 20/23/3 26/24/3 27/25/3
+f 22/26/4 23/27/4 32/28/4
+f 26/24/2 21/29/2 14/30/2
+f 32/31/5 25/13/5 24/32/5
+f 12/9/2 19/22/2 16/3/2 13/2/2
+f 28/10/1 26/24/1 31/11/1
+f 26/24/3 28/33/3 27/25/3
+f 27/25/3 24/34/3 20/23/3
+f 24/34/3 25/13/3 20/23/3
+f 32/28/4 29/35/4 22/26/4
+f 29/35/4 30/36/4 22/26/4
+f 30/36/4 31/11/4 22/26/4
+f 32/31/5 23/27/5 25/13/5
+f 14/1/1 21/37/1 13/2/1
+f 12/9/3 13/2/3 11/7/3
+f 13/2/3 21/38/3 11/7/3
+f 16/3/4 19/22/4 15/19/4
+f 19/22/4 17/39/4 15/19/4
+f 12/9/5 18/40/5 17/21/5
+f 11/41/2 20/23/2 18/15/2
+f 20/23/2 25/13/2 18/15/2
+f 25/13/2 23/27/2 17/14/2
+f 23/27/2 22/26/2 17/14/2
+f 22/26/2 15/42/2 17/14/2
+f 14/30/2 15/42/2 22/26/2
+f 22/26/2 31/11/2 14/30/2
+f 31/11/2 26/24/2 14/30/2
+f 26/24/2 20/23/2 21/29/2
+f 20/23/2 11/41/2 21/29/2
+f 4/43/2 9/44/2 32/4/2
+f 9/44/2 29/45/2 32/4/2
+f 27/46/2 10/47/2 24/5/2
+f 10/47/2 8/6/2 24/5/2
+f 4/43/2 32/4/2 8/6/2
+f 6/48/2 10/47/2 28/16/2
+f 10/47/2 27/46/2 28/16/2
+f 29/45/2 9/44/2 30/17/2
+f 9/44/2 2/18/2 30/17/2
+f 6/48/2 28/16/2 2/18/2
+g Cube_Cube.001_bottom
+f 5/49/6 1/50/6 3/51/6 7/52/6
+g Cube_Cube.001_right
+f 8/6/4 10/53/4 6/54/4 5/55/4 7/52/4
+g Cube_Cube.001_left
+f 9/56/3 4/43/3 3/51/3 1/57/3 2/58/3
+g Cube_Cube.001_back
+f 7/59/1 3/60/1 4/61/1 8/62/1
+g Cube_Cube.001_front
+f 1/63/5 5/64/5 6/65/5 2/66/5
diff --git a/mods/homedecor_kitchen/textures/homedecor_kitchen_cabinet_bevel.png b/mods/homedecor_kitchen/textures/homedecor_kitchen_cabinet_bevel.png
index 137eb3ee750b2d69316cd0941548b144ec44c8d7..ad6dac3fec5290bfa327063df43aade63ce49e44 100644
GIT binary patch
delta 81
zcmV-X0IvU6aF8TSH%UZ6R5;7+%&`psAP7alhoN;mR`~lT7L-`H0k+%#XH~Unk`xYL
nW~X`N;?o2ZOz^m*0J0lg9Rmp<|Gl=&00000NkvXXu0mjfTiGDK

delta 56
zcmXR2pP*ta=jq}YVsSc|V^jD%56(0O;gqI8W;b35(}r7Y0ZojXXZYw^eQ1+n00K`}
KKbLh*2~7a;&k<Vy

diff --git a/mods/homedecor_kitchen/textures/homedecor_kitchen_cabinet_colored_front.png b/mods/homedecor_kitchen/textures/homedecor_kitchen_cabinet_colored_front.png
new file mode 100644
index 0000000000000000000000000000000000000000..382026f39e981dbfe95631394e4e0e8dead76466
GIT binary patch
literal 244
zcmV<Q01N+#P)<h;3K|Lk000e1NJLTq000mG000mO00000I+&on0002HNkl<Z7}Hga
zEepa>07cKX$0i#V4Z|Y7AP5Q;o5?8nUrlDkCOGrJF!2MOAO`hKhx!bDpK{@H57!9p
zmr}oaBW$ggNpo8u&_|tUJxK0Ho#@_DK<LjMf5k+}d2vxU(SD5Jg9#`y{{?seZuBj>
zF);pF<Q1rwa((6wQc1+@xj0CWHpuj)G_auok?oj(%MYe7VjqB$0{8s_a0YNJBRGWF
uy~yHi()?b~7I?MNuzYc*opo+h!Fm7?ML@p<=9D}D0000<MNUMnLSTaBS7WpQ

literal 0
HcmV?d00001

diff --git a/mods/homedecor_kitchen/textures/homedecor_kitchen_cabinet_colored_front_half.png b/mods/homedecor_kitchen/textures/homedecor_kitchen_cabinet_colored_front_half.png
new file mode 100644
index 0000000000000000000000000000000000000000..0c180fa5e42a210a1fcae340db08d836ad1d7b16
GIT binary patch
literal 190
zcmeAS@N?(olHy`uVBq!ia0vp^0wBx*Bp9q_EZ7UAT0LDHLnJPrJ-Csp$wB78!};x3
z1q5|v^#Y5XoueHUOup?p`;|$(FYi=phNFOr9NXRfYtvu+W_rB)XXa1E?$wua-wV1)
z6)L4amo6;QaXzs{_Jy|R?hTtydnx{MW17IUpkbPvJy(P60X23GpT9L4_vLxB?`3_m
nYUx=XD;FNSua9fD_7CxR?z^UI1@-rT06EOl)z4*}Q$iB}33*2J

literal 0
HcmV?d00001

diff --git a/mods/homedecor_kitchen/textures/homedecor_kitchen_cabinet_colored_front_with_drawers.png b/mods/homedecor_kitchen/textures/homedecor_kitchen_cabinet_colored_front_with_drawers.png
new file mode 100644
index 0000000000000000000000000000000000000000..c367510a196df2cf6bf214a4e70fb63a463520ae
GIT binary patch
literal 254
zcmV<a00IArP)<h;3K|Lk000e1NJLTq000mG000mO00000I+&on0002RNkl<Z7}G_}
zF-rnr0D$4=@&o0hL4?kRM8{~Tz^$pZ|64&zP*ac=P2r-I5oZX2d3j-XEk@7&zEQu(
zJC}Pu9*^H9Uq{nz{bKF2D2noQ5=0YRnKgIBUiO3KGdeoRtpqo(%xHp!pw}ZNi^*IF
z;sIp3ES6J2p5u;(L#%{Vt&O&kDp6w`oPA*ay}k-g%7{f>3Fp;dIq+|^6+*3@X6|ti
zC&q$Bn$QKQc_pYP>0gl8Y;L%HY7NU}Ic$}U>-XKtFJ(ng=Qj=7Q2+n{07*qoM6N<$
Ef~in!B>(^b

literal 0
HcmV?d00001

diff --git a/mods/homedecor_kitchen/textures/homedecor_kitchen_cabinet_front.png b/mods/homedecor_kitchen/textures/homedecor_kitchen_cabinet_front.png
index 406739f8a8780ac3d5dae8b7679389b5e94305f7..8f66ff6450f3871dbf9dc37de99a190080cb3b72 100644
GIT binary patch
delta 517
zcmV+g0{Z>C0+a-h8Gi-<001BJ|6u?C0ozGLK~y-)os&yz6JZpFpGhY(xsK5!%#hT=
zV9`J{pcE8b>8b=5UFgD9{Q>?Ae?>uXZ=tv<y09wh!kUfL+SuxZNg5LqtxhMGnWT-2
zkkF7;qGxq(-^2SJ_=E@d=X=6|jnlG8=?Rvf=ec?@LHDo+K!0xY8@F#>z^GV!HGg8a
zJ7lk)qg1oeH3bo1Av@2OxkoY<WKqp9n+#E|H&|U;XYuYG{1V8q4hz}S?CjdiCPTb@
z^b}pA4*=NScuh-<lQ%6kWjL!Ulu89)j@<fNtfot=79($3?9V8a%mQRC;Q`pK*-Wc(
zO4S+wg4fTa;eR<={B8;WDDvU|0S2K2<?&uX;-gWY46wA4qgb^@dTZ~E$rWhPAXd{I
z)<^R(fZI7Zaaj4$80KxaOInWs46SS#<>M9n+INP_0BJpjPZCG!w%a|~!i_l{VC2!D
zH&Eb{L}Y)c4-n{kJQe8iui=rrQzYVNC{`_|)%dYXR(``7IiwPhfWKH6132SrKG}!p
z5&D1O;o}!<d@_iHWxnq@NFqeSGLf*%^6DF^<sI5Cd@0t4bLgT)gMC0W*ydU~N=i@g
z<kdEr^D0iuM)rsJ@VUahTbD5^7Fxv5vv&oqq%;7$Qy%^R=XI@vLd}~100000NkvXX
Hu0mjfc(VDt

delta 299
zcmV+`0o4AK1iJ!|8Gi!+001a04^sdD0Blf9R7F`qACGT7VMrxTHyT$!A6i2qYEmwA
zS~ZStK59}hWlk+%ODsz^8HZ^;lypT`LM2T&8F*eeP&yh;IU1yZOn6^7P&*t~LLqlu
zH;8IKbXqZ4Kplu_H<oopSwkUYN+wb~9C=?jvWrrYb404h5PuN>004?fL_t(|+Evd3
z5(GgE1<+oO?H2Oyf5tJ3sTVWHhlUqT5H@qfJ;z*Ygkd_*#ZPEc&7cY7!<JAHNIU?N
zM9=yKUedNwfnYX>)C@E%;1(dL&bHkNI3QiYnH{oZhWG-TDUdv7)Y4iU5T78o!^{E0
x9Z*^%*r3uzza(}3(ck^K|N4Fy@PczbxCy!r8_teTljQ&a002ovPDHLkV1iJmaN_^~

diff --git a/mods/homedecor_kitchen/textures/homedecor_kitchen_cabinet_front_half.png b/mods/homedecor_kitchen/textures/homedecor_kitchen_cabinet_front_half.png
index 2e6a60ca241fffa2852578e0b384aaf0337a400b..d5d8e31b7cdd3318cd05d81737bbfead189b6f21 100644
GIT binary patch
delta 355
zcmV-p0i6Dc0{sGzBYy!zNkl<ZD9`Q7%}c@n00r>3wVa}^jLF2QAlV0G1`$Pdh@^w<
z<e`Et`49AG^oMlp;5DR6B4ihlI+QeuTw{LW7tQI+kJcdw>(IGFztejU9&vIUA%@zU
zuFd=1@k?<n=pMWq0J6E#UU)8FR-fgD*6j<M(@ItIyBG>URDXy($W5NL#<);`w-syc
zL^2aQ+_#uOv;C;xcq(WC-j+JO@Vh_(0PuKsrE^YER&zAG9HS@_u#(MOtDT-+Wkp$S
z`4~l(5LzSw6snqsb1Ic8faHyW5$W3(d`Etz*A4-|Od0qU`J*4~ER5FOjhXv=ZFHdk
zoSmn&W~p3nlUyW~$_~sXYSK=}6X{A(0?_RZNRkpI`tvXrUJY1@2Jf2kvZj_kJQ9Kv
zjKyI^p<G{I@@y~rY-Xd|H=<j!=J6rxu;bsK@By+ydq5GQkZ}M2002ovPDHLkV1gGz
Bs!0F<

delta 238
zcmV<K01^NF0*L~UBYyzUNkl<Zc-rldL!v`56hPlLzJ=MhZQDkT>GKMzQMr(=uqRE8
zd6nb}CsORcb?tK@9Ne?=j`h2a6MUTa+|J;Xs%Y(Vg-}86w+7vp(;xdoLLZEL9F5(q
z_p!))9*v{PP`cgd7l8S*Mx2d3vf}D-MnAEBmL9hU*#(EaNoUFuOc@|90dI$662JjS
zX(v?xg4YC?3I%pc0C#H)=${J!EcJ7VP?o}hwKBkK<g?I@^C|i0+clAV+aIZYG!lHA
ot@&2|l%JI$S}uA7&>Jl=a-q<Fq&a8~g8%>k07*qoM6N<$g3C>D{{R30

diff --git a/mods/homedecor_kitchen/textures/homedecor_kitchen_cabinet_front_with_drawers.png b/mods/homedecor_kitchen/textures/homedecor_kitchen_cabinet_front_with_drawers.png
new file mode 100644
index 0000000000000000000000000000000000000000..510243b22ab2d3d2a6e10d78c56faddaf9a6ce4c
GIT binary patch
literal 561
zcmV-10?z%3P)<h;3K|Lk000e1NJLTq000mG000mO0ssI2kdbIM0005_Nkl<ZD9>$C
zU2oE07(Fj5RG_U8R;Y}X5lp~nWYa`0h&P&;#cO|nKVVn>hF$vyyzz1|#u$xeF~&rf
zZAM2%Of*0YAhdj>n{%bmwXotvYlq6YdfxLs=XuY0AF{r-N=`LH*RrYj(|48pmH612
z04RRz+`E;jchy?+r*<;BTS!ZamJ&F!zP5Vf+A?OLua8*27XX3D2AM}s-rl|%q5v%L
z%zp8s+xOx_89?`NAVh-c#d!c+zz3k!Y{3?Mm$gb$bp@HFIDpL3*;7LU0L(D}PypWV
z>`7AFzUv+i>_UhH|8W=%(~h8!&mo_)S=;n<0J{e8Y;)HUuzqjx^Um}zb!Y;(oSJuz
z14A`DO1BQIPylq(acN^~zit=1U*wxBDVI0L6adN`onBmE`XYB0TFe3XT0Z~~pdFGB
z5)ISkdYc09@bR1eQQH;#>KiBKcxG-V!-M;GWJM$1bF9x|1HN+eC@Y2m$ci@Iy76k8
z_D`HW?0xzxbg4LF@wHkb9Zga`?_4bG%ZQxRQ;vrOz;@|}+f-Oio)1hCF&;pr@n;Y6
z!9eOMi5Q;%rhn5#tEbx8C=a0kWW}(q@HYED2#m!T4<N+SLL}$`@ci{=wIL-1rc~`%
zuykFuV3n$!q`+9P_z?GUt0F7M*Dqc0&Ut<VNodCRN}8{G00000NkvXXu0mjf0?h@Y

literal 0
HcmV?d00001

diff --git a/mods/homedecor_kitchen/textures/homedecor_kitchen_cabinet_half_bevel.png b/mods/homedecor_kitchen/textures/homedecor_kitchen_cabinet_half_bevel.png
new file mode 100644
index 0000000000000000000000000000000000000000..1c12493c7b9083211f961c5400686b97ef1d47f1
GIT binary patch
literal 109
zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`CY~;iAr`0Ko-yQQFyL@K=zch=
zGUCU-$$ULmnAgl{*t}|&i6<Ak!RG5WpA5Dz?pVSwX)BwZJR7Hg=CsN6K>ZA!u6{1-
HoD!M<MBE`=

literal 0
HcmV?d00001

diff --git a/mods/homedecor_kitchen/textures/homedecor_kitchen_sink_top.png b/mods/homedecor_kitchen/textures/homedecor_kitchen_sink_top.png
index fc70835ca83a5302bc25499461f75db52dd01d2a..ccb117ea7956ddd76cdfb1ffa8d49d728488cdbc 100644
GIT binary patch
literal 286
zcmV+(0pb3MP)<h;3K|Lk000e1NJLTq000mG000mO0ssI2kdbIM0002xNkl<ZD9?>j
zK~BUl47A7YM(qjp1BkcrCO*M$xFH@9ZlT*a_8uY?M4{Wc*`67X;_&Osvxr25s+yU*
z1BeJ_jtCK9=2|O&)|!Z@h<toL(Fv&P<Mgh*n5OBjpr_D?=ygizfDNFOLPW~UTlc>`
zW@ctYRBMHZ&}pbDT5J13&N=72@4LGKIAG87{Bv}<T(B1$pp>HfNSo^~dm<7M{nKer
z?HGmu%d(u0#LPO5BbD#>J{GvUy8Cv^y8<)Q@^$SWq+k9R%hhyQ+XKCMaR_=!t0n>l
kz*yH+2W{4vDWznMZd3nsaJ^_JXaE2J07*qoM6N<$f;3EmkpKVy

literal 358
zcmV-s0h#`ZP)<h;3K|Lk000e1NJLTq001BW001Be0ssI2{21+{0003kNkl<Zc-rlh
z19n9*00pzn+FV2rzipe9cGx-pmU%@|YtDVf#0HK^8>iLnlgidbV~;(T?2pTv+Mm^S
z&g;9nd01R$Z@l13Ux6IiY?eI~i$&{1kFMd@B;rOQk-$W<HxvWhKC%Tl2l$K%5l%!c
zfGtp!C8$12y<Ybc*fo%#{{-!JTLQX)cnIiN;x15u-k}D1DJWoE5f1@FkXQm9AI#vy
z5?nU-iHATRxC<uvRpKGgsBmv0%>!?Ndnc<&Jp|+23UL=`)V;ow+fVZj6RrL%uk3?C
zW`(edW!>nfS4i=Opy2kA5slcQQVY-Pq#0kThUOa41y0(D70x-~X+1LEORsT<++Upe
zsdb`9clZj-yAYaTK8VmgKKAe8M+y9!=<7TApMU<j0?O2RV!lp<UH||907*qoM6N<$
Ef)vA{ga7~l

diff --git a/mods/homedecor_lighting/init.lua b/mods/homedecor_lighting/init.lua
index ab473868..6d7ba80f 100644
--- a/mods/homedecor_lighting/init.lua
+++ b/mods/homedecor_lighting/init.lua
@@ -1789,6 +1789,14 @@ unifieddyes.register_color_craft({
 	}
 })
 
+
+minetest.register_craft({
+	output = "homedecor:torch_wall 10",
+	recipe = {
+		{ "default:coal_lump" },
+		{ "default:steel_ingot" },
+	},
+})
 -- aliases
 
 minetest.register_alias("chains:chain_top",                    "homedecor:chain_steel_top")
diff --git a/mods/homedecor_tables/misc.lua b/mods/homedecor_tables/misc.lua
index 51fb3993..de062240 100644
--- a/mods/homedecor_tables/misc.lua
+++ b/mods/homedecor_tables/misc.lua
@@ -2,25 +2,58 @@
 
 local S = minetest.get_translator("homedecor_tables")
 
-local materials = {
+-- Various kinds of table legs
+
+local table_shapes = {"large_square", "small_square", "small_round"}
+
+local tabletop_materials = {
 	{ "glass",
-		S("Small square glass table"),
-		S("Small round glass table"),
-		S("Large glass table piece"),
+		S("Small square glass tabletop"),
+		S("Small round glass tabletop"),
+		S("Large glass tabletop piece"),
 	},
 	{ "wood",
-		S("Small square wooden table"),
-		S("Small round wooden table"),
-		S("Large wooden table piece"),
+		S("Small square wooden tabletop"),
+		S("Small round wooden tabletop"),
+		S("Large wooden tabletop piece"),
 	}
 }
 
+leg_materials = {
+	{ "brass",          S("brass") },
+	{ "wrought_iron",   S("wrought iron") },
+	{ "wood",           S("wood") }
+}
+
+for _, t in ipairs(leg_materials) do
+	local name, desc = unpack(t)
+	homedecor.register("table_legs_"..name, {
+		description = S("Table Legs (@1)", desc),
+		drawtype = "plantlike",
+		tiles = {"homedecor_table_legs_"..name..".png"},
+		inventory_image = "homedecor_table_legs_"..name..".png",
+		wield_image = "homedecor_table_legs_"..name..".png",
+		walkable = false,
+		groups = {snappy=3},
+		sounds = default.node_sound_wood_defaults(),
+		selection_box = {
+			type = "fixed",
+			fixed = { -0.37, -0.5, -0.37, 0.37, 0.5, 0.37 }
+		},
+	})
+end
+
+minetest.register_alias("homedecor:utility_table_legs", "homedecor:table_legs_wood")
+minetest.register_alias("homedecor:utility_table_top",  "homedecor:wood_table_small_square")
+
+-- table tops and combined tables
+
 local tables_cbox = {
 	type = "fixed",
 	fixed = { -0.5, -0.5,    -0.5,  0.5,    -0.4375, 0.5 },
 }
 
-for i, mat in ipairs(materials) do
+for i, mat in ipairs(tabletop_materials) do
 	local m, small_s, small_r, large = unpack(mat)
 	local s
 
@@ -30,179 +63,102 @@ for i, mat in ipairs(materials) do
 		s = default.node_sound_wood_defaults()
 	end
 
--- small square tables
+	for _, shape in ipairs(table_shapes) do
 
-	homedecor.register(m.."_table_small_square", {
-		description = small_s,
-		mesh = "homedecor_table_small_square.obj",
-		tiles = { 'homedecor_'..m..'_table_small_square.png' },
-		wield_image = 'homedecor_'..m..'_table_small_square_inv.png',
-		inventory_image = 'homedecor_'..m..'_table_small_square_inv.png',
-		groups = { snappy = 3 },
-		sounds = s,
-		selection_box = tables_cbox,
-		collision_box = tables_cbox,
-		on_place = minetest.rotate_node
-	})
+		homedecor.register(m.."_table_"..shape, {
+			description = shape.." "..m.." tabletop",
+			mesh = "homedecor_table_"..shape..".obj",
+			tiles = {
+				'homedecor_'..m..'_table_'..shape..'.png',
+				'homedecor_'..m..'_table_edges.png',
+				'homedecor_blanktile.png',
+				'homedecor_blanktile.png',
+				'homedecor_blanktile.png',
+			},
+			wield_image = 'homedecor_'..m..'_table_'..shape..'_inv.png',
+			groups = { snappy = 3 },
+			sounds = s,
+			selection_box = tables_cbox,
+			collision_box = tables_cbox,
+			on_place = function(itemstack, placer, pointed_thing)
+				local player_name = placer:get_player_name()
+				if minetest.is_protected(pointed_thing.under, player_name) then return end
+				local node = minetest.get_node(pointed_thing.under)
+				if string.find(node.name, "homedecor:table_legs") then
+					local newname = string.format("homedecor:%s_table_%s_with_%s_legs",
+						m, shape, string.sub(node.name, 22))
+					minetest.set_node(pointed_thing.under, {name = newname})
+					if not creative.is_enabled_for(player_name) then
+						itemstack:take_item()
+						return itemstack
+					end
+				else
+					return minetest.rotate_node(itemstack, placer, pointed_thing)
+				end
+			end
+		})
 
--- small round tables
+		for _, l in ipairs(leg_materials) do
+			local leg_mat, desc = unpack(l)
 
-	homedecor.register(m..'_table_small_round', {
-		description = small_r,
-		mesh = "homedecor_table_small_round.obj",
-		tiles = { "homedecor_"..m.."_table_small_round.png" },
-		wield_image = 'homedecor_'..m..'_table_small_round_inv.png',
-		inventory_image = 'homedecor_'..m..'_table_small_round_inv.png',
-		groups = { snappy = 3 },
-		sounds = s,
-		selection_box = tables_cbox,
-		collision_box = tables_cbox,
-		on_place = minetest.rotate_node
-	})
-
--- Large square table pieces
-
-	homedecor.register(m..'_table_large', {
-		description = large,
-		tiles = {
-			'homedecor_'..m..'_table_large_tb.png',
-			'homedecor_'..m..'_table_large_tb.png',
-			'homedecor_'..m..'_table_large_edges.png',
-			'homedecor_'..m..'_table_large_edges.png',
-			'homedecor_'..m..'_table_large_edges.png',
-			'homedecor_'..m..'_table_large_edges.png'
-		},
-		wield_image = 'homedecor_'..m..'_table_large_inv.png',
-		inventory_image = 'homedecor_'..m..'_table_large_inv.png',
-		groups = { snappy = 3 },
-		sounds = s,
-		node_box = {
-			type = "fixed",
-			fixed = { -0.5, -0.5, -0.5, 0.5, -0.4375, 0.5 },
-		},
-		selection_box = tables_cbox,
-		on_place = minetest.rotate_node
-	})
+			homedecor.register(string.format("%s_table_%s_with_%s_legs", m, shape, leg_mat), {
+				description = string.format("%s %s table with %s legs", shape, m, leg_mat),
+				mesh = "homedecor_table_"..shape..".obj",
+				tiles = {
+					'homedecor_blanktile.png',
+					'homedecor_blanktile.png',
+					'homedecor_'..m..'_table_'..shape..'.png',
+					'homedecor_'..m..'_table_edges.png',
+					"homedecor_table_legs_"..leg_mat..".png",
+				},
+				groups = { snappy = 3 },
+				sounds = s,
+			})
+		end
+	end
 
 	minetest.register_alias('homedecor:'..m..'_table_large_b', 'homedecor:'..m..'_table_large')
 	minetest.register_alias('homedecor:'..m..'_table_small_square_b', 'homedecor:'..m..'_table_small_square')
 	minetest.register_alias('homedecor:'..m..'_table_small_round_b', 'homedecor:'..m..'_table_small_round')
+	minetest.register_alias('homedecor:'..m..'_table_large', 'homedecor:'..m..'_table_large_square')
 
 end
 
--- conversion routines for old non-6dfacedir tables
+-- old-style tables that used to be from 3dforniture.
 
-local tlist_s = {}
-local tlist_t = {}
-local dirs2 = { 9, 18, 7, 12 }
-
-for i in ipairs(materials) do
-	local m = materials[i][1]
-	table.insert(tlist_s, "homedecor:"..m.."_table_large_s")
-	table.insert(tlist_s, "homedecor:"..m.."_table_small_square_s")
-	table.insert(tlist_s, "homedecor:"..m.."_table_small_round_s")
-
-	table.insert(tlist_t, "homedecor:"..m.."_table_large_t")
-	table.insert(tlist_t, "homedecor:"..m.."_table_small_square_t")
-	table.insert(tlist_t, "homedecor:"..m.."_table_small_round_t")
-end
-
-minetest.register_abm({
-	nodenames = tlist_s,
-	interval = 1,
-	chance = 1,
-	action = function(pos, node, active_object_count, active_object_count_wider)
-		local newnode = string.sub(node.name, 1, -3) -- strip the "_s" from the name
-		local fdir = node.param2 or 0
-		minetest.set_node(pos, {name = newnode, param2 = dirs2[fdir+1]})
-	end
-})
-
-minetest.register_abm({
-	nodenames = tlist_t,
-	interval = 1,
-	chance = 1,
-	action = function(pos, node, active_object_count, active_object_count_wider)
-		local newnode = string.sub(node.name, 1, -3) -- strip the "_t" from the name
-		minetest.set_node(pos, { name = newnode, param2 = 20 })
-	end
-})
-
--- other tables
-
-homedecor.register("utility_table_top", {
-	description = S("Utility Table"),
-	tiles = {
-		'homedecor_utility_table_tb.png',
-		'homedecor_utility_table_tb.png',
-		'homedecor_utility_table_edges.png',
-		'homedecor_utility_table_edges.png',
-		'homedecor_utility_table_edges.png',
-		'homedecor_utility_table_edges.png'
-	},
-	wield_image = 'homedecor_utility_table_tb.png',
-	inventory_image = 'homedecor_utility_table_tb.png',
-	groups = { snappy = 3 },
-	sounds = default.node_sound_wood_defaults(),
-	paramtype2 = "wallmounted",
-	node_box = {
-		type = "wallmounted",
-		wall_bottom = { -0.5, -0.5,    -0.5,  0.5,   -0.4375, 0.5 },
-		wall_top =    { -0.5,  0.4375, -0.5,  0.5,    0.5,    0.5 },
-		wall_side =   { -0.5, -0.5,    -0.5, -0.4375, 0.5,    0.5 },
-	},
-	selection_box = {
-		type = "wallmounted",
-		wall_bottom = { -0.5, -0.5,    -0.5,  0.5,   -0.4375, 0.5 },
-		wall_top =    { -0.5,  0.4375, -0.5,  0.5,    0.5,    0.5 },
-		wall_side =   { -0.5, -0.5,    -0.5, -0.4375, 0.5,    0.5 },
-	},
-})
-
--- Various kinds of table legs
-
--- local above
-materials = {
-	{ "brass",          S("brass") },
-	{ "wrought_iron",   S("wrought iron") },
+local table_colors = {
+	{ "",           S("Table"),           homedecor.plain_wood },
+	{ "_mahogany",  S("Mahogany Table"),  homedecor.mahogany_wood },
+	{ "_white",     S("White Table"),     homedecor.white_wood }
 }
 
-for _, t in ipairs(materials) do
-local name, desc = unpack(t)
-homedecor.register("table_legs_"..name, {
-	description = S("Table Legs (@1)", desc),
-	drawtype = "plantlike",
-	tiles = {"homedecor_table_legs_"..name..".png"},
-	inventory_image = "homedecor_table_legs_"..name..".png",
-	wield_image = "homedecor_table_legs_"..name..".png",
-	walkable = false,
-	groups = {snappy=3},
-	sounds = default.node_sound_wood_defaults(),
-	selection_box = {
-		type = "fixed",
-		fixed = { -0.37, -0.5, -0.37, 0.37, 0.5, 0.37 }
-	},
-})
+for _, t in ipairs(table_colors) do
+	local suffix, desc, texture = unpack(t)
+
+	homedecor.register("table"..suffix, {
+		description = desc,
+		tiles = { texture },
+		node_box = {
+			type = "fixed",
+			fixed = {
+				{ -0.4, -0.5, -0.4, -0.3,  0.4, -0.3 },
+				{  0.3, -0.5, -0.4,  0.4,  0.4, -0.3 },
+				{ -0.4, -0.5,  0.3, -0.3,  0.4,  0.4 },
+				{  0.3, -0.5,  0.3,  0.4,  0.4,  0.4 },
+				{ -0.5,  0.4, -0.5,  0.5,  0.5,  0.5 },
+				{ -0.4, -0.2, -0.3, -0.3, -0.1,  0.3 },
+				{  0.3, -0.2, -0.4,  0.4, -0.1,  0.3 },
+				{ -0.3, -0.2, -0.4,  0.4, -0.1, -0.3 },
+				{ -0.3, -0.2,  0.3,  0.3, -0.1,  0.4 },
+			},
+		},
+		groups = {snappy=2,choppy=2,oddly_breakable_by_hand=2},
+		sounds = default.node_sound_wood_defaults(),
+	})
 end
 
-homedecor.register("utility_table_legs", {
-	description = S("Legs for Utility Table"),
-	drawtype = "plantlike",
-	tiles = { 'homedecor_utility_table_legs.png' },
-	inventory_image = 'homedecor_utility_table_legs_inv.png',
-	wield_image = 'homedecor_utility_table_legs.png',
-	walkable = false,
-	groups = { snappy = 3 },
-	sounds = default.node_sound_wood_defaults(),
-	selection_box = {
-		type = "fixed",
-		fixed = { -0.37, -0.5, -0.37, 0.37, 0.5, 0.37 }
-	},
-})
-
 -- crafting
 
-
 minetest.register_craft( {
         output = "homedecor:glass_table_small_round_b 15",
         recipe = {
@@ -226,8 +182,6 @@ minetest.register_craft( {
 	}
 })
 
---
-
 minetest.register_craft( {
         output = "homedecor:wood_table_small_round_b 15",
         recipe = {
@@ -305,7 +259,73 @@ minetest.register_craft({
         burntime = 30,
 })
 
+for _, shape in ipairs (table_shapes) do
+	for _, leg in ipairs(leg_materials) do
+		for _, mat in ipairs(tabletop_materials) do
+			minetest.register_craft({
+				output = "homedecor:"..mat[1].."_table_"..shape.."_with_"..leg[1].."_legs",
+				type = "shapeless",
+				recipe = {
+					"homedecor:"..mat[1].."_table_"..shape,
+					"homedecor:table_legs_"..leg[1]
+				},
+			})
+		end
+	end
+end
 
+minetest.register_craft({
+	output = "homedecor:table",
+	recipe = {
+		{ "group:wood","group:wood", "group:wood" },
+		{ "group:stick", "", "group:stick" },
+	},
+})
+
+minetest.register_craft({
+	type = "shapeless",
+	output = "homedecor:table_mahogany",
+	recipe = {
+		"homedecor:table",
+		"dye:brown",
+	},
+})
+
+minetest.register_craft({
+	type = "shapeless",
+	output = "homedecor:table_mahogany",
+	recipe = {
+		"homedecor:table",
+		"unifieddyes:dark_orange",
+	},
+})
+
+minetest.register_craft({
+	type = "shapeless",
+	output = "homedecor:table_white",
+	recipe = {
+		"homedecor:table",
+		"dye:white",
+	},
+})
+
+minetest.register_craft({
+	type = "fuel",
+	recipe = "homedecor:table",
+	burntime = 30,
+})
+
+minetest.register_craft({
+	type = "fuel",
+	recipe = "homedecor:table_mahogany",
+	burntime = 30,
+})
+
+minetest.register_craft({
+	type = "fuel",
+	recipe = "homedecor:table_white",
+	burntime = 30,
+})
 
 -- recycling
 
@@ -368,3 +388,8 @@ minetest.register_craft({
 		"homedecor:wood_table_large"
 	}
 })
+
+-- Aliases for the above 3dforniture-like tables
+
+minetest.register_alias("3dforniture:table", "homedecor:table")
+minetest.register_alias('table', 'homedecor:table')
diff --git a/mods/homedecor_tables/mod.conf b/mods/homedecor_tables/mod.conf
index a652f4c6..32011ac5 100644
--- a/mods/homedecor_tables/mod.conf
+++ b/mods/homedecor_tables/mod.conf
@@ -1,3 +1,4 @@
 name = homedecor_tables
 description = Homedecor mod: tables
 depends = homedecor_common, default, basic_materials
+optional_depends = creative
diff --git a/mods/homedecor_tables/models/homedecor_table_large_square.obj b/mods/homedecor_tables/models/homedecor_table_large_square.obj
new file mode 100644
index 00000000..e570fdd7
--- /dev/null
+++ b/mods/homedecor_tables/models/homedecor_table_large_square.obj
@@ -0,0 +1,107 @@
+# Blender v2.83.5 OBJ File: 'homedecor table with legs.blend'
+# www.blender.org
+o Cube_Cube.001
+v -0.500000 -0.500000 0.500000
+v 0.500000 -0.500000 -0.500000
+v 0.500000 0.500000 0.500000
+v 0.500000 0.500000 -0.500000
+v -0.500000 0.437500 -0.500000
+v -0.353553 -0.500000 0.353554
+v -0.353553 0.437515 0.353554
+v 0.353553 -0.500000 -0.353553
+v 0.353553 0.437515 -0.353553
+v 0.500000 -0.500000 0.500000
+v 0.500000 -0.437500 -0.500000
+v 0.500000 -0.437500 0.500000
+v -0.500000 -0.437500 -0.500000
+v -0.500000 -0.500000 -0.500000
+v -0.500000 -0.437500 0.500000
+v 0.500000 0.437500 -0.500000
+v 0.500000 0.437500 0.500000
+v -0.500000 0.500000 -0.500000
+v -0.500000 0.437500 0.500000
+v -0.500000 0.500000 0.500000
+v 0.353553 -0.500000 0.353554
+v 0.353553 0.437515 0.353554
+v -0.353553 -0.500000 -0.353553
+v -0.353553 0.437515 -0.353553
+vt -0.000000 -0.000000
+vt 1.000000 -0.000000
+vt 1.000000 0.500000
+vt -0.000000 0.500000
+vt 1.000000 1.000000
+vt -0.000000 1.000000
+vt -0.000000 0.500000
+vt 1.000000 0.500000
+vt -0.000000 1.000000
+vt -0.000000 0.937500
+vt 1.000000 0.937500
+vt -0.000000 0.937500
+vt 1.000000 0.937500
+vt 1.000000 1.000000
+vt 1.000000 1.000000
+vt -0.000000 1.000000
+vt -0.000000 0.937500
+vt 1.000000 0.937500
+vt 1.000000 1.000000
+vt -0.000000 1.000000
+vt -0.000000 0.937500
+vt 1.000000 0.937500
+vt -0.000000 0.500000
+vt 1.000000 0.500000
+vt 1.000000 1.000000
+vt -0.000000 1.000000
+vt 1.000000 -0.000000
+vt 1.000000 0.500000
+vt 0.000000 0.500000
+vt 0.000000 -0.000000
+vt -0.000000 1.000000
+vt -0.000000 0.937500
+vt 1.000000 0.937500
+vt 1.000000 1.000000
+vt -0.000000 1.000000
+vt -0.000000 0.937500
+vt 1.000000 0.937500
+vt 1.000000 0.937500
+vt 1.000000 1.000000
+vt -0.000000 0.937500
+vt -0.000000 1.000000
+vt -0.000000 0.937500
+vt 1.000000 0.937500
+vt 1.000000 1.000000
+vt -0.000000 0.000000
+vt 1.000000 -0.000000
+vt 1.000000 1.000000
+vt 0.000000 1.000000
+vt -0.000000 0.000000
+vt 1.000000 -0.000000
+vt 1.000000 1.000000
+vt 0.000000 1.000000
+vn 0.0000 -1.0000 0.0000
+vn 0.0000 1.0000 0.0000
+vn 1.0000 0.0000 0.0000
+vn -1.0000 0.0000 0.0000
+vn 0.0000 0.0000 1.0000
+vn 0.0000 0.0000 -1.0000
+vn 0.7071 0.0000 -0.7071
+vn 0.7071 0.0000 0.7071
+g Cube_Cube.001_top-bottom
+s off
+f 14/1/1 2/2/1 10/3/1 1/4/1
+f 11/5/2 13/6/2 15/7/2 12/8/2
+g Cube_Cube.001_edges
+f 11/5/3 12/9/3 10/10/3 2/11/3
+f 13/6/4 14/12/4 1/13/4 15/14/4
+f 12/15/5 15/16/5 1/17/5 10/18/5
+f 13/19/6 11/20/6 2/21/6 14/22/6
+g Cube_Cube.001_top-bot_with_legs
+f 20/23/2 3/24/2 4/25/2 18/26/2
+f 16/27/1 17/28/1 19/29/1 5/30/1
+g Cube_Cube.001_edges_with_legs
+f 20/31/5 19/32/5 17/33/5 3/34/5
+f 4/25/3 3/35/3 17/36/3 16/37/3
+f 19/38/4 20/39/4 18/26/4 5/40/4
+f 4/41/6 16/42/6 5/43/6 18/44/6
+g Cube_Cube.001_legs
+f 21/45/7 23/46/7 24/47/7 22/48/7
+f 6/49/8 8/50/8 9/51/8 7/52/8
diff --git a/mods/homedecor_tables/models/homedecor_table_small_round.obj b/mods/homedecor_tables/models/homedecor_table_small_round.obj
index 41bd5e8a..8e7ddeb5 100644
--- a/mods/homedecor_tables/models/homedecor_table_small_round.obj
+++ b/mods/homedecor_tables/models/homedecor_table_small_round.obj
@@ -1,300 +1,1456 @@
-v 0.049 -0.499 -0.498
-v 0.049 -0.453 -0.498
-v 0.145 -0.499 -0.478
-v 0.145 -0.453 -0.478
-v 0.236 -0.499 -0.441
-v 0.236 -0.453 -0.441
-v 0.317 -0.499 -0.387
-v 0.317 -0.453 -0.387
-v 0.387 -0.499 -0.317
-v 0.387 -0.453 -0.317
-v 0.441 -0.499 -0.236
-v 0.441 -0.453 -0.236
-v 0.478 -0.499 -0.145
-v 0.478 -0.453 -0.145
-v 0.498 -0.499 -0.049
-v 0.498 -0.453 -0.049
-v 0.498 -0.499 0.049
-v 0.498 -0.453 0.049
-v 0.478 -0.499 0.145
-v 0.478 -0.453 0.145
-v 0.441 -0.499 0.236
-v 0.441 -0.453 0.236
-v 0.387 -0.499 0.317
-v 0.387 -0.453 0.317
-v 0.317 -0.499 0.387
-v 0.317 -0.453 0.387
-v 0.236 -0.499 0.441
-v 0.236 -0.453 0.441
-v 0.145 -0.499 0.478
-v 0.145 -0.453 0.478
-v 0.049 -0.499 0.498
-v 0.049 -0.453 0.498
-v -0.049 -0.499 0.498
-v -0.049 -0.453 0.498
-v -0.145 -0.499 0.478
-v -0.145 -0.453 0.478
-v -0.236 -0.499 0.441
-v -0.236 -0.453 0.441
-v -0.317 -0.499 0.387
-v -0.317 -0.453 0.387
-v -0.387 -0.499 0.317
-v -0.387 -0.453 0.317
-v -0.441 -0.499 0.236
-v -0.441 -0.453 0.236
-v -0.478 -0.499 0.145
-v -0.478 -0.453 0.145
-v -0.498 -0.499 0.049
-v -0.498 -0.453 0.049
-v -0.498 -0.499 -0.049
-v -0.498 -0.453 -0.049
-v -0.478 -0.499 -0.145
-v -0.478 -0.453 -0.145
-v -0.441 -0.499 -0.236
-v -0.441 -0.453 -0.236
-v -0.387 -0.499 -0.317
-v -0.387 -0.453 -0.317
-v -0.317 -0.499 -0.387
-v -0.317 -0.453 -0.387
-v -0.236 -0.499 -0.441
-v -0.236 -0.453 -0.441
-v -0.145 -0.499 -0.478
-v -0.145 -0.453 -0.478
-v -0.049 -0.499 -0.498
-v -0.049 -0.453 -0.498
-v 0.046 -0.437 -0.469
-v 0.137 -0.437 -0.451
-v 0.222 -0.437 -0.416
-v 0.299 -0.437 -0.364
-v 0.364 -0.437 -0.299
-v 0.416 -0.437 -0.222
-v 0.451 -0.437 -0.137
-v 0.469 -0.437 -0.046
-v 0.469 -0.437 0.046
-v 0.451 -0.437 0.137
-v 0.416 -0.437 0.222
-v 0.364 -0.437 0.299
-v 0.299 -0.437 0.364
-v 0.222 -0.437 0.416
-v 0.137 -0.437 0.451
-v 0.046 -0.437 0.469
-v -0.046 -0.437 0.469
-v -0.137 -0.437 0.451
-v -0.222 -0.437 0.416
-v -0.299 -0.437 0.364
-v -0.364 -0.437 0.299
-v -0.416 -0.437 0.222
-v -0.451 -0.437 0.137
-v -0.469 -0.437 0.046
-v -0.469 -0.437 -0.046
-v -0.451 -0.437 -0.137
-v -0.416 -0.437 -0.222
-v -0.364 -0.437 -0.299
-v -0.299 -0.437 -0.364
-v -0.222 -0.437 -0.416
-v -0.137 -0.437 -0.451
-v -0.046 -0.437 -0.469
-vt 0.277 0.123
-vt 0.277 0.096
-vt 0.333 0.096
-vt 0.333 0.123
-vt 0.389 0.096
-vt 0.389 0.123
-vt 0.444 0.096
-vt 0.444 0.123
-vt 0.5 0.096
-vt 0.5 0.123
-vt 0.556 0.096
-vt 0.556 0.123
-vt 0.611 0.096
-vt 0.611 0.123
-vt 0.667 0.096
-vt 0.667 0.123
-vt 0.723 0.096
-vt 0.723 0.123
-vt 0.277 0.404
-vt 0.277 0.377
-vt 0.333 0.377
-vt 0.333 0.404
-vt 0.389 0.377
-vt 0.389 0.404
-vt 0.444 0.377
-vt 0.444 0.404
-vt 0.5 0.377
-vt 0.5 0.404
-vt 0.556 0.377
-vt 0.556 0.404
-vt 0.611 0.377
-vt 0.611 0.404
-vt 0.667 0.377
-vt 0.667 0.404
-vt 0.723 0.377
-vt 0.723 0.404
-vt 0.277 0.311
-vt 0.277 0.283
-vt 0.333 0.283
-vt 0.333 0.311
-vt 0.389 0.283
-vt 0.389 0.311
-vt 0.444 0.283
-vt 0.444 0.311
-vt 0.5 0.283
-vt 0.5 0.311
-vt 0.556 0.283
-vt 0.556 0.311
-vt 0.611 0.283
-vt 0.611 0.311
-vt 0.667 0.283
-vt 0.667 0.311
-vt 0.723 0.283
-vt 0.723 0.311
-vt 0.277 0.217
-vt 0.277 0.189
-vt 0.333 0.189
-vt 0.333 0.217
-vt 0.389 0.189
-vt 0.389 0.217
-vt 0.444 0.189
-vt 0.444 0.217
-vt 0.5 0.189
-vt 0.5 0.217
-vt 0.556 0.189
-vt 0.556 0.217
-vt 0.611 0.189
-vt 0.611 0.217
-vt 0.667 0.217
-vt 0.667 0.189
-vt 0.723 0.189
-vt 0.723 0.217
-vt 0.728 0.526
-vt 0.685 0.535
-vt 0.644 0.552
-vt 0.607 0.576
-vt 0.576 0.607
-vt 0.552 0.644
-vt 0.535 0.685
-vt 0.526 0.728
-vt 0.526 0.772
-vt 0.535 0.815
-vt 0.552 0.856
-vt 0.576 0.893
-vt 0.607 0.924
-vt 0.644 0.948
-vt 0.685 0.965
-vt 0.728 0.974
-vt 0.772 0.974
-vt 0.815 0.965
-vt 0.856 0.948
-vt 0.893 0.924
-vt 0.924 0.893
-vt 0.948 0.856
-vt 0.965 0.815
-vt 0.974 0.772
-vt 0.974 0.728
-vt 0.965 0.685
-vt 0.948 0.644
-vt 0.924 0.607
-vt 0.893 0.576
-vt 0.856 0.552
-vt 0.815 0.535
-vt 0.772 0.526
-vt 0.192 0.558
-vt 0.23 0.551
-vt 0.27 0.551
-vt 0.308 0.558
-vt 0.344 0.573
-vt 0.377 0.595
-vt 0.405 0.623
-vt 0.427 0.656
-vt 0.442 0.692
-vt 0.449 0.73
-vt 0.449 0.77
-vt 0.442 0.808
-vt 0.427 0.844
-vt 0.405 0.877
-vt 0.377 0.905
-vt 0.344 0.927
-vt 0.308 0.942
-vt 0.27 0.949
-vt 0.23 0.949
-vt 0.192 0.942
-vt 0.156 0.927
-vt 0.123 0.905
-vt 0.095 0.877
-vt 0.073 0.844
-vt 0.058 0.808
-vt 0.051 0.77
-vt 0.051 0.73
-vt 0.058 0.692
-vt 0.073 0.656
-vt 0.095 0.623
-vt 0.123 0.595
-vt 0.156 0.573
-g 1
+# Blender v2.83.5 OBJ File: 'homedecor round table with legs.blend'
+# www.blender.org
+o Cube_Cube.001
+v 0.277785 -0.500000 -0.415735
+v -0.500000 -0.468750 0.000000
+v 0.277785 0.468750 0.415735
+v -0.500000 -0.500000 0.000000
+v 0.317196 0.468750 0.386505
+v 0.497592 -0.500000 -0.049009
+v 0.297348 0.500000 0.362320
+v 0.490393 -0.500000 -0.097545
+v 0.235698 -0.500000 -0.440961
+v 0.353553 0.468750 0.353554
+v 0.478470 -0.500000 -0.145142
+v -0.235699 0.468750 0.440960
+v 0.490393 -0.500000 0.097545
+v 0.478470 -0.500000 0.145142
+v 0.440961 -0.500000 0.235699
+v -0.277786 0.468750 0.415735
+v 0.461940 -0.500000 0.191342
+v -0.317197 0.468750 0.386505
+v 0.497592 -0.500000 0.049009
+v -0.297348 0.500000 0.362319
+v 0.461940 -0.500000 -0.191342
+v 0.145142 -0.500000 -0.478470
+v 0.317197 0.468750 -0.386505
+v -0.277786 -0.500000 -0.415734
+v 0.353553 0.468750 -0.353553
+v 0.191342 -0.500000 -0.461940
+v 0.331430 0.500000 -0.331430
+v 0.500000 -0.500000 0.000000
+v -0.490393 0.468750 0.097545
+v -0.497592 -0.500000 0.049009
+v -0.459706 0.500000 0.091441
+v 0.415735 -0.500000 0.277785
+v 0.386505 -0.500000 0.317197
+v -0.461940 0.468750 0.191342
+v -0.415735 -0.500000 -0.277784
+v -0.440961 -0.500000 -0.235698
+v -0.440961 0.468750 0.235698
+v -0.490393 -0.500000 -0.097545
+v -0.386506 -0.500000 -0.317196
+v 0.145142 0.468750 0.478470
+v -0.353554 -0.500000 -0.353553
+v 0.191341 0.468750 0.461940
+v -0.317198 -0.500000 -0.386505
+v 0.179368 0.500000 0.433034
+v -0.191343 -0.500000 -0.461939
+v 0.220949 0.500000 0.413367
+v -0.235700 -0.500000 -0.440960
+v 0.235698 0.468750 0.440961
+v -0.461940 -0.500000 -0.191341
+v -0.478470 -0.500000 -0.145142
+v 0.097545 0.468750 0.490393
+v -0.497592 -0.500000 -0.049008
+v -0.191342 0.468750 0.461940
+v -0.097547 -0.500000 -0.490392
+v -0.179369 0.500000 0.433034
+v -0.145144 -0.500000 -0.478470
+v -0.049010 -0.500000 -0.497592
+v -0.097546 0.468750 0.490393
+v 0.000000 -0.500000 -0.500000
+v -0.478470 0.468750 0.145142
+v -0.386506 -0.500000 0.317196
+v -0.415735 -0.500000 0.277785
+v -0.145143 0.468750 0.478470
+v 0.049008 -0.500000 0.497592
+v -0.000000 -0.500000 0.500000
+v 0.362320 0.500000 -0.297348
+v -0.353554 -0.500000 0.353553
+v 0.386505 0.468750 -0.317197
+v -0.049009 -0.500000 0.497592
+v 0.389720 0.500000 -0.260403
+v 0.049009 -0.500000 -0.497592
+v 0.415735 0.468750 -0.277785
+v 0.097545 -0.500000 -0.490393
+v 0.440961 -0.500000 -0.235698
+v 0.440961 0.468750 -0.235698
+v 0.415735 -0.500000 -0.277785
+v 0.097545 0.468750 -0.490393
+v 0.386505 -0.500000 -0.317197
+v 0.091441 0.500000 -0.459706
+v -0.145143 -0.500000 0.478470
+v -0.478470 -0.500000 0.145142
+v 0.049009 0.468750 -0.497592
+v -0.097546 -0.500000 0.490393
+v -0.049009 0.468750 0.497592
+v -0.191342 -0.500000 0.461940
+v -0.045942 0.500000 0.466455
+v 0.097545 -0.500000 0.490393
+v 0.235698 -0.500000 0.440961
+v -0.353554 0.468750 0.353553
+v 0.191341 -0.500000 0.461940
+v -0.000000 0.468750 0.500000
+v 0.145142 -0.500000 0.478470
+v -0.440961 -0.500000 0.235698
+v -0.461940 -0.500000 0.191342
+v 0.049008 0.468750 0.497592
+v -0.490393 -0.500000 0.097545
+v -0.415735 0.468750 0.277785
+v 0.353553 -0.500000 -0.353553
+v -0.389720 0.500000 0.260402
+v 0.317197 -0.500000 -0.386505
+v -0.317197 -0.500000 0.386505
+v -0.386506 0.468750 0.317196
+v -0.277786 -0.500000 0.415735
+v 0.000000 0.468750 -0.500000
+v -0.235699 -0.500000 0.440960
+v 0.353553 -0.500000 0.353554
+v -0.045943 0.500000 -0.466455
+v 0.317196 -0.500000 0.386505
+v -0.049010 0.468750 -0.497592
+v 0.277785 -0.500000 0.415735
+v -0.136061 0.500000 -0.448529
+v 0.277785 0.437500 0.415735
+v -0.145144 0.468750 -0.478470
+v -0.500000 0.437500 0.000000
+v -0.097547 0.468750 -0.490392
+v -0.091443 0.500000 -0.459706
+v 0.490393 0.437500 -0.097545
+v -0.497592 0.468750 -0.049008
+v 0.478470 0.437500 -0.145142
+v -0.478470 0.468750 -0.145142
+v -0.461940 0.468750 -0.191341
+v 0.440961 0.437500 0.235699
+v -0.433034 0.500000 -0.179368
+v 0.461940 0.437500 0.191342
+v 0.497592 0.437500 0.049009
+v -0.235700 0.468750 -0.440960
+v -0.191343 0.468750 -0.461939
+v 0.145142 0.437500 -0.478470
+v -0.179370 0.500000 -0.433033
+v -0.297349 0.500000 -0.362319
+v 0.191342 0.437500 -0.461940
+v -0.317198 0.468750 -0.386505
+v 0.500000 0.437500 0.000000
+v -0.353554 0.468750 -0.353553
+v -0.331430 0.500000 -0.331429
+v 0.415735 0.437500 0.277785
+v -0.386506 0.468750 -0.317196
+v -0.415735 0.437500 -0.277784
+v -0.490393 0.468750 -0.097545
+v -0.440961 0.468750 -0.235698
+v -0.415735 0.468750 -0.277784
+v -0.389720 0.500000 -0.260402
+v 0.386505 0.468750 0.317197
+v 0.362319 0.500000 0.297348
+v -0.461940 0.437500 -0.191341
+v 0.415735 0.468750 0.277785
+v -0.478470 0.437500 -0.145142
+v 0.389720 0.500000 0.260403
+v -0.497592 0.437500 -0.049008
+v -0.466455 0.500000 0.045942
+v -0.497592 0.468750 0.049009
+v 0.500000 0.468750 0.000000
+v -0.049010 0.437500 -0.497592
+v 0.468712 0.500000 0.000000
+v 0.000000 0.437500 -0.500000
+v 0.179368 0.500000 -0.433034
+v -0.386506 0.437500 0.317196
+v 0.191342 0.468750 -0.461940
+v -0.415735 0.437500 0.277785
+v -0.277786 0.468750 -0.415734
+v -0.260403 0.500000 -0.389720
+v -0.000000 0.437500 0.500000
+v 0.136060 0.500000 -0.448530
+v 0.145142 0.468750 -0.478470
+v -0.049009 0.437500 0.497592
+v 0.461940 0.468750 -0.191342
+v 0.049009 0.437500 -0.497592
+v 0.097545 0.437500 -0.490393
+v 0.497592 0.468750 0.049009
+v 0.415735 0.437500 -0.277785
+v 0.433034 0.500000 0.179369
+v 0.386505 0.437500 -0.317197
+v 0.461940 0.468750 0.191342
+v 0.440961 0.468750 0.235699
+v 0.478470 0.468750 0.145142
+v -0.191342 0.437500 0.461940
+v 0.459706 0.500000 0.091441
+v 0.490393 0.468750 0.097545
+v 0.448530 0.500000 -0.136060
+v 0.478470 0.468750 -0.145142
+v -0.440961 0.437500 0.235698
+v 0.235698 0.468750 -0.440961
+v 0.490393 0.468750 -0.097545
+v 0.317197 0.437500 -0.386505
+v 0.497592 0.468750 -0.049009
+v -0.317197 0.437500 0.386505
+v 0.466455 0.500000 -0.045942
+v -0.500000 0.468750 0.000000
+v -0.235699 0.437500 0.440960
+v 0.277785 0.468750 -0.415735
+v 0.260403 0.500000 -0.389720
+v 0.260403 -0.437500 -0.389720
+v 0.277785 -0.468750 -0.415735
+v -0.468712 -0.437500 0.000000
+v 0.466455 -0.437500 -0.045942
+v 0.497592 -0.468750 -0.049009
+v 0.490393 -0.468750 -0.097545
+v 0.459706 -0.437500 -0.091441
+v 0.235698 -0.468750 -0.440961
+v 0.220950 -0.437500 -0.413367
+v 0.478470 -0.468750 -0.145142
+v 0.448530 -0.437500 -0.136060
+v 0.490393 -0.468750 0.097545
+v 0.459706 -0.437500 0.091441
+v 0.448530 -0.437500 0.136060
+v 0.478470 -0.468750 0.145142
+v 0.413367 -0.437500 0.220949
+v 0.440961 -0.468750 0.235699
+v 0.461940 -0.468750 0.191342
+v 0.433034 -0.437500 0.179369
+v 0.497592 -0.468750 0.049009
+v 0.466455 -0.437500 0.045942
+v 0.433034 -0.437500 -0.179368
+v 0.461940 -0.468750 -0.191342
+v 0.145142 -0.468750 -0.478470
+v 0.136060 -0.437500 -0.448530
+v -0.260403 -0.437500 -0.389720
+v -0.277786 -0.468750 -0.415734
+v 0.191342 -0.468750 -0.461940
+v 0.179368 -0.437500 -0.433034
+v 0.468712 -0.437500 0.000000
+v 0.500000 -0.468750 0.000000
+v -0.497592 -0.468750 0.049009
+v -0.466455 -0.437500 0.045942
+v 0.389720 -0.437500 0.260403
+v 0.415735 -0.468750 0.277785
+v 0.362319 -0.437500 0.297348
+v 0.386505 -0.468750 0.317197
+v -0.389720 -0.437500 -0.260402
+v -0.415735 -0.468750 -0.277784
+v -0.440961 -0.468750 -0.235698
+v -0.413368 -0.437500 -0.220949
+v -0.459706 -0.437500 -0.091441
+v -0.490393 -0.468750 -0.097545
+v -0.362320 -0.437500 -0.297347
+v -0.386506 -0.468750 -0.317196
+v -0.331430 -0.437500 -0.331429
+v -0.353554 -0.468750 -0.353553
+v -0.317198 -0.468750 -0.386505
+v -0.297349 -0.437500 -0.362319
+v -0.179370 -0.437500 -0.433033
+v -0.191343 -0.468750 -0.461939
+v -0.235700 -0.468750 -0.440960
+v -0.220951 -0.437500 -0.413367
+v -0.433034 -0.437500 -0.179368
+v -0.461940 -0.468750 -0.191341
+v -0.478470 -0.468750 -0.145142
+v -0.448530 -0.437500 -0.136059
+v -0.497592 -0.468750 -0.049008
+v -0.466455 -0.437500 -0.045942
+v -0.091443 -0.437500 -0.459706
+v -0.097547 -0.468750 -0.490392
+v -0.145144 -0.468750 -0.478470
+v -0.136061 -0.437500 -0.448529
+v -0.049010 -0.468750 -0.497592
+v -0.045943 -0.437500 -0.466455
+v -0.000000 -0.437500 -0.468712
+v 0.000000 -0.468750 -0.500000
+v -0.386506 -0.468750 0.317196
+v -0.362320 -0.437500 0.297348
+v -0.389720 -0.437500 0.260402
+v -0.415735 -0.468750 0.277785
+v 0.049008 -0.468750 0.497592
+v 0.045942 -0.437500 0.466455
+v -0.000000 -0.437500 0.468712
+v -0.000000 -0.468750 0.500000
+v -0.353554 -0.468750 0.353553
+v -0.331430 -0.437500 0.331429
+v -0.045942 -0.437500 0.466455
+v -0.049009 -0.468750 0.497592
+v 0.049009 -0.468750 -0.497592
+v 0.045942 -0.437500 -0.466455
+v 0.091441 -0.437500 -0.459706
+v 0.097545 -0.468750 -0.490393
+v 0.440961 -0.468750 -0.235698
+v 0.413367 -0.437500 -0.220950
+v 0.415735 -0.468750 -0.277785
+v 0.389720 -0.437500 -0.260403
+v 0.386505 -0.468750 -0.317197
+v 0.362320 -0.437500 -0.297348
+v -0.136061 -0.437500 0.448530
+v -0.145143 -0.468750 0.478470
+v -0.448530 -0.437500 0.136060
+v -0.478470 -0.468750 0.145142
+v -0.097546 -0.468750 0.490393
+v -0.091442 -0.437500 0.459706
+v -0.179369 -0.437500 0.433034
+v -0.191342 -0.468750 0.461940
+v 0.097545 -0.468750 0.490393
+v 0.091441 -0.437500 0.459706
+v 0.235698 -0.468750 0.440961
+v 0.220949 -0.437500 0.413367
+v 0.179368 -0.437500 0.433034
+v 0.191341 -0.468750 0.461940
+v 0.145142 -0.468750 0.478470
+v 0.136060 -0.437500 0.448530
+v -0.440961 -0.468750 0.235698
+v -0.413368 -0.437500 0.220949
+v -0.461940 -0.468750 0.191342
+v -0.433034 -0.437500 0.179369
+v -0.459706 -0.437500 0.091441
+v -0.490393 -0.468750 0.097545
+v 0.331430 -0.437500 -0.331430
+v 0.353553 -0.468750 -0.353553
+v 0.317197 -0.468750 -0.386505
+v 0.297348 -0.437500 -0.362319
+v -0.297348 -0.437500 0.362319
+v -0.317197 -0.468750 0.386505
+v -0.277786 -0.468750 0.415735
+v -0.260403 -0.437500 0.389720
+v -0.220950 -0.437500 0.413367
+v -0.235699 -0.468750 0.440960
+v 0.353553 -0.468750 0.353554
+v 0.331430 -0.437500 0.331430
+v 0.297348 -0.437500 0.362320
+v 0.317196 -0.468750 0.386505
+v 0.277785 -0.468750 0.415735
+v 0.260403 -0.437500 0.389720
+v 0.317196 0.437500 0.386505
+v -0.468712 0.500000 0.000000
+v 0.353553 0.437500 0.353554
+v -0.277786 0.437500 0.415735
+v 0.459706 0.500000 -0.091441
+v 0.220950 0.500000 -0.413367
+v 0.353553 0.437500 -0.353553
+v 0.448530 0.500000 0.136060
+v -0.490393 0.437500 0.097545
+v 0.413367 0.500000 0.220949
+v -0.461940 0.437500 0.191342
+v 0.145142 0.437500 0.478470
+v 0.466455 0.500000 0.045942
+v 0.433034 0.500000 -0.179368
+v 0.191341 0.437500 0.461940
+v 0.235698 0.437500 0.440961
+v 0.097545 0.437500 0.490393
+v -0.097546 0.437500 0.490393
+v -0.478470 0.437500 0.145142
+v -0.145143 0.437500 0.478470
+v 0.440961 0.437500 -0.235698
+v -0.413368 0.500000 -0.220949
+v -0.459706 0.500000 -0.091441
+v -0.362320 0.500000 -0.297347
+v -0.353554 0.437500 0.353553
+v 0.049008 0.437500 0.497592
+v -0.220951 0.500000 -0.413367
+v -0.448530 0.500000 -0.136059
+v -0.466455 0.500000 -0.045942
+v -0.145144 0.437500 -0.478470
+v -0.097547 0.437500 -0.490392
+v -0.000000 0.500000 -0.468712
+v -0.362320 0.500000 0.297348
+v -0.235700 0.437500 -0.440960
+v 0.045942 0.500000 0.466455
+v -0.000000 0.500000 0.468712
+v -0.191343 0.437500 -0.461939
+v -0.317198 0.437500 -0.386505
+v -0.331430 0.500000 0.331429
+v -0.353554 0.437500 -0.353553
+v -0.386506 0.437500 -0.317196
+v 0.045942 0.500000 -0.466455
+v -0.490393 0.437500 -0.097545
+v -0.440961 0.437500 -0.235698
+v 0.413367 0.500000 -0.220950
+v 0.386505 0.437500 0.317197
+v -0.136061 0.500000 0.448530
+v -0.448530 0.500000 0.136060
+v -0.497592 0.437500 0.049009
+v -0.091442 0.500000 0.459706
+v -0.277786 0.437500 -0.415734
+v 0.091441 0.500000 0.459706
+v 0.461940 0.437500 -0.191342
+v 0.136060 0.500000 0.448530
+v -0.413368 0.500000 0.220949
+v -0.433034 0.500000 0.179369
+v 0.478470 0.437500 0.145142
+v 0.490393 0.437500 0.097545
+v 0.297348 0.500000 -0.362319
+v 0.235698 0.437500 -0.440961
+v -0.260403 0.500000 0.389720
+v -0.220950 0.500000 0.413367
+v 0.497592 0.437500 -0.049009
+v 0.331430 0.500000 0.331430
+v 0.277785 0.437500 -0.415735
+v 0.260403 0.500000 0.389720
+v -0.353553 -0.500000 0.353554
+v -0.353553 0.437515 0.353554
+v 0.353553 -0.500000 -0.353553
+v 0.353553 0.437515 -0.353553
+v 0.353553 -0.500000 0.353554
+v 0.353553 0.437515 0.353554
+v -0.353553 -0.500000 -0.353553
+v -0.353553 0.437515 -0.353553
+vt 0.500000 0.000000
+vt 0.549008 0.001204
+vt 0.597545 0.004804
+vt 0.645142 0.010765
+vt 0.691342 0.019030
+vt 0.735698 0.029520
+vt 0.777785 0.042133
+vt 0.817197 0.056747
+vt 0.853553 0.073223
+vt 0.886505 0.091402
+vt 0.915735 0.111107
+vt 0.940961 0.132151
+vt 0.961940 0.154329
+vt 0.978470 0.177429
+vt 0.990393 0.201227
+vt 0.997592 0.225496
+vt 1.000000 0.250000
+vt 0.997592 0.274504
+vt 0.990393 0.298773
+vt 0.978470 0.322571
+vt 0.961940 0.345671
+vt 0.940960 0.367849
+vt 0.915735 0.388893
+vt 0.886505 0.408598
+vt 0.853553 0.426777
+vt 0.817196 0.443253
+vt 0.777785 0.457868
+vt 0.735698 0.470480
+vt 0.691341 0.480970
+vt 0.645142 0.489235
+vt 0.597545 0.495196
+vt 0.549008 0.498796
+vt 0.500000 0.500000
+vt 0.450991 0.498796
+vt 0.402454 0.495196
+vt 0.354857 0.489235
+vt 0.308658 0.480970
+vt 0.264301 0.470480
+vt 0.222215 0.457867
+vt 0.182803 0.443252
+vt 0.146446 0.426776
+vt 0.113495 0.408598
+vt 0.084265 0.388892
+vt 0.059039 0.367849
+vt 0.038060 0.345671
+vt 0.021530 0.322571
+vt 0.009607 0.298773
+vt 0.002408 0.274504
+vt 0.000000 0.250000
+vt 0.002408 0.225496
+vt 0.009607 0.201228
+vt 0.021530 0.177429
+vt 0.038060 0.154329
+vt 0.059039 0.132151
+vt 0.084265 0.111108
+vt 0.113494 0.091402
+vt 0.146446 0.073224
+vt 0.182803 0.056748
+vt 0.222214 0.042133
+vt 0.264300 0.029520
+vt 0.308657 0.019030
+vt 0.354856 0.010765
+vt 0.402453 0.004804
+vt 0.450990 0.001204
+vt 0.454057 0.983227
+vt 0.408557 0.979853
+vt 0.363939 0.974265
+vt 0.320630 0.966516
+vt 0.279049 0.956683
+vt 0.239597 0.944860
+vt 0.202651 0.931159
+vt 0.168569 0.915714
+vt 0.137680 0.898673
+vt 0.110280 0.880201
+vt 0.086632 0.860474
+vt 0.066966 0.839684
+vt 0.051470 0.818030
+vt 0.040294 0.795721
+vt 0.033545 0.772970
+vt 0.031287 0.750000
+vt 0.033545 0.727029
+vt 0.040294 0.704280
+vt 0.051470 0.681970
+vt 0.066967 0.660316
+vt 0.086633 0.639526
+vt 0.110280 0.619799
+vt 0.137680 0.601326
+vt 0.168570 0.584285
+vt 0.202652 0.568840
+vt 0.239597 0.555140
+vt 0.279050 0.543316
+vt 0.320631 0.533483
+vt 0.363939 0.525735
+vt 0.408558 0.520147
+vt 0.454058 0.516772
+vt 0.500000 0.515644
+vt 0.545941 0.516772
+vt 0.591441 0.520147
+vt 0.636059 0.525735
+vt 0.679368 0.533483
+vt 0.720949 0.543316
+vt 0.760403 0.555140
+vt 0.797348 0.568840
+vt 0.831429 0.584285
+vt 0.862319 0.601326
+vt 0.889720 0.619799
+vt 0.913368 0.639525
+vt 0.933034 0.660315
+vt 0.948529 0.681970
+vt 0.959706 0.704280
+vt 0.966455 0.727029
+vt 0.968712 0.750000
+vt 0.966455 0.772971
+vt 0.959706 0.795721
+vt 0.948530 0.818030
+vt 0.933034 0.839684
+vt 0.913367 0.860475
+vt 0.889720 0.880201
+vt 0.862320 0.898674
+vt 0.831430 0.915715
+vt 0.797348 0.931160
+vt 0.760403 0.944860
+vt 0.720950 0.956684
+vt 0.679368 0.966517
+vt 0.636060 0.974265
+vt 0.591441 0.979853
+vt 0.545942 0.983228
+vt 0.500000 0.984356
+vt 0.156250 0.937500
+vt 0.187500 0.937500
+vt 0.187500 0.968750
+vt 0.156250 0.968750
+vt 0.718750 0.937500
+vt 0.750000 0.937500
+vt 0.750000 0.968750
+vt 0.718750 0.968750
+vt 0.031250 0.968750
+vt -0.000000 0.968750
+vt -0.000000 0.937500
+vt 0.031250 0.937500
+vt 0.250000 0.937500
+vt 0.281250 0.937500
+vt 0.281250 0.968750
+vt 0.250000 0.968750
+vt 0.125000 0.937500
+vt 0.125000 0.968750
+vt 0.312500 0.937500
+vt 0.312500 0.968750
+vt 0.031250 0.968750
+vt 0.000000 0.968750
+vt 0.000000 0.937500
+vt 0.031250 0.937500
+vt 0.656250 0.937500
+vt 0.687500 0.937500
+vt 0.687500 0.968750
+vt 0.656250 0.968750
+vt 0.781250 0.937500
+vt 0.812500 0.937500
+vt 0.812500 0.968750
+vt 0.781250 0.968750
+vt 0.406250 0.937500
+vt 0.437500 0.937500
+vt 0.437500 0.968750
+vt 0.406250 0.968750
+vt 0.593750 0.937500
+vt 0.625000 0.937500
+vt 0.625000 0.968750
+vt 0.593750 0.968750
+vt 0.625000 0.937500
+vt 0.625000 0.968750
+vt 0.218750 0.937500
+vt 0.250000 0.937500
+vt 0.250000 0.968750
+vt 0.218750 0.968750
+vt 0.218750 0.937500
+vt 0.218750 0.968750
+vt 0.875000 0.937500
+vt 0.906250 0.937500
+vt 0.906250 0.968750
+vt 0.875000 0.968750
+vt 0.125000 0.937500
+vt 0.156250 0.937500
+vt 0.156250 0.968750
+vt 0.125000 0.968750
+vt 0.062500 0.937500
+vt 0.093750 0.937500
+vt 0.093750 0.968750
+vt 0.062500 0.968750
+vt 0.375000 0.937500
+vt 0.406250 0.937500
+vt 0.406250 0.968750
+vt 0.375000 0.968750
+vt 0.937500 0.937500
+vt 0.968750 0.937500
+vt 0.968750 0.968750
+vt 0.937500 0.968750
+vt 0.343750 0.937500
+vt 0.343750 0.968750
+vt 0.843750 0.937500
+vt 0.843750 0.968750
+vt 0.656250 0.937500
+vt 0.687500 0.937500
+vt 0.687500 0.968750
+vt 0.656250 0.968750
+vt 0.281250 0.937500
+vt 0.312500 0.937500
+vt 0.312500 0.968750
+vt 0.281250 0.968750
+vt 0.500000 0.937500
+vt 0.531250 0.937500
+vt 0.531250 0.968750
+vt 0.500000 0.968750
+vt 0.906250 0.937500
+vt 0.906250 0.968750
+vt 0.718750 0.937500
+vt 0.750000 0.937500
+vt 0.750000 0.968750
+vt 0.718750 0.968750
+vt 0.937500 0.937500
+vt 0.937500 0.968750
+vt 0.843750 0.937500
+vt 0.875000 0.937500
+vt 0.875000 0.968750
+vt 0.843750 0.968750
+vt 0.562500 0.937500
+vt 0.593750 0.937500
+vt 0.593750 0.968750
+vt 0.562500 0.968750
+vt 0.187500 0.937500
+vt 0.187500 0.968750
+vt 0.062500 0.937500
+vt 0.093750 0.937500
+vt 0.093750 0.968750
+vt 0.062500 0.968750
+vt 0.343750 0.937500
+vt 0.343750 0.968750
+vt 0.968750 0.937500
+vt 1.000000 0.937500
+vt 1.000000 0.968750
+vt 0.968750 0.968750
+vt 0.375000 0.937500
+vt 0.375000 0.968750
+vt 0.781250 0.937500
+vt 0.812500 0.937500
+vt 0.812500 0.968750
+vt 0.781250 0.968750
+vt 0.437500 0.937500
+vt 0.437500 0.968750
+vt 0.562500 0.937500
+vt 0.562500 0.968750
+vt 0.531250 0.937500
+vt 0.531250 0.968750
+vt 0.468750 0.937500
+vt 0.468750 0.968750
+vt 0.468750 0.937500
+vt 0.468750 0.968750
+vt 0.500000 0.937500
+vt 0.500000 0.968750
+vt 1.000000 0.937500
+vt 1.000000 0.968750
+vt 0.343750 1.000000
+vt 0.312500 1.000000
+vt 0.062500 1.000000
+vt 0.031250 1.000000
+vt 0.093750 1.000000
+vt 0.375000 1.000000
+vt 0.937500 1.000000
+vt 0.906250 1.000000
+vt 0.875000 1.000000
+vt 0.843750 1.000000
+vt 0.968750 1.000000
+vt 1.000000 1.000000
+vt 0.156250 1.000000
+vt 0.125000 1.000000
+vt 0.718750 1.000000
+vt 0.687500 1.000000
+vt 0.406250 1.000000
+vt 0.031250 1.000000
+vt -0.000000 1.000000
+vt 0.812500 1.000000
+vt 0.000000 1.000000
+vt 0.781250 1.000000
+vt 0.843750 1.000000
+vt 0.812500 1.000000
+vt 0.781250 1.000000
+vt 0.750000 1.000000
+vt 0.656250 1.000000
+vt 0.625000 1.000000
+vt 0.968750 1.000000
+vt 0.937500 1.000000
+vt 0.906250 1.000000
+vt 0.875000 1.000000
+vt 1.000000 1.000000
+vt 0.593750 1.000000
+vt 0.562500 1.000000
+vt 0.531250 1.000000
+vt 0.500000 1.000000
+vt 0.218750 1.000000
+vt 0.187500 1.000000
+vt 0.531250 1.000000
+vt 0.500000 1.000000
+vt 0.250000 1.000000
+vt 0.468750 1.000000
+vt 0.468750 1.000000
+vt 0.437500 1.000000
+vt 0.187500 1.000000
+vt 0.218750 1.000000
+vt 0.437500 1.000000
+vt 0.406250 1.000000
+vt 0.125000 1.000000
+vt 0.093750 1.000000
+vt 0.375000 1.000000
+vt 0.562500 1.000000
+vt 0.656250 1.000000
+vt 0.625000 1.000000
+vt 0.593750 1.000000
+vt 0.156250 1.000000
+vt 0.062500 1.000000
+vt 0.281250 1.000000
+vt 0.250000 1.000000
+vt 0.312500 1.000000
+vt 0.281250 1.000000
+vt 0.343750 1.000000
+vt 0.750000 1.000000
+vt 0.718750 1.000000
+vt 0.687500 1.000000
+vt 0.454057 0.983227
+vt 0.408557 0.979853
+vt 0.363939 0.974265
+vt 0.320630 0.966516
+vt 0.279049 0.956683
+vt 0.239597 0.944860
+vt 0.202651 0.931159
+vt 0.168569 0.915714
+vt 0.137680 0.898673
+vt 0.110280 0.880201
+vt 0.086632 0.860474
+vt 0.066966 0.839684
+vt 0.051470 0.818030
+vt 0.040294 0.795721
+vt 0.033545 0.772970
+vt 0.031287 0.750000
+vt 0.033545 0.727029
+vt 0.040294 0.704280
+vt 0.051470 0.681970
+vt 0.066967 0.660316
+vt 0.086633 0.639526
+vt 0.110280 0.619799
+vt 0.137680 0.601326
+vt 0.168570 0.584285
+vt 0.202652 0.568840
+vt 0.239597 0.555140
+vt 0.279050 0.543316
+vt 0.320631 0.533483
+vt 0.363939 0.525735
+vt 0.408558 0.520147
+vt 0.454058 0.516772
+vt 0.500000 0.515644
+vt 0.545941 0.516772
+vt 0.591441 0.520147
+vt 0.636059 0.525735
+vt 0.679368 0.533483
+vt 0.720949 0.543316
+vt 0.760403 0.555140
+vt 0.797348 0.568840
+vt 0.831429 0.584285
+vt 0.862319 0.601326
+vt 0.889720 0.619799
+vt 0.913368 0.639525
+vt 0.933034 0.660315
+vt 0.948529 0.681970
+vt 0.959706 0.704280
+vt 0.966455 0.727029
+vt 0.968712 0.750000
+vt 0.966455 0.772971
+vt 0.959706 0.795721
+vt 0.948530 0.818030
+vt 0.933034 0.839684
+vt 0.913367 0.860475
+vt 0.889720 0.880201
+vt 0.862320 0.898674
+vt 0.831430 0.915715
+vt 0.797348 0.931160
+vt 0.760403 0.944860
+vt 0.720950 0.956684
+vt 0.679368 0.966517
+vt 0.636060 0.974265
+vt 0.591441 0.979853
+vt 0.545942 0.983228
+vt 0.500000 0.984356
+vt 0.500000 0.000000
+vt 0.549008 0.001204
+vt 0.597545 0.004804
+vt 0.645142 0.010765
+vt 0.691342 0.019030
+vt 0.735698 0.029520
+vt 0.777785 0.042133
+vt 0.817197 0.056747
+vt 0.853553 0.073223
+vt 0.886505 0.091402
+vt 0.915735 0.111107
+vt 0.940961 0.132151
+vt 0.961940 0.154329
+vt 0.978470 0.177429
+vt 0.990393 0.201227
+vt 0.997592 0.225496
+vt 1.000000 0.250000
+vt 0.997592 0.274504
+vt 0.990393 0.298773
+vt 0.978470 0.322571
+vt 0.961940 0.345671
+vt 0.940960 0.367849
+vt 0.915735 0.388893
+vt 0.886505 0.408598
+vt 0.853553 0.426777
+vt 0.817196 0.443253
+vt 0.777785 0.457868
+vt 0.735698 0.470480
+vt 0.691341 0.480970
+vt 0.645142 0.489235
+vt 0.597545 0.495196
+vt 0.549008 0.498796
+vt 0.500000 0.500000
+vt 0.450991 0.498796
+vt 0.402454 0.495196
+vt 0.354857 0.489235
+vt 0.308658 0.480970
+vt 0.264301 0.470480
+vt 0.222215 0.457867
+vt 0.182803 0.443252
+vt 0.146446 0.426776
+vt 0.113495 0.408598
+vt 0.084265 0.388892
+vt 0.059039 0.367849
+vt 0.038060 0.345671
+vt 0.021530 0.322571
+vt 0.009607 0.298773
+vt 0.002408 0.274504
+vt 0.000000 0.250000
+vt 0.002408 0.225496
+vt 0.009607 0.201228
+vt 0.021530 0.177429
+vt 0.038060 0.154329
+vt 0.059039 0.132151
+vt 0.084265 0.111108
+vt 0.113494 0.091402
+vt 0.146446 0.073224
+vt 0.182803 0.056748
+vt 0.222214 0.042133
+vt 0.264300 0.029520
+vt 0.308657 0.019030
+vt 0.354856 0.010765
+vt 0.402453 0.004804
+vt 0.450990 0.001204
+vt 0.687500 0.968750
+vt 0.718750 0.968750
+vt 0.718750 1.000000
+vt 0.687500 1.000000
+vt 0.750000 0.968750
+vt 0.781250 0.968750
+vt 0.781250 1.000000
+vt 0.750000 1.000000
+vt 0.656250 0.968750
+vt 0.656250 1.000000
+vt 0.312500 0.968750
+vt 0.343750 0.968750
+vt 0.343750 1.000000
+vt 0.312500 1.000000
+vt 0.250000 0.968750
+vt 0.281250 0.968750
+vt 0.281250 1.000000
+vt 0.250000 1.000000
+vt 0.375000 0.968750
+vt 0.375000 1.000000
+vt 0.281250 0.968750
+vt 0.312500 0.968750
+vt 0.312500 1.000000
+vt 0.281250 1.000000
+vt 0.218750 0.968750
+vt 0.250000 0.968750
+vt 0.250000 1.000000
+vt 0.218750 1.000000
+vt 0.406250 0.968750
+vt 0.437500 0.968750
+vt 0.437500 1.000000
+vt 0.406250 1.000000
+vt 0.031250 0.968750
+vt 0.062500 0.968750
+vt 0.062500 1.000000
+vt 0.031250 1.000000
+vt 0.156250 0.968750
+vt 0.187500 0.968750
+vt 0.187500 1.000000
+vt 0.156250 1.000000
+vt 0.093750 0.968750
+vt 0.093750 1.000000
+vt 0.125000 0.968750
+vt 0.125000 1.000000
+vt 0.593750 0.968750
+vt 0.625000 0.968750
+vt 0.625000 1.000000
+vt 0.593750 1.000000
+vt 0.562500 0.968750
+vt 0.562500 1.000000
+vt 0.531250 0.968750
+vt 0.531250 1.000000
+vt 0.406250 0.968750
+vt 0.406250 1.000000
+vt 0.437500 0.968750
+vt 0.468750 0.968750
+vt 0.468750 1.000000
+vt 0.437500 1.000000
+vt 0.187500 0.968750
+vt 0.187500 1.000000
+vt 0.468750 0.968750
+vt 0.500000 0.968750
+vt 0.500000 1.000000
+vt 0.468750 1.000000
+vt 0.156250 0.968750
+vt 0.156250 1.000000
+vt 0.500000 0.968750
+vt 0.500000 1.000000
+vt 0.218750 0.968750
+vt 0.218750 1.000000
+vt 0.875000 0.968750
+vt 0.906250 0.968750
+vt 0.906250 1.000000
+vt 0.875000 1.000000
+vt 0.531250 0.968750
+vt 0.562500 0.968750
+vt 0.562500 1.000000
+vt 0.531250 1.000000
+vt 0.593750 0.968750
+vt 0.625000 0.968750
+vt 0.625000 1.000000
+vt 0.593750 1.000000
+vt 0.656250 0.968750
+vt 0.687500 0.968750
+vt 0.687500 1.000000
+vt 0.656250 1.000000
+vt 0.906250 0.968750
+vt 0.937500 0.968750
+vt 0.937500 1.000000
+vt 0.906250 1.000000
+vt 0.843750 0.968750
+vt 0.875000 0.968750
+vt 0.875000 1.000000
+vt 0.843750 1.000000
+vt 0.968750 0.968750
+vt 1.000000 0.968750
+vt 1.000000 1.000000
+vt 0.968750 1.000000
+vt 0.718750 0.968750
+vt 0.750000 0.968750
+vt 0.750000 1.000000
+vt 0.718750 1.000000
+vt 0.781250 0.968750
+vt 0.781250 1.000000
+vt 0.812500 0.968750
+vt 0.812500 1.000000
+vt 0.812500 0.968750
+vt 0.812500 1.000000
+vt 0.000000 0.968750
+vt 0.031250 0.968750
+vt 0.031250 1.000000
+vt 0.000000 1.000000
+vt 0.843750 0.968750
+vt 0.843750 1.000000
+vt -0.000000 1.000000
+vt -0.000000 0.968750
+vt 0.375000 0.968750
+vt 0.375000 1.000000
+vt 0.093750 0.968750
+vt 0.125000 0.968750
+vt 0.125000 1.000000
+vt 0.093750 1.000000
+vt 0.968750 0.968750
+vt 1.000000 0.968750
+vt 1.000000 1.000000
+vt 0.968750 1.000000
+vt 0.937500 0.968750
+vt 0.937500 1.000000
+vt 0.343750 0.968750
+vt 0.343750 1.000000
+vt 0.062500 0.968750
+vt 0.062500 1.000000
+vt 0.625000 0.937500
+vt 0.656250 0.937500
+vt 0.562500 0.937500
+vt 0.593750 0.937500
+vt 0.968750 0.937500
+vt 1.000000 0.937500
+vt 0.500000 0.937500
+vt 0.531250 0.937500
+vt 0.468750 0.937500
+vt 0.812500 0.937500
+vt 0.843750 0.937500
+vt 0.468750 0.937500
+vt 0.500000 0.937500
+vt 0.437500 0.937500
+vt 0.937500 0.937500
+vt 0.968750 0.937500
+vt 0.312500 0.937500
+vt 0.343750 0.937500
+vt 0.687500 0.937500
+vt 0.718750 0.937500
+vt 0.437500 0.937500
+vt 0.562500 0.937500
+vt 0.750000 0.937500
+vt 0.781250 0.937500
+vt 0.593750 0.937500
+vt 0.625000 0.937500
+vt 0.531250 0.937500
+vt 0.343750 0.937500
+vt 0.375000 0.937500
+vt 0.406250 0.937500
+vt 0.687500 0.937500
+vt 0.718750 0.937500
+vt 0.093750 0.937500
+vt 0.125000 0.937500
+vt 0.875000 0.937500
+vt 0.906250 0.937500
+vt 0.406250 0.937500
+vt 0.187500 0.937500
+vt 0.218750 0.937500
+vt 0.093750 0.937500
+vt 0.125000 0.937500
+vt 1.000000 0.937500
+vt 0.312500 0.937500
+vt 0.031250 0.937500
+vt 0.062500 0.937500
+vt 0.156250 0.937500
+vt 0.906250 0.937500
+vt 0.250000 0.937500
+vt 0.281250 0.937500
+vt 0.843750 0.937500
+vt 0.875000 0.937500
+vt 0.937500 0.937500
+vt 0.218750 0.937500
+vt 0.250000 0.937500
+vt 0.812500 0.937500
+vt 0.375000 0.937500
+vt 0.031250 0.937500
+vt 0.062500 0.937500
+vt 0.187500 0.937500
+vt 0.656250 0.937500
+vt 0.750000 0.937500
+vt 0.781250 0.937500
+vt 0.000000 0.937500
+vt 0.281250 0.937500
+vt 0.156250 0.937500
+vt -0.000000 0.937500
+vt -0.000000 0.000000
+vt 1.000000 -0.000000
+vt 1.000000 1.000000
+vt 0.000000 1.000000
+vt -0.000000 0.000000
+vt 1.000000 -0.000000
+vt 1.000000 1.000000
+vt 0.000000 1.000000
+vn 0.0000 -1.0000 0.0000
+vn 0.0000 1.0000 -0.0000
+vn -0.8577 0.0000 0.5141
+vn 0.6716 0.0000 0.7410
+vn -0.9988 0.0000 0.0491
+vn -0.6716 -0.0000 0.7410
+vn -0.9040 0.0000 0.4276
+vn -0.5957 0.0000 0.8032
+vn 0.9988 0.0000 -0.0491
+vn 0.5141 0.0000 0.8577
+vn 0.8032 0.0000 0.5957
+vn 0.7410 0.0000 0.6716
+vn 0.2430 0.0000 -0.9700
+vn -0.3369 -0.0000 -0.9415
+vn 0.4276 0.0000 0.9040
+vn 0.7410 0.0000 -0.6716
+vn -0.8032 0.0000 0.5957
+vn 0.9415 0.0000 0.3369
+vn 0.9040 0.0000 -0.4276
+vn 0.9700 0.0000 -0.2430
+vn -0.3369 0.0000 0.9415
+vn 0.9892 0.0000 -0.1467
+vn -0.9892 0.0000 -0.1467
+vn -0.4276 0.0000 0.9040
+vn 0.8577 -0.0000 0.5141
+vn -0.5141 0.0000 -0.8577
+vn 0.5957 0.0000 -0.8032
+vn -0.0491 0.0000 -0.9988
+vn -0.7410 -0.0000 0.6716
+vn -0.9700 0.0000 -0.2430
+vn 0.9040 -0.0000 0.4276
+vn -0.6716 0.0000 -0.7409
+vn 0.6716 -0.0000 -0.7410
+vn 0.9700 -0.0000 0.2430
+vn -0.9040 0.0000 -0.4276
+vn 0.2430 0.0000 0.9700
+vn 0.8577 0.0000 -0.5141
+vn -0.9700 0.0000 0.2430
+vn -0.9892 0.0000 0.1467
+vn 0.5141 0.0000 -0.8577
+vn 0.9988 0.0000 0.0491
+vn 0.9415 0.0000 -0.3369
+vn 0.8032 0.0000 -0.5957
+vn 0.3369 0.0000 -0.9415
+vn -0.9415 0.0000 -0.3369
+vn -0.9415 0.0000 0.3369
+vn -0.8032 0.0000 -0.5957
+vn 0.5957 0.0000 0.8032
+vn -0.2430 0.0000 0.9700
+vn 0.4276 0.0000 -0.9040
+vn -0.1467 0.0000 -0.9892
+vn 0.3369 0.0000 0.9415
+vn -0.7410 0.0000 -0.6716
+vn 0.1467 0.0000 0.9892
+vn 0.1467 0.0000 -0.9892
+vn -0.5957 0.0000 -0.8032
+vn -0.5141 0.0000 0.8577
+vn 0.9892 0.0000 0.1467
+vn -0.1467 0.0000 0.9892
+vn 0.0491 0.0000 -0.9988
+vn -0.8577 0.0000 -0.5141
+vn -0.0491 0.0000 0.9988
+vn 0.0491 -0.0000 0.9988
+vn -0.9988 0.0000 -0.0491
+vn -0.2430 -0.0000 -0.9700
+vn -0.4276 0.0000 -0.9040
+vn 0.3635 0.7071 -0.6065
+vn 0.6995 0.7071 -0.1038
+vn 0.6859 0.7071 -0.1718
+vn 0.3023 0.7071 -0.6392
+vn 0.6859 0.7071 0.1718
+vn 0.6392 0.7071 0.3023
+vn 0.6995 0.7071 0.1038
+vn 0.7063 0.7071 0.0347
+vn 0.6392 0.7071 -0.3023
+vn -0.4212 0.7071 -0.5680
+vn 0.6658 0.7071 -0.2382
+vn 0.2382 0.7071 -0.6658
+vn -0.7063 0.7071 0.0347
+vn 0.6065 0.7071 0.3635
+vn 0.7063 0.7071 -0.0347
+vn 0.5680 0.7071 0.4212
+vn -0.6065 0.7071 -0.3635
+vn -0.5680 0.7071 -0.4212
+vn -0.5239 0.7071 -0.4749
+vn -0.4749 0.7071 -0.5239
+vn -0.3023 0.7071 -0.6392
+vn -0.6995 0.7071 -0.1038
+vn -0.6658 0.7071 -0.2382
+vn -0.7063 0.7071 -0.0347
+vn -0.6392 0.7071 -0.3023
+vn -0.6859 0.7071 -0.1718
+vn -0.1718 0.7071 -0.6859
+vn -0.3635 0.7071 -0.6065
+vn -0.2382 0.7071 -0.6658
+vn -0.0347 0.7071 -0.7063
+vn -0.1038 0.7071 -0.6995
+vn 0.6658 0.7071 0.2382
+vn -0.5680 0.7071 0.4212
+vn 0.0347 0.7071 0.7063
+vn -0.5239 0.7071 0.4749
+vn -0.0347 0.7071 0.7063
+vn 0.1038 0.7071 -0.6995
+vn 0.6065 0.7071 -0.3635
+vn 0.0347 0.7071 -0.7063
+vn 0.5680 0.7071 -0.4212
+vn -0.1718 0.7071 0.6859
+vn -0.6658 0.7071 0.2382
+vn -0.1038 0.7071 0.6995
+vn -0.2382 0.7071 0.6658
+vn 0.1038 0.7071 0.6995
+vn 0.3023 0.7071 0.6392
+vn 0.1718 0.7071 0.6859
+vn 0.2382 0.7071 0.6658
+vn -0.6392 0.7071 0.3023
+vn -0.6859 0.7071 0.1718
+vn -0.6065 0.7071 0.3635
+vn -0.6995 0.7071 0.1038
+vn 0.4749 0.7071 -0.5239
+vn 0.1718 0.7071 -0.6859
+vn 0.5239 0.7071 -0.4749
+vn 0.4212 0.7071 -0.5680
+vn -0.4212 0.7071 0.5680
+vn -0.3023 0.7071 0.6392
+vn -0.4749 0.7071 0.5239
+vn -0.3635 0.7071 0.6065
+vn 0.4749 0.7071 0.5239
+vn 0.3635 0.7071 0.6065
+vn 0.5239 0.7071 0.4749
+vn 0.4212 0.7071 0.5680
+vn -0.6716 0.0000 -0.7410
+vn 0.7071 0.0000 -0.7071
+vn 0.7071 0.0000 0.7071
+g Cube_Cube.001_top-bottom
 s off
-f 1/1 2/2 4/3 3/4
-f 3/4 4/3 6/5 5/6
-f 5/6 6/5 8/7 7/8
-f 7/8 8/7 10/9 9/10
-f 9/10 10/9 12/11 11/12
-f 11/12 12/11 14/13 13/14
-f 13/14 14/13 16/15 15/16
-f 15/16 16/15 18/17 17/18
-f 17/19 18/20 20/21 19/22
-f 19/22 20/21 22/23 21/24
-f 21/24 22/23 24/25 23/26
-f 23/26 24/25 26/27 25/28
-f 25/28 26/27 28/29 27/30
-f 27/30 28/29 30/31 29/32
-f 29/32 30/31 32/33 31/34
-f 31/34 32/33 34/35 33/36
-f 33/37 34/38 36/39 35/40
-f 35/40 36/39 38/41 37/42
-f 37/42 38/41 40/43 39/44
-f 39/44 40/43 42/45 41/46
-f 41/46 42/45 44/47 43/48
-f 43/48 44/47 46/49 45/50
-f 45/50 46/49 48/51 47/52
-f 47/52 48/51 50/53 49/54
-f 49/55 50/56 52/57 51/58
-f 51/58 52/57 54/59 53/60
-f 53/60 54/59 56/61 55/62
-f 55/62 56/61 58/63 57/64
-f 57/64 58/63 60/65 59/66
-f 59/66 60/65 62/67 61/68
-f 54/59 52/57 90/57 91/59
-f 63/69 64/70 2/71 1/72
-f 61/68 62/67 64/70 63/69
-f 1/73 3/74 5/75 7/76 9/77 11/78 13/79 15/80 17/81 19/82 21/83 23/84 25/85 27/86 29/87 31/88 33/89 35/90 37/91 39/92 41/93 43/94 45/95 47/96 49/97 51/98 53/99 55/100 57/101 59/102 61/103 63/104
-f 66/105 65/106 96/107 95/108 94/109 93/110 92/111 91/112 90/113 89/114 88/115 87/116 86/117 85/118 84/119 83/120 82/121 81/122 80/123 79/124 78/125 77/126 76/127 75/128 74/129 73/130 72/131 71/132 70/133 69/134 68/135 67/136
-f 10/9 8/7 68/7 69/9
-f 32/33 30/31 79/31 80/33
-f 60/65 58/63 93/63 94/65
-f 38/41 36/39 82/39 83/41
-f 16/15 14/13 71/13 72/15
-f 2/71 64/70 96/70 65/71
-f 44/47 42/45 85/45 86/47
-f 22/23 20/21 74/21 75/23
-f 50/53 48/51 88/51 89/53
-f 6/5 4/3 66/3 67/5
-f 28/29 26/27 77/27 78/29
-f 56/61 54/59 91/59 92/61
-f 12/11 10/9 69/9 70/11
-f 34/35 32/33 80/33 81/35
-f 62/67 60/65 94/65 95/67
-f 40/43 38/41 83/41 84/43
-f 4/3 2/2 65/2 66/3
-f 18/17 16/15 72/15 73/17
-f 46/49 44/47 86/47 87/49
-f 24/25 22/23 75/23 76/25
-f 52/57 50/56 89/56 90/57
-f 8/7 6/5 67/5 68/7
-f 30/31 28/29 78/29 79/31
-f 58/63 56/61 92/61 93/63
-f 36/39 34/38 81/38 82/39
-f 14/13 12/11 70/11 71/13
-f 64/70 62/67 95/67 96/70
-f 42/45 40/43 84/43 85/45
-f 20/21 18/20 73/20 74/21
-f 48/51 46/49 87/49 88/51
-f 26/27 24/25 76/25 77/27
+f 59/1/1 71/2/1 73/3/1 22/4/1 26/5/1 9/6/1 1/7/1 100/8/1 98/9/1 78/10/1 76/11/1 74/12/1 21/13/1 11/14/1 8/15/1 6/16/1 28/17/1 19/18/1 13/19/1 14/20/1 17/21/1 15/22/1 32/23/1 33/24/1 106/25/1 108/26/1 110/27/1 88/28/1 90/29/1 92/30/1 87/31/1 64/32/1 65/33/1 69/34/1 83/35/1 80/36/1 85/37/1 105/38/1 103/39/1 101/40/1 67/41/1 61/42/1 62/43/1 93/44/1 94/45/1 81/46/1 96/47/1 30/48/1 4/49/1 52/50/1 38/51/1 50/52/1 49/53/1 36/54/1 35/55/1 39/56/1 41/57/1 43/58/1 24/59/1 47/60/1 45/61/1 56/62/1 54/63/1 57/64/1
+f 256/65/2 251/66/2 254/67/2 241/68/2 244/69/2 217/70/2 240/71/2 237/72/2 235/73/2 229/74/2 232/75/2 245/76/2 248/77/2 233/78/2 250/79/2 194/80/2 224/81/2 301/82/2 283/83/2 300/84/2 298/85/2 261/86/2 260/87/2 268/88/2 307/89/2 310/90/2 311/91/2 287/92/2 281/93/2 286/94/2 269/95/2 265/96/2 264/97/2 290/98/2 296/99/2 293/100/2 292/101/2 318/102/2 315/103/2 314/104/2 227/105/2 225/106/2 207/107/2 210/108/2 205/109/2 204/110/2 212/111/2 221/112/2 195/113/2 198/114/2 202/115/2 213/116/2 276/117/2 278/118/2 280/119/2 303/120/2 306/121/2 192/122/2 200/123/2 220/124/2 216/125/2 273/126/2 272/127/2 257/128/2
+g Cube_Cube.001_edges
+f 93/129/3 62/130/3 262/131/3 297/132/3
+f 108/133/4 106/134/4 313/135/4 316/136/4
+f 223/137/5 2/138/5 4/139/5 30/140/5
+f 67/141/6 101/142/6 308/143/6 267/144/6
+f 94/145/7 93/129/7 297/132/7 299/146/7
+f 101/142/8 103/147/8 309/148/8 308/143/8
+f 196/149/9 222/150/9 28/151/9 6/152/9
+f 88/153/10 110/154/10 317/155/10 291/156/10
+f 33/157/11 32/158/11 226/159/11 228/160/11
+f 106/134/12 33/157/12 228/160/12 313/135/12
+f 22/161/13 73/162/13 274/163/13 215/164/13
+f 56/165/14 45/166/14 242/167/14 253/168/14
+f 90/169/15 88/153/15 291/156/15 294/170/15
+f 78/171/16 98/172/16 304/173/16 279/174/16
+f 62/130/17 61/175/17 259/176/17 262/131/17
+f 17/177/18 14/178/18 206/179/18 209/180/18
+f 21/181/19 74/182/19 275/183/19 214/184/19
+f 8/185/20 11/186/20 201/187/20 197/188/20
+f 85/189/21 80/190/21 282/191/21 288/192/21
+f 6/152/22 8/185/22 197/188/22 196/149/22
+f 38/193/23 52/194/23 249/195/23 234/196/23
+f 105/197/24 85/189/24 288/192/24 312/198/24
+f 32/158/25 15/199/25 208/200/25 226/159/25
+f 47/201/26 24/202/26 218/203/26 243/204/26
+f 100/205/27 1/206/27 193/207/27 305/208/27
+f 59/209/28 57/210/28 255/211/28 258/212/28
+f 61/175/29 67/141/29 267/144/29 259/176/29
+f 50/213/30 38/193/30 234/196/30 247/214/30
+f 15/199/31 17/177/31 209/180/31 208/200/31
+f 43/215/32 41/216/32 238/217/32 239/218/32
+f 98/172/33 100/205/33 305/208/33 304/173/33
+f 14/178/34 13/219/34 203/220/34 206/179/34
+f 36/221/35 49/222/35 246/223/35 231/224/35
+f 87/225/36 92/226/36 295/227/36 289/228/36
+f 74/182/37 76/229/37 277/230/37 275/183/37
+f 96/231/38 81/232/38 284/233/38 302/234/38
+f 30/140/39 96/231/39 302/234/39 223/137/39
+f 1/206/40 9/235/40 199/236/40 193/207/40
+f 19/237/41 28/238/41 222/239/41 211/240/41
+f 11/186/42 21/181/42 214/184/42 201/187/42
+f 76/229/43 78/171/43 279/174/43 277/230/43
+f 26/241/44 22/161/44 215/164/44 219/242/44
+f 49/222/45 50/213/45 247/214/45 246/223/45
+f 81/232/46 94/145/46 299/146/46 284/233/46
+f 39/243/47 35/244/47 230/245/47 236/246/47
+f 110/154/48 108/133/48 316/136/48 317/155/48
+f 80/190/49 83/247/49 285/248/49 282/191/49
+f 9/235/50 26/241/50 219/242/50 199/236/50
+f 57/210/51 54/249/51 252/250/51 255/211/51
+f 92/226/52 90/169/52 294/170/52 295/227/52
+f 41/216/53 39/243/53 236/246/53 238/217/53
+f 64/251/54 87/225/54 289/228/54 263/252/54
+f 73/162/55 71/253/55 271/254/55 274/163/55
+f 24/202/56 43/215/56 239/218/56 218/203/56
+f 103/147/57 105/197/57 312/198/57 309/148/57
+f 13/219/58 19/237/58 211/240/58 203/220/58
+f 83/247/59 69/255/59 270/256/59 285/248/59
+f 71/253/60 59/209/60 258/212/60 271/254/60
+f 35/244/61 36/221/61 231/224/61 230/245/61
+f 69/255/62 65/257/62 266/258/62 270/256/62
+f 263/252/63 266/258/63 65/257/63 64/251/63
+f 52/194/64 4/259/64 2/260/64 249/195/64
+f 54/249/65 56/165/65 253/168/65 252/250/65
+f 45/166/66 47/201/66 243/204/66 242/167/66
+f 193/207/67 199/236/67 200/261/67 192/262/67
+f 196/149/68 197/188/68 198/263/68 195/264/68
+f 197/188/69 201/187/69 202/265/69 198/263/69
+f 199/236/70 219/242/70 220/266/70 200/261/70
+f 206/179/71 203/220/71 204/267/71 205/268/71
+f 208/200/72 209/180/72 210/269/72 207/270/72
+f 203/220/73 211/240/73 212/271/73 204/267/73
+f 211/240/74 222/239/74 221/272/74 212/271/74
+f 214/184/75 275/183/75 276/273/75 213/274/75
+f 218/203/76 239/218/76 240/275/76 217/276/76
+f 201/187/77 214/184/77 213/274/77 202/265/77
+f 219/242/78 215/164/78 216/277/78 220/266/78
+f 224/278/79 194/279/79 2/138/79 223/137/79
+f 226/159/80 208/200/80 207/270/80 225/280/80
+f 222/150/81 196/149/81 195/264/81 221/281/81
+f 228/160/82 226/159/82 225/280/82 227/282/82
+f 230/245/83 231/224/83 232/283/83 229/284/83
+f 236/246/84 230/245/84 229/284/84 235/285/84
+f 238/217/85 236/246/85 235/285/85 237/286/85
+f 239/218/86 238/217/86 237/286/86 240/275/86
+f 242/167/87 243/204/87 244/287/87 241/288/87
+f 234/196/88 249/195/88 250/289/88 233/290/88
+f 246/223/89 247/214/89 248/291/89 245/292/89
+f 249/195/90 2/260/90 194/293/90 250/289/90
+f 231/224/91 246/223/91 245/292/91 232/283/91
+f 247/214/92 234/196/92 233/290/92 248/291/92
+f 252/250/93 253/168/93 254/294/93 251/295/93
+f 243/204/94 218/203/94 217/276/94 244/287/94
+f 253/168/95 242/167/95 241/288/95 254/294/95
+f 258/212/96 255/211/96 256/296/96 257/297/96
+f 255/211/97 252/250/97 251/295/97 256/296/97
+f 209/180/98 206/179/98 205/268/98 210/269/98
+f 262/131/99 259/176/99 260/298/99 261/299/99
+f 264/300/100 265/301/100 266/258/100 263/252/100
+f 259/176/101 267/144/101 268/302/101 260/298/101
+f 270/256/102 266/258/102 265/301/102 269/303/102
+f 274/163/103 271/254/103 272/304/103 273/305/103
+f 275/183/104 277/230/104 278/306/104 276/273/104
+f 271/254/105 258/212/105 257/297/105 272/304/105
+f 277/230/106 279/174/106 280/307/106 278/306/106
+f 282/191/107 285/248/107 286/308/107 281/309/107
+f 284/233/108 299/146/108 300/310/108 283/311/108
+f 285/248/109 270/256/109 269/303/109 286/308/109
+f 288/192/110 282/191/110 281/309/110 287/312/110
+f 263/252/111 289/228/111 290/313/111 264/300/111
+f 294/170/112 291/156/112 292/314/112 293/315/112
+f 289/228/113 295/227/113 296/316/113 290/313/113
+f 295/227/114 294/170/114 293/315/114 296/316/114
+f 299/146/115 297/132/115 298/317/115 300/310/115
+f 302/234/116 284/233/116 283/311/116 301/318/116
+f 297/132/117 262/131/117 261/299/117 298/317/117
+f 223/137/118 302/234/118 301/318/118 224/278/118
+f 304/173/119 305/208/119 306/319/119 303/320/119
+f 215/164/120 274/163/120 273/305/120 216/277/120
+f 279/174/121 304/173/121 303/320/121 280/307/121
+f 305/208/122 193/207/122 192/262/122 306/319/122
+f 308/143/123 309/148/123 310/321/123 307/322/123
+f 312/198/124 288/192/124 287/312/124 311/323/124
+f 267/144/125 308/143/125 307/322/125 268/302/125
+f 309/148/126 312/198/126 311/323/126 310/321/126
+f 316/136/127 313/135/127 314/324/127 315/325/127
+f 291/156/128 317/155/128 318/326/128 292/314/128
+f 313/135/129 228/160/129 227/282/129 314/324/129
+f 317/155/130 316/136/130 315/325/130 318/326/130
+g Cube_Cube.001_top-bot_with_legs
+f 107/327/2 116/328/2 111/329/2 129/330/2 345/331/2 161/332/2 130/333/2 135/334/2 342/335/2 142/336/2 340/337/2 123/338/2 346/339/2 341/340/2 347/341/2 320/342/2 150/343/2 31/344/2 366/345/2 374/346/2 373/347/2 99/348/2 351/349/2 357/350/2 20/351/2 379/352/2 380/353/2 55/354/2 365/355/2 368/356/2 86/357/2 354/358/2 353/359/2 370/360/2 372/361/2 44/362/2 46/363/2 384/364/2 7/365/2 382/366/2 144/367/2 148/368/2 328/369/2 171/370/2 326/371/2 177/372/2 331/373/2 154/374/2 187/375/2 323/376/2 179/377/2 332/378/2 363/379/2 70/380/2 66/381/2 27/382/2 377/383/2 191/384/2 324/385/2 156/386/2 163/387/2 79/388/2 360/389/2 350/390/2
+f 155/391/1 167/392/1 168/393/1 128/394/1 131/395/1 378/396/1 383/397/1 184/398/1 325/399/1 172/400/1 170/401/1 339/402/1 371/403/1 119/404/1 117/405/1 381/406/1 133/407/1 125/408/1 376/409/1 375/410/1 124/411/1 122/412/1 136/413/1 364/414/1 321/415/1 319/416/1 112/417/1 334/418/1 333/419/1 330/420/1 335/421/1 344/422/1 162/423/1 165/424/1 336/425/1 338/426/1 176/427/1 189/428/1 322/429/1 186/430/1 343/431/1 157/432/1 159/433/1 181/434/1 329/435/1 337/436/1 327/437/1 367/438/1 114/439/1 149/440/1 361/441/1 147/442/1 145/443/1 362/444/1 138/445/1 359/446/1 358/447/1 356/448/1 369/449/1 352/450/1 355/451/1 348/452/1 349/453/1 153/454/1
+g Cube_Cube.001_edges_with_legs
+f 3/455/130 5/456/130 7/457/130 384/458/130
+f 10/459/129 143/460/129 144/461/129 382/462/129
+f 48/463/128 3/455/128 384/458/128 46/464/128
+f 5/456/127 10/459/127 382/462/127 7/457/127
+f 16/465/126 12/466/126 380/467/126 379/468/126
+f 89/469/125 18/470/125 20/471/125 357/472/125
+f 12/466/124 53/473/124 55/474/124 380/467/124
+f 18/470/123 16/465/123 379/468/123 20/471/123
+f 23/475/122 190/476/122 191/477/122 377/478/122
+f 68/479/121 25/480/121 27/481/121 66/482/121
+f 164/483/120 77/484/120 79/485/120 163/486/120
+f 25/480/119 23/475/119 377/478/119 27/481/119
+f 151/487/118 29/488/118 31/489/118 150/490/118
+f 37/491/117 97/492/117 99/493/117 373/494/117
+f 29/488/116 60/495/116 366/496/116 31/489/116
+f 34/497/115 37/491/115 373/494/115 374/498/115
+f 40/499/114 42/500/114 44/501/114 372/502/114
+f 51/503/113 40/499/113 372/502/113 370/504/113
+f 42/500/112 48/463/112 46/464/112 44/501/112
+f 95/505/111 51/503/111 370/504/111 353/506/111
+f 53/473/110 63/507/110 365/508/110 55/474/110
+f 58/509/109 84/510/109 86/511/109 368/512/109
+f 60/495/108 34/497/108 374/498/108 366/496/108
+f 63/507/107 58/509/107 368/512/107 365/508/107
+f 72/513/106 68/479/106 66/482/106 70/514/106
+f 82/515/105 104/516/105 350/517/105 360/518/105
+f 75/519/104 72/513/104 70/514/104 363/520/104
+f 77/484/103 82/515/103 360/518/103 79/485/103
+f 84/510/102 91/521/102 354/522/102 86/511/102
+f 102/523/101 89/469/101 357/472/101 351/524/101
+f 353/506/100 354/522/100 91/521/100 95/505/100
+f 97/492/99 102/523/99 351/524/99 99/493/99
+f 173/525/98 175/526/98 326/527/98 171/528/98
+f 109/529/97 115/530/97 116/531/97 107/532/97
+f 104/516/96 109/529/96 107/532/96 350/517/96
+f 113/533/95 127/534/95 129/535/95 111/536/95
+f 126/537/94 160/538/94 161/539/94 345/540/94
+f 115/530/93 113/533/93 111/536/93 116/531/93
+f 120/541/92 139/542/92 341/543/92 346/544/92
+f 140/545/91 121/546/91 123/547/91 340/548/91
+f 118/549/90 188/550/90 320/551/90 347/552/90
+f 121/546/89 120/541/89 346/544/89 123/547/89
+f 139/542/88 118/549/88 347/552/88 341/543/88
+f 127/534/87 126/537/87 345/540/87 129/535/87
+f 132/553/86 134/554/86 135/555/86 130/556/86
+f 134/554/85 137/557/85 342/558/85 135/555/85
+f 137/557/84 141/559/84 142/560/84 342/558/84
+f 141/559/83 140/545/83 340/548/83 142/560/83
+f 143/460/82 146/561/82 148/562/82 144/461/82
+f 152/563/81 185/564/81 187/565/81 154/566/81
+f 146/561/80 174/567/80 328/568/80 148/562/80
+f 150/490/79 320/569/79 188/570/79 151/487/79
+f 158/571/78 164/483/78 163/486/78 156/572/78
+f 180/573/77 166/574/77 332/575/77 179/576/77
+f 160/538/76 132/553/76 130/556/76 161/539/76
+f 166/574/75 75/519/75 363/520/75 332/575/75
+f 169/577/74 152/578/74 154/579/74 331/580/74
+f 178/581/73 169/577/73 331/580/73 177/582/73
+f 174/567/72 173/525/72 171/528/72 328/568/72
+f 175/526/71 178/581/71 177/582/71 326/527/71
+f 182/583/70 158/571/70 156/572/70 324/584/70
+f 183/585/69 180/573/69 179/576/69 323/586/69
+f 185/564/68 183/585/68 323/586/68 187/565/68
+f 190/476/67 182/583/67 324/584/67 191/477/67
+f 355/587/66 352/588/66 126/537/66 127/534/66
+f 349/589/65 348/590/65 113/533/65 115/530/65
+f 149/591/64 114/592/64 188/550/64 118/549/64
+f 95/505/63 91/521/63 162/593/63 344/594/63
+f 165/595/62 162/593/62 91/521/62 84/510/62
+f 138/596/61 362/597/61 140/545/61 141/559/61
+f 167/598/60 155/599/60 104/516/60 82/515/60
+f 336/600/59 165/595/59 84/510/59 58/509/59
+f 376/601/58 125/602/58 169/577/58 178/581/58
+f 322/603/57 189/604/57 12/466/57 16/465/57
+f 369/605/56 356/606/56 132/553/56 160/538/56
+f 168/607/55 167/598/55 82/515/55 77/484/55
+f 344/594/54 335/608/54 51/503/54 95/505/54
+f 358/609/53 359/610/53 137/557/53 134/554/53
+f 330/611/52 333/612/52 42/500/52 40/499/52
+f 153/613/51 349/589/51 115/530/51 109/529/51
+f 378/614/50 131/615/50 158/571/50 182/583/50
+f 338/616/49 336/600/49 58/509/49 63/507/49
+f 112/617/48 319/618/48 5/456/48 3/455/48
+f 359/610/47 138/596/47 141/559/47 137/557/47
+f 337/619/46 329/620/46 34/497/46 60/495/46
+f 145/621/45 147/622/45 120/541/45 121/546/45
+f 131/615/44 128/623/44 164/483/44 158/571/44
+f 170/624/43 172/625/43 68/479/43 72/513/43
+f 119/626/42 371/627/42 166/574/42 180/573/42
+f 125/602/41 133/628/41 152/578/41 169/577/41
+f 383/629/40 378/614/40 182/583/40 190/476/40
+f 367/630/39 327/631/39 29/488/39 151/487/39
+f 327/631/38 337/619/38 60/495/38 29/488/38
+f 339/632/37 170/624/37 72/513/37 75/519/37
+f 335/608/36 330/611/36 40/499/36 51/503/36
+f 362/597/35 145/621/35 121/546/35 140/545/35
+f 375/633/34 376/601/34 178/581/34 175/526/34
+f 325/634/33 184/635/33 23/475/33 25/480/33
+f 356/606/131 358/609/131 134/554/131 132/553/131
+f 122/636/31 124/637/31 173/525/31 174/567/31
+f 147/622/30 361/638/30 139/542/30 120/541/30
+f 157/639/29 343/640/29 89/469/29 102/523/29
+f 155/599/28 153/613/28 109/529/28 104/516/28
+f 184/635/27 383/629/27 190/476/27 23/475/27
+f 352/588/26 369/605/26 160/538/26 126/537/26
+f 136/641/25 122/636/25 174/567/25 146/561/25
+f 189/604/24 176/642/24 53/473/24 12/466/24
+f 361/638/23 149/591/23 118/549/23 139/542/23
+f 381/643/22 117/644/22 183/585/22 185/564/22
+f 176/642/21 338/616/21 63/507/21 53/473/21
+f 117/644/20 119/626/20 180/573/20 183/585/20
+f 371/627/19 339/632/19 75/519/19 166/574/19
+f 124/637/18 375/633/18 175/526/18 173/525/18
+f 159/645/17 157/639/17 102/523/17 97/492/17
+f 172/625/16 325/634/16 25/480/16 68/479/16
+f 333/612/15 334/646/15 48/463/15 42/500/15
+f 348/590/14 355/587/14 127/534/14 113/533/14
+f 128/623/13 168/607/13 77/484/13 164/483/13
+f 321/647/12 364/648/12 143/460/12 10/459/12
+f 364/648/11 136/641/11 146/561/11 143/460/11
+f 334/646/10 112/617/10 3/455/10 48/463/10
+f 185/564/9 152/563/9 133/649/9 381/643/9
+f 186/650/8 322/603/8 16/465/8 18/470/8
+f 329/620/7 181/651/7 37/491/7 34/497/7
+f 343/640/6 186/650/6 18/470/6 89/469/6
+f 151/487/5 188/570/5 114/652/5 367/630/5
+f 319/618/4 321/647/4 10/459/4 5/456/4
+f 181/651/3 159/645/3 97/492/3 37/491/3
+g Cube_Cube.001_legs
+f 389/653/132 391/654/132 392/655/132 390/656/132
+f 385/657/133 387/658/133 388/659/133 386/660/133
diff --git a/mods/homedecor_tables/models/homedecor_table_small_square.obj b/mods/homedecor_tables/models/homedecor_table_small_square.obj
index 5bb07ee3..bec5c536 100644
--- a/mods/homedecor_tables/models/homedecor_table_small_square.obj
+++ b/mods/homedecor_tables/models/homedecor_table_small_square.obj
@@ -1,43 +1,139 @@
-v 0.499 -0.499 -0.499
-v 0.499 -0.499 0.499
-v -0.499 -0.499 0.499
-v -0.499 -0.499 -0.499
-v 0.499 -0.469 -0.499
-v 0.499 -0.469 0.499
-v -0.499 -0.469 0.499
-v -0.499 -0.469 -0.499
-v 0.469 -0.437 -0.469
-v 0.469 -0.437 0.469
-v -0.469 -0.437 0.469
-v -0.469 -0.437 -0.469
-vt 0.5 0.029
-vt 0.971 0.029
-vt 0.971 0.5
-vt 0.5 0.5
-vt 0.015 0.985
-vt 0.015 0.515
-vt 0.029 0.529
-vt 0.029 0.971
-vt 0.985 0.5
-vt 0.985 0.029
-vt 0.5 0.515
-vt 0.971 0.515
-vt 0.485 0.029
-vt 0.485 0.5
-vt 0.971 0.015
-vt 0.5 0.015
-vt 0.471 0.971
-vt 0.471 0.529
-vt 0.485 0.515
-vt 0.485 0.985
+# Blender v2.83.5 OBJ File: 'homedecor small square table with legs.blend'
+# www.blender.org
+o Cube_Cube.001
+v -0.500000 -0.500000 0.500000
+v 0.500000 -0.500000 -0.500000
+v -0.500000 0.437500 -0.500000
+v -0.353553 -0.500000 0.353554
+v -0.353553 0.437515 0.353554
+v 0.353553 -0.500000 -0.353553
+v 0.353553 0.437515 -0.353553
+v 0.500000 -0.500000 0.500000
+v -0.500000 -0.500000 -0.500000
+v 0.500000 0.437500 -0.500000
+v 0.500000 0.437500 0.500000
+v -0.500000 0.437500 0.500000
+v 0.353553 -0.500000 0.353554
+v 0.353553 0.437515 0.353554
+v -0.353553 -0.500000 -0.353553
+v -0.353553 0.437515 -0.353553
+v 0.468750 0.500000 0.468750
+v 0.500000 0.468750 0.500000
+v 0.500000 0.468750 -0.500000
+v 0.468750 0.500000 -0.468750
+v 0.500000 -0.468750 -0.500000
+v 0.468750 -0.437500 -0.468750
+v 0.500000 -0.468750 0.500000
+v 0.468750 -0.437500 0.468750
+v -0.500000 -0.468750 -0.500000
+v -0.468750 -0.437500 -0.468750
+v -0.468750 -0.437500 0.468750
+v -0.500000 -0.468750 0.500000
+v -0.468750 0.500000 -0.468750
+v -0.500000 0.468750 -0.500000
+v -0.468750 0.500000 0.468750
+v -0.500000 0.468750 0.500000
+vt -0.000000 -0.000000
+vt 1.000000 -0.000000
+vt 1.000000 0.500000
+vt -0.000000 0.500000
+vt 0.968750 0.984375
+vt 0.031250 0.984375
+vt 0.031250 0.515625
+vt 0.968750 0.515625
+vt 0.000000 0.500000
+vt 1.000000 0.500000
+vt 1.000000 1.000000
+vt 0.000000 1.000000
+vt 1.000000 0.968750
+vt 0.000000 0.968750
+vt 0.000000 0.937500
+vt 1.000000 0.937500
+vt 1.000000 0.968750
+vt 0.000000 0.968750
+vt 0.000000 0.937500
+vt 1.000000 0.937500
+vt 0.000000 0.968750
+vt 0.000000 0.937500
+vt 1.000000 0.937500
+vt 1.000000 0.968750
+vt 1.000000 0.968750
+vt 0.000000 0.968750
+vt 0.000000 0.937500
+vt 1.000000 0.937500
+vt 1.000000 -0.000000
+vt 1.000000 0.500000
+vt 0.000000 0.500000
+vt 0.000000 -0.000000
+vt 0.031250 0.515625
+vt 0.968750 0.515625
+vt 0.968750 0.984375
+vt 0.031250 0.984375
+vt 0.000000 1.000000
+vt 0.000000 0.500000
+vt 1.000000 0.500000
+vt 1.000000 1.000000
+vt 0.000000 0.968750
+vt 0.000000 0.937500
+vt 1.000000 0.937500
+vt 1.000000 0.968750
+vt 0.000000 0.968750
+vt 0.000000 0.937500
+vt 1.000000 0.937500
+vt 1.000000 0.968750
+vt 1.000000 0.937500
+vt 1.000000 0.968750
+vt 0.000000 0.968750
+vt 0.000000 0.937500
+vt 1.000000 0.968750
+vt 0.000000 0.968750
+vt 0.000000 0.937500
+vt 1.000000 0.937500
+vt -0.000000 0.000000
+vt 1.000000 -0.000000
+vt 1.000000 1.000000
+vt 0.000000 1.000000
+vt -0.000000 0.000000
+vt 1.000000 -0.000000
+vt 1.000000 1.000000
+vt 0.000000 1.000000
+vn 0.0000 -1.0000 0.0000
+vn 0.0000 1.0000 0.0000
+vn 0.0000 0.7071 0.7071
+vn 0.7071 0.7071 0.0000
+vn 0.0000 0.7071 -0.7071
+vn -0.7071 0.7071 0.0000
+vn 0.0000 0.0000 1.0000
+vn 0.0000 0.0000 -1.0000
+vn -1.0000 0.0000 0.0000
+vn 1.0000 0.0000 0.0000
+vn 0.7071 0.0000 -0.7071
+vn 0.7071 0.0000 0.7071
+g Cube_Cube.001_top-bottom
 s off
-f 1/1 2/2 3/3 4/4
-f 8/5 7/6 11/7 12/8
-f 1/9 5/3 6/2 2/10
-f 2/11 6/4 7/3 3/12
-f 3/13 7/1 8/4 4/14
-f 5/15 1/2 4/1 8/16
-f 9/17 12/8 11/7 10/18
-f 7/6 6/19 10/18 11/7
-f 5/20 8/5 12/8 9/17
-f 6/19 5/20 9/17 10/18
+f 9/1/1 2/2/1 8/3/1 1/4/1
+f 22/5/2 26/6/2 27/7/2 24/8/2
+f 24/8/3 27/7/3 28/9/3 23/10/3
+f 22/5/4 24/8/4 23/10/4 21/11/4
+f 26/6/5 22/5/5 21/11/5 25/12/5
+f 27/7/6 26/6/6 25/12/6 28/9/6
+g Cube_Cube.001_edges
+f 23/13/7 28/14/7 1/15/7 8/16/7
+f 25/17/8 21/18/8 2/19/8 9/20/8
+f 25/21/9 9/22/9 1/23/9 28/24/9
+f 21/25/10 23/26/10 8/27/10 2/28/10
+g Cube_Cube.001_top-bot_with_legs
+f 10/29/1 11/30/1 12/31/1 3/32/1
+f 31/33/2 17/34/2 20/35/2 29/36/2
+f 31/33/6 29/36/6 30/37/6 32/38/6
+f 20/35/4 17/34/4 18/39/4 19/40/4
+f 17/34/3 31/33/3 32/38/3 18/39/3
+f 29/36/5 20/35/5 19/40/5 30/37/5
+g Cube_Cube.001_edges_with_legs
+f 32/41/7 12/42/7 11/43/7 18/44/7
+f 19/45/8 10/46/8 3/47/8 30/48/8
+f 12/49/9 32/50/9 30/51/9 3/52/9
+f 19/53/10 18/54/10 11/55/10 10/56/10
+g Cube_Cube.001_legs
+f 13/57/11 15/58/11 16/59/11 14/60/11
+f 4/61/12 6/62/12 7/63/12 5/64/12
diff --git a/mods/homedecor_tables/textures/homedecor_glass_face_clean.png b/mods/homedecor_tables/textures/homedecor_glass_face_clean.png
deleted file mode 100644
index d955612af8b238e80f589bdb2e3aa17cbb58d972..0000000000000000000000000000000000000000
GIT binary patch
literal 0
HcmV?d00001

literal 74
zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`f}SppAr-fhC0G|Hi1aXNFfgzP
WFfc0XXw(BG89ZJ6T-G@yGywqPlnzY*

diff --git a/mods/homedecor_tables/textures/homedecor_glass_table_large_edges.png b/mods/homedecor_tables/textures/homedecor_glass_table_edges.png
similarity index 100%
rename from mods/homedecor_tables/textures/homedecor_glass_table_large_edges.png
rename to mods/homedecor_tables/textures/homedecor_glass_table_edges.png
diff --git a/mods/homedecor_tables/textures/homedecor_glass_table_large_inv.png b/mods/homedecor_tables/textures/homedecor_glass_table_large_inv.png
deleted file mode 100644
index c8bc85751b8d25fed1e4f3ea1f8e67eb44e533d1..0000000000000000000000000000000000000000
GIT binary patch
literal 0
HcmV?d00001

literal 2457
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
Xk%Z@P<<(h{00000NkvXXu0mjfOOUu5

diff --git a/mods/homedecor_tables/textures/homedecor_glass_table_large_square.png b/mods/homedecor_tables/textures/homedecor_glass_table_large_square.png
new file mode 100644
index 0000000000000000000000000000000000000000..3f58b48f6d9a23b3cb85150daf218c1fb8a42780
GIT binary patch
literal 604
zcmV-i0;BzjP)<h;3K|Lk000e1NJLTq001BW002M;1ONa4(TBYy0006bNkl<ZSi`kf
zF>)I*3|w&T8=gFa58xkCyK$HH+AG-V32s!Ua_fQ*xbZX6XVRrainBx#1R%<qT*uSw
zVnHl$5PdKndKMs){qqleci}%d$XBO36@(sk0{9CAC#;t<uXLZ10HDHA;j07M#}wo}
z^zfZ~c(e%);SwInf(rsoc!eLrqh19&?+TA<QVqfC_(8&JQlpVrQxnZQ34O#9uVfeT
z5FSZ&;_AS6C9)u>a47I-!U6i=-{e{K+fcZ^8yC0@ySs4H%GK>rasLE?jO*zL9(>2n
zx6%koovUn)bn6y^-F4tdP~d%Y2dnE~)Lr@^SY0;<A1=|)SaYKwxEF33X%;?BV8JH|
zZ1^NWq`RAG{-O6rKkt7ZRIvQPtCQgio?ZCcxF6)N?FV@hURWi_*sd=&mnxB@2ra0E
zZ-$0MK)L0E1D>z3N}mRjO^_QM8yyrqpg#!$DSV?Ru7E>F8u!FcFoVXtf6=oVxt>Ce
z)-QP3$-6y;R&eGEP$rWa9~hUI4+?C^Y!$H}QQ@RJajS7jZmXpcF0B-*fi7{kYXRGg
ztMHzJ&J1@ycp3`VcjE%LVT%iQMp}`#e;<L2>*-iLcmV(grP&n9AUkPAWrLt}|5iTX
zNaGOc&u8w;!qql<)Y6^b_)1_;J*_(CR4&TYyHSlZ&&*!S3(9vvpS`vh0;a~dZ6)*T
q+){W>bUyEi<UIO6`@#9a{oo&DbLfs!@>6vH0000<MNUMnLSTX(1QSjG

literal 0
HcmV?d00001

diff --git a/mods/homedecor_tables/textures/homedecor_glass_table_large_square_inv.png b/mods/homedecor_tables/textures/homedecor_glass_table_large_square_inv.png
new file mode 100644
index 0000000000000000000000000000000000000000..24ea176c042daf428512e376e614fd5504a6a579
GIT binary patch
literal 315
zcmV-B0mS}^P)<h;3K|Lk000e1NJLTq001BW001Be1ONa4*>kdg00033Nkl<ZNXMm>
z!41PO2t_|Advpvo=@h+sfnL2yH|Pjfcj*fB5LK=T5U24iiQe}IJ_@}Qr_KW0DgJ!J
zHN_vw_EkOTfJdwX`iDS8`95o*V@?=A$I<bUKy6!s?Zb#S9dU^TR^t{Iif|*~8SnUN
zT>L4-b$49cqJ9KQk_U_TqP9U&&y9pV;qk_*h2kNu#)aG@mIQCk%|@W(aBvB6fL{8h
zEUK5y;KprSkS=UX@i59g?c$_=Lcrde`QQw1Xu4MhJ9F-~RcNmZ9B&;|2o63jH%D8C
zVD2^#9BthkzG-4!v6n_8a1;-NG>cCQMEImYj86&(9bTsSL(h}H_Yc<TXcEdvOL71J
N002ovPDHLkV1mv#g@phB

literal 0
HcmV?d00001

diff --git a/mods/homedecor_tables/textures/homedecor_glass_table_large_tb.png b/mods/homedecor_tables/textures/homedecor_glass_table_large_tb.png
deleted file mode 100644
index ca9a14ef807e2f52f778ad74f49642f282b38144..0000000000000000000000000000000000000000
GIT binary patch
literal 0
HcmV?d00001

literal 146
zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`k)AG&Ar-fhEeanUsrNFt(GYUC
zgsteqwYAZl(gkmCZT-)}>k!^^PCbLc@#u`UBq@ikG$S5|47Ch~orw++#)-@Zrjv6S
s{w6cV3hvwp6nL80kjXG(0ShyO*OV2nuBq&>0b0V~>FVdQ&MBb@0Ks4|jQ{`u

diff --git a/mods/homedecor_tables/textures/homedecor_glass_table_small_round.png b/mods/homedecor_tables/textures/homedecor_glass_table_small_round.png
index 1932f0fe5171a8e9e5e1b14122f3a7ed08f333ba..1329b1b53edb21fbf1277e896d7b896020d96359 100644
GIT binary patch
literal 597
zcmV-b0;>IqP)<h;3K|Lk000e1NJLTq001BW002M;1ONa4(TBYy0006UNkl<ZSi`lK
zF>)I*3`IXUx`rpm-~o7t)NazH-F6GMx`gUfYF+REJ3dDGOuCdvv6e`J0K~P%>L|_o
z_#i&HD|*LspA(RspMT=Ji~mB9U!4y+2t9TN_!9zWEVnf;bj(QrP;pdzaiDE%LGDA3
zZ`|Y27TAqTJd%YA0nK>DcjHl?g57t;quNv>usC^;cx`G75^HXvxhJ8oc;<!dA@0Uo
zyh-BX;G0re2vi&j9!(secl>dq`fV6oe;QA45A5dRW|V8%qmup!0a@4c5j=du#*f+v
z%ABihj`V03f_>`1k)YuH;SScRgE4oRhhUw$Iegeezhf<pLf|NF25A<b7O?P10UMtb
zu<-+XV14NA*~k08=id*!$LJ5dy7*<>gZ#PogFJ~BRs}NF`xmP#l}Jj27HaX;@Q?^7
zk8-f%`ChB^Z6MhKx$&{mF3|)1N(e~fE4^?9b{}cX!3WHsvG3pXs#dP6P^<MXc-iT@
zU4_<g<{K!RNlgxnP0YIlR%Et@Sdgf2(v!H>x+LFLOJiI{DbxVn>aO<zwjEdFy#!tH
z*G>P+Fu49Sp5PwX;^NMgR^;v<6OeU1A14nl0KlL$+d>&^CvB)~2$b&M$_I`#ULyVa
z+J}W}Z1k$7TVJYxed}q{F>mFf+<FhDah<w*tt?#h9B3}AECftl-*%MDr*kXeCDD1j
jCzAKk*SsHGo)q{Gtc}@u8DJ^L00000NkvXXu0mjf6fz&x

literal 241
zcmV<N01p3&P)<h;3K|Lk000e1NJLTq001Na001Ni1ONa4O9@aD0002ENkl<Zc-rlf
z<#mHW5Cc;~`v0AnnVFfX20yo87^{OlGfKy+Hy{3dlvZn(%*`<>Ugc!DF(b-6_5tn8
z(_!xaGirTyX0pxy8WAJ&)f=cspAI7$RH!mxOjG-w)*ZQpGsXbPcfBJiLxuzqf+V$y
zYn>;oF@^`NTtRUxP?5Xdku+pXP43WTK%ar!przG>9s^g<1Pj#Wu6HEG$Pp(=UUPy!
rjWJT{NlK(;M@#_&B;W9kzOr=$j=YY=;}JXp00000NkvXXu0mjfkUe0G

diff --git a/mods/homedecor_tables/textures/homedecor_glass_table_small_round_inv.png b/mods/homedecor_tables/textures/homedecor_glass_table_small_round_inv.png
index 0d868375b0aa6a09a93a2ef40bbf832196f29eb4..d6af47720b41d24ecd21210385133bc283ecb13a 100644
GIT binary patch
literal 713
zcmV;)0yh1LP)<h;3K|Lk000e1NJLTq001BW001Be1ONa4*>kdg0007zNkl<ZNXLzp
zF-RLx7{`D2DmWDM)!-OP@Rlw*Xt+(3f`h~1ASq5Rfp)04m`-tNv&AKpZb9fIO&!V!
z1p}fu^@t8SSvbv*F<2i$hl1sGxSp50+(q9FclYl7zW06afA9T`7X57|!y>axk>eR~
zLz^>>`F?WUKh|jRKGNajDN^8oLr%Hm7cj;I)6Dad26Y*kvB6LT9;d`I+f3RWzvnFl
z=+fl}pH!ArzNlTQvKunOzf}QejvYqYIlB_z(Iz{x!U7}gsJU2xDkYpHHrf06dff;^
zCIs>18}`^#OF_>NKnZ7#HFoSewE!=X)?`inW=$!1bf1AUP8r9p2Sehxt0Qm7Iu2zu
z9<D(N&#r}u$8pQ(#VtVA@cdx{oIJ~Hr6nHXE&x{WVT)yz_cJK6ZF^~Thqx69D?PR;
zf|$ur;B$ZCQ5E92WdNTkEMx?W9Q5j5)k(!9;K&XKEDB~h3}>wBl94W=uSU<39x^MK
z;xs_ga5q5>08W__<hY~<CjqyTakwOB=sSj+e^Y-uo=57BHuZ!*hQ4E1rUq~a;C=wX
z4P!}QboJfj2xHs`+Dtq&Z)zSBv;}8Or{ONH9$3aSXM$tqV>*XvYs(n83iBKrI)lfg
z?DX$Cl7#CKRAo8G6erg-Snc0+58=Qnjpj8ibY5R+a}@u&V06HBp@S!F>MNb!M}Tax
z%f@4Lj}*DVu51M-QWaCJ$9LTzT&-jJ`%eJKE){H5<gs`Wn~Lua|BXc+Dao38Dr=9L
z-R7fzCKEc7{H7FT^@1(wrQ^zE1CtK{e(y|v7OZefQ<YUV>0DG<Ri?=;D<MwQ8)cVw
v>MKRgRhqfJk}*3s_7f^zNU`^3g1!F(*~1ds5v0}e00000NkvXXu0mjf@*YE`

literal 3865
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
bs#f(sjH-iy2wRT=00000NkvXXu0mjf4Iiq)

diff --git a/mods/homedecor_tables/textures/homedecor_glass_table_small_square.png b/mods/homedecor_tables/textures/homedecor_glass_table_small_square.png
index 66baf21bf497433350960eee88133e23596dae88..e89ea540b97c84dc8567060f9a308b49933e0ef0 100644
GIT binary patch
literal 642
zcmV-|0)737P)<h;3K|Lk000e1NJLTq001BW002M;1ONa4(TBYy0006>Nkl<ZSi_}P
zF^=0X5S%5{2KNFZ&)@_2hpVqimsYI`wJxtrb4Zyg4=^8~X9Vd3-x)}E*eht8%N3WV
zPihPrn%UXiS(2gyW79JL4;$crFaW?z`L8`j@xpgJHsHS)a2MG1_s*1@ipnFElwAZ_
zbcT-&(4q<Squ~peaBmYN;TrDAf-8cW@C;AFeXRzqyffTalM)1DC7HT#nbfL?d#<VR
zW=&ifanB>!O-#ZiTsU!Tz?Vv7MUdgBz`Y3v=)e#7N4D#}t{NwY>6E7Nv0+-@GYhuc
zeZ~D91Uha@hikzXEPN{sSLt(>&7N*m!P!#>_Jj(&9ByY#9gMzfKR9dZ`rxY~wll7|
zQ4!n=H;vQ_?<TO|odh<#lfXBol@9#A;cz`+IBq-LG5p_3@QU3A_!|b`h##UzGbZuE
zH#{}qzw`ZIM)_+!k*jT#QKu$VAWh*UNWv#WLm(jDGE#!i*I2Pk1HmSkg^r05MF}WZ
zia-mWXvZ0lbcFRi@eF3rI`6;qRE?ZhE=Mabcyl9fxpGqQ%om_eCI}xGMVu1_Cd_O#
zF(OdpY7x(kOF+`M)hL8(E4gf-OWf(&K$&qCUQ*CAe*qdh&TiE>IZSV<jrPRF2E4f^
zMqT~;2z1<*j-dsQ0KlNon?hX44z;GTK@f|tl`|Y+y@?cSCxxe1bpgxHM@{+6FWlbs
zYTdc`;3vD9+wXCOA_&!uv(-%3xA)p!aOm2;Z7Z3_yRQ5v?gxReYN%o5mrs7dAK@?n
cr%lKE2OuT!R=rR+Z2$lO07*qoM6N<$f{oxMjQ{`u

literal 358
zcmV-s0h#`ZP)<h;3K|Lk000e1NJLTq002Y)002Y?1ONa4k{Vk%0003kNkl<Zc-rmQ
z$9Y3B3<P2JU&d=d6}SOK07~V+<DAXUUY<a4ZjQfF+Sb}#Dy^~&IWR=XD2mEhXdtBh
z^DI+BJU!=xy#3QYqCTYmPru^oL;ix86Vkuq)`#>TwlhNB5I0Eg+#sIb`T9JNK4K<F
zA2A=KgP0O>duCnbA~XoHQW+Fvw51~%o#^=7%lCKWWVCxO=!K#(R0uWwM20-|7>$64
zjAabO(&We8o=QRFg~g~2gsW9pSSmt1U0zrYR0qNzkrx)DQV@AzIZ+)*WXKE4nMy(A
zg=I%|AlJOgZv%|#Kq5n4Sawtg;_33jvZqoId0{cC1L10w7nTDRfCwM3YC|GJo_d0Y
zKwu1k=r<1SX-8{v+ELJ+jGPW+bRefQ#T!FEDx`7l0S9=?yGt}tIsgCw07*qoM6N<$
Eg6O-K1^@s6

diff --git a/mods/homedecor_tables/textures/homedecor_glass_table_small_square_inv.png b/mods/homedecor_tables/textures/homedecor_glass_table_small_square_inv.png
index f768314d4b8f507965e1b35d5a29e09dc70d9e44..aa4079c4bbaf9ae99341e33c3ffffffbe8676255 100644
GIT binary patch
literal 334
zcmV-U0kQsxP)<h;3K|Lk000e1NJLTq001BW001Be1ONa4*>kdg0003MNkl<ZNXMm>
z!41MN3`M`A-Wh>0yh*3vngzIa6K3cF8G{875@%!%6(n_SH>kZ-s`|da9e;&p!J%gW
zP6zNi1^~EH{WKvrKU^>d_)UQH#eVNUTS}^`WLish2~^V+&jD1lfPOSyWR0^guo%}k
zlZPt-%Xq~X<7~|!>bv4>Hq{7ZqZ!+H+tg-=lUQ!pok?0(oFtQfh>P(SZ#FRpcrhv~
zfr`Vx*~I~x<%9?MTX)_ZTpOm>lEyJuTJFh$zwK;ne}{ms8~I2PUQlGOjbxm2wJl70
zQ%HX5AWSgub-0t4IymR9_aS+y>%%ugj61frQ3?EuyNlF|cMEuUr+|-l3UH8Cn&o}q
ga(!WV9=qM~0hM-bLdVkU0RR9107*qoM6N<$g5l1NxBvhE

literal 3938
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

diff --git a/mods/homedecor_tables/textures/homedecor_table_legs_brass.png b/mods/homedecor_tables/textures/homedecor_table_legs_brass.png
index f0e8bf950ab85b689743b03dcb3cc22085996087..ab80ee76501fc8b9075d395d8db87bac8e0b3c45 100644
GIT binary patch
delta 461
zcmV;;0W$u}0^9?T8Gi-<001BJ|6u?C0i#JoK~y-)osvIH6hRcme*=TNcaq(sFmZvS
z(8LZCDQ*2%5^YQf30j$rcEp0lM0*MnjTSVT(^9b2!b%$o5=g+D{7EFagNTQhy+OIz
z<53)JghM><t0wck_sjR*4D3tx#XoekP8}TPrbZ+-WqwCx3V+2C-+x4e&sG$`%;Z(k
zX%C(DaQpz*@1bwtfl2^#QzNpvQebfOLjue_ydZr+hLl%tyfpMS@jkyFmu%2Uw*Q{e
z02gn*R7ayK?Ig{`@?r1t^-)DLntgLi=BMwRxR<t*%!8R*1~`6z+tu4T!1a63j^7&K
z+w4>6Nc+^{3V+L=9?O3N+EW=~yG=FPpjz4dYl35+qwpmsHEYN(ED~>*2r`P;lo=SF
zZm8GC0b*<Ty12lV+Y<`l-S{;*bGp{t2y62%#767HW-GbdF%gAgiRbsvHS9v=KaPph
z)k}x#QL7rN(FRNTWp3PkbtvwW;jEkwQgolq(COEIs76kE==F+2yZyzkEn&?j)@(I2
z13b#Dsn=uu@^eQMMQvycr*_@C8HS;RVJI}IKkN4ZHYlsqJ!ML300000NkvXXu0mjf
DCV=Ff

delta 315
zcmV-B0mS~?1Iq%C8Gix*005AYXf^-<00wkYPE!B?00000Zl(v300031Nkl<Zc-mut
zfd62?fDUlWURoc2Zb`tg>5gma^rvSlK?G0FaXG&%=<<eyTl*^?otuK9dSkCEoV%n{
z?NFZ?L^WLS*sk8kmuF&kz|u-xi0W<Ap&AGSh)WoV2M~9Ypnn16%L`LU&;SgRXV;ey
zt@`|w=QkEVzC7dZ(MF;)JiW057=m|?HD2GDOIY<Yu<E@l3wF+rgTy8w_W)I|%7?Il
zv3YEU6F$`-cOPp6nhoKuYO+{UZvamzh!A{uVd^uWFE0Uo2~mvzO);`dOV#%Gn!(c*
z!=cR$M|brc-Za|0Z&f}-HD*d#-)6O`-wl{j_AJQ&31xx-Uauk4003{WopaleneYGr
N002ovPDHLkV1oMZh^PPn

diff --git a/mods/homedecor_tables/textures/homedecor_table_legs_wood.png b/mods/homedecor_tables/textures/homedecor_table_legs_wood.png
new file mode 100644
index 0000000000000000000000000000000000000000..c8c658eb3b6bf6c2662ef88d2cb6661a730a07b1
GIT binary patch
literal 357
zcmV-r0h<1aP)<h;3K|Lk000e1NJLTq000mG000mO1^@s6AM^iV0003jNkl<ZILn=q
zF-inM5Jg{Ach8QlvaYbKiFyFR)Xdx)cnuF^VCV@<1Tl6oF*GrdU2s+%RB)!dr`sC{
zGcW&-|BI5#i?ckNj@cS-a(lPH6^6R@%=c&P&3BoMgu*JT&zARfMZNwZB{)4j#<vZ2
zI&oaxKVyr6$3?~Vc*N_v=BP?cc4|ZgQy5|sSuVd=eS8D(Ldp5b0k(7{2wdMh2mloT
zygfbhA1C=RJLk|Y2FmdkeKFPnphgT`47~+*RG`M9fj~~Ve*-n-oKe9Mz3(mXzClFL
zruF39zd>kPf^Sjdgxn37;2bF>bi+E3-g#6NMbY0j3=*U+@!144#18B1070Zn8O;b?
z>==p`RtNooh)`NZeN2#t-QcTD=x@w4vA-be1|;|cMbCp>u`Twz00000NkvXXu0mjf
Dqu`k*

literal 0
HcmV?d00001

diff --git a/mods/homedecor_tables/textures/homedecor_table_legs_wrought_iron.png b/mods/homedecor_tables/textures/homedecor_table_legs_wrought_iron.png
index 8d7eec55533742ddcdcef2a0d8b7acf9de692782..94e8bc1ae789d5860dbeace45a0cceb66046a6e4 100644
GIT binary patch
delta 424
zcmV;Z0ayOT0=EN@8Gi-<001BJ|6u?C0e(qDK~y-)os&&#6hRP%pPtF~d~AMzppamc
zagDf|5J@fp1qojC=5O@s#XsOtM3hVt3~Lezo;-*Qo9U_PE)Pl8uiZ)XJrz{-!&`6B
zaHg^>wJb~J0{uB>&Wi_k2ingw@+>FGQf$xi;^iv?@MwKSn}0?K8gPx^8ex0?z)S!e
z_m{PH4exgLC%|W04|QBshzQ;XUcdb?=`CKpqG_72H##zAmesZ4ZS5x(fUn=av;FbY
z)Y)hj;LZCT<3nJ4;$}YX1OWID@F8@D+6fS8X?@!XnCohe>zWYs{~Qc&Evbk<t8eH(
z0~+x}QA8X?M1Ql7H61XxzMzUCjo?EdO)Z;iL%qBM18wUW9e**qqa))QVZJ|qIR}HK
z1?|nn*xt{4t+ix%&hw{F{&HbfmkVvZ=cINR1Btar>)9P0{<iqz%?-_xgsQ4Q15N~0
z#oS!Hrp^gbWQgOKUL3P`@Of%#>-X+x?P^p36lqVdL?KZWS`@{FU-?|W&i?=ahOtxv
SjYYBm0000<MNUMnLSTZsCC7~b

delta 309
zcmV-50m}Zj1H}T68Gix*005AYXf^-<00wkYPE!B?00000Zl(v30002`Nkl<Zc-oDU
zgJFd+5P)xs-?k#vwvENRPp@`gzL-aN;o%wh!JnswbQ|;HXk+>EaQpu3@MUvzUM!1g
zkq>gH$0~z&7WlyX>V0{(x3RON*9}{d<b5*@+_p&IS2XSMHh<Q!&cTuuMa<NJJ&R(L
zLj(5csikcJ_6$|py_jeNZHqdM@BwX0u%Ro`Hc!SX<6UKOJ5SKxMd+ghjL)j3Grv#D
zBz&2Rp*~z+nsJ*nd0(b4%XvOt9q!zo9>8bN-)J0K*<=xE3N+yJ>CWoH>CXD*g2KF7
zlGCCXp-RKpb1pDdia2Pq_@~%;HnOgyE!N^yc=HVW%ln;29NaXl%g?-<00000NkvXX
Hu0mjf+0>ZQ

diff --git a/mods/homedecor_tables/textures/homedecor_utility_table_edges.png b/mods/homedecor_tables/textures/homedecor_utility_table_edges.png
deleted file mode 100644
index c2b3d96e801a7b3608054d7bbfa8af3145c1864b..0000000000000000000000000000000000000000
GIT binary patch
literal 0
HcmV?d00001

literal 465
zcmV;?0WSWDP)<h;3K|Lk000e1NJLTq000mG000mO0ssI2kdbIM0004)Nkl<Zc-lRY
zw;4o5421uYwD0hc5t2~@&Cm(`;=Q|jyVBtKlxn;_`}7k@C}0AHSS!yxBd&^b$TUM<
zI(yFRE~1cdta4S2&$%Jv%24R7B@`Ljd)ETJQIT;K;mmZ;gzC*V+&EM#Rhrv+s5>h}
zCH3<c-)?KA_ZC6o)2x!h3=S~>$1sek9ZGwnEGq?C3t*aBjO~!^C5+sz=dU15PgR^V
z8J6<C#}*KQJwRM|qj0_R0Spi-OEr6dx0ROf8z4eJ6+z9MziRE-8OzGPcdbw^9G=%c
zJMxMMAg@Q?FS$$cc=Ni(Fud{J^?z>nx*k`CkI@K@1<H{7uj>|ew|AdCp~*~|i0e^*
z;wmE_*IJRa_wU<*rb)|^JRNm~=<%yNGd*o2{MXVyegBjM03-#rm9Gr<h(TeM<^W{4
z_EW$#JqB_qLc&=JuszM-2p9<Jcx)joM<NYMBikKdCI|tHz|=<{f5@4r7zhziD^Anh
zt1>fznc1huaHf9$>1U(5s=IMiq345`Anf6JqQcWa_Za;Fj>Q)Yis1M)00000NkvXX
Hu0mjfYCP3V

diff --git a/mods/homedecor_tables/textures/homedecor_utility_table_legs.png b/mods/homedecor_tables/textures/homedecor_utility_table_legs.png
deleted file mode 100644
index 121f2f23c681c4e5259803e4d60132924c481b77..0000000000000000000000000000000000000000
GIT binary patch
literal 0
HcmV?d00001

literal 338
zcmV-Y0j>UtP)<h;3K|Lk000e1NJLTq000mG000mO0ssI2kdbIM00006bW%=J00000
z003^L2ax~(0S8G$K~#9!jS;n3g)#8%lHl&X0NT;L3a!yKSOFOWTLG)k{(UTfySv51
zKf*=M{cv$+w7$Buth8i%FRu#3`@3yyuWxFssVu|-Nq2AN<@xFT`8!6)<$A2qvbs{O
z9vsPng2Vh%d1>MG^Lyu0tgL!RLQx>R_P4j6cduUna1KS&{T;BiFgZ5R3yd>9*ta%2
zE`xVPrDec4LaGdsK#}<X<H*7S5|SLa6cZ~0iIfr{C~qw=j<p&QNgJCID}&R<Swli$
z3cQk(iZN2LRDi%al${Lx8OL;pA--uRoexq;o`VlDQ3A{eU>_=w#M}cS7D*!OBP4DQ
kpC;0uPuc_LBr1jo|61gJ-l#yVO8@`>07*qoM6N<$f|c`&7XSbN

diff --git a/mods/homedecor_tables/textures/homedecor_utility_table_legs_inv.png b/mods/homedecor_tables/textures/homedecor_utility_table_legs_inv.png
deleted file mode 100644
index 799477a48f9912cc6ae7642cbe97e1d2a7ae2235..0000000000000000000000000000000000000000
GIT binary patch
literal 0
HcmV?d00001

literal 4371
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
N002ovPDHLkV1lvj0M!5h

diff --git a/mods/homedecor_tables/textures/homedecor_utility_table_tb.png b/mods/homedecor_tables/textures/homedecor_utility_table_tb.png
deleted file mode 100644
index b3ba2be505e010b6d950d9143f479a0b9c51ee88..0000000000000000000000000000000000000000
GIT binary patch
literal 0
HcmV?d00001

literal 576
zcmV-G0>Ax<P)<h;3K|Lk000e1NJLTq000mG000mO0ssI2kdbIM00069Nkl<Zc-keA
z<#iY_5QG;b9hjM@f<OiSpK?-ADhV}^2Et5czB|!op0i@u`Q}Od?CF!WrJ328{>AGz
zKIp|o+}K;&+*n>{I5_!zKAoN%U!2_3N{5FJ<21UZ1;4qsDj{sI^$SZ2pFSQv-k)FG
zSY&0LomsiO`KIxE$|SUTu=?%Y4{3c%N~A(W)d=^lCv#m731+222o*+eWZruzIk}lx
zX@fc*r<hY6Q_aI2v9K|;5TzPUMI7b=as|;U7M=I#b0sW|3waUmhFCx-*`yDm&Lv7v
zfSy+mM>vZ)TQ+t|mFf^HiGafloSDI$uQ4JA-WoMnLd0}Ov6h<wyFtmR6ta>hWC?sD
z53Yc_xW1!I+l#H&#>lu+_Bz{0sdi5rQ=CLSgHTf}#(j^+5ijOudsw1et(Nn_a1K%S
z9&qWLXN2;2H%_H=jUL@*!?7s(ayyh#tQg3+BqTCSiGom}5JZKG*j%f)M-0^>T_8}h
zrDB%L`IubFMP2j%*WeX$FpWEu2w~aAIL1_&82Pv$2B`#|;22WD3w~Pr=KkpjW~mYa
z5cCKMPQZeA=-QYv#NeflnVljBRYag7o&af`NX+n&;2{p9SN4txdSyT_>R3G{7{P(=
z)l}V(?fdU@@2*ZSrfkE_WiHM6wXH9WCwRo8v-th@Wf^R$<>>DP(*6N?&T8iaOIkqy
O0000<MNUMnLSTaQIS1?j

diff --git a/mods/homedecor_tables/textures/homedecor_wood_table_edges.png b/mods/homedecor_tables/textures/homedecor_wood_table_edges.png
new file mode 100644
index 0000000000000000000000000000000000000000..3e3f98e79739a628532b8b1baf3cc0f5e64586a5
GIT binary patch
literal 204
zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE1|*BCs=ffJ$(}BbArXh)p4-iP$U&gx;eWY;
zXE74I7kR%bs&q3%Cal?eT*!f)Z_b+|#*5F#>Zc!dZ!_GyPh7@pCGW&mn-spo9pBuh
zifT@sB6Lf7X`RIpVTR~$9}Rt5W=#0qt0mj8ZvTDN{U0j4GFu*W96#|#B!J)H^2`T!
xmhEN!_qF!XO-nX|21cF)24;x^3@~O5qy6pps*K->CxFgl@O1TaS?83{1OOyDPB#Dm

literal 0
HcmV?d00001

diff --git a/mods/homedecor_tables/textures/homedecor_wood_table_large_edges.png b/mods/homedecor_tables/textures/homedecor_wood_table_large_edges.png
deleted file mode 100644
index c2b3d96e801a7b3608054d7bbfa8af3145c1864b..0000000000000000000000000000000000000000
GIT binary patch
literal 0
HcmV?d00001

literal 465
zcmV;?0WSWDP)<h;3K|Lk000e1NJLTq000mG000mO0ssI2kdbIM0004)Nkl<Zc-lRY
zw;4o5421uYwD0hc5t2~@&Cm(`;=Q|jyVBtKlxn;_`}7k@C}0AHSS!yxBd&^b$TUM<
zI(yFRE~1cdta4S2&$%Jv%24R7B@`Ljd)ETJQIT;K;mmZ;gzC*V+&EM#Rhrv+s5>h}
zCH3<c-)?KA_ZC6o)2x!h3=S~>$1sek9ZGwnEGq?C3t*aBjO~!^C5+sz=dU15PgR^V
z8J6<C#}*KQJwRM|qj0_R0Spi-OEr6dx0ROf8z4eJ6+z9MziRE-8OzGPcdbw^9G=%c
zJMxMMAg@Q?FS$$cc=Ni(Fud{J^?z>nx*k`CkI@K@1<H{7uj>|ew|AdCp~*~|i0e^*
z;wmE_*IJRa_wU<*rb)|^JRNm~=<%yNGd*o2{MXVyegBjM03-#rm9Gr<h(TeM<^W{4
z_EW$#JqB_qLc&=JuszM-2p9<Jcx)joM<NYMBikKdCI|tHz|=<{f5@4r7zhziD^Anh
zt1>fznc1huaHf9$>1U(5s=IMiq345`Anf6JqQcWa_Za;Fj>Q)Yis1M)00000NkvXX
Hu0mjfYCP3V

diff --git a/mods/homedecor_tables/textures/homedecor_wood_table_large_inv.png b/mods/homedecor_tables/textures/homedecor_wood_table_large_inv.png
deleted file mode 100644
index 2c4b3e8e8d96c17c0a1798a2a894b094b354f5c9..0000000000000000000000000000000000000000
GIT binary patch
literal 0
HcmV?d00001

literal 4095
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

diff --git a/mods/homedecor_tables/textures/homedecor_wood_table_large_square.png b/mods/homedecor_tables/textures/homedecor_wood_table_large_square.png
new file mode 100644
index 0000000000000000000000000000000000000000..3c64e3cc193e3c8843907fe0aeda8af87817dfc7
GIT binary patch
literal 1217
zcmV;y1U~zTP)<h;3K|Lk000e1NJLTq001BW002M;0ssI2^z7pK000DtNkl<ZSi|ks
zy^bVF6^7yO{6u7Cb$4|S+k?>f7#J&IAq+5amuuiQxEbyT69+7W!3b$I8iwks%8WSY
z#KGv@wl~d{D%^aGR2bhI^p`*XkqJcwfU0^7VQMWRgCN!~9wRer(RFKxasTwR%j;AN
zD>Gr5rdpMfw%(JrTIVX<t@;?5$>76Xh*Eg&^7^;G{sRCDh$u!1Q&M8U2at$}5pV+)
z0w9^wB)hx{Q$|u!cnT2{gm?&skCC7uVS|7QW(I)0UZ0-T4FFg%Y{VcD(t_4`_+Vy_
zfq~Z(Bae^!yxu*$Tkh{NlZc4Lt&i|hBqIBIm0H|~GKU*Tkq**bUZ0+xrdfzZK(C+I
z%UUNMWBA=&W&)th&AhO9jw-s#YjbO7J1n&gz_ud9O5L19rpkfDK<iO!B_x9PdUfky
z?aABqN=WnQ{d$-WWxiX7dEdJEG)+0ed@Z`XUjL8x`uWo*(W(FEqxS(|Bmi6wX9k;v
z2x-;R*N$WWktZSA<@M9YEwYKGHvk}^ump@5%Oa660;P)eE=4d99=p80`=*p4$YCRk
z2y&?K+M*PROra8)!^cQw!bmXjF0bA(EWl9V7%9TuMqvue)}j;|2@FgVHOon8?YYbA
zZ+`#l$P}XcignOI&;!l0x2+bnNXk%Ev-Ief9?wt5U0(lpx>SV<H#tP)*Uh?lL^cay
zuZmKqmrHA&IU+~w^?E&hjl<nCmoHyVV3?;0Z>=+PspYbEx?V?uxF9`zT-&<Kt1kBm
zm?wx-G%<uprAEfOrCa}D-|^OiUH;aCTMuqMxb@)HgP%qZKK|?POqhxSD5aQ(3a_hs
zIzjt(GLMlt*K)b8@bUQmd6(B^s$4`E%d$*U;iSvf23;QK<E*l^$;QZ$41PGe7IquE
zJbm{J03slU2UL&*1Z)5acZ9<_r~-f{mSvw;Wu$``-k=O2h+rsU#Yj-VI|!Ho5dhfj
zpFhAF07yY}ct90p!n$D?m|+3L+rH!7H~YLEpO*W_<M;b6YQ2TqRK-2F%ZtvF^(Z24
z4OEZ@D!aVCfB$|tD6uG5=h|&tPUm@%h_K`FZQrl0S5eC`YuV-HcfXw1%~WXXzS&CX
zATo<&UaC@IVeXMyiU@g%S=;5+dV`cL<$8W0WH;ZomxsecJsdBi+jiZ$Ez6SO&CXM~
zf4%-6@99t9LJPJI+wivUcMlMtHK?M@um&UmctUBX|Mx%P16pD0>%Jp8USB@<cko0w
zrWtL6R$#zwpVy!N0<{8(9;gZ=isG`O*6;t<6T=Wk2q6+eJN>T?2!jWdFapdN9l~(O
zb^#J@NXJsq4U1sg_Idroci(!Z5<Sj12R$e@$7Z>$*SVG!NyBR?t*7~RYX0H*XS=+9
z{&JcNipr|@;raR6w`Lw=ZJ}awL7kWXp4QbehiCX+FTefZ$tuF9)4H|od}&Brt}77^
zv%Z|$dO7vpkih6}-Y@4}Ud#RC0J<fJik3vEaM9V*&)2lxe%N=s^<bC3_2AZnTMuqM
fxb@&C(S!d3=rYeuD-HEW00000NkvXXu0mjfyK!Ak

literal 0
HcmV?d00001

diff --git a/mods/homedecor_tables/textures/homedecor_wood_table_large_square_inv.png b/mods/homedecor_tables/textures/homedecor_wood_table_large_square_inv.png
new file mode 100644
index 0000000000000000000000000000000000000000..88bb82926a0a80ca056c29df6e1f6d4068a70d03
GIT binary patch
literal 652
zcmV;70(1R|P)<h;3K|Lk000e1NJLTq001BW001Be0ssI2{21+{00070Nkl<ZNXPBf
zIgT7h5QX6vOJ?;lBAXx&B1@jmp!?`Dx{pj*x&R?yKoG+wyQ?x|lQ9r&mMNgajn4`r
ze){A0-<Z%;0H~@*3ey-76$G()^T?{|P1kK8^67Hf<#p+em6@<COYcfW+nhyP?}sit
zt$SuwG5B;2Q3|hJUjO>@ZvZSHqR0}aqC&zGC`3dC+(3;0NY%2)F0aB=QB)LOLc|0i
zPC<HRfl|VffDUE`fW2NXAJh#1Sdo^IBtqISCZ{Jedn6LC6IpNG?(=&7>D}?^TvbFw
zEN(NyTa$>I>s@+tPh}1_kfI!<yS!d5m*pVDBB0mxdRzO#nd#?qRRN%?&AhRAWf$G$
zb-0ahb~^TvfNf2Pm8Lm~ES&>|#F){0ClrGBdUcy%oyFVzPAK!3^L{#<+TpyW`P`=Y
zvMiNhzBWC+p8v<aetLcuUFJU@eI|e`0JxvNG1x3bNV{HNCW-+>U4>|u*XNI0)DSHn
z06;=v1sF4qM~R9Iv@SNMG(jRfc6ojGzO^Q(w5%qAN)=v5v?fs{)S@aqvzQ54VB%d~
zeIhNuP~pfDVISF;!fK3Yjk18mve2+vgw|QRy#Dg*&ru~rPaSL0NiYM$YmTiqwJ54k
zRkQM#w;3NUZ+3b8a=mqh3J*C&)XQemJfen$uy;l4%h%f&UX@W9d%fPTFL62_5AE~k
zD;Vab!rPe4+<LpMlkWE{5I2;E=Y6cZyz23(0P_NoiWX9sRC-jbTe;2u{yV<+V3&XN
m;L(Fe4<0>u^x%KdgMR@9&8(n)slIXm0000<MNUMnLSTY=sWD6d

literal 0
HcmV?d00001

diff --git a/mods/homedecor_tables/textures/homedecor_wood_table_large_tb.png b/mods/homedecor_tables/textures/homedecor_wood_table_large_tb.png
deleted file mode 100644
index 559b895e18f05610a9b687b5d4fd1cf20647e4ac..0000000000000000000000000000000000000000
GIT binary patch
literal 0
HcmV?d00001

literal 529
zcmV+s0`C2ZP)<h;3K|Lk000e1NJLTq000mG000mO0ssI2kdbIM0005lNkl<Zc-k$I
z#{m>E3`M^r+mpySG{A`?4NwvFP!2av^g#~0Gh-_t!k=J;_fDp_Z(gsr?%ck$y?^(i
zG<^L$9zCBQJbF}Wn@aum?c3$&*KeQHJYK$farVK}y0rp}U_z~8K~g4g0Wi(7+}Ly=
zEC6ufWO$it5f;i42$vFl9P_rWOCy$uL_v}zl1`L$_`0q)8nPZ9dP2J&m#aGjl;Hxi
z$YPo%0G!XT*qs1W5&R7yz%H#4iw_qf^JuMPcxaf8RUnd>laL37S`|`t9o;-F2onXV
zITztRv>RZawT%GK`_+v0%kHKklyp!Wy=TG4+0EkA0AoK5z_Q9ZukPL^u2o8f6W}<G
z<2;Qs=dgYr=9Ft@<WuL3MA9*fvqwK&9j!GB<7G~YS}kc?#Ind37H&;g4Sl~R>j4B>
zauB}my%i)=D+!T>iIDcg5E*HencZM!edy>HrWmzN6y^bo$X#hAcW`7>UCn!UH>i8o
zoZNBrQc4o8UYqFXc}HhAiYUzg&4KtECa$N(7%@$h^5}-(a3i8)s3i!r%2bKLtrkXT
zuGRWE(uPz4FmxwGWdRic%*dp^A1AAN3YTt^kO$zfh+39z&~SvB2LOqXLNNag+nQhg
TCY1&p00000NkvXXu0mjf3ccv9

diff --git a/mods/homedecor_tables/textures/homedecor_wood_table_small_round.png b/mods/homedecor_tables/textures/homedecor_wood_table_small_round.png
index 874227c3b615cb462671c382a9b6cb02191feb38..1cfeb9b12a40ab62c7c88f76768a764929b1c373 100644
GIT binary patch
literal 2294
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
QJpcdz07*qoM6N<$f_1uMo&W#<

delta 561
zcmV-10?z&R5xoSE7k?lK0ssI2{21+{00066Nkl<Zc-mr`UFf{DK6p!STwQ=(Q<z?%
zvu1mo;p`Ik`IWxQYJ;ZbI&~))R{Q8yc<C%_2$^5y4`{DG5@1JRAb^%6z@h*Bk2xvX
z2!+vv3$X8!BRtl%>)UaEMuTTEp?C2#X$QCgI8M2Ke184u=YRABfgAI}u5Z`bo3Idp
zfedM>>pegBpdgma1VBPe$%LZ4(Uxahao_ikf%;yNHenj?pMOO_KoxFq&-yry1Hi85
zn&tTf0q7$5H-rR-j7}`ELWn$aj8@t8ye!?;Ef6UdBov8d-i6G<mU<8igo%>OW7l&N
z)@AB|M}7NB0Dr1~xzqFK6K*0@Iw@b(`q=gSPIb>|3C1(M^mWU9-Vrel?p<0(5D<9Z
zcTV5+T$#&tz8+ND%&6(-heRU6J*TG5u)r9@)3^O~mZH(yoVA<RC2M(x4`FlY^H<qO
zATi28c0K>~=x8X@I|-4ei;(H-$cl{4%;9i%UAFYkU4PG%tB-@yBjK6hXrt900u{3`
z57h{VMb!7M=W_3>t+f(i(TCX5<2a@|Wj5yjPcG!Y+4YUMPs?-VanST!>d2nqMD*(N
zg23pk2nLV7?HOscZLV`A6QoOtWe*`c3#b8LMrD~l@7(ol78(Ah`XLkv1U$31OC6Sh
zG><GTnJUr<9=jgjJ}Cd~gKr;v`{3IL-#+*o88?rL1LY9}00000NkvXXu0mjfDa9Jj

diff --git a/mods/homedecor_tables/textures/homedecor_wood_table_small_round_inv.png b/mods/homedecor_tables/textures/homedecor_wood_table_small_round_inv.png
index b1d1a909db388127cfcb749d2e2b80f2abf15efe..44ad6593df02a88b933a040f4309f3c8da6bf9b8 100644
GIT binary patch
literal 2007
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

literal 5201
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
LNkvXXu0mjfBdh~b

diff --git a/mods/homedecor_tables/textures/homedecor_wood_table_small_square.png b/mods/homedecor_tables/textures/homedecor_wood_table_small_square.png
index 0a0d0722f04dc5c5f9ab7b897ee456e5f3de8e00..c5af8fc76f739c175932c2fcff2e82382a8e2d87 100644
GIT binary patch
literal 1467
zcmV;s1w{IZP)<h;3K|Lk000e1NJLTq001BW002M;0ssI2^z7pK000GoNkl<ZSi|ks
zJC9^X8OHJFy;Pmkmz`Og*|oI@<NyZ_ED;irk|BQw0zNX?3S_{nL1sPM)7|G()q5cr
zvuRIDBuG=~`2|N6JpZCU{{GiQ5M}@(?2$}l7Lft4+v<@(sz@ILk@I$Ul~+~y`DeF8
zsHK)7l+<kW)=N=kHgn5BCV|aE1nyv=C;ET>_@IA%``z*TfB)ju{!HYN!jzN<SO5uk
z4~Gp<Apnv&O#*-g7yY~Y(}&}t%)|gCxup;>L5M>T7LlM3A3;C`GXsDyrRP)pL?q0*
zeIeVO?r)V9F~WmHNDEr$uwZ8MK;ZFs<jt+x0Dy~rHZDdwZ+3T|-+lJx6CxrO8$H}g
z5%=uNS!yv0Wp*1NMH)yq`(0*U^e5IKtlRBwx2-R4_X2wSyquOgaYWc|mze-4a~)P#
zETf7}vk=Qgzdz>v;%aWEb01^00LEH`Sg8*qk*TsH5oq0Ot%QVgv(b)YyQ!DGFi6zh
zETSi`=QAOPdGF`#ye;!?iD7;1!=`D<@L@~Q&Exey#XlVHeGGj#9JY#Y-!9ezKqLU1
zw?_t#;Uc6}5BD9(06Y&uBs%qX-(B>_!|B6^ML)dnSWl&=H2@$X9|;U*Y&PQQ;V4x`
z?@|N-H}`C!m;HyMoer+Mz21FVUf<ObSwxVb!b|f~#50A8XNE;2Ga(X8T#6v$qCZAE
z8*3QG8m*-Yd!z_ki^Ak1Tk}#V5(rEawULw1(ldsGanWa>0Q#%1zWDs^=BqDW?<<y|
zt)M%aWp8UOIy@;|RmVv4e(HYr^2RfT=%UY?cYpc*UeD)sv^v_-Wb2;y>*&MWvke!v
zswj1OIJIV(;TitnaH<LwzUY_c>7i{ox4t!x_wNs23`-SWTW97{%W3I!K1YJMAk8h#
zZSn1HGndOgM!2ceIYGk`L@JsHVN$7{zN~4Zn@48Wf@N*+*uQ+4z*GErZKDrWl{yuz
zI!#lpN=a+)No%ch74D;2L}oI0yK_-;OIBvWMSpwS){viiaQ?@?=*k|@a}S<-@Z5vv
z9{jI+@Ta$bo9Eda;Wo@7(9MNN1zKwFqkAGE!@sTfMIb^?@{c|E_MO)v?)M<LCo>N-
zBC17tH^4JNBtW<aBFZ#9(T9ira(7_DR1^iJlwq#I%VL&B&>n|j9+`73r}F}f+gEp2
zdEHEviwI-0*-TU6q|@4hPPg;Ttg^OgL}Vm`U)-1$wh>o(`sNM*L_iF4s2~Y&i~tg5
zaKq@J3ILkeY_9XFj5H9#8k8Xf5ro1QM1maFLBI@%0KnD$?hQr*04eYebEu+BSXRUU
zGlm2Hu?P6%XV-bXdAZr&-u$%hqN6vrF;y|k_4J_gG`bfN8x2&D15~c^`s&rI%~pv;
z!8+GI;&eF98*%q>bMtZE&#hO{kuhtz%FA!RoR@W|(AsSs3!#H(3{U1wRVpmZ-BU{u
zAxjyfUFCK31}SUG`S?J{K5ShdUTj~~?ae9rSkG%8o6RQO+Bi;S|9JgR_w<Lap#^Kl
zSn+Y+cP}77Yfwd*F&dBnU<suw{onr#3uwhy9`_yI@%ZxD?_dcxOf%XFtw6xWbzWb8
zj#`04cT@!uMR8hC>rek{i5T!32*DFVSNgBE@BwouAsozz4q=#KJpl<DNW-S04{QYM
zdY#wbee<<tD$(tXqtgq;YFJ0E%XzM)c~V#{rS%-P9-6(m`}8WWKfFK81x01iy<7fp
z?rR(7u{2j1b3vUqKOUB4WQL{NwO)Sn#*$Tp4~J!K>+#f(IGq<FY-fEqw&ir_y&-|<
zHmskHS9vY_+W`7V5EU&6SK*?wr5(>Xdi(Fb<6{r5^3OeZ?!j{po_p}zga3;j{0F$@
V^9&(V#+3j7002ovPDHLkV1hN>%PIf>

literal 982
zcmV;{11bE8P)<h;3K|Lk000e1NJLTq002Y)002Y?0{{R356xqM00054P)t-s0001+
zbVr|fNuPO5o_9!~cu1*&Q=ocIo_I{Ae^R1+P^W-Vr+!hZgHxh=PMdK<pL$QAd{U=?
zQ?H0ws)ACaeo~=)QK*4btAtgtiCMIbUb&E8uZC5ne^a1+P_Kqrw2NA>hgPnJR=bg3
z!IWROkzc@*Ua^c_hgL6uQ!a;CFMv@lf>bVjPc4L2Fo#(&eo!ueRW5>7E`(Yzhg&g=
zT``ARFM?PubVn?7Ni1<hDRxRMb4Mw5NGxqXDQi6`ZbB+?Mk#SaDTG}xhh8y<UoVSf
zHH2F*iC{B_U@?AHE`V1qiefmHa6X)NN|kRzk!(Geaz~qXOQV5RtA<smgH)`AQm2AZ
zq<c`Ug;l41Q?Q9#v4>f%hghb4QkHB!mTf|ra6^@DL78$xoOMW=b4H+hP<>G?gjg_(
zU@?hbF?L2QbVMv}KPq%ZEO<#QfKM)cO)Yy$EqhEYdPyv9L@IVmEP72WdQU8SPAzy$
zEO<&Rsf1OgfK;o5SE_|pw2WM?iCVCWT)2^9w~}F~gjSPkKa*`imT*LuaYdkdQlfiO
zse)CigI1w?PnObvEdT%k<Vi$9RCwCG)-#|bNf?09^RI2&w(W44tu2IWTZ%VYM{C;{
z8|m1>b3b*BjT+Xy-5ph*mcFp$U)xkz{@)<`i;zJy6hgLQE3t}ygPj;x2swaRb`e6O
z?QNp6^+KZA_L`Vj2sz4fr?pFMO9`Deu{nbaAtw{kLMSc37A})o&A>v)Sr!AE2q6$^
z<};h{XCdTLg5_>|0+p>*{9XtNF894Fgm3LA%yyN~Z8IVHic|>MnaXY|n>x=xr}|N+
ztA*b*>xS+^$d+8=Gh6G%);e7-guh%OblIGb3L&>xe4{N`={<LtVlVI7T&J7(pb&Bo
z|AMWYsjqN`eoiycY5L-H-YJAU03i?tImJIN5|-R<-Y$e(!l~$^%O;X@#lnA5+YDYV
zggmw6H89el!f?k6;bYg@LdA=PkXHyJ940*Gb+33*Xt0x~@Uj<}y&;fCG6QA{uVlug
zM>7K&Qpo&v)R+mFMrDxwP0Iw#v_i-}Hp>LeW`&TGRGEOO3L&RRnSe=!kV~{?0;aVP
za+#C~m{bS}*?=j8Y-)#0!0b>6x!EU~fcc~la;uaHm{bV4Pn`*vx)Ac9DibhOA>>KD
zG6B=85c0H?37Av}*(uv6j}$`e)R0MwN1w<eB7-!T0|7RlX3eOAQUCw|07*qoM6N<$
Ef+kU^WB>pF

diff --git a/mods/homedecor_tables/textures/homedecor_wood_table_small_square_inv.png b/mods/homedecor_tables/textures/homedecor_wood_table_small_square_inv.png
index a36081d32e7789fff90197c6c628ec4907e7d094..9b84a0f0af9b326172d377cd9962af8fb2ea78bd 100644
GIT binary patch
literal 901
zcmV;01A6?4P)<h;3K|Lk000e1NJLTq001BW001Be0ssI2{21+{0009_Nkl<ZNXPBf
zy>47p6o%n%{p@|lX9n9KlSCk-6f|^P2)Dr{(?vo71qUR;csw)b?7i0yh3UtUD81VC
zRA2Mb&p-W01Yrgs!XC*)W)T?xyR9Axq>A)05V@JRpXF6mzI}Z|gj#ATLP^a=Z@m;%
zW;3@8WD?jsMBok<dZz#LpGW=e-G}4HzrXu>cP8>kVM<B_EP#Z&hr<S_5CF-XCIP^L
zi~fFpdN?l1Obk$xTM7{qgg69Y5eW+M5d>5)GXMxvdOpWbM8d4|7cy^kccZL`5gsH$
zTF^R&1v8rm0#E0W*Eebd051BCaWT@()%Nbq-Rp0@BqCz5(Zj72anHV-r53YLX14)S
zq=EEmx6RCp{=_<jb)L7|x!&IF1oZS?PD`CQB5b?OOaPR*4l68{QAMYX5X(isJLZ0I
zHMi5bk1<*RV=Y3g)Q6GCRN0XTwC=T5Lc+P(XvZ;M)yrNOB<gM!(UaHnnUKT0_w&4&
z%VxX8u)g+T(==uHu%+nL)BMlzkH@`_p^t~dta$%!u^s>-0pL6z89auIkXAkHJCXr-
z9)w7A>h~Wm`s3mB@UZB^r;hbhdRhYj67rG2V8+#zczQTWmC?HtLBP#Do9Jc#aJ19G
zb-UBMuga^tIwFe*GE{hJUW$08Q1Q&Lh-4;2f{9BJWL)&eXlG*$!&sxWRAG-4VQW#C
zd}M203Pl2eX`(iA5?Xr3a4;_V3=}}W|KaVMyXzm`zS>nRL9?Jcnq_ZmEjm0YT~)_O
z^M2}ncYE!bLUhsR_5H6O_j*3Bqt(%tCbN6)*U^W$XB#eTRZ;5ncxufu!!!KhaH<Lw
zzUY_c>7i{ow?3Q4r%wkkhNTLxtuu3}<+OA<pCdtBkmeTWw)nig+LX&aM!2ceO@f9c
zh*UHY!lY6?eOc2+H;>G$1<TstvAexZ;5q)hw$X>GN}Y;Uou;W)rKGj@q_x&f74D;2
zL}oI0-nuBcB`Y)GqQALmYsh~+IREh%eP$2nr3WuPc<I4Q5B~2S{POPi&1Peca2sY3
z=;lJC0xh-o(LE87;qU9d2t?>v{;3D=@4Xgr--F<u%skA9s21tn0M7)G0O1~pDAV*z
bA0Gb#QxMV0kgq_!00000NkvXXu0mjfW1G7E

literal 4200
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

diff --git a/mods/unifieddyes/airbrush.lua b/mods/unifieddyes/airbrush.lua
new file mode 100644
index 00000000..44f155f0
--- /dev/null
+++ b/mods/unifieddyes/airbrush.lua
@@ -0,0 +1,498 @@
+-- This file supplies all the code related to the airbrush
+
+local S = minetest.get_translator("unifieddyes")
+
+function unifieddyes.on_airbrush(itemstack, player, pointed_thing)
+	local player_name = player:get_player_name()
+	local painting_with = nil
+
+	if unifieddyes.player_current_dye[player_name] then
+		painting_with = unifieddyes.player_current_dye[player_name]
+	end
+
+	if not painting_with then
+		minetest.chat_send_player(player_name, "*** You need to set a color first.")
+		minetest.chat_send_player(player_name, "*** Right-click any random node to open the color selector,")
+		minetest.chat_send_player(player_name, "*** or shift+right-click a colorized node to use its color.")
+		minetest.chat_send_player(player_name, "*** Be sure to click \"Accept\", or the color you select will be ignored.")
+		return
+	end
+
+	local pos = minetest.get_pointed_thing_position(pointed_thing)
+	if not pos then
+		local look_angle = player:get_look_vertical()
+		if look_angle > -1.55 then
+			minetest.chat_send_player(player_name, "*** No node selected")
+		else
+			local hexcolor = unifieddyes.get_color_from_dye_name(painting_with)
+			if hexcolor then
+				local r = tonumber(string.sub(hexcolor,1,2),16)
+				local g = tonumber(string.sub(hexcolor,3,4),16)
+				local b = tonumber(string.sub(hexcolor,5,6),16)
+				player:set_sky({r=r,g=g,b=b,a=255},"plain")
+			end
+		end
+		return
+	end
+
+	local node = minetest.get_node(pos)
+	local def = minetest.registered_items[node.name]
+	if not def then return end
+
+	if minetest.is_protected(pos, player_name) then
+		minetest.chat_send_player(player_name, "*** Sorry, someone else owns that node.")
+		return
+	end
+
+	if not (def.groups and def.groups.ud_param2_colorable and def.groups.ud_param2_colorable > 0) then
+		minetest.chat_send_player(player_name, "*** That node can't be colored.")
+		return
+	end
+
+	local palette = nil
+	local fdir = 0
+	if not def or not def.palette then
+		minetest.chat_send_player(player_name, "*** That node can't be colored -- it's either undefined or has no palette.")
+		return
+	elseif def.palette == "unifieddyes_palette_extended.png" then
+		palette = "extended"
+	elseif def.palette == "unifieddyes_palette_colorwallmounted.png" then
+		palette = "wallmounted"
+		fdir = node.param2 % 8
+	elseif def.palette ~= "unifieddyes_palette_extended.png"
+	  and def.palette ~= "unifieddyes_palette_colorwallmounted.png"
+	  and string.find(def.palette, "unifieddyes_palette_") then
+		palette = "split"
+		fdir = node.param2 % 32
+	else
+		minetest.chat_send_player(player_name, "*** That node can't be colored -- it has an invalid color mode.")
+		return
+	end
+
+	local idx, hue = unifieddyes.getpaletteidx(painting_with, palette)
+	local inv = player:get_inventory()
+	if (not creative or not creative.is_enabled_for(player_name)) and not inv:contains_item("main", painting_with) then
+		local suff = ""
+		if not idx then
+			suff = "  Besides, "..string.sub(painting_with, 5).." can't be applied to that node."
+		end
+		minetest.chat_send_player(player_name, "*** You're in survival mode, and you're out of "..string.sub(painting_with, 5).."."..suff)
+		return
+	end
+
+	if not idx then
+		minetest.chat_send_player(player_name, "*** "..string.sub(painting_with, 5).." can't be applied to that node.")
+		return
+	end
+
+	local oldidx = node.param2 - fdir
+	local name = def.airbrush_replacement_node or node.name
+
+	if palette == "split" then
+
+		local modname = string.sub(name, 1, string.find(name, ":")-1)
+		local nodename2 = string.sub(name, string.find(name, ":")+1)
+		local oldcolor = "snozzberry"
+		local newcolor = "razzberry" -- intentionally misspelled ;-)
+
+		if def.ud_color_start and def.ud_color_end then
+			oldcolor = string.sub(node.name, def.ud_color_start, def.ud_color_end)
+			newcolor = string.sub(painting_with, 5)
+		else
+			if hue ~= 0 then
+				newcolor = unifieddyes.HUES_EXTENDED[hue][1]
+			else
+				newcolor = "grey"
+			end
+
+			if def.airbrush_replacement_node then
+				oldcolor = "grey"
+			else
+				local s = string.sub(def.palette, 21)
+				oldcolor = string.sub(s, 1, string.find(s, "s.png")-1)
+			end
+		end
+
+		name = modname..":"..string.gsub(nodename2, oldcolor, newcolor)
+
+		if not minetest.registered_items[name] then
+			minetest.chat_send_player(player_name, "*** "..string.sub(painting_with, 5).." can't be applied to that node.")
+			return
+		end
+	elseif idx == oldidx then
+		return
+	end
+	minetest.swap_node(pos, {name = name, param2 = fdir + idx})
+	if not creative or not creative.is_enabled_for(player_name) then
+		inv:remove_item("main", painting_with)
+		return
+	end
+end
+
+local hps = 0.6 -- horizontal position scale
+local vps = 1.3 -- vertical position scale
+local vs = 0.1 -- vertical shift/offset
+
+local color_button_size = ";0.75,0.75;"
+local color_square_size = ";0.69,0.69;"
+
+function unifieddyes.make_readable_color(color)
+        -- is this a low saturation color?
+        local has_low_saturtation = string.find(color, "s50");
+
+        -- remove _s50 tag, we care about that later again
+	local s = string.gsub(color, "_s50", "")
+
+        -- replace underscores with spaces to make it look nicer
+	local s = string.gsub(s, "_", " ")
+
+        -- capitalize words, you know, looks nicer ;)
+        s = string.gsub(s, "(%l)(%w*)", function(a,b) return string.upper(a)..b end)
+
+        -- add the word dye, this is what the translations expect
+        s = s.." Dye"
+
+	-- if it is a low sat color, append an appropriate string
+	if has_low_saturtation then
+	  s = s.." (low saturation)"
+	end
+
+	return s
+end
+
+function unifieddyes.make_colored_square(hexcolor, colorname, showall, creative, painting_with, nodepalette, hp, v2, selindic, inv, explist)
+
+	local dye = "dye:"..colorname
+
+	local overlay = ""
+	local colorize = minetest.formspec_escape("^[colorize:#"..hexcolor..":255")
+
+	if not creative and inv:contains_item("main", dye) then
+		overlay = "^unifieddyes_onhand_overlay.png"
+	end
+
+	local unavail_overlay = ""
+	if not showall and not unifieddyes.palette_has_color[nodepalette.."_"..colorname]
+		or (explist and not explist[colorname]) then
+		if overlay == "" then
+			unavail_overlay = "^unifieddyes_unavailable_overlay.png"
+		else
+			unavail_overlay = "^unifieddyes_onhand_unavailable_overlay.png"
+		end
+	end
+
+	local tooltip = "tooltip["..colorname..";"..
+					S(unifieddyes.make_readable_color(colorname))..
+					"\n(dye:"..colorname..")]"
+
+	if dye == painting_with then
+		overlay = "^unifieddyes_select_overlay.png"
+		selindic = "unifieddyes_white_square.png"..colorize..overlay..unavail_overlay.."]"..tooltip
+	end
+
+	local form
+	if unavail_overlay == "" then
+		form = "image_button["..
+					(hp*hps)..","..(v2*vps+vs)..
+					color_button_size..
+					"unifieddyes_white_square.png"..colorize..overlay..unavail_overlay..";"..
+					colorname..";]"..
+					tooltip
+	else
+		form = "image["..
+					(hp*hps)..","..(v2*vps+vs)..
+					color_square_size..
+					"unifieddyes_white_square.png"..colorize..overlay..unavail_overlay.."]"..
+					tooltip
+	end
+
+	return form, selindic
+end
+
+function unifieddyes.show_airbrush_form(player)
+	if not player then return end
+
+	local t = {}
+
+	local player_name = player:get_player_name()
+	local painting_with = unifieddyes.player_selected_dye[player_name] or unifieddyes.player_current_dye[player_name]
+	local creative = creative and creative.is_enabled_for(player_name)
+	local inv = player:get_inventory()
+	local nodepalette = "extended"
+	local showall = unifieddyes.player_showall[player_name]
+
+	t[1] = "size[14.5,8.5]label[7,-0.3;"..S("Select a color:").."]"
+	local selindic = "unifieddyes_select_overlay.png^unifieddyes_question.png]"
+
+	local last_right_click = unifieddyes.player_last_right_clicked[player_name]
+	if last_right_click then
+		if last_right_click.def and last_right_click.def.palette then
+			if last_right_click.def.palette == "unifieddyes_palette_colorwallmounted.png" then
+				nodepalette = "wallmounted"
+			elseif last_right_click.def.palette == "unifieddyes_palette_extended.png" then
+				t[#t+1] = "label[0.5,8.25;"..S("(Right-clicked a node that supports all 256 colors, showing them all)").."]"
+				showall = true
+			elseif last_right_click.def.palette ~= "unifieddyes_palette_extended.png"
+			  and last_right_click.def.palette ~= "unifieddyes_palette_colorwallmounted.png"
+			  and string.find(last_right_click.def.palette, "unifieddyes_palette_") then
+				nodepalette = "split"
+			end
+		end
+	end
+
+	if not last_right_click.def.groups
+	  or not last_right_click.def.groups.ud_param2_colorable
+	  or not last_right_click.def.palette
+	  or not string.find(last_right_click.def.palette, "unifieddyes_palette_") then
+		t[#t+1] = "label[0.5,8.25;"..S("(Right-clicked a node not supported by the Airbrush, showing all colors)").."]"
+	end
+
+	local explist = last_right_click.def.explist
+
+	for v = 0, 6 do
+		local val = unifieddyes.VALS_EXTENDED[v+1]
+
+		local sat = ""
+		local v2=(v/2)
+
+		for hi, h in ipairs(unifieddyes.HUES_EXTENDED) do
+			local hue = h[1]
+			local hp=hi-1
+
+			local r = h[2]
+			local g = h[3]
+			local b = h[4]
+
+			local factor = 40
+			if v > 3 then
+				factor = 75
+				v2 = (v-2)
+			end
+
+			local r2 = math.max(math.min(r + (4-v)*factor, 255), 0)
+			local g2 = math.max(math.min(g + (4-v)*factor, 255), 0)
+			local b2 = math.max(math.min(b + (4-v)*factor, 255), 0)
+
+			local hexcolor = string.format("%02x", r2)..string.format("%02x", g2)..string.format("%02x", b2)
+			local f
+			f, selindic = unifieddyes.make_colored_square(hexcolor, val..hue..sat, showall, creative, painting_with, nodepalette, hp, v2, selindic, inv, explist)
+			t[#t+1] = f
+		end
+
+		if v > 3 then
+			sat = "_s50"
+			v2 = (v-1.5)
+
+			for hi, h in ipairs(unifieddyes.HUES_EXTENDED) do
+				local hue = h[1]
+				local hp=hi-1
+
+				local r = h[2]
+				local g = h[3]
+				local b = h[4]
+
+				local factor = 75
+
+				local pr = 0.299
+				local pg = 0.587
+				local pb = 0.114
+
+				local r2 = math.max(math.min(r + (4-v)*factor, 255), 0)
+				local g2 = math.max(math.min(g + (4-v)*factor, 255), 0)
+				local b2 = math.max(math.min(b + (4-v)*factor, 255), 0)
+
+				local p = math.sqrt(r2*r2*pr + g2*g2*pg + b2*b2*pb)
+				local r3 = math.floor(p+(r2-p)*0.5)
+				local g3 = math.floor(p+(g2-p)*0.5)
+				local b3 = math.floor(p+(b2-p)*0.5)
+
+				local hexcolor = string.format("%02x", r3)..string.format("%02x", g3)..string.format("%02x", b3)
+				local f
+				f, selindic = unifieddyes.make_colored_square(hexcolor, val..hue..sat, showall, creative, painting_with, nodepalette, hp, v2, selindic, inv, explist)
+				t[#t+1] = f
+			end
+		end
+	end
+
+	local v2=5
+	for y = 0, 15 do
+
+		local hp=15-y
+
+		local hexgrey = string.format("%02x", y*17)..string.format("%02x", y*17)..string.format("%02x", y*17)
+		local grey = "grey_"..y
+
+		if y == 0 then grey = "black" 
+		elseif y == 4 then grey = "dark_grey"
+		elseif y == 8 then grey = "grey"
+		elseif y == 11 then grey = "light_grey"
+		elseif y == 15 then grey = "white"
+		end
+
+		local f
+		f, selindic = unifieddyes.make_colored_square(hexgrey, grey, showall, creative, painting_with, nodepalette, hp, v2, selindic, inv, explist)
+		t[#t+1] = f
+
+	end
+
+	if not creative then
+		t[#t+1] = "image[10,"
+		t[#t+1] = (vps*5.55+vs)
+		t[#t+1] = color_button_size
+		t[#t+1] = "unifieddyes_onhand_overlay.png]label[10.7,"
+		t[#t+1] = (vps*5.51+vs)
+		t[#t+1] = ";"..S("Dyes").."]"
+		t[#t+1] = "label[10.7,"
+		t[#t+1] = (vps*5.67+vs)
+		t[#t+1] = ";on hand]"
+
+	end
+
+	t[#t+1] = "image[10,"
+	t[#t+1] = (vps*5+vs)
+	t[#t+1] = color_button_size
+	t[#t+1] = selindic
+
+	if painting_with then
+		t[#t+1] = "label[10.7,"
+		t[#t+1] = (vps*4.90+vs)
+		t[#t+1] = ";"..S("Your selection:").."]"
+		t[#t+1] = "label[10.7,"
+		t[#t+1] = (vps*5.07+vs)
+		t[#t+1] = ";"
+		t[#t+1] = S(unifieddyes.make_readable_color(string.sub(painting_with, 5)))
+		t[#t+1] = "]label[10.7,"
+		t[#t+1] = (vps*5.24+vs)
+		t[#t+1] = ";("
+		t[#t+1] = painting_with
+		t[#t+1] = ")]"
+	else
+		t[#t+1] = "label[10.7,"
+		t[#t+1] = (vps*5.07+vs)
+		t[#t+1] = ";"..S("Your selection").."]"
+	end
+
+	t[#t+1] = "button_exit[10.5,8;2,1;cancel;"..S("Cancel").."]button_exit[12.5,8;2,1;accept;"..S("Accept").."]"
+
+
+	if last_right_click and last_right_click.def and nodepalette ~= "extended" then
+		if showall then
+			t[#t+1] = "button[0,8;2,1;show_avail;"..S("Show Available").."]"
+			t[#t+1] = "label[2,8.25;"..S("(Currently showing all 256 colors)").."]"
+		else
+			t[#t+1] = "button[0,8;2,1;show_all;"..S("Show All Colors").."]"
+			t[#t+1] = "label[2,8.25;"..S("(Currently only showing what the right-clicked node can use)").."]"
+		end
+	end
+
+	minetest.show_formspec(player_name, "unifieddyes:dye_select_form", table.concat(t))
+end
+
+minetest.register_on_player_receive_fields(function(player, formname, fields)
+
+	if formname == "unifieddyes:dye_select_form" then
+
+		local player_name = player:get_player_name()
+		local nodepalette = "extended"
+		local showall = unifieddyes.player_showall[player_name]
+
+		local last_right_click = unifieddyes.player_last_right_clicked[player_name]
+		if last_right_click and last_right_click.def then
+			if last_right_click.def.palette then
+				if last_right_click.def.palette == "unifieddyes_palette_colorwallmounted.png" then
+					nodepalette = "wallmounted"
+				elseif last_right_click.def.palette ~= "unifieddyes_palette_extended.png" then
+					nodepalette = "split"
+				end
+			end
+		end
+
+		if fields.show_all then 
+			unifieddyes.player_showall[player_name] = true
+			unifieddyes.show_airbrush_form(player)
+			return
+		elseif fields.show_avail then 
+			unifieddyes.player_showall[player_name] = false
+			unifieddyes.show_airbrush_form(player)
+			return
+		elseif fields.quit then
+			if fields.accept then
+				local dye = unifieddyes.player_selected_dye[player_name]
+				if not dye then
+					minetest.chat_send_player(player_name, "*** Clicked \"Accept\", but no color was selected!")
+					return
+				elseif not showall
+						and not unifieddyes.palette_has_color[nodepalette.."_"..string.sub(dye, 5)] then
+					minetest.chat_send_player(player_name, "*** Clicked \"Accept\", but the selected color can't be used on the")
+					minetest.chat_send_player(player_name, "*** node that was right-clicked (and \"Show All\" wasn't in effect).")
+					if unifieddyes.player_current_dye[player_name] then
+						minetest.chat_send_player(player_name, "*** Ignoring it and sticking with "..string.sub(unifieddyes.player_current_dye[player_name], 5)..".")
+					else
+						minetest.chat_send_player(player_name, "*** Ignoring it.")
+					end
+					return
+				else
+					unifieddyes.player_current_dye[player_name] = dye
+					unifieddyes.player_selected_dye[player_name] = nil
+					minetest.chat_send_player(player_name, "*** Selected "..string.sub(dye, 5).." for the airbrush.")
+					return
+				end
+			else -- assume "Cancel" or Esc.
+				unifieddyes.player_selected_dye[player_name] = nil
+				return
+			end
+		else
+			local s1 = string.sub(minetest.serialize(fields), 11)
+			local s3 = string.sub(s1,1, string.find(s1, '"')-1)
+
+			local inv = player:get_inventory()
+			local creative = creative and creative.is_enabled_for(player_name)
+			local dye = "dye:"..s3
+
+			if (showall or unifieddyes.palette_has_color[nodepalette.."_"..s3]) and
+				(minetest.registered_items[dye] and (creative or inv:contains_item("main", dye))) then
+				unifieddyes.player_selected_dye[player_name] = dye 
+				unifieddyes.show_airbrush_form(player)
+			end
+		end
+	end
+end)
+
+minetest.register_tool("unifieddyes:airbrush", {
+	description = S("Dye Airbrush"),
+	inventory_image = "unifieddyes_airbrush.png",
+	use_texture_alpha = true,
+	tool_capabilities = {
+		full_punch_interval=0.1,
+	},
+	range = 12,
+	on_use = unifieddyes.on_airbrush,
+	on_place = function(itemstack, placer, pointed_thing)
+		local keys = placer:get_player_control()
+		local player_name = placer:get_player_name()
+		local pos = minetest.get_pointed_thing_position(pointed_thing)
+		local node
+		local def
+
+		if pos then node = minetest.get_node(pos) end
+		if node then def = minetest.registered_items[node.name] end
+
+		unifieddyes.player_last_right_clicked[player_name] = {pos = pos, node = node, def = def}
+
+		if not keys.aux1 then
+			unifieddyes.show_airbrush_form(placer)
+		elseif keys.aux1 then
+			if not pos or not def then return end
+			local newcolor = unifieddyes.color_to_name(node.param2, def)
+
+			if newcolor and string.find(def.paramtype2, "color") then
+				minetest.chat_send_player(player_name, "*** Switching to "..newcolor.." for the airbrush, to match that node.")
+				unifieddyes.player_current_dye[player_name] = "dye:"..newcolor 
+			else
+				minetest.chat_send_player(player_name, "*** That node is uncolored.")
+			end
+		elseif def.on_rightclick then
+			return def.on_rightclick(pos, node, placer, itemstack, pointed_thing)
+		end
+	end
+})
diff --git a/mods/unifieddyes/aliases.lua b/mods/unifieddyes/aliases.lua
new file mode 100644
index 00000000..785eb588
--- /dev/null
+++ b/mods/unifieddyes/aliases.lua
@@ -0,0 +1,23 @@
+minetest.register_alias("dye:light_red",  "dye:pink")
+minetest.register_alias("dye:medium_orange", "dye:brown")
+
+minetest.register_alias("unifieddyes:black",      "dye:black")
+minetest.register_alias("unifieddyes:dark_grey",  "dye:dark_grey")
+minetest.register_alias("unifieddyes:grey", 	  "dye:grey")
+minetest.register_alias("unifieddyes:light_grey", "dye:light_grey")
+minetest.register_alias("unifieddyes:white",      "dye:white")
+
+minetest.register_alias("unifieddyes:grey_0",     "dye:black")
+minetest.register_alias("unifieddyes:grey_4",     "dye:dark_grey")
+minetest.register_alias("unifieddyes:grey_8",     "dye:grey")
+minetest.register_alias("unifieddyes:grey_11",    "dye:light_grey")
+minetest.register_alias("unifieddyes:grey_15",    "dye:white")
+
+minetest.register_alias("unifieddyes:white_paint", "dye:white")
+minetest.register_alias("unifieddyes:titanium_dioxide", "dye:white")
+minetest.register_alias("unifieddyes:lightgrey_paint", "dye:light_grey")
+minetest.register_alias("unifieddyes:grey_paint", "dye:grey")
+minetest.register_alias("unifieddyes:darkgrey_paint", "dye:dark_grey")
+minetest.register_alias("unifieddyes:carbon_black", "dye:black")
+
+minetest.register_alias("unifieddyes:brown", "dye:brown")
diff --git a/mods/unifieddyes/api.lua b/mods/unifieddyes/api.lua
new file mode 100644
index 00000000..8b4eb14f
--- /dev/null
+++ b/mods/unifieddyes/api.lua
@@ -0,0 +1,494 @@
+-- This file supplies the majority of Unified Dyes' API
+
+local S = minetest.get_translator("unifieddyes")
+
+unifieddyes.player_current_dye = {}
+unifieddyes.player_selected_dye = {}
+unifieddyes.player_last_right_clicked = {}
+unifieddyes.palette_has_color = {}
+unifieddyes.player_showall = {}
+
+-- if a node with a palette is placed in the world,
+-- but the itemstack used to place it has no palette_index (color byte),
+-- create something appropriate to make it officially white.
+
+minetest.register_on_placenode(
+	function(pos, newnode, placer, oldnode, itemstack, pointed_thing)
+		local def = minetest.registered_items[newnode.name]
+
+		if not def
+		  or not def.palette
+		  or def.after_place_node
+		  or not placer then
+			return false
+		end
+
+		local param2
+		if not string.find(itemstack:to_string(), "palette_index") then
+			if def.palette == "unifieddyes_palette_extended.png"
+			  and def.paramtype2 == "color" then
+				param2 = 240
+			elseif def.palette == "unifieddyes_palette_colorwallmounted.png"
+			  and def.paramtype2 == "colorwallmounted" then
+				param2 = newnode.param2 % 8
+			elseif string.find(def.palette, "unifieddyes_palette_")
+			  and def.paramtype2 == "colorfacedir" then -- it's a split palette
+				param2 = newnode.param2 % 32
+			end
+
+			if param2 then
+				minetest.swap_node(pos, {name = newnode.name, param2 = param2})
+			end
+		end
+
+		if def.palette ~= "" then
+			minetest.get_meta(pos):set_int("palette_index", param2 or 240)
+		end
+	end
+)
+
+-- The complementary function:  strip-off the color if the node being dug is still white/neutral
+
+local function move_item(item, pos, inv, digger, fix_color)
+	if not (digger and digger:is_player()) then return end
+	local creative = creative_mode or minetest.check_player_privs(digger, "creative")
+	item = unifieddyes.fix_bad_color_info(item, fix_color)
+	if inv:room_for_item("main", item)
+	  and (not creative or not inv:contains_item("main", item, true)) then
+		inv:add_item("main", item)
+	elseif not creative then
+		minetest.item_drop(ItemStack(item), digger, pos)
+	end
+	minetest.remove_node(pos)
+end
+
+function unifieddyes.on_dig(pos, node, digger)
+	if not digger then return end
+	local playername = digger:get_player_name()
+	if minetest.is_protected(pos, playername) then 
+		minetest.record_protection_violation(pos, playername)
+		return
+	end
+
+	local oldparam2 = minetest.get_node(pos).param2
+	local def = minetest.registered_items[node.name]
+	local fix_color
+
+	if def.paramtype2 == "color" and oldparam2 == 240 and def.palette == "unifieddyes_palette_extended.png" then
+		fix_color = 240
+	elseif def.paramtype2 == "color" and oldparam2 == 0 and def.palette == "unifieddyes_palette_extended.png" then
+		fix_color = 0
+	elseif def.paramtype2 == "colorwallmounted" and math.floor(oldparam2 / 8) == 0 and def.palette == "unifieddyes_palette_colorwallmounted.png" then
+		fix_color = 0
+	elseif def.paramtype2 == "colorfacedir" and math.floor(oldparam2 / 32) == 0 and string.find(def.palette, "unifieddyes_palette_") then
+		fix_color = 0
+	end
+
+	local inv = digger:get_inventory()
+	if fix_color then
+		move_item(node.name, pos, inv, digger, fix_color)
+	else
+		return minetest.node_dig(pos, node, digger)
+	end
+end
+
+-- just stubs to keep old mods from crashing when expecting auto-coloring
+-- or getting back the dye on dig.
+
+function unifieddyes.recolor_on_place(foo)
+end
+
+function unifieddyes.after_dig_node(foo)
+end
+
+-- This helper function creates multiple copies of the passed node,
+-- for the split palette - one per hue, plus grey - and assigns
+-- proper palettes and other attributes
+
+function unifieddyes.generate_split_palette_nodes(name, def, drop)
+	for _, color in ipairs(unifieddyes.HUES_WITH_GREY) do
+		local def2 = table.copy(def)
+		local desc_color = string.gsub(string.upper(string.sub(color, 1, 1))..string.sub(color, 2), "_", " ")
+		if string.sub(def2.description, -1) == ")" then
+			def2.description = string.sub(def2.description, 1, -2)..", "..desc_color.." shades)"
+		else
+			def2.description = def2.description.."("..desc_color.." shades)"
+		end
+		def2.palette = "unifieddyes_palette_"..color.."s.png"
+		def2.paramtype2 = "colorfacedir"
+		def2.groups.ud_param2_colorable = 1
+
+		if drop then
+			def2.drop = {
+				items = {
+					{items = {drop.."_"..color}, inherit_color = true },
+				}
+			}
+		end
+
+		minetest.register_node(":"..name.."_"..color, def2)
+	end
+end
+
+-- This helper function creates a colored itemstack
+
+function unifieddyes.fix_bad_color_info(item, paletteidx)
+	local stack=minetest.itemstring_with_color(item, paletteidx)
+	return string.gsub(stack, "u0001color", "u0001palette_index")
+end
+
+function unifieddyes.make_colored_itemstack(item, palette, color)
+	local paletteidx = unifieddyes.getpaletteidx(color, palette)
+	return unifieddyes.fix_bad_color_info(item, paletteidx), paletteidx
+end
+
+-- these helper functions register all of the recipes needed to create colored
+-- nodes with any of the dyes supported by that node's palette.
+
+local function register_c(craft, h, sat, val)
+	local hue = (type(h) == "table") and h[1] or h
+	local color = ""
+	if val then
+		if craft.palette == "wallmounted" then
+			color = val..hue..sat
+		else
+			color = val..hue..sat
+		end
+	else
+		color = hue -- if val is nil, then it's grey.
+	end
+
+	local dye = "dye:"..color
+	local recipe = minetest.serialize(craft.recipe)
+	recipe = string.gsub(recipe, "MAIN_DYE", dye)
+	recipe = string.gsub(recipe, "NEUTRAL_NODE", craft.neutral_node)
+	local newrecipe = minetest.deserialize(recipe)
+
+	local coutput = craft.output or ""
+	local output = coutput
+	if craft.output_prefix then
+		if craft.palette ~= "split" then
+			output = craft.output_prefix..color..craft.output_suffix..coutput
+		else
+			if hue == "white" or hue == "black" or string.find(hue, "grey") then
+				output = craft.output_prefix.."grey"..craft.output_suffix..coutput
+			elseif hue == "pink" then
+				dye = "dye:light_red"
+				output = craft.output_prefix.."red"..craft.output_suffix..coutput
+			else
+				output = craft.output_prefix..hue..craft.output_suffix..coutput
+			end
+		end
+	end
+
+	local colored_itemstack =
+		unifieddyes.make_colored_itemstack(output, craft.palette, dye)
+
+	minetest.register_craft({
+		output = colored_itemstack,
+		type = craft.type,
+		recipe = newrecipe
+	})
+
+end
+
+function unifieddyes.register_color_craft(craft)
+	local hues_table = unifieddyes.HUES_EXTENDED
+	local sats_table = unifieddyes.SATS
+	local vals_table = unifieddyes.VALS_SPLIT
+	local greys_table = unifieddyes.GREYS
+
+	if craft.palette == "wallmounted" then
+		register_c(craft, "green", "", "light_")
+		register_c(craft, "blue", "", "light_")
+		hues_table = unifieddyes.HUES_WALLMOUNTED
+		sats_table = {""}
+		vals_table = unifieddyes.VALS
+	elseif craft.palette == "extended" then
+		vals_table = unifieddyes.VALS_EXTENDED
+		greys_table = unifieddyes.GREYS_EXTENDED
+	end
+
+	for _, hue in ipairs(hues_table) do
+		for _, val in ipairs(vals_table) do
+			for _, sat in ipairs(sats_table) do
+
+				if sat == "_s50" and val ~= "" and val ~= "medium_" and val ~= "dark_" then break end
+				register_c(craft, hue, sat, val)
+
+			end
+		end
+	end
+
+	for _, grey in ipairs(greys_table) do
+		register_c(craft, grey)
+	end
+
+	register_c(craft, "pink")
+
+end
+
+-- code borrowed from homedecor
+-- call this function to reset the rotation of a "wallmounted" object on place
+
+function unifieddyes.fix_rotation(pos, placer, itemstack, pointed_thing)
+	local node = minetest.get_node(pos)
+	local colorbits = node.param2 - (node.param2 % 8)
+
+	local yaw = placer:get_look_horizontal()
+	local dir = minetest.yaw_to_dir(yaw) -- -1.5)
+	local pitch = placer:get_look_vertical()
+
+	local fdir = minetest.dir_to_wallmounted(dir)
+
+	if pitch < -(math.pi/8) then
+		fdir = 0
+	elseif pitch > math.pi/8 then
+		fdir = 1
+	end
+	minetest.swap_node(pos, { name = node.name, param2 = fdir+colorbits })
+end
+
+-- use this when you have a "wallmounted" node that should never be oriented
+-- to floor or ceiling...
+
+function unifieddyes.fix_rotation_nsew(pos, placer, itemstack, pointed_thing)
+	local node = minetest.get_node(pos)
+	local colorbits = node.param2 - (node.param2 % 8)
+	local yaw = placer:get_look_horizontal()
+	local dir = minetest.yaw_to_dir(yaw+1.5)
+	local fdir = minetest.dir_to_wallmounted(dir)
+
+	minetest.swap_node(pos, { name = node.name, param2 = fdir+colorbits })
+end
+
+-- ... and use this one to force that kind of node off of floor/ceiling
+-- orientation after the screwdriver rotates it.
+
+function unifieddyes.fix_after_screwdriver_nsew(pos, node, user, mode, new_param2)
+	local new_fdir = new_param2 % 8
+	local color = new_param2 - new_fdir
+	if new_fdir < 2 then
+		new_fdir = 2
+		minetest.swap_node(pos, { name = node.name, param2 = new_fdir + color })
+		return true
+	end
+end
+
+function unifieddyes.is_buildable_to(placer_name, ...)
+	for _, pos in ipairs({...}) do
+		local node = minetest.get_node_or_nil(pos)
+		local def = node and minetest.registered_nodes[node.name]
+		if not (def and def.buildable_to) or minetest.is_protected(pos, placer_name) then
+			return false
+		end
+	end
+	return true
+end
+
+function unifieddyes.get_hsv(name) -- expects a node/item name
+	local hue = ""
+	local a,b
+	for _, i in ipairs(unifieddyes.HUES_EXTENDED) do
+		a,b = string.find(name, "_"..i[1])
+		if a then
+			hue = i[1]
+			break
+		end
+	end
+
+	if string.find(name, "_light_grey")     then hue = "light_grey"
+	elseif string.find(name, "_lightgrey")  then hue = "light_grey"
+	elseif string.find(name, "_dark_grey")  then hue = "dark_grey"
+	elseif string.find(name, "_darkgrey")   then hue = "dark_grey"
+	elseif string.find(name, "_grey")       then hue = "grey"
+	elseif string.find(name, "_white")      then hue = "white"
+	elseif string.find(name, "_black")      then hue = "black"
+	end
+
+	local sat = ""
+	if string.find(name, "_s50")    then sat = "_s50" end
+
+	local val = ""
+	if string.find(name, "dark_")   then val = "dark_"   end
+	if string.find(name, "medium_") then val = "medium_" end
+	if string.find(name, "light_")  then val = "light_"  end
+
+	return hue, sat, val
+end
+
+-- code partially borrowed from cheapie's plasticbox mod
+
+-- in the function below, color is just a color string, while
+-- palette_type can be:
+--
+-- "extended" = 256 color palette
+-- "split" = 200 color palette split into pieces for colorfacedir
+-- "wallmounted" = 32-color abridged palette
+
+function unifieddyes.getpaletteidx(color, palette_type)
+
+	local origcolor = color
+
+	if string.sub(color,1,4) == "dye:" then
+		color = string.sub(color,5,-1)
+	elseif string.sub(color,1,12) == "unifieddyes:" then
+		color = string.sub(color,13,-1)
+	else
+		return
+	end
+
+	if palette_type == "wallmounted" then
+		if unifieddyes.gpidx_grayscale_wallmounted[color] then
+			return (unifieddyes.gpidx_grayscale_wallmounted[color] * 8), 0
+		end
+	elseif palette_type == "split" then
+		if unifieddyes.gpidx_grayscale[color] then
+			return (unifieddyes.gpidx_grayscale[color] * 32), 0
+		end
+	elseif palette_type == "extended" then
+		if unifieddyes.gpidx_grayscale_extended[color] then
+			return unifieddyes.gpidx_grayscale_extended[color]+240, 0
+		end
+	end
+
+	local shade = "" -- assume full
+	if string.sub(color,1,6) == "faint_" then
+		shade = "faint"
+		color = string.sub(color,7,-1)
+	elseif string.sub(color,1,7) == "pastel_" then
+		shade = "pastel"
+		color = string.sub(color,8,-1)
+	elseif string.sub(color,1,6) == "light_" then
+		shade = "light"
+		color = string.sub(color,7,-1)
+	elseif string.sub(color,1,7) == "bright_" then
+		shade = "bright"
+		color = string.sub(color,8,-1)
+	elseif string.sub(color,1,7) == "medium_" then
+		shade = "medium"
+		color = string.sub(color,8,-1)
+	elseif string.sub(color,1,5) == "dark_" then
+		shade = "dark"
+		color = string.sub(color,6,-1)
+	end
+	if string.sub(color,-4,-1) == "_s50" then
+		shade = shade.."s50"
+		color = string.sub(color,1,-5)
+	end
+
+	if palette_type == "wallmounted" then
+		if color == "green" and shade == "light" then return 48,3
+		elseif color == "brown" then return 17,1
+		elseif color == "pink" then return 56,7
+		elseif color == "blue" and shade == "light" then return 40,5
+		elseif unifieddyes.gpidx_hues_wallmounted[color] and unifieddyes.gpidx_shades_wallmounted[shade] then
+			return (unifieddyes.gpidx_shades_wallmounted[shade] * 64 + unifieddyes.gpidx_hues_wallmounted[color] * 8), unifieddyes.gpidx_hues_wallmounted[color]
+		end
+	else
+		if color == "brown" then
+			color = "orange"
+			shade = "medium"
+		elseif color == "pink" then
+			color = "red"
+			shade = "light"
+		end
+		if palette_type == "split" then -- it's colorfacedir
+			if unifieddyes.gpidx_hues_extended[color] and unifieddyes.gpidx_shades_split[shade] then
+				return (unifieddyes.gpidx_shades_split[shade] * 32), unifieddyes.gpidx_hues_extended[color]+1
+			end
+		elseif palette_type == "extended" then
+			if unifieddyes.gpidx_hues_extended[color] and unifieddyes.gpidx_shades_extended[shade] then
+				return (unifieddyes.gpidx_hues_extended[color] + unifieddyes.gpidx_shades_extended[shade]*24), unifieddyes.gpidx_hues_extended[color]
+			end
+		end
+	end
+end
+
+function unifieddyes.get_color_from_dye_name(name)
+	if name == "dye:black" then
+		return "000000"
+	elseif name == "dye:white" then
+		return "ffffff"
+	end
+	local item = minetest.registered_items[name]
+	if not item then return end
+	local inv_image = item.inventory_image
+	if not inv_image then return end
+	return string.match(inv_image,"colorize:#(......):200")
+end
+
+-- get a node's dye color based on its palette and param2
+
+function unifieddyes.color_to_name(param2, def)
+	if not param2 or not def or not def.palette then return end
+
+	if def.palette == "unifieddyes_palette_extended.png" then
+		local color = param2
+
+		local v = 0
+		local s = 1 
+		if color < 24 then v = 1
+		elseif color > 23  and color < 48  then v = 2
+		elseif color > 47  and color < 72  then v = 3
+		elseif color > 71  and color < 96  then v = 4
+		elseif color > 95  and color < 120 then v = 5
+		elseif color > 119 and color < 144 then v = 5 s = 2
+		elseif color > 143 and color < 168 then v = 6
+		elseif color > 167 and color < 192 then v = 6 s = 2
+		elseif color > 191 and color < 216 then v = 7
+		elseif color > 215 and color < 240 then v = 7 s = 2
+		end
+
+		if color > 239 then
+			if color == 240 then return "white"
+			elseif color == 244 then return "light_grey"
+			elseif color == 247 then return "grey"
+			elseif color == 251 then return "dark_grey"
+			elseif color == 255 then return "black" 
+			else return "grey_"..15-(color-240)
+			end
+		else
+			local h = color - math.floor(color/24)*24
+			return unifieddyes.VALS_EXTENDED[v]..unifieddyes.HUES_EXTENDED[h+1][1]..unifieddyes.SATS[s]
+		end
+
+	elseif def.palette == "unifieddyes_palette_colorwallmounted.png" then
+		local color = math.floor(param2 / 8)
+		if color == 0 then return "white"
+		elseif color == 1 then return "light_grey"
+		elseif color == 2 then return "grey"
+		elseif color == 3 then return "dark_grey"
+		elseif color == 4 then return "black"
+		elseif color == 5 then return "light_blue"
+		elseif color == 6 then return "light_green"
+		elseif color == 7 then return "pink"
+		end
+		local v = math.floor(color/8)
+		local h = color - v * 8
+		return unifieddyes.VALS[v]..unifieddyes.HUES_WALLMOUNTED[h+1]
+
+	elseif string.find(def.palette, "unifieddyes_palette") then -- it's the split palette
+		-- palette names in this mode are always "unifieddyes_palette_COLORs.png"
+
+		local s = string.sub(def.palette, 21)
+		local color = string.sub(s, 1, string.find(s, "s.png")-1)
+
+		local v = math.floor(param2/32)
+		if color ~= "grey" then
+			if     v == 0 then return "faint_"..color
+			elseif v == 1 then return color
+			elseif v == 2 then return color.."_s50"
+			elseif v == 3 then return "light_"..color
+			elseif v == 4 then return "medium_"..color
+			elseif v == 5 then return "medium_"..color.."_s50"
+			elseif v == 6 then return "dark_"..color
+			elseif v == 7 then return "dark_"..color.."_s50"
+			end
+		else
+			if v > 0 and v < 6 then return unifieddyes.GREYS[v]
+			else return "white"
+			end
+		end
+	end
+end
diff --git a/mods/unifieddyes/color-tables.lua b/mods/unifieddyes/color-tables.lua
new file mode 100644
index 00000000..12eaa325
--- /dev/null
+++ b/mods/unifieddyes/color-tables.lua
@@ -0,0 +1,237 @@
+
+-- the names of the various colors here came from http://www.procato.com/rgb+index/
+
+unifieddyes.HUES_EXTENDED = {
+	{ "red",        0xff, 0x00, 0x00 },
+	{ "vermilion",  0xff, 0x40, 0x00 },
+	{ "orange",     0xff, 0x80, 0x00 },
+	{ "amber",      0xff, 0xbf, 0x00 },
+	{ "yellow",     0xff, 0xff, 0x00 },
+	{ "lime",       0xbf, 0xff, 0x00 },
+	{ "chartreuse", 0x80, 0xff, 0x00 },
+	{ "harlequin",  0x40, 0xff, 0x00 },
+	{ "green",      0x00, 0xff, 0x00 },
+	{ "malachite",  0x00, 0xff, 0x40 },
+	{ "spring",     0x00, 0xff, 0x80 },
+	{ "turquoise",  0x00, 0xff, 0xbf },
+	{ "cyan",       0x00, 0xff, 0xff },
+	{ "cerulean",   0x00, 0xbf, 0xff },
+	{ "azure",      0x00, 0x80, 0xff },
+	{ "sapphire",   0x00, 0x40, 0xff },
+	{ "blue",       0x00, 0x00, 0xff },
+	{ "indigo",     0x40, 0x00, 0xff },
+	{ "violet",     0x80, 0x00, 0xff },
+	{ "mulberry",   0xbf, 0x00, 0xff },
+	{ "magenta",    0xff, 0x00, 0xff },
+	{ "fuchsia",    0xff, 0x00, 0xbf },
+	{ "rose",       0xff, 0x00, 0x80 },
+	{ "crimson",    0xff, 0x00, 0x40 }
+}
+
+unifieddyes.HUES_WITH_GREY = {}
+
+for _,i in ipairs(unifieddyes.HUES_EXTENDED) do
+	table.insert(unifieddyes.HUES_WITH_GREY, i[1])
+end
+table.insert(unifieddyes.HUES_WITH_GREY, "grey")
+
+unifieddyes.HUES_WALLMOUNTED = {
+	"red",
+	"orange",
+	"yellow",
+	"green",
+	"cyan",
+	"blue",
+	"violet",
+	"magenta"
+}
+
+unifieddyes.SATS = {
+	"",
+	"_s50"
+}
+
+unifieddyes.VALS = {
+	"",
+	"medium_",
+	"dark_"
+}
+
+unifieddyes.VALS_SPLIT = {
+	"faint_",
+	"light_",
+	"",
+	"medium_",
+	"dark_"
+}
+
+unifieddyes.VALS_EXTENDED = {
+	"faint_",
+	"pastel_",
+	"light_",
+	"bright_",
+	"",
+	"medium_",
+	"dark_"
+}
+
+unifieddyes.GREYS = {
+	"white",
+	"light_grey",
+	"grey",
+	"dark_grey",
+	"black"
+}
+
+unifieddyes.GREYS_EXTENDED = table.copy(unifieddyes.GREYS)
+
+for i = 1, 14 do
+	if i ~= 0 and i ~= 4 and i ~= 8 and i ~= 11 and i ~= 15 then
+		table.insert(unifieddyes.GREYS_EXTENDED, "grey_"..i)
+	end
+end
+
+local default_dyes = {
+	"black",
+	"blue",
+	"brown",
+	"cyan",
+	"dark_green",
+	"dark_grey",
+	"green",
+	"grey",
+	"magenta",
+	"orange",
+	"pink",
+	"red",
+	"violet",
+	"white",
+	"yellow"
+}
+
+-- reverse lookups for getpaletteidx()
+
+unifieddyes.gpidx_aliases = {
+	["pink"] = "light_red",
+	["brown"] = "medium_orange",
+	["azure"] = "light_blue"
+}
+
+unifieddyes.gpidx_grayscale = {
+	["white"] = 1,
+	["light_grey"] = 2,
+	["grey"] = 3,
+	["dark_grey"] = 4,
+	["black"] = 5,
+}
+
+unifieddyes.gpidx_grayscale_extended = {
+	["white"] = 0,
+	["grey_14"] = 1,
+	["grey_13"] = 2,
+	["grey_12"] = 3,
+	["light_grey"] = 4,
+	["grey_11"] = 4,
+	["grey_10"] = 5,
+	["grey_9"] = 6,
+	["grey_8"] = 7,
+	["grey"] = 7,
+	["grey_7"] = 8,
+	["grey_6"] = 9,
+	["grey_5"] = 10,
+	["grey_4"] = 11,
+	["dark_grey"] = 11,
+	["grey_3"] = 12,
+	["grey_2"] = 13,
+	["grey_1"] = 14,
+	["black"] = 15,
+}
+
+unifieddyes.gpidx_grayscale_wallmounted = {
+	["white"] = 0,
+	["light_grey"] = 1,
+	["grey"] = 2,
+	["dark_grey"] = 3,
+	["black"] = 4,
+}
+
+unifieddyes.gpidx_hues_extended = {
+	["red"] = 0,
+	["vermilion"] = 1,
+	["orange"] = 2,
+	["amber"] = 3,
+	["yellow"] = 4,
+	["lime"] = 5,
+	["chartreuse"] = 6,
+	["harlequin"] = 7,
+	["green"] = 8,
+	["malachite"] = 9,
+	["spring"] = 10,
+	["aqua"] = 10,
+	["turquoise"] = 11,
+	["cyan"] = 12,
+	["cerulean"] = 13,
+	["azure"] = 14,
+	["skyblue"] = 14,
+	["sapphire"] = 15,
+	["blue"] = 16,
+	["indigo"] = 17,
+	["violet"] = 18,
+	["mulberry"] = 19,
+	["magenta"] = 20,
+	["fuchsia"] = 21,
+	["rose"] = 22,
+	["redviolet"] = 22,
+	["crimson"] = 23,
+}
+
+unifieddyes.gpidx_hues_wallmounted = {
+	["red"] = 0,
+	["orange"] = 1,
+	["yellow"] = 2,
+	["green"] = 3,
+	["cyan"] = 4,
+	["blue"] = 5,
+	["violet"] = 6,
+	["magenta"] = 7
+}
+
+unifieddyes.gpidx_shades = {
+	[""] = 1,
+	["s50"] = 2,
+	["light"] = 3,
+	["medium"] = 4,
+	["mediums50"] = 5,
+	["dark"] = 6,
+	["darks50"] = 7,
+}
+
+unifieddyes.gpidx_shades_split = {
+	["faint"] = 0,
+	[""] = 1,
+	["s50"] = 2,
+	["light"] = 3,
+	["medium"] = 4,
+	["mediums50"] = 5,
+	["dark"] = 6,
+	["darks50"] = 7,
+}
+
+unifieddyes.gpidx_shades_extended = {
+	["faint"] = 0,
+	["pastel"] = 1,
+	["light"] = 2,
+	["bright"] = 3,
+	[""] = 4,
+	["s50"] = 5,
+	["medium"] = 6,
+	["mediums50"] = 7,
+	["dark"] = 8,
+	["darks50"] = 9
+}
+
+unifieddyes.gpidx_shades_wallmounted = {
+	[""] = 1,
+	["medium"] = 2,
+	["dark"] = 3
+}
diff --git a/mods/unifieddyes/dyes-crafting.lua b/mods/unifieddyes/dyes-crafting.lua
new file mode 100644
index 00000000..2c11c41b
--- /dev/null
+++ b/mods/unifieddyes/dyes-crafting.lua
@@ -0,0 +1,309 @@
+-- crafting!
+
+-- Generate all dyes that are not part of the default minetest_game dyes mod
+
+local S = minetest.get_translator("unifieddyes")
+
+for _, h in ipairs(unifieddyes.HUES_EXTENDED) do
+	local hue = h[1]
+	local r = h[2]
+	local g = h[3]
+	local b = h[4]
+
+	for v = 0, 6 do
+		local val = unifieddyes.VALS_EXTENDED[v+1]
+
+		local factor = 40
+		if v > 3 then factor = 75 end
+
+		local r2 = math.max(math.min(r + (4-v)*factor, 255), 0)
+		local g2 = math.max(math.min(g + (4-v)*factor, 255), 0)
+		local b2 = math.max(math.min(b + (4-v)*factor, 255), 0)
+
+		-- full-sat color
+
+		local desc = hue:gsub("%a", string.upper, 1).." Dye"
+
+		if val ~= "" then
+			desc = val:sub(1, -2):gsub("%a", string.upper, 1) .." "..desc
+		end
+
+		local color = string.format("%02x", r2)..string.format("%02x", g2)..string.format("%02x", b2)
+		if minetest.registered_items["dye:"..val..hue] then
+			minetest.override_item("dye:"..val..hue, {
+				inventory_image = "unifieddyes_dye.png^[colorize:#"..color..":200",
+			})
+		else
+			if (val..hue) ~= "medium_orange"
+			  and (val..hue) ~= "light_red" then
+				minetest.register_craftitem(":dye:"..val..hue, {
+					description = S(desc),
+					inventory_image = "unifieddyes_dye.png^[colorize:#"..color..":200",
+					groups = { dye=1, not_in_creative_inventory=1 },
+				})
+			end
+		end
+		minetest.register_alias("unifieddyes:"..val..hue, "dye:"..val..hue)
+
+		if v > 3 then -- also register the low-sat version
+
+			local pr = 0.299
+			local pg = 0.587
+			local pb = 0.114
+
+			local p = math.sqrt(r2*r2*pr + g2*g2*pg + b2*b2*pb)
+			local r3 = math.floor(p+(r2-p)*0.5)
+			local g3 = math.floor(p+(g2-p)*0.5)
+			local b3 = math.floor(p+(b2-p)*0.5)
+
+			local color = string.format("%02x", r3)..string.format("%02x", g3)..string.format("%02x", b3)
+
+			minetest.register_craftitem(":dye:"..val..hue.."_s50", {
+				description = S(desc.." (low saturation)"),
+				inventory_image = "unifieddyes_dye.png^[colorize:#"..color..":200",
+				groups = { dye=1, not_in_creative_inventory=1 },
+			})
+			minetest.register_alias("unifieddyes:"..val..hue.."_s50", "dye:"..val..hue.."_s50")
+		end
+	end
+end
+
+-- register the greyscales too :P
+
+for y = 1, 14 do -- colors 0 and 15 are black and white, default dyes
+
+	if y ~= 4 and y ~= 8 and y~= 11 then -- don't register the three greys, they're done separately.
+
+		local rgb = string.format("%02x", y*17)..string.format("%02x", y*17)..string.format("%02x", y*17)
+		local name = "grey_"..y
+		local desc = "Grey Dye #"..y
+
+		minetest.register_craftitem(":dye:"..name, {
+			description = S(desc),
+			inventory_image = "unifieddyes_dye.png^[colorize:#"..rgb..":200",
+			groups = { dye=1, not_in_creative_inventory=1 },
+		})
+		minetest.register_alias("unifieddyes:"..name, "dye:"..name)
+	end
+end
+
+minetest.override_item("dye:grey", {
+	inventory_image = "unifieddyes_dye.png^[colorize:#888888:200",
+})
+
+minetest.override_item("dye:dark_grey", {
+	inventory_image = "unifieddyes_dye.png^[colorize:#444444:200",
+})
+
+minetest.register_craftitem(":dye:light_grey", {
+	description = S("Light grey Dye"),
+	inventory_image = "unifieddyes_dye.png^[colorize:#cccccc:200",
+	groups = { dye=1, not_in_creative_inventory=1 },
+})
+
+-- build a table of color <-> palette associations to reduce the need for
+-- realtime lookups with getpaletteidx()
+
+for _, palette in ipairs({"extended", "split", "wallmounted"}) do
+	local palette2 = palette
+
+	for i in ipairs(unifieddyes.SATS) do
+		local sat = (palette == "wallmounted") and "" or unifieddyes.SATS[i]
+		for _, hue in ipairs(unifieddyes.HUES_EXTENDED) do
+			for _, val in ipairs(unifieddyes.VALS_EXTENDED) do
+				local color = val..hue[1]..sat
+				if unifieddyes.getpaletteidx("dye:"..color, palette2) then
+					unifieddyes.palette_has_color[palette.."_"..color] = true
+				end
+			end
+		end
+	end
+
+	for y = 0, 15 do
+		local grey = "grey_"..y
+
+		if y == 0 then grey = "black" 
+		elseif y == 4 then grey = "dark_grey"
+		elseif y == 8 then grey = "grey"
+		elseif y == 11 then grey = "light_grey"
+		elseif y == 15 then grey = "white"
+		end
+		if unifieddyes.getpaletteidx("dye:"..grey, palette2) then
+			unifieddyes.palette_has_color[palette.."_"..grey] = true
+		end
+	end
+end
+
+unifieddyes.palette_has_color["wallmounted_light_red"] = true
+
+unifieddyes.base_color_crafts = {
+	{ "red",		"flowers:rose",				nil,				nil,			nil,			nil,		4 },
+	{ "vermilion",	"dye:red",					"dye:orange",		nil,			nil,			nil,		3 },
+	{ "orange",		"flowers:tulip",			nil,				nil,			nil,			nil,		4 },
+	{ "orange",		"dye:red",					"dye:yellow",		nil,			nil,			nil,		2 },
+	{ "amber",		"dye:orange",				"dye:yellow",		nil,			nil,			nil,		2 },
+	{ "yellow",		"flowers:dandelion_yellow",	nil,				nil,			nil,			nil,		4 },
+	{ "lime",		"dye:yellow",				"dye:chartreuse",	nil,			nil,			nil,		2 },
+	{ "lime",		"dye:yellow",				"dye:yellow",		"dye:green",	nil,			nil,		3 },
+	{ "chartreuse",	"dye:yellow",				"dye:green",		nil,			nil,			nil,		2 },
+	{ "harlequin",	"dye:chartreuse",			"dye:green",		nil,			nil,			nil,		2 },
+	{ "harlequin",	"dye:yellow",				"dye:green",		"dye:green",	nil,			nil,		3 },
+	{ "green", 		"default:cactus",			nil,				nil,			nil,			nil,		4 },
+	{ "green", 		"dye:yellow",				"dye:blue",			nil,			nil,			nil,		2 },
+	{ "malachite",	"dye:green",				"dye:spring",		nil,			nil,			nil,		2 },
+	{ "malachite",	"dye:green",				"dye:green",		"dye:cyan",		nil,			nil,		3 },
+	{ "malachite",	"dye:green",				"dye:green",		"dye:green",	"dye:blue",		nil,		4 },
+	{ "spring",		"dye:green",				"dye:cyan",			nil,			nil,			nil,		2 },
+	{ "spring",		"dye:green",				"dye:green",		"dye:blue",		nil,			nil,		3 },
+	{ "turquoise",	"dye:spring",				"dye:cyan",			nil,			nil,			nil,		2 },
+	{ "turquoise",	"dye:green",				"dye:cyan",			"dye:cyan",		nil,			nil,		3 },
+	{ "turquoise",	"dye:green",				"dye:green",		"dye:green",	"dye:blue",		"dye:blue",	5 },
+	{ "cyan",		"dye:green",				"dye:blue",			nil,			nil,			nil,		2 },
+	{ "cerulean",	"dye:cyan",					"dye:azure",		nil,			nil,			nil,		2 },
+	{ "cerulean",	"dye:cyan",					"dye:cyan",			"dye:blue",		nil,			nil,		3 },
+	{ "cerulean",	"dye:green",				"dye:green",		"dye:blue",		"dye:blue",		"dye:blue",	5 },
+	{ "azure",		"dye:cyan",					"dye:blue",			nil,			nil,			nil,		2 },
+	{ "azure",		"dye:green",				"dye:blue",			"dye:blue",		nil,			nil,		3 },
+	{ "sapphire",	"dye:azure",				"dye:blue",			nil,			nil,			nil,		2 },
+	{ "sapphire",	"dye:cyan",					"dye:blue",			"dye:blue",		nil,			nil,		3 },
+	{ "sapphire",	"dye:green",				"dye:blue",			"dye:blue",		"dye:blue",		nil,		4 },
+	{ "blue",		"flowers:geranium",			nil,				nil,			nil,			nil,		4 },
+	{ "indigo",		"dye:blue",					"dye:violet",		nil,			nil,			nil,		2 },
+	{ "violet",		"flowers:viola",			nil,				nil,			nil,			nil,		4 },
+	{ "violet",		"dye:blue",					"dye:magenta",		nil,			nil,			nil,		2 },
+	{ "mulberry",	"dye:violet",				"dye:magenta",		nil,			nil,			nil,		2 },
+	{ "mulberry",	"dye:violet",				"dye:blue",			"dye:red",		nil,			nil,		3 },
+	{ "magenta",	"dye:blue",					"dye:red",			nil,			nil,			nil,		2 },
+	{ "fuchsia",	"dye:magenta",				"dye:rose",			nil,			nil,			nil,		2 },
+	{ "fuchsia",	"dye:blue",					"dye:red",			"dye:rose",		nil,			nil,		3 },
+	{ "fuchsia",	"dye:red",					"dye:violet",		nil,			nil,			nil,		2 },
+	{ "rose",		"dye:magenta",				"dye:red",			nil,			nil,			nil,		2 },
+	{ "rose",		"dye:red",					"dye:red",			"dye:blue",		nil,			nil,		3 },
+	{ "crimson",	"dye:rose",					"dye:red",			nil,			nil,			nil,		2 },
+	{ "crimson",	"dye:magenta",				"dye:red",			"dye:red",		nil,			nil,		3 },
+	{ "crimson",	"dye:red",					"dye:red",			"dye:red",		"dye:blue",		nil,		4 },
+
+	{ "black",		"default:coal_lump",		nil,				nil,			nil,			nil,		4 },
+	{ "white",		"flowers:dandelion_white",	nil,				nil,			nil,			nil,		4 },
+}
+
+unifieddyes.shade_crafts = {
+	{ "faint_",		"",			"dye:white",		"dye:white",	"dye:white",	4 },
+	{ "pastel_",	"",			"dye:white",		"dye:white",	nil,			3 },
+	{ "light_",		"",			"dye:white",		nil,			nil,			2 },
+	{ "bright_",	"",			"color",			"dye:white",	nil,			3 },
+	{ "",			"_s50",		"dye:light_grey",	nil,			nil,			2 },
+	{ "",			"_s50",		"dye:black",		"dye:white",	"dye:white",	3 },
+	{ "medium_",	"",			"dye:black",		nil,			nil,			2 },
+	{ "medium_",	"_s50",		"dye:grey",			nil,			nil,			2 },
+	{ "medium_",	"_s50",		"dye:black",		"dye:white",	nil,			3 },
+	{ "dark_",		"",			"dye:black",		"dye:black",	nil,			3 },
+	{ "dark_",		"_s50",		"dye:dark_grey",	nil,			nil,			2 },
+	{ "dark_",		"_s50",		"dye:black",		"dye:black",	"dye:white",	4 },
+}
+
+for _,i in ipairs(unifieddyes.base_color_crafts) do
+	local color = i[1]
+	local yield = i[7]
+
+	minetest.register_craft( {
+		type = "shapeless",
+		output = "dye:"..color.." "..yield,
+		recipe = {
+			i[2],
+			i[3],
+			i[4],
+			i[5],
+			i[6],
+		},
+	})
+
+	for _,j in ipairs(unifieddyes.shade_crafts) do
+		local firstdye = j[3]
+		if firstdye == "color" then firstdye = "dye:"..color end
+
+		-- ignore black, white, anything containing the word "grey"
+
+		if color ~= "black" and color ~= "white" and not string.find(color, "grey") then
+
+			minetest.register_craft( {
+				type = "shapeless",
+				output = "dye:"..j[1]..color..j[2].." "..j[6],
+				recipe = {
+					"dye:"..color,
+					firstdye,
+					j[4],
+					j[5]
+				},
+			})
+		end
+	end
+end
+
+-- greys
+
+unifieddyes.greymixes = {
+	{ 1,	"dye:black",			"dye:black",		"dye:black",		"dye:dark_grey",	4 },
+	{ 2,	"dye:black",			"dye:black",		"dye:dark_grey",	nil,				3 },
+	{ 3,	"dye:black",			"dye:dark_grey",	nil,				nil,				2 },
+	{ 4,	"dye:white",			"dye:black",		"dye:black",		nil,				3 },
+	{ 5,	"dye:dark_grey",		"dye:dark_grey",	"dye:grey",			nil,				3 },
+	{ 6,	"dye:dark_grey",		"dye:grey",			nil,				nil,				2 },
+	{ 7,	"dye:dark_grey",		"dye:grey",			"dye:grey",			nil,				3 },
+	{ 8,	"dye:white",			"dye:black",		nil,				nil,				2 },
+	{ 9,	"dye:grey", 			"dye:grey",			"dye:light_grey",	nil,				3 },
+	{ 10,	"dye:grey",				"dye:light_grey",	"dye:light_grey",	nil,				3 },
+	{ 11,	"dye:white",			"dye:white",		"dye:black",		nil,				3 },
+	{ 12,	"dye:light_grey",		"dye:light_grey",	"dye:white",		nil,				3 },
+	{ 13,	"dye:light_grey",		"dye:white",		nil,				nil,				2 },
+	{ 14,	"dye:white", 			"dye:white",		"dye:light_grey",	nil,				3 },
+}
+
+for _, i in ipairs(unifieddyes.greymixes) do
+	local shade = i[1]
+	local dye1 = i[2]
+	local dye2 = i[3]
+	local dye3 = i[4]
+	local dye4 = i[5]
+	local yield = i[6]
+	local color = "grey_"..shade
+	if shade == 4 then
+		color = "dark_grey"
+	elseif shade == 8 then
+		color = "grey"
+	elseif shade == 11 then
+		color = "light_grey"
+	end
+
+	minetest.register_craft( {
+		type = "shapeless",
+		output = "dye:"..color.." "..yield,
+		recipe = {
+			dye1,
+			dye2,
+			dye3,
+			dye4,
+		},
+	})
+end
+
+-- other crafts
+-- we can't make dark orange anymore because brown/medium orange conflicts
+
+minetest.register_craft( {
+	type = "shapeless",
+	output = "dye:dark_orange",
+	recipe = {
+		"dye:brown",
+		"dye:brown"
+	},
+})
+
+minetest.register_craft( {
+	output = "unifieddyes:airbrush",
+	recipe = {
+		{ "basic_materials:brass_ingot", "",           "basic_materials:plastic_sheet" },
+		{ "",                   "default:steel_ingot", ""                              },
+		{ "",                   "",                    "default:steel_ingot"           }
+	},
+})
diff --git a/mods/unifieddyes/init.lua b/mods/unifieddyes/init.lua
index dcebc786..a8e5092b 100644
--- a/mods/unifieddyes/init.lua
+++ b/mods/unifieddyes/init.lua
@@ -2,12 +2,12 @@
 
 Unified Dyes
 
-This mod provides an extension to the Minetest 0.4.x dye system
+This mod provides an extension to the Minetest dye system
 
 ==============================================================================
 
-Copyright (C) 2012-2013, Vanessa Ezekowitz
-Email: vanessaezekowitz@gmail.com
+Copyright (C) 2012-2013, Vanessa Dannenberg
+Email: vanessa.e.dannenberg@gmail.com
 
 This program is free software; you can redistribute it and/or modify
 it under the terms of the GNU General Public License as published by
@@ -34,1562 +34,12 @@ unifieddyes = {}
 local creative_mode = minetest.settings:get_bool("creative_mode")
 
 local S = minetest.get_translator("unifieddyes")
+local modpath=minetest.get_modpath(minetest.get_current_modname())
 
--- the names of the various colors here came from http://www.procato.com/rgb+index/
-
-unifieddyes.HUES_EXTENDED = {
-	{ "red",        0xff, 0x00, 0x00 },
-	{ "vermilion",  0xff, 0x40, 0x00 },
-	{ "orange",     0xff, 0x80, 0x00 },
-	{ "amber",      0xff, 0xbf, 0x00 },
-	{ "yellow",     0xff, 0xff, 0x00 },
-	{ "lime",       0xbf, 0xff, 0x00 },
-	{ "chartreuse", 0x80, 0xff, 0x00 },
-	{ "harlequin",  0x40, 0xff, 0x00 },
-	{ "green",      0x00, 0xff, 0x00 },
-	{ "malachite",  0x00, 0xff, 0x40 },
-	{ "spring",     0x00, 0xff, 0x80 },
-	{ "turquoise",  0x00, 0xff, 0xbf },
-	{ "cyan",       0x00, 0xff, 0xff },
-	{ "cerulean",   0x00, 0xbf, 0xff },
-	{ "azure",      0x00, 0x80, 0xff },
-	{ "sapphire",   0x00, 0x40, 0xff },
-	{ "blue",       0x00, 0x00, 0xff },
-	{ "indigo",     0x40, 0x00, 0xff },
-	{ "violet",     0x80, 0x00, 0xff },
-	{ "mulberry",   0xbf, 0x00, 0xff },
-	{ "magenta",    0xff, 0x00, 0xff },
-	{ "fuchsia",    0xff, 0x00, 0xbf },
-	{ "rose",       0xff, 0x00, 0x80 },
-	{ "crimson",    0xff, 0x00, 0x40 }
-}
-
-unifieddyes.HUES_WITH_GREY = {}
-
-for _,i in ipairs(unifieddyes.HUES_EXTENDED) do
-	table.insert(unifieddyes.HUES_WITH_GREY, i[1])
-end
-table.insert(unifieddyes.HUES_WITH_GREY, "grey")
-
-unifieddyes.HUES_WALLMOUNTED = {
-	"red",
-	"orange",
-	"yellow",
-	"green",
-	"cyan",
-	"blue",
-	"violet",
-	"magenta"
-}
-
-unifieddyes.SATS = {
-	"",
-	"_s50"
-}
-
-unifieddyes.VALS = {
-	"",
-	"medium_",
-	"dark_"
-}
-
-unifieddyes.VALS_SPLIT = {
-	"faint_",
-	"light_",
-	"",
-	"medium_",
-	"dark_"
-}
-
-unifieddyes.VALS_EXTENDED = {
-	"faint_",
-	"pastel_",
-	"light_",
-	"bright_",
-	"",
-	"medium_",
-	"dark_"
-}
-
-unifieddyes.GREYS = {
-	"white",
-	"light_grey",
-	"grey",
-	"dark_grey",
-	"black"
-}
-
-unifieddyes.GREYS_EXTENDED = table.copy(unifieddyes.GREYS)
-
-for i = 1, 14 do
-	if i ~= 0 and i ~= 4 and i ~= 8 and i ~= 11 and i ~= 15 then
-		table.insert(unifieddyes.GREYS_EXTENDED, "grey_"..i)
-	end
-end
-
-local default_dyes = {
-	"black",
-	"blue",
-	"brown",
-	"cyan",
-	"dark_green",
-	"dark_grey",
-	"green",
-	"grey",
-	"magenta",
-	"orange",
-	"pink",
-	"red",
-	"violet",
-	"white",
-	"yellow"
-}
-
-unifieddyes.player_current_dye = {}
-unifieddyes.player_selected_dye = {}
-unifieddyes.player_last_right_clicked = {}
-unifieddyes.palette_has_color = {}
-unifieddyes.player_showall = {}
-
--- if a node with a palette is placed in the world,
--- but the itemstack used to place it has no palette_index (color byte),
--- create something appropriate to make it officially white.
-
-minetest.register_on_placenode(
-	function(pos, newnode, placer, oldnode, itemstack, pointed_thing)
-		local def = minetest.registered_items[newnode.name]
-
-		if not def
-		  or not def.palette
-		  or def.after_place_node
-		  or not placer then
-			return false
-		end
-
-		local param2
-		if not string.find(itemstack:to_string(), "palette_index") then
-			if def.palette == "unifieddyes_palette_extended.png"
-			  and def.paramtype2 == "color" then
-				param2 = 240
-			elseif def.palette == "unifieddyes_palette_colorwallmounted.png"
-			  and def.paramtype2 == "colorwallmounted" then
-				param2 = newnode.param2 % 8
-			elseif string.find(def.palette, "unifieddyes_palette_")
-			  and def.paramtype2 == "colorfacedir" then -- it's a split palette
-				param2 = newnode.param2 % 32
-			end
-
-			if param2 then
-				minetest.swap_node(pos, {name = newnode.name, param2 = param2})
-			end
-		end
-
-		if def.palette ~= "" then
-			minetest.get_meta(pos):set_int("palette_index", param2 or 240)
-		end
-	end
-)
-
--- The complementary function:  strip-off the color if the node being dug is still white/neutral
-
-local function move_item(item, pos, inv, digger, fix_color)
-	if not (digger and digger:is_player()) then return end
-	local creative = creative_mode or minetest.check_player_privs(digger, "creative")
-	item = unifieddyes.fix_bad_color_info(item, fix_color)
-	if inv:room_for_item("main", item)
-	  and (not creative or not inv:contains_item("main", item, true)) then
-		inv:add_item("main", item)
-	elseif not creative then
-		minetest.item_drop(ItemStack(item), digger, pos)
-	end
-	minetest.remove_node(pos)
-end
-
-function unifieddyes.on_dig(pos, node, digger)
-	if not digger then return end
-	local playername = digger:get_player_name()
-	if minetest.is_protected(pos, playername) then 
-		minetest.record_protection_violation(pos, playername)
-		return
-	end
-
-	local oldparam2 = minetest.get_node(pos).param2
-	local def = minetest.registered_items[node.name]
-	local fix_color
-
-	if def.paramtype2 == "color" and oldparam2 == 240 and def.palette == "unifieddyes_palette_extended.png" then
-		fix_color = 240
-	elseif def.paramtype2 == "color" and oldparam2 == 0 and def.palette == "unifieddyes_palette_extended.png" then
-		fix_color = 0
-	elseif def.paramtype2 == "colorwallmounted" and math.floor(oldparam2 / 8) == 0 and def.palette == "unifieddyes_palette_colorwallmounted.png" then
-		fix_color = 0
-	elseif def.paramtype2 == "colorfacedir" and math.floor(oldparam2 / 32) == 0 and string.find(def.palette, "unifieddyes_palette_") then
-		fix_color = 0
-	end
-
-	local inv = digger:get_inventory()
-	if fix_color then
-		move_item(node.name, pos, inv, digger, fix_color)
-	else
-		return minetest.node_dig(pos, node, digger)
-	end
-end
-
--- just stubs to keep old mods from crashing when expecting auto-coloring
--- or getting back the dye on dig.
-
-function unifieddyes.recolor_on_place(foo)
-end
-
-function unifieddyes.after_dig_node(foo)
-end
-
--- This helper function creates multiple copies of the passed node,
--- for the split palette - one per hue, plus grey - and assigns
--- proper palettes and other attributes
-
-function unifieddyes.generate_split_palette_nodes(name, def, drop)
-	for _, color in ipairs(unifieddyes.HUES_WITH_GREY) do
-		local def2 = table.copy(def)
-		local desc_color = string.gsub(string.upper(string.sub(color, 1, 1))..string.sub(color, 2), "_", " ")
-		if string.sub(def2.description, -1) == ")" then
-			def2.description = string.sub(def2.description, 1, -2)..", "..desc_color.." shades)"
-		else
-			def2.description = def2.description.."("..desc_color.." shades)"
-		end
-		def2.palette = "unifieddyes_palette_"..color.."s.png"
-		def2.paramtype2 = "colorfacedir"
-		def2.groups.ud_param2_colorable = 1
-
-		if drop then
-			def2.drop = {
-				items = {
-					{items = {drop.."_"..color}, inherit_color = true },
-				}
-			}
-		end
-
-		minetest.register_node(":"..name.."_"..color, def2)
-	end
-end
-
--- This helper function creates a colored itemstack
-
-function unifieddyes.fix_bad_color_info(item, paletteidx)
-	local stack=minetest.itemstring_with_color(item, paletteidx)
-	return string.gsub(stack, "u0001color", "u0001palette_index")
-end
-
-function unifieddyes.make_colored_itemstack(item, palette, color)
-	local paletteidx = unifieddyes.getpaletteidx(color, palette)
-	return unifieddyes.fix_bad_color_info(item, paletteidx), paletteidx
-end
-
--- these helper functions register all of the recipes needed to create colored
--- nodes with any of the dyes supported by that node's palette.
-
-local function register_c(craft, h, sat, val)
-	local hue = (type(h) == "table") and h[1] or h
-	local color = ""
-	if val then
-		if craft.palette == "wallmounted" then
-			color = val..hue..sat
-		else
-			color = val..hue..sat
-		end
-	else
-		color = hue -- if val is nil, then it's grey.
-	end
-
-	local dye = "dye:"..color
-	local recipe = minetest.serialize(craft.recipe)
-	recipe = string.gsub(recipe, "MAIN_DYE", dye)
-	recipe = string.gsub(recipe, "NEUTRAL_NODE", craft.neutral_node)
-	local newrecipe = minetest.deserialize(recipe)
-
-	local coutput = craft.output or ""
-	local output = coutput
-	if craft.output_prefix then
-		if craft.palette ~= "split" then
-			output = craft.output_prefix..color..craft.output_suffix..coutput
-		else
-			if hue == "white" or hue == "black" or string.find(hue, "grey") then
-				output = craft.output_prefix.."grey"..craft.output_suffix..coutput
-			elseif hue == "pink" then
-				dye = "dye:light_red"
-				output = craft.output_prefix.."red"..craft.output_suffix..coutput
-			else
-				output = craft.output_prefix..hue..craft.output_suffix..coutput
-			end
-		end
-	end
-
-	local colored_itemstack =
-		unifieddyes.make_colored_itemstack(output, craft.palette, dye)
-
-	minetest.register_craft({
-		output = colored_itemstack,
-		type = craft.type,
-		recipe = newrecipe
-	})
-
-end
-
-function unifieddyes.register_color_craft(craft)
-	local hues_table = unifieddyes.HUES_EXTENDED
-	local sats_table = unifieddyes.SATS
-	local vals_table = unifieddyes.VALS_SPLIT
-	local greys_table = unifieddyes.GREYS
-
-	if craft.palette == "wallmounted" then
-		register_c(craft, "green", "", "light_")
-		register_c(craft, "blue", "", "light_")
-		hues_table = unifieddyes.HUES_WALLMOUNTED
-		sats_table = {""}
-		vals_table = unifieddyes.VALS
-	elseif craft.palette == "extended" then
-		vals_table = unifieddyes.VALS_EXTENDED
-		greys_table = unifieddyes.GREYS_EXTENDED
-	end
-
-	for _, hue in ipairs(hues_table) do
-		for _, val in ipairs(vals_table) do
-			for _, sat in ipairs(sats_table) do
-
-				if sat == "_s50" and val ~= "" and val ~= "medium_" and val ~= "dark_" then break end
-				register_c(craft, hue, sat, val)
-
-			end
-		end
-	end
-
-	for _, grey in ipairs(greys_table) do
-		register_c(craft, grey)
-	end
-
-	register_c(craft, "pink")
-
-end
-
--- code borrowed from homedecor
--- call this function to reset the rotation of a "wallmounted" object on place
-
-function unifieddyes.fix_rotation(pos, placer, itemstack, pointed_thing)
-	local node = minetest.get_node(pos)
-	local colorbits = node.param2 - (node.param2 % 8)
-
-	local yaw = placer:get_look_horizontal()
-	local dir = minetest.yaw_to_dir(yaw) -- -1.5)
-	local pitch = placer:get_look_vertical()
-
-	local fdir = minetest.dir_to_wallmounted(dir)
-
-	if pitch < -(math.pi/8) then
-		fdir = 0
-	elseif pitch > math.pi/8 then
-		fdir = 1
-	end
-	minetest.swap_node(pos, { name = node.name, param2 = fdir+colorbits })
-end
-
--- use this when you have a "wallmounted" node that should never be oriented
--- to floor or ceiling...
-
-function unifieddyes.fix_rotation_nsew(pos, placer, itemstack, pointed_thing)
-	local node = minetest.get_node(pos)
-	local colorbits = node.param2 - (node.param2 % 8)
-	local yaw = placer:get_look_horizontal()
-	local dir = minetest.yaw_to_dir(yaw+1.5)
-	local fdir = minetest.dir_to_wallmounted(dir)
-
-	minetest.swap_node(pos, { name = node.name, param2 = fdir+colorbits })
-end
-
--- ... and use this one to force that kind of node off of floor/ceiling
--- orientation after the screwdriver rotates it.
-
-function unifieddyes.fix_after_screwdriver_nsew(pos, node, user, mode, new_param2)
-	local new_fdir = new_param2 % 8
-	local color = new_param2 - new_fdir
-	if new_fdir < 2 then
-		new_fdir = 2
-		minetest.swap_node(pos, { name = node.name, param2 = new_fdir + color })
-		return true
-	end
-end
-
-function unifieddyes.is_buildable_to(placer_name, ...)
-	for _, pos in ipairs({...}) do
-		local node = minetest.get_node_or_nil(pos)
-		local def = node and minetest.registered_nodes[node.name]
-		if not (def and def.buildable_to) or minetest.is_protected(pos, placer_name) then
-			return false
-		end
-	end
-	return true
-end
-
-function unifieddyes.get_hsv(name) -- expects a node/item name
-	local hue = ""
-	local a,b
-	for _, i in ipairs(unifieddyes.HUES_EXTENDED) do
-		a,b = string.find(name, "_"..i[1])
-		if a then
-			hue = i[1]
-			break
-		end
-	end
-
-	if string.find(name, "_light_grey")     then hue = "light_grey"
-	elseif string.find(name, "_lightgrey")  then hue = "light_grey"
-	elseif string.find(name, "_dark_grey")  then hue = "dark_grey"
-	elseif string.find(name, "_darkgrey")   then hue = "dark_grey"
-	elseif string.find(name, "_grey")       then hue = "grey"
-	elseif string.find(name, "_white")      then hue = "white"
-	elseif string.find(name, "_black")      then hue = "black"
-	end
-
-	local sat = ""
-	if string.find(name, "_s50")    then sat = "_s50" end
-
-	local val = ""
-	if string.find(name, "dark_")   then val = "dark_"   end
-	if string.find(name, "medium_") then val = "medium_" end
-	if string.find(name, "light_")  then val = "light_"  end
-
-	return hue, sat, val
-end
-
--- code partially borrowed from cheapie's plasticbox mod
-
--- in the function below, color is just a color string, while
--- palette_type can be:
---
--- "extended" = 256 color palette
--- "split" = 200 color palette split into pieces for colorfacedir
--- "wallmounted" = 32-color abridged palette
-
-
-function unifieddyes.getpaletteidx(color, palette_type)
-
-	local origcolor = color
-	local aliases = {
-		["pink"] = "light_red",
-		["brown"] = "medium_orange",
-		["azure"] = "light_blue"
-	}
-
-	local grayscale = {
-		["white"] = 1,
-		["light_grey"] = 2,
-		["grey"] = 3,
-		["dark_grey"] = 4,
-		["black"] = 5,
-	}
-
-	local grayscale_extended = {
-		["white"] = 0,
-		["grey_14"] = 1,
-		["grey_13"] = 2,
-		["grey_12"] = 3,
-		["light_grey"] = 4,
-		["grey_11"] = 4,
-		["grey_10"] = 5,
-		["grey_9"] = 6,
-		["grey_8"] = 7,
-		["grey"] = 7,
-		["grey_7"] = 8,
-		["grey_6"] = 9,
-		["grey_5"] = 10,
-		["grey_4"] = 11,
-		["dark_grey"] = 11,
-		["grey_3"] = 12,
-		["grey_2"] = 13,
-		["grey_1"] = 14,
-		["black"] = 15,
-	}
-
-	local grayscale_wallmounted = {
-		["white"] = 0,
-		["light_grey"] = 1,
-		["grey"] = 2,
-		["dark_grey"] = 3,
-		["black"] = 4,
-	}
-
-	local hues_extended = {
-		["red"] = 0,
-		["vermilion"] = 1,
-		["orange"] = 2,
-		["amber"] = 3,
-		["yellow"] = 4,
-		["lime"] = 5,
-		["chartreuse"] = 6,
-		["harlequin"] = 7,
-		["green"] = 8,
-		["malachite"] = 9,
-		["spring"] = 10,
-		["aqua"] = 10,
-		["turquoise"] = 11,
-		["cyan"] = 12,
-		["cerulean"] = 13,
-		["azure"] = 14,
-		["skyblue"] = 14,
-		["sapphire"] = 15,
-		["blue"] = 16,
-		["indigo"] = 17,
-		["violet"] = 18,
-		["mulberry"] = 19,
-		["magenta"] = 20,
-		["fuchsia"] = 21,
-		["rose"] = 22,
-		["redviolet"] = 22,
-		["crimson"] = 23,
-	}
-
-	local hues_wallmounted = {
-		["red"] = 0,
-		["orange"] = 1,
-		["yellow"] = 2,
-		["green"] = 3,
-		["cyan"] = 4,
-		["blue"] = 5,
-		["violet"] = 6,
-		["magenta"] = 7
-	}
-
-	local shades = {
-		[""] = 1,
-		["s50"] = 2,
-		["light"] = 3,
-		["medium"] = 4,
-		["mediums50"] = 5,
-		["dark"] = 6,
-		["darks50"] = 7,
-	}
-
-	local shades_split = {
-		["faint"] = 0,
-		[""] = 1,
-		["s50"] = 2,
-		["light"] = 3,
-		["medium"] = 4,
-		["mediums50"] = 5,
-		["dark"] = 6,
-		["darks50"] = 7,
-	}
-
-	local shades_extended = {
-		["faint"] = 0,
-		["pastel"] = 1,
-		["light"] = 2,
-		["bright"] = 3,
-		[""] = 4,
-		["s50"] = 5,
-		["medium"] = 6,
-		["mediums50"] = 7,
-		["dark"] = 8,
-		["darks50"] = 9
-	}
-
-	local shades_wallmounted = {
-		[""] = 1,
-		["medium"] = 2,
-		["dark"] = 3
-	}
-
-	if string.sub(color,1,4) == "dye:" then
-		color = string.sub(color,5,-1)
-	elseif string.sub(color,1,12) == "unifieddyes:" then
-		color = string.sub(color,13,-1)
-	else
-		return
-	end
-
-	if palette_type == "wallmounted" then
-		if grayscale_wallmounted[color] then
-			return (grayscale_wallmounted[color] * 8), 0
-		end
-	elseif palette_type == "split" then
-		if grayscale[color] then
-			return (grayscale[color] * 32), 0
-		end
-	elseif palette_type == "extended" then
-		if grayscale_extended[color] then
-			return grayscale_extended[color]+240, 0
-		end
-	end
-
-	local shade = "" -- assume full
-	if string.sub(color,1,6) == "faint_" then
-		shade = "faint"
-		color = string.sub(color,7,-1)
-	elseif string.sub(color,1,7) == "pastel_" then
-		shade = "pastel"
-		color = string.sub(color,8,-1)
-	elseif string.sub(color,1,6) == "light_" then
-		shade = "light"
-		color = string.sub(color,7,-1)
-	elseif string.sub(color,1,7) == "bright_" then
-		shade = "bright"
-		color = string.sub(color,8,-1)
-	elseif string.sub(color,1,7) == "medium_" then
-		shade = "medium"
-		color = string.sub(color,8,-1)
-	elseif string.sub(color,1,5) == "dark_" then
-		shade = "dark"
-		color = string.sub(color,6,-1)
-	end
-	if string.sub(color,-4,-1) == "_s50" then
-		shade = shade.."s50"
-		color = string.sub(color,1,-5)
-	end
-
-	if palette_type == "wallmounted" then
-		if color == "green" and shade == "light" then return 48,3
-		elseif color == "brown" then return 17,1
-		elseif color == "pink" then return 56,7
-		elseif color == "blue" and shade == "light" then return 40,5
-		elseif hues_wallmounted[color] and shades_wallmounted[shade] then
-			return (shades_wallmounted[shade] * 64 + hues_wallmounted[color] * 8), hues_wallmounted[color]
-		end
-	else
-		if color == "brown" then
-			color = "orange"
-			shade = "medium"
-		elseif color == "pink" then
-			color = "red"
-			shade = "light"
-		end
-		if palette_type == "split" then -- it's colorfacedir
-			if hues_extended[color] and shades_split[shade] then
-				return (shades_split[shade] * 32), hues_extended[color]+1
-			end
-		elseif palette_type == "extended" then
-			if hues_extended[color] and shades_extended[shade] then
-				return (hues_extended[color] + shades_extended[shade]*24), hues_extended[color]
-			end
-		end
-	end
-end
-
-function unifieddyes.get_color_from_dye_name(name)
-	if name == "dye:black" then
-		return "000000"
-	elseif name == "dye:white" then
-		return "ffffff"
-	end
-	local item = minetest.registered_items[name]
-	if not item then return end
-	local inv_image = item.inventory_image
-	if not inv_image then return end
-	return string.match(inv_image,"colorize:#(......):200")
-end
-
--- punch-to-recolor using the airbrush
-
-function unifieddyes.on_airbrush(itemstack, player, pointed_thing)
-	local player_name = player:get_player_name()
-	local painting_with = nil
-
-	if unifieddyes.player_current_dye[player_name] then
-		painting_with = unifieddyes.player_current_dye[player_name]
-	end
-
-	if not painting_with then
-		minetest.chat_send_player(player_name, "*** You need to set a color first.")
-		minetest.chat_send_player(player_name, "*** Right-click any random node to open the color selector,")
-		minetest.chat_send_player(player_name, "*** or shift+right-click a colorized node to use its color.")
-		minetest.chat_send_player(player_name, "*** Be sure to click \"Accept\", or the color you select will be ignored.")
-		return
-	end
-
-	local pos = minetest.get_pointed_thing_position(pointed_thing)
-	if not pos then
-		local look_angle = player:get_look_vertical()
-		if look_angle > -1.55 then
-			minetest.chat_send_player(player_name, "*** No node selected")
-		else
-			local hexcolor = unifieddyes.get_color_from_dye_name(painting_with)
-			if hexcolor then
-				local r = tonumber(string.sub(hexcolor,1,2),16)
-				local g = tonumber(string.sub(hexcolor,3,4),16)
-				local b = tonumber(string.sub(hexcolor,5,6),16)
-				player:set_sky({r=r,g=g,b=b,a=255},"plain")
-			end
-		end
-		return
-	end
-
-	local node = minetest.get_node(pos)
-	local def = minetest.registered_items[node.name]
-	if not def then return end
-
-	if minetest.is_protected(pos, player_name) then
-		minetest.chat_send_player(player_name, "*** Sorry, someone else owns that node.")
-		return
-	end
-
-	if not (def.groups and def.groups.ud_param2_colorable and def.groups.ud_param2_colorable > 0) then
-		minetest.chat_send_player(player_name, "*** That node can't be colored.")
-		return
-	end
-
-	local palette = nil
-	local fdir = 0
-	if not def or not def.palette then
-		minetest.chat_send_player(player_name, "*** That node can't be colored -- it's either undefined or has no palette.")
-		return
-	elseif def.palette == "unifieddyes_palette_extended.png" then
-		palette = "extended"
-	elseif def.palette == "unifieddyes_palette_colorwallmounted.png" then
-		palette = "wallmounted"
-		fdir = node.param2 % 8
-	elseif def.palette ~= "unifieddyes_palette_extended.png"
-	  and def.palette ~= "unifieddyes_palette_colorwallmounted.png"
-	  and string.find(def.palette, "unifieddyes_palette_") then
-		palette = "split"
-		fdir = node.param2 % 32
-	else
-		minetest.chat_send_player(player_name, "*** That node can't be colored -- it has an invalid color mode.")
-		return
-	end
-
-	local idx, hue = unifieddyes.getpaletteidx(painting_with, palette)
-	local inv = player:get_inventory()
-	if (not creative or not creative.is_enabled_for(player_name)) and not inv:contains_item("main", painting_with) then
-		local suff = ""
-		if not idx then
-			suff = "  Besides, "..string.sub(painting_with, 5).." can't be applied to that node."
-		end
-		minetest.chat_send_player(player_name, "*** You're in survival mode, and you're out of "..string.sub(painting_with, 5).."."..suff)
-		return
-	end
-
-	if not idx then
-		minetest.chat_send_player(player_name, "*** "..string.sub(painting_with, 5).." can't be applied to that node.")
-		return
-	end
-
-	local oldidx = node.param2 - fdir
-	local name = def.airbrush_replacement_node or node.name
-
-	if palette == "split" then
-
-		local modname = string.sub(name, 1, string.find(name, ":")-1)
-		local nodename2 = string.sub(name, string.find(name, ":")+1)
-		local oldcolor = "snozzberry"
-		local newcolor = "razzberry" -- intentionally misspelled ;-)
-
-		if def.ud_color_start and def.ud_color_end then
-			oldcolor = string.sub(node.name, def.ud_color_start, def.ud_color_end)
-			newcolor = string.sub(painting_with, 5)
-		else
-			if hue ~= 0 then
-				newcolor = unifieddyes.HUES_EXTENDED[hue][1]
-			else
-				newcolor = "grey"
-			end
-
-			if def.airbrush_replacement_node then
-				oldcolor = "grey"
-			else
-				local s = string.sub(def.palette, 21)
-				oldcolor = string.sub(s, 1, string.find(s, "s.png")-1)
-			end
-		end
-
-		name = modname..":"..string.gsub(nodename2, oldcolor, newcolor)
-
-		if not minetest.registered_items[name] then
-			minetest.chat_send_player(player_name, "*** "..string.sub(painting_with, 5).." can't be applied to that node.")
-			return
-		end
-	elseif idx == oldidx then
-		return
-	end
-	minetest.swap_node(pos, {name = name, param2 = fdir + idx})
-	if not creative or not creative.is_enabled_for(player_name) then
-		inv:remove_item("main", painting_with)
-		return
-	end
-end
-
--- get a node's dye color based on its palette and param2
-
-function unifieddyes.color_to_name(param2, def)
-	if not param2 or not def or not def.palette then return end
-
-	if def.palette == "unifieddyes_palette_extended.png" then
-		local color = param2
-
-		local v = 0
-		local s = 1 
-		if color < 24 then v = 1
-		elseif color > 23  and color < 48  then v = 2
-		elseif color > 47  and color < 72  then v = 3
-		elseif color > 71  and color < 96  then v = 4
-		elseif color > 95  and color < 120 then v = 5
-		elseif color > 119 and color < 144 then v = 5 s = 2
-		elseif color > 143 and color < 168 then v = 6
-		elseif color > 167 and color < 192 then v = 6 s = 2
-		elseif color > 191 and color < 216 then v = 7
-		elseif color > 215 and color < 240 then v = 7 s = 2
-		end
-
-		if color > 239 then
-			if color == 240 then return "white"
-			elseif color == 244 then return "light_grey"
-			elseif color == 247 then return "grey"
-			elseif color == 251 then return "dark_grey"
-			elseif color == 255 then return "black" 
-			else return "grey_"..15-(color-240)
-			end
-		else
-			local h = color - math.floor(color/24)*24
-			return unifieddyes.VALS_EXTENDED[v]..unifieddyes.HUES_EXTENDED[h+1][1]..unifieddyes.SATS[s]
-		end
-
-	elseif def.palette == "unifieddyes_palette_colorwallmounted.png" then
-		local color = math.floor(param2 / 8)
-		if color == 0 then return "white"
-		elseif color == 1 then return "light_grey"
-		elseif color == 2 then return "grey"
-		elseif color == 3 then return "dark_grey"
-		elseif color == 4 then return "black"
-		elseif color == 5 then return "light_blue"
-		elseif color == 6 then return "light_green"
-		elseif color == 7 then return "pink"
-		end
-		local v = math.floor(color/8)
-		local h = color - v * 8
-		return unifieddyes.VALS[v]..unifieddyes.HUES_WALLMOUNTED[h+1]
-
-	elseif string.find(def.palette, "unifieddyes_palette") then -- it's the split palette
-		-- palette names in this mode are always "unifieddyes_palette_COLORs.png"
-
-		local s = string.sub(def.palette, 21)
-		local color = string.sub(s, 1, string.find(s, "s.png")-1)
-
-		local v = math.floor(param2/32)
-		if color ~= "grey" then
-			if     v == 0 then return "faint_"..color
-			elseif v == 1 then return color
-			elseif v == 2 then return color.."_s50"
-			elseif v == 3 then return "light_"..color
-			elseif v == 4 then return "medium_"..color
-			elseif v == 5 then return "medium_"..color.."_s50"
-			elseif v == 6 then return "dark_"..color
-			elseif v == 7 then return "dark_"..color.."_s50"
-			end
-		else
-			if v > 0 and v < 6 then return unifieddyes.GREYS[v]
-			else return "white"
-			end
-		end
-	end
-end
-
-local hps = 0.6 -- horizontal position scale
-local vps = 1.3 -- vertical position scale
-local vs = 0.1 -- vertical shift/offset
-
-local color_button_size = ";0.75,0.75;"
-local color_square_size = ";0.69,0.69;"
-
-function unifieddyes.make_readable_color(color)
-        -- is this a low saturation color?
-        local has_low_saturtation = string.find(color, "s50");
-
-        -- remove _s50 tag, we care about that later again
-	local s = string.gsub(color, "_s50", "")
-
-        -- replace underscores with spaces to make it look nicer
-	local s = string.gsub(s, "_", " ")
-
-        -- capitalize words, you know, looks nicer ;)
-        s = string.gsub(s, "(%l)(%w*)", function(a,b) return string.upper(a)..b end)
-
-        -- add the word dye, this is what the translations expect
-        s = s.." Dye"
-
-	-- if it is a low sat color, append an appropriate string
-	if has_low_saturtation then
-	  s = s.." (low saturation)"
-	end
-
-	return s
-end
-
-function unifieddyes.make_colored_square(hexcolor, colorname, showall, creative, painting_with, nodepalette, hp, v2, selindic, inv, explist)
-
-	local dye = "dye:"..colorname
-
-	local overlay = ""
-	local colorize = minetest.formspec_escape("^[colorize:#"..hexcolor..":255")
-
-	if not creative and inv:contains_item("main", dye) then
-		overlay = "^unifieddyes_onhand_overlay.png"
-	end
-
-	local unavail_overlay = ""
-	if not showall and not unifieddyes.palette_has_color[nodepalette.."_"..colorname]
-		or (explist and not explist[colorname]) then
-		if overlay == "" then
-			unavail_overlay = "^unifieddyes_unavailable_overlay.png"
-		else
-			unavail_overlay = "^unifieddyes_onhand_unavailable_overlay.png"
-		end
-	end
-
-	local tooltip = "tooltip["..colorname..";"..
-					S(unifieddyes.make_readable_color(colorname))..
-					"\n(dye:"..colorname..")]"
-
-	if dye == painting_with then
-		overlay = "^unifieddyes_select_overlay.png"
-		selindic = "unifieddyes_white_square.png"..colorize..overlay..unavail_overlay.."]"..tooltip
-	end
-
-	local form
-	if unavail_overlay == "" then
-		form = "image_button["..
-					(hp*hps)..","..(v2*vps+vs)..
-					color_button_size..
-					"unifieddyes_white_square.png"..colorize..overlay..unavail_overlay..";"..
-					colorname..";]"..
-					tooltip
-	else
-		form = "image["..
-					(hp*hps)..","..(v2*vps+vs)..
-					color_square_size..
-					"unifieddyes_white_square.png"..colorize..overlay..unavail_overlay.."]"..
-					tooltip
-	end
-
-	return form, selindic
-end
-
-function unifieddyes.show_airbrush_form(player)
-	if not player then return end
-
-	local t = {}
-
-	local player_name = player:get_player_name()
-	local painting_with = unifieddyes.player_selected_dye[player_name] or unifieddyes.player_current_dye[player_name]
-	local creative = creative and creative.is_enabled_for(player_name)
-	local inv = player:get_inventory()
-	local nodepalette = "extended"
-	local showall = unifieddyes.player_showall[player_name]
-
-	t[1] = "size[14.5,8.5]label[7,-0.3;"..S("Select a color:").."]"
-	local selindic = "unifieddyes_select_overlay.png^unifieddyes_question.png]"
-
-	local last_right_click = unifieddyes.player_last_right_clicked[player_name]
-	if last_right_click then
-		if last_right_click.def and last_right_click.def.palette then
-			if last_right_click.def.palette == "unifieddyes_palette_colorwallmounted.png" then
-				nodepalette = "wallmounted"
-			elseif last_right_click.def.palette == "unifieddyes_palette_extended.png" then
-				t[#t+1] = "label[0.5,8.25;"..S("(Right-clicked a node that supports all 256 colors, showing them all)").."]"
-				showall = true
-			elseif last_right_click.def.palette ~= "unifieddyes_palette_extended.png"
-			  and last_right_click.def.palette ~= "unifieddyes_palette_colorwallmounted.png"
-			  and string.find(last_right_click.def.palette, "unifieddyes_palette_") then
-				nodepalette = "split"
-			end
-		end
-	end
-
-	if not last_right_click.def.groups
-	  or not last_right_click.def.groups.ud_param2_colorable
-	  or not last_right_click.def.palette
-	  or not string.find(last_right_click.def.palette, "unifieddyes_palette_") then
-		t[#t+1] = "label[0.5,8.25;"..S("(Right-clicked a node not supported by the Airbrush, showing all colors)").."]"
-	end
-
-	local explist = last_right_click.def.explist
-
-	for v = 0, 6 do
-		local val = unifieddyes.VALS_EXTENDED[v+1]
-
-		local sat = ""
-		local v2=(v/2)
-
-		for hi, h in ipairs(unifieddyes.HUES_EXTENDED) do
-			local hue = h[1]
-			local hp=hi-1
-
-			local r = h[2]
-			local g = h[3]
-			local b = h[4]
-
-			local factor = 40
-			if v > 3 then
-				factor = 75
-				v2 = (v-2)
-			end
-
-			local r2 = math.max(math.min(r + (4-v)*factor, 255), 0)
-			local g2 = math.max(math.min(g + (4-v)*factor, 255), 0)
-			local b2 = math.max(math.min(b + (4-v)*factor, 255), 0)
-
-			local hexcolor = string.format("%02x", r2)..string.format("%02x", g2)..string.format("%02x", b2)
-			local f
-			f, selindic = unifieddyes.make_colored_square(hexcolor, val..hue..sat, showall, creative, painting_with, nodepalette, hp, v2, selindic, inv, explist)
-			t[#t+1] = f
-		end
-
-		if v > 3 then
-			sat = "_s50"
-			v2 = (v-1.5)
-
-			for hi, h in ipairs(unifieddyes.HUES_EXTENDED) do
-				local hue = h[1]
-				local hp=hi-1
-
-				local r = h[2]
-				local g = h[3]
-				local b = h[4]
-
-				local factor = 75
-
-				local pr = 0.299
-				local pg = 0.587
-				local pb = 0.114
-
-				local r2 = math.max(math.min(r + (4-v)*factor, 255), 0)
-				local g2 = math.max(math.min(g + (4-v)*factor, 255), 0)
-				local b2 = math.max(math.min(b + (4-v)*factor, 255), 0)
-
-				local p = math.sqrt(r2*r2*pr + g2*g2*pg + b2*b2*pb)
-				local r3 = math.floor(p+(r2-p)*0.5)
-				local g3 = math.floor(p+(g2-p)*0.5)
-				local b3 = math.floor(p+(b2-p)*0.5)
-
-				local hexcolor = string.format("%02x", r3)..string.format("%02x", g3)..string.format("%02x", b3)
-				local f
-				f, selindic = unifieddyes.make_colored_square(hexcolor, val..hue..sat, showall, creative, painting_with, nodepalette, hp, v2, selindic, inv, explist)
-				t[#t+1] = f
-			end
-		end
-	end
-
-	local v2=5
-	for y = 0, 15 do
-
-		local hp=15-y
-
-		local hexgrey = string.format("%02x", y*17)..string.format("%02x", y*17)..string.format("%02x", y*17)
-		local grey = "grey_"..y
-
-		if y == 0 then grey = "black" 
-		elseif y == 4 then grey = "dark_grey"
-		elseif y == 8 then grey = "grey"
-		elseif y == 11 then grey = "light_grey"
-		elseif y == 15 then grey = "white"
-		end
-
-		local f
-		f, selindic = unifieddyes.make_colored_square(hexgrey, grey, showall, creative, painting_with, nodepalette, hp, v2, selindic, inv, explist)
-		t[#t+1] = f
-
-	end
-
-	if not creative then
-		t[#t+1] = "image[10,"
-		t[#t+1] = (vps*5.55+vs)
-		t[#t+1] = color_button_size
-		t[#t+1] = "unifieddyes_onhand_overlay.png]label[10.7,"
-		t[#t+1] = (vps*5.51+vs)
-		t[#t+1] = ";"..S("Dyes").."]"
-		t[#t+1] = "label[10.7,"
-		t[#t+1] = (vps*5.67+vs)
-		t[#t+1] = ";on hand]"
-
-	end
-
-	t[#t+1] = "image[10,"
-	t[#t+1] = (vps*5+vs)
-	t[#t+1] = color_button_size
-	t[#t+1] = selindic
-
-	if painting_with then
-		t[#t+1] = "label[10.7,"
-		t[#t+1] = (vps*4.90+vs)
-		t[#t+1] = ";"..S("Your selection:").."]"
-		t[#t+1] = "label[10.7,"
-		t[#t+1] = (vps*5.07+vs)
-		t[#t+1] = ";"
-		t[#t+1] = S(unifieddyes.make_readable_color(string.sub(painting_with, 5)))
-		t[#t+1] = "]label[10.7,"
-		t[#t+1] = (vps*5.24+vs)
-		t[#t+1] = ";("
-		t[#t+1] = painting_with
-		t[#t+1] = ")]"
-	else
-		t[#t+1] = "label[10.7,"
-		t[#t+1] = (vps*5.07+vs)
-		t[#t+1] = ";"..S("Your selection").."]"
-	end
-
-	t[#t+1] = "button_exit[10.5,8;2,1;cancel;"..S("Cancel").."]button_exit[12.5,8;2,1;accept;"..S("Accept").."]"
-
-
-	if last_right_click and last_right_click.def and nodepalette ~= "extended" then
-		if showall then
-			t[#t+1] = "button[0,8;2,1;show_avail;"..S("Show Available").."]"
-			t[#t+1] = "label[2,8.25;"..S("(Currently showing all 256 colors)").."]"
-		else
-			t[#t+1] = "button[0,8;2,1;show_all;"..S("Show All Colors").."]"
-			t[#t+1] = "label[2,8.25;"..S("(Currently only showing what the right-clicked node can use)").."]"
-		end
-	end
-
-	minetest.show_formspec(player_name, "unifieddyes:dye_select_form", table.concat(t))
-end
-
-minetest.register_tool("unifieddyes:airbrush", {
-	description = S("Dye Airbrush"),
-	inventory_image = "unifieddyes_airbrush.png",
-	use_texture_alpha = true,
-	tool_capabilities = {
-		full_punch_interval=0.1,
-	},
-	range = 12,
-	on_use = unifieddyes.on_airbrush,
-	on_place = function(itemstack, placer, pointed_thing)
-		local keys = placer:get_player_control()
-		local player_name = placer:get_player_name()
-		local pos = minetest.get_pointed_thing_position(pointed_thing)
-		local node
-		local def
-
-		if pos then node = minetest.get_node(pos) end
-		if node then def = minetest.registered_items[node.name] end
-
-		unifieddyes.player_last_right_clicked[player_name] = {pos = pos, node = node, def = def}
-
-		if (not keys.sneak) and def.on_rightclick then
-			return def.on_rightclick(pos, node, placer, itemstack, pointed_thing)
-		elseif not keys.sneak then
-			unifieddyes.show_airbrush_form(placer)
-		elseif keys.sneak then
-			if not pos or not def then return end
-			local newcolor = unifieddyes.color_to_name(node.param2, def)
-
-			if not newcolor then
-				minetest.chat_send_player(player_name, "*** That node is uncolored.")
-				return
-			end
-			minetest.chat_send_player(player_name, "*** Switching to "..newcolor.." for the airbrush, to match that node.")
-			unifieddyes.player_current_dye[player_name] = "dye:"..newcolor 
-		end
-	end
-})
-
-minetest.register_craft( {
-	output = "unifieddyes:airbrush",
-	recipe = {
-		{ "basic_materials:brass_ingot", "",           "basic_materials:plastic_sheet" },
-		{ "",                   "default:steel_ingot", ""                              },
-		{ "",                   "",                    "default:steel_ingot"           }
-	},
-})
-
-minetest.register_on_player_receive_fields(function(player, formname, fields)
-
-	if formname == "unifieddyes:dye_select_form" then
-
-		local player_name = player:get_player_name()
-		local nodepalette = "extended"
-		local showall = unifieddyes.player_showall[player_name]
-
-		local last_right_click = unifieddyes.player_last_right_clicked[player_name]
-		if last_right_click and last_right_click.def then
-			if last_right_click.def.palette then
-				if last_right_click.def.palette == "unifieddyes_palette_colorwallmounted.png" then
-					nodepalette = "wallmounted"
-				elseif last_right_click.def.palette ~= "unifieddyes_palette_extended.png" then
-					nodepalette = "split"
-				end
-			end
-		end
-
-		if fields.show_all then 
-			unifieddyes.player_showall[player_name] = true
-			unifieddyes.show_airbrush_form(player)
-			return
-		elseif fields.show_avail then 
-			unifieddyes.player_showall[player_name] = false
-			unifieddyes.show_airbrush_form(player)
-			return
-		elseif fields.quit then
-			if fields.accept then
-				local dye = unifieddyes.player_selected_dye[player_name]
-				if not dye then
-					minetest.chat_send_player(player_name, "*** Clicked \"Accept\", but no color was selected!")
-					return
-				elseif not showall
-						and not unifieddyes.palette_has_color[nodepalette.."_"..string.sub(dye, 5)] then
-					minetest.chat_send_player(player_name, "*** Clicked \"Accept\", but the selected color can't be used on the")
-					minetest.chat_send_player(player_name, "*** node that was right-clicked (and \"Show All\" wasn't in effect).")
-					if unifieddyes.player_current_dye[player_name] then
-						minetest.chat_send_player(player_name, "*** Ignoring it and sticking with "..string.sub(unifieddyes.player_current_dye[player_name], 5)..".")
-					else
-						minetest.chat_send_player(player_name, "*** Ignoring it.")
-					end
-					return
-				else
-					unifieddyes.player_current_dye[player_name] = dye
-					unifieddyes.player_selected_dye[player_name] = nil
-					minetest.chat_send_player(player_name, "*** Selected "..string.sub(dye, 5).." for the airbrush.")
-					return
-				end
-			else -- assume "Cancel" or Esc.
-				unifieddyes.player_selected_dye[player_name] = nil
-				return
-			end
-		else
-			local s1 = string.sub(minetest.serialize(fields), 11)
-			local s3 = string.sub(s1,1, string.find(s1, '"')-1)
-
-			local inv = player:get_inventory()
-			local creative = creative and creative.is_enabled_for(player_name)
-			local dye = "dye:"..s3
-
-			if (showall or unifieddyes.palette_has_color[nodepalette.."_"..s3]) and
-				(minetest.registered_items[dye] and (creative or inv:contains_item("main", dye))) then
-				unifieddyes.player_selected_dye[player_name] = dye 
-				unifieddyes.show_airbrush_form(player)
-			end
-		end
-	end
-end)
-
--- Generate all dyes that are not part of the default minetest_game dyes mod
-
-for _, h in ipairs(unifieddyes.HUES_EXTENDED) do
-	local hue = h[1]
-	local r = h[2]
-	local g = h[3]
-	local b = h[4]
-
-	for v = 0, 6 do
-		local val = unifieddyes.VALS_EXTENDED[v+1]
-
-		local factor = 40
-		if v > 3 then factor = 75 end
-
-		local r2 = math.max(math.min(r + (4-v)*factor, 255), 0)
-		local g2 = math.max(math.min(g + (4-v)*factor, 255), 0)
-		local b2 = math.max(math.min(b + (4-v)*factor, 255), 0)
-
-		-- full-sat color
-
-		local desc = hue:gsub("%a", string.upper, 1).." Dye"
-
-		if val ~= "" then
-			desc = val:sub(1, -2):gsub("%a", string.upper, 1) .." "..desc
-		end
-
-		local color = string.format("%02x", r2)..string.format("%02x", g2)..string.format("%02x", b2)
-		if minetest.registered_items["dye:"..val..hue] then
-			minetest.override_item("dye:"..val..hue, {
-				inventory_image = "unifieddyes_dye.png^[colorize:#"..color..":200",
-			})
-		else
-			if (val..hue) ~= "medium_orange"
-			  and (val..hue) ~= "light_red" then
-				minetest.register_craftitem(":dye:"..val..hue, {
-					description = S(desc),
-					inventory_image = "unifieddyes_dye.png^[colorize:#"..color..":200",
-					groups = { dye=1, not_in_creative_inventory=1 },
-				})
-			end
-		end
-		minetest.register_alias("unifieddyes:"..val..hue, "dye:"..val..hue)
-
-		if v > 3 then -- also register the low-sat version
-
-			local pr = 0.299
-			local pg = 0.587
-			local pb = 0.114
-
-			local p = math.sqrt(r2*r2*pr + g2*g2*pg + b2*b2*pb)
-			local r3 = math.floor(p+(r2-p)*0.5)
-			local g3 = math.floor(p+(g2-p)*0.5)
-			local b3 = math.floor(p+(b2-p)*0.5)
-
-			local color = string.format("%02x", r3)..string.format("%02x", g3)..string.format("%02x", b3)
-
-			minetest.register_craftitem(":dye:"..val..hue.."_s50", {
-				description = S(desc.." (low saturation)"),
-				inventory_image = "unifieddyes_dye.png^[colorize:#"..color..":200",
-				groups = { dye=1, not_in_creative_inventory=1 },
-			})
-			minetest.register_alias("unifieddyes:"..val..hue.."_s50", "dye:"..val..hue.."_s50")
-		end
-	end
-end
-
--- register the greyscales too :P
-
-for y = 1, 14 do -- colors 0 and 15 are black and white, default dyes
-
-	if y ~= 4 and y ~= 8 and y~= 11 then -- don't register the three greys, they're done separately.
-
-		local rgb = string.format("%02x", y*17)..string.format("%02x", y*17)..string.format("%02x", y*17)
-		local name = "grey_"..y
-		local desc = "Grey Dye #"..y
-
-		minetest.register_craftitem(":dye:"..name, {
-			description = S(desc),
-			inventory_image = "unifieddyes_dye.png^[colorize:#"..rgb..":200",
-			groups = { dye=1, not_in_creative_inventory=1 },
-		})
-		minetest.register_alias("unifieddyes:"..name, "dye:"..name)
-	end
-end
-
-minetest.override_item("dye:grey", {
-	inventory_image = "unifieddyes_dye.png^[colorize:#888888:200",
-})
-
-minetest.override_item("dye:dark_grey", {
-	inventory_image = "unifieddyes_dye.png^[colorize:#444444:200",
-})
-
-minetest.register_craftitem(":dye:light_grey", {
-	description = S("Light grey Dye"),
-	inventory_image = "unifieddyes_dye.png^[colorize:#cccccc:200",
-	groups = { dye=1, not_in_creative_inventory=1 },
-})
-
--- build a table of color <-> palette associations to reduce the need for
--- realtime lookups with getpaletteidx()
-
-for _, palette in ipairs({"extended", "split", "wallmounted"}) do
-	local palette2 = palette
-
-	for i in ipairs(unifieddyes.SATS) do
-		local sat = (palette == "wallmounted") and "" or unifieddyes.SATS[i]
-		for _, hue in ipairs(unifieddyes.HUES_EXTENDED) do
-			for _, val in ipairs(unifieddyes.VALS_EXTENDED) do
-				local color = val..hue[1]..sat
-				if unifieddyes.getpaletteidx("dye:"..color, palette2) then
-					unifieddyes.palette_has_color[palette.."_"..color] = true
-				end
-			end
-		end
-	end
-
-	for y = 0, 15 do
-		local grey = "grey_"..y
-
-		if y == 0 then grey = "black" 
-		elseif y == 4 then grey = "dark_grey"
-		elseif y == 8 then grey = "grey"
-		elseif y == 11 then grey = "light_grey"
-		elseif y == 15 then grey = "white"
-		end
-		if unifieddyes.getpaletteidx("dye:"..grey, palette2) then
-			unifieddyes.palette_has_color[palette.."_"..grey] = true
-		end
-	end
-end
-
-unifieddyes.palette_has_color["wallmounted_light_red"] = true
-
--- crafting!
-
-unifieddyes.base_color_crafts = {
-	{ "red",		"flowers:rose",				nil,				nil,			nil,			nil,		4 },
-	{ "vermilion",	"dye:red",					"dye:orange",		nil,			nil,			nil,		3 },
-	{ "orange",		"flowers:tulip",			nil,				nil,			nil,			nil,		4 },
-	{ "orange",		"dye:red",					"dye:yellow",		nil,			nil,			nil,		2 },
-	{ "amber",		"dye:orange",				"dye:yellow",		nil,			nil,			nil,		2 },
-	{ "yellow",		"flowers:dandelion_yellow",	nil,				nil,			nil,			nil,		4 },
-	{ "lime",		"dye:yellow",				"dye:chartreuse",	nil,			nil,			nil,		2 },
-	{ "lime",		"dye:yellow",				"dye:yellow",		"dye:green",	nil,			nil,		3 },
-	{ "chartreuse",	"dye:yellow",				"dye:green",		nil,			nil,			nil,		2 },
-	{ "harlequin",	"dye:chartreuse",			"dye:green",		nil,			nil,			nil,		2 },
-	{ "harlequin",	"dye:yellow",				"dye:green",		"dye:green",	nil,			nil,		3 },
-	{ "green", 		"default:cactus",			nil,				nil,			nil,			nil,		4 },
-	{ "green", 		"dye:yellow",				"dye:blue",			nil,			nil,			nil,		2 },
-	{ "malachite",	"dye:green",				"dye:spring",		nil,			nil,			nil,		2 },
-	{ "malachite",	"dye:green",				"dye:green",		"dye:cyan",		nil,			nil,		3 },
-	{ "malachite",	"dye:green",				"dye:green",		"dye:green",	"dye:blue",		nil,		4 },
-	{ "spring",		"dye:green",				"dye:cyan",			nil,			nil,			nil,		2 },
-	{ "spring",		"dye:green",				"dye:green",		"dye:blue",		nil,			nil,		3 },
-	{ "turquoise",	"dye:spring",				"dye:cyan",			nil,			nil,			nil,		2 },
-	{ "turquoise",	"dye:green",				"dye:cyan",			"dye:cyan",		nil,			nil,		3 },
-	{ "turquoise",	"dye:green",				"dye:green",		"dye:green",	"dye:blue",		"dye:blue",	5 },
-	{ "cyan",		"dye:green",				"dye:blue",			nil,			nil,			nil,		2 },
-	{ "cerulean",	"dye:cyan",					"dye:azure",		nil,			nil,			nil,		2 },
-	{ "cerulean",	"dye:cyan",					"dye:cyan",			"dye:blue",		nil,			nil,		3 },
-	{ "cerulean",	"dye:green",				"dye:green",		"dye:blue",		"dye:blue",		"dye:blue",	5 },
-	{ "azure",		"dye:cyan",					"dye:blue",			nil,			nil,			nil,		2 },
-	{ "azure",		"dye:green",				"dye:blue",			"dye:blue",		nil,			nil,		3 },
-	{ "sapphire",	"dye:azure",				"dye:blue",			nil,			nil,			nil,		2 },
-	{ "sapphire",	"dye:cyan",					"dye:blue",			"dye:blue",		nil,			nil,		3 },
-	{ "sapphire",	"dye:green",				"dye:blue",			"dye:blue",		"dye:blue",		nil,		4 },
-	{ "blue",		"flowers:geranium",			nil,				nil,			nil,			nil,		4 },
-	{ "indigo",		"dye:blue",					"dye:violet",		nil,			nil,			nil,		2 },
-	{ "violet",		"flowers:viola",			nil,				nil,			nil,			nil,		4 },
-	{ "violet",		"dye:blue",					"dye:magenta",		nil,			nil,			nil,		2 },
-	{ "mulberry",	"dye:violet",				"dye:magenta",		nil,			nil,			nil,		2 },
-	{ "mulberry",	"dye:violet",				"dye:blue",			"dye:red",		nil,			nil,		3 },
-	{ "magenta",	"dye:blue",					"dye:red",			nil,			nil,			nil,		2 },
-	{ "fuchsia",	"dye:magenta",				"dye:rose",			nil,			nil,			nil,		2 },
-	{ "fuchsia",	"dye:blue",					"dye:red",			"dye:rose",		nil,			nil,		3 },
-	{ "fuchsia",	"dye:red",					"dye:violet",		nil,			nil,			nil,		2 },
-	{ "rose",		"dye:magenta",				"dye:red",			nil,			nil,			nil,		2 },
-	{ "rose",		"dye:red",					"dye:red",			"dye:blue",		nil,			nil,		3 },
-	{ "crimson",	"dye:rose",					"dye:red",			nil,			nil,			nil,		2 },
-	{ "crimson",	"dye:magenta",				"dye:red",			"dye:red",		nil,			nil,		3 },
-	{ "crimson",	"dye:red",					"dye:red",			"dye:red",		"dye:blue",		nil,		4 },
-
-	{ "black",		"default:coal_lump",		nil,				nil,			nil,			nil,		4 },
-	{ "white",		"flowers:dandelion_white",	nil,				nil,			nil,			nil,		4 },
-}
-
-unifieddyes.shade_crafts = {
-	{ "faint_",		"",			"dye:white",		"dye:white",	"dye:white",	4 },
-	{ "pastel_",	"",			"dye:white",		"dye:white",	nil,			3 },
-	{ "light_",		"",			"dye:white",		nil,			nil,			2 },
-	{ "bright_",	"",			"color",			"dye:white",	nil,			3 },
-	{ "",			"_s50",		"dye:light_grey",	nil,			nil,			2 },
-	{ "",			"_s50",		"dye:black",		"dye:white",	"dye:white",	3 },
-	{ "medium_",	"",			"dye:black",		nil,			nil,			2 },
-	{ "medium_",	"_s50",		"dye:grey",			nil,			nil,			2 },
-	{ "medium_",	"_s50",		"dye:black",		"dye:white",	nil,			3 },
-	{ "dark_",		"",			"dye:black",		"dye:black",	nil,			3 },
-	{ "dark_",		"_s50",		"dye:dark_grey",	nil,			nil,			2 },
-	{ "dark_",		"_s50",		"dye:black",		"dye:black",	"dye:white",	4 },
-}
-
-for _,i in ipairs(unifieddyes.base_color_crafts) do
-	local color = i[1]
-	local yield = i[7]
-
-	minetest.register_craft( {
-		type = "shapeless",
-		output = "dye:"..color.." "..yield,
-		recipe = {
-			i[2],
-			i[3],
-			i[4],
-			i[5],
-			i[6],
-		},
-	})
-
-	for _,j in ipairs(unifieddyes.shade_crafts) do
-		local firstdye = j[3]
-		if firstdye == "color" then firstdye = "dye:"..color end
-
-		-- ignore black, white, anything containing the word "grey"
-
-		if color ~= "black" and color ~= "white" and not string.find(color, "grey") then
-
-			minetest.register_craft( {
-				type = "shapeless",
-				output = "dye:"..j[1]..color..j[2].." "..j[6],
-				recipe = {
-					"dye:"..color,
-					firstdye,
-					j[4],
-					j[5]
-				},
-			})
-		end
-	end
-end
-
--- greys
-
-unifieddyes.greymixes = {
-	{ 1,	"dye:black",			"dye:black",		"dye:black",		"dye:dark_grey",	4 },
-	{ 2,	"dye:black",			"dye:black",		"dye:dark_grey",	nil,				3 },
-	{ 3,	"dye:black",			"dye:dark_grey",	nil,				nil,				2 },
-	{ 4,	"dye:white",			"dye:black",		"dye:black",		nil,				3 },
-	{ 5,	"dye:dark_grey",		"dye:dark_grey",	"dye:grey",			nil,				3 },
-	{ 6,	"dye:dark_grey",		"dye:grey",			nil,				nil,				2 },
-	{ 7,	"dye:dark_grey",		"dye:grey",			"dye:grey",			nil,				3 },
-	{ 8,	"dye:white",			"dye:black",		nil,				nil,				2 },
-	{ 9,	"dye:grey", 			"dye:grey",			"dye:light_grey",	nil,				3 },
-	{ 10,	"dye:grey",				"dye:light_grey",	"dye:light_grey",	nil,				3 },
-	{ 11,	"dye:white",			"dye:white",		"dye:black",		nil,				3 },
-	{ 12,	"dye:light_grey",		"dye:light_grey",	"dye:white",		nil,				3 },
-	{ 13,	"dye:light_grey",		"dye:white",		nil,				nil,				2 },
-	{ 14,	"dye:white", 			"dye:white",		"dye:light_grey",	nil,				3 },
-}
-
-for _, i in ipairs(unifieddyes.greymixes) do
-	local shade = i[1]
-	local dye1 = i[2]
-	local dye2 = i[3]
-	local dye3 = i[4]
-	local dye4 = i[5]
-	local yield = i[6]
-	local color = "grey_"..shade
-	if shade == 4 then
-		color = "dark_grey"
-	elseif shade == 8 then
-		color = "grey"
-	elseif shade == 11 then
-		color = "light_grey"
-	end
-
-	minetest.register_craft( {
-		type = "shapeless",
-		output = "dye:"..color.." "..yield,
-		recipe = {
-			dye1,
-			dye2,
-			dye3,
-			dye4,
-		},
-	})
-end
-
--- we can't make dark orange anymore because brown/medium orange conflicts
-
-minetest.register_craft( {
-	type = "shapeless",
-	output = "dye:dark_orange",
-	recipe = {
-		"dye:brown",
-		"dye:brown"
-	},
-})
-
--- aliases
-
-minetest.register_alias("dye:light_red",  "dye:pink")
-minetest.register_alias("dye:medium_orange", "dye:brown")
-
-minetest.register_alias("unifieddyes:black",      "dye:black")
-minetest.register_alias("unifieddyes:dark_grey",  "dye:dark_grey")
-minetest.register_alias("unifieddyes:grey", 	  "dye:grey")
-minetest.register_alias("unifieddyes:light_grey", "dye:light_grey")
-minetest.register_alias("unifieddyes:white",      "dye:white")
-
-minetest.register_alias("unifieddyes:grey_0",     "dye:black")
-minetest.register_alias("unifieddyes:grey_4",     "dye:dark_grey")
-minetest.register_alias("unifieddyes:grey_8",     "dye:grey")
-minetest.register_alias("unifieddyes:grey_11",    "dye:light_grey")
-minetest.register_alias("unifieddyes:grey_15",    "dye:white")
-
-minetest.register_alias("unifieddyes:white_paint", "dye:white")
-minetest.register_alias("unifieddyes:titanium_dioxide", "dye:white")
-minetest.register_alias("unifieddyes:lightgrey_paint", "dye:light_grey")
-minetest.register_alias("unifieddyes:grey_paint", "dye:grey")
-minetest.register_alias("unifieddyes:darkgrey_paint", "dye:dark_grey")
-minetest.register_alias("unifieddyes:carbon_black", "dye:black")
-
-minetest.register_alias("unifieddyes:brown", "dye:brown")
+dofile(modpath.."/color-tables.lua")
+dofile(modpath.."/api.lua")
+dofile(modpath.."/airbrush.lua")
+dofile(modpath.."/dyes-crafting.lua")
+dofile(modpath.."/aliases.lua")
 
 print(S("[UnifiedDyes] Loaded!"))
-