Skip to content

Commit

Permalink
Added "[sheet" to the texture special commands.
Browse files Browse the repository at this point in the history
"[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.
  • Loading branch information
lupuchard authored and sfan5 committed Jan 2, 2017
1 parent 523f0e8 commit 7057c19
Show file tree
Hide file tree
Showing 8 changed files with 54 additions and 4 deletions.
5 changes: 5 additions & 0 deletions doc/lua_api.txt
Expand Up @@ -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`.
Expand Down
10 changes: 6 additions & 4 deletions games/minimal/mods/default/init.lua
Expand Up @@ -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,
Expand Down Expand Up @@ -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,
Expand Down
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
43 changes: 43 additions & 0 deletions src/client/tile.cpp
Expand Up @@ -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 "
Expand Down

0 comments on commit 7057c19

Please sign in to comment.