Skip to content
Permalink
Browse files
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.
  • Loading branch information
lupuchard authored and sfan5 committed Jan 2, 2017
1 parent 523f0e8 commit 7057c196c442ff3484b53f48d940f4c9e0ffe23a
Show file tree
Hide file tree
Showing 8 changed files with 54 additions and 4 deletions.
@@ -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`.
@@ -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,
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.
@@ -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 "

0 comments on commit 7057c19

Please sign in to comment.