diff options
author | Luke Puchner-Hardman <x.lukk3.x@gmail.com> | 2014-09-23 14:39:34 +0200 |
---|---|---|
committer | sfan5 <sfan5@live.de> | 2017-01-02 15:28:06 +0100 |
commit | 7057c196c442ff3484b53f48d940f4c9e0ffe23a (patch) | |
tree | ea6e57d1755253577e3eda6fe22280314d22fb87 | |
parent | 523f0e8c5bce0cb58215dc1f9d027cf32394e3c3 (diff) | |
download | minetest-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.txt | 5 | ||||
-rw-r--r-- | games/minimal/mods/default/init.lua | 10 | ||||
-rw-r--r-- | games/minimal/mods/default/textures/default_chest.png | bin | 0 -> 263 bytes | |||
-rw-r--r-- | games/minimal/mods/default/textures/default_chest_front.png | bin | 114 -> 0 bytes | |||
-rw-r--r-- | games/minimal/mods/default/textures/default_chest_lock.png | bin | 145 -> 0 bytes | |||
-rw-r--r-- | games/minimal/mods/default/textures/default_chest_side.png | bin | 98 -> 0 bytes | |||
-rw-r--r-- | games/minimal/mods/default/textures/default_chest_top.png | bin | 93 -> 0 bytes | |||
-rw-r--r-- | src/client/tile.cpp | 43 |
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 Binary files differnew file mode 100644 index 000000000..9746a3fd9 --- /dev/null +++ b/games/minimal/mods/default/textures/default_chest.png diff --git a/games/minimal/mods/default/textures/default_chest_front.png b/games/minimal/mods/default/textures/default_chest_front.png Binary files differdeleted file mode 100644 index 55b076c35..000000000 --- a/games/minimal/mods/default/textures/default_chest_front.png +++ /dev/null diff --git a/games/minimal/mods/default/textures/default_chest_lock.png b/games/minimal/mods/default/textures/default_chest_lock.png Binary files differdeleted file mode 100644 index 4b2d1af6c..000000000 --- a/games/minimal/mods/default/textures/default_chest_lock.png +++ /dev/null diff --git a/games/minimal/mods/default/textures/default_chest_side.png b/games/minimal/mods/default/textures/default_chest_side.png Binary files differdeleted file mode 100644 index ae4847cb6..000000000 --- a/games/minimal/mods/default/textures/default_chest_side.png +++ /dev/null diff --git a/games/minimal/mods/default/textures/default_chest_top.png b/games/minimal/mods/default/textures/default_chest_top.png Binary files differdeleted file mode 100644 index ac41551b0..000000000 --- a/games/minimal/mods/default/textures/default_chest_top.png +++ /dev/null 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 " |