aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorLuke Puchner-Hardman <x.lukk3.x@gmail.com>2014-09-23 14:39:34 +0200
committersfan5 <sfan5@live.de>2017-01-02 15:28:06 +0100
commit7057c196c442ff3484b53f48d940f4c9e0ffe23a (patch)
treeea6e57d1755253577e3eda6fe22280314d22fb87
parent523f0e8c5bce0cb58215dc1f9d027cf32394e3c3 (diff)
downloadminetest-7057c196c442ff3484b53f48d940f4c9e0ffe23a.tar.gz
minetest-7057c196c442ff3484b53f48d940f4c9e0ffe23a.tar.bz2
minetest-7057c196c442ff3484b53f48d940f4c9e0ffe23a.zip
Added "[sheet" to the texture special commands.
"[sheet:WxH:X,Y" assumes the base image is a tilesheet with W*H tiles on it and crops to the tile at position X,Y. Basically it works like "[verticalframe" but in 2D. For testing, I combined the four default_chest images into one.
-rw-r--r--doc/lua_api.txt5
-rw-r--r--games/minimal/mods/default/init.lua10
-rw-r--r--games/minimal/mods/default/textures/default_chest.pngbin0 -> 263 bytes
-rw-r--r--games/minimal/mods/default/textures/default_chest_front.pngbin114 -> 0 bytes
-rw-r--r--games/minimal/mods/default/textures/default_chest_lock.pngbin145 -> 0 bytes
-rw-r--r--games/minimal/mods/default/textures/default_chest_side.pngbin98 -> 0 bytes
-rw-r--r--games/minimal/mods/default/textures/default_chest_top.pngbin93 -> 0 bytes
-rw-r--r--src/client/tile.cpp43
8 files changed, 54 insertions, 4 deletions
diff --git a/doc/lua_api.txt b/doc/lua_api.txt
index d2ddc635b..648a29303 100644
--- a/doc/lua_api.txt
+++ b/doc/lua_api.txt
@@ -403,6 +403,11 @@ Apply a mask to the base image.
The mask is applied using binary AND.
+#### `[sheet:<w>x<h>:<x>,<y>`
+Retrieves a tile at position x,y from the base image
+which it assumes to be a tilesheet with dimensions w,h.
+
+
#### `[colorize:<color>:<ratio>`
Colorize the textures with the given color.
`<color>` is specified as a `ColorString`.
diff --git a/games/minimal/mods/default/init.lua b/games/minimal/mods/default/init.lua
index bff7860e3..f532e7193 100644
--- a/games/minimal/mods/default/init.lua
+++ b/games/minimal/mods/default/init.lua
@@ -1130,8 +1130,9 @@ minetest.register_node("default:sign_wall", {
minetest.register_node("default:chest", {
description = "Chest",
- tiles ={"default_chest_top.png", "default_chest_top.png", "default_chest_side.png",
- "default_chest_side.png", "default_chest_side.png", "default_chest_front.png"},
+ tiles ={"default_chest.png^[sheet:2x2:0,0", "default_chest.png^[sheet:2x2:0,0",
+ "default_chest.png^[sheet:2x2:1,0", "default_chest.png^[sheet:2x2:1,0",
+ "default_chest.png^[sheet:2x2:1,0", "default_chest.png^[sheet:2x2:0,1"},
paramtype2 = "facedir",
groups = {snappy=2,choppy=2,oddly_breakable_by_hand=2},
legacy_facedir_simple = true,
@@ -1164,8 +1165,9 @@ end
minetest.register_node("default:chest_locked", {
description = "Locked Chest",
- tiles ={"default_chest_top.png", "default_chest_top.png", "default_chest_side.png",
- "default_chest_side.png", "default_chest_side.png", "default_chest_lock.png"},
+ tiles ={"default_chest.png^[sheet:2x2:0,0", "default_chest.png^[sheet:2x2:0,0",
+ "default_chest.png^[sheet:2x2:1,0", "default_chest.png^[sheet:2x2:1,0",
+ "default_chest.png^[sheet:2x2:1,0", "default_chest.png^[sheet:2x2:1,1"},
paramtype2 = "facedir",
groups = {snappy=2,choppy=2,oddly_breakable_by_hand=2},
legacy_facedir_simple = true,
diff --git a/games/minimal/mods/default/textures/default_chest.png b/games/minimal/mods/default/textures/default_chest.png
new file mode 100644
index 000000000..9746a3fd9
--- /dev/null
+++ b/games/minimal/mods/default/textures/default_chest.png
Binary files differ
diff --git a/games/minimal/mods/default/textures/default_chest_front.png b/games/minimal/mods/default/textures/default_chest_front.png
deleted file mode 100644
index 55b076c35..000000000
--- a/games/minimal/mods/default/textures/default_chest_front.png
+++ /dev/null
Binary files differ
diff --git a/games/minimal/mods/default/textures/default_chest_lock.png b/games/minimal/mods/default/textures/default_chest_lock.png
deleted file mode 100644
index 4b2d1af6c..000000000
--- a/games/minimal/mods/default/textures/default_chest_lock.png
+++ /dev/null
Binary files differ
diff --git a/games/minimal/mods/default/textures/default_chest_side.png b/games/minimal/mods/default/textures/default_chest_side.png
deleted file mode 100644
index ae4847cb6..000000000
--- a/games/minimal/mods/default/textures/default_chest_side.png
+++ /dev/null
Binary files differ
diff --git a/games/minimal/mods/default/textures/default_chest_top.png b/games/minimal/mods/default/textures/default_chest_top.png
deleted file mode 100644
index ac41551b0..000000000
--- a/games/minimal/mods/default/textures/default_chest_top.png
+++ /dev/null
Binary files differ
diff --git a/src/client/tile.cpp b/src/client/tile.cpp
index 7f7535df6..4d2166342 100644
--- a/src/client/tile.cpp
+++ b/src/client/tile.cpp
@@ -1827,6 +1827,49 @@ bool TextureSource::generateImagePart(std::string part_of_name,
baseimg->setPixel(x, y, c);
}
}
+ /*
+ [sheet:WxH:X,Y
+ Retrieves a tile at position X,Y (in tiles)
+ from the base image it assumes to be a
+ tilesheet with dimensions W,H (in tiles).
+ */
+ else if (part_of_name.substr(0,7) == "[sheet:") {
+ if (baseimg == NULL) {
+ errorstream << "generateImagePart(): baseimg != NULL "
+ << "for part_of_name=\"" << part_of_name
+ << "\", cancelling." << std::endl;
+ return false;
+ }
+
+ Strfnd sf(part_of_name);
+ sf.next(":");
+ u32 w0 = stoi(sf.next("x"));
+ u32 h0 = stoi(sf.next(":"));
+ u32 x0 = stoi(sf.next(","));
+ u32 y0 = stoi(sf.next(":"));
+
+ core::dimension2d<u32> img_dim = baseimg->getDimension();
+ core::dimension2d<u32> tile_dim(v2u32(img_dim) / v2u32(w0, h0));
+
+ video::IImage *img = driver->createImage(
+ video::ECF_A8R8G8B8, tile_dim);
+ if (!img) {
+ errorstream << "generateImagePart(): Could not create image "
+ << "for part_of_name=\"" << part_of_name
+ << "\", cancelling." << std::endl;
+ return false;
+ }
+
+ img->fill(video::SColor(0,0,0,0));
+ v2u32 vdim(tile_dim);
+ core::rect<s32> rect(v2s32(x0 * vdim.X, y0 * vdim.Y), tile_dim);
+ baseimg->copyToWithAlpha(img, v2s32(0), rect,
+ video::SColor(255,255,255,255), NULL);
+
+ // Replace baseimg
+ baseimg->drop();
+ baseimg = img;
+ }
else
{
errorstream << "generateImagePart(): Invalid "