forked from Mirrorlandia_minetest/minetest
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.
This commit is contained in:
parent
523f0e8c5b
commit
7057c196c4
@ -403,6 +403,11 @@ Apply a mask to the base image.
|
|||||||
|
|
||||||
The mask is applied using binary AND.
|
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:<color>:<ratio>`
|
||||||
Colorize the textures with the given color.
|
Colorize the textures with the given color.
|
||||||
`<color>` is specified as a `ColorString`.
|
`<color>` is specified as a `ColorString`.
|
||||||
|
@ -1130,8 +1130,9 @@ minetest.register_node("default:sign_wall", {
|
|||||||
|
|
||||||
minetest.register_node("default:chest", {
|
minetest.register_node("default:chest", {
|
||||||
description = "Chest",
|
description = "Chest",
|
||||||
tiles ={"default_chest_top.png", "default_chest_top.png", "default_chest_side.png",
|
tiles ={"default_chest.png^[sheet:2x2:0,0", "default_chest.png^[sheet:2x2:0,0",
|
||||||
"default_chest_side.png", "default_chest_side.png", "default_chest_front.png"},
|
"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",
|
paramtype2 = "facedir",
|
||||||
groups = {snappy=2,choppy=2,oddly_breakable_by_hand=2},
|
groups = {snappy=2,choppy=2,oddly_breakable_by_hand=2},
|
||||||
legacy_facedir_simple = true,
|
legacy_facedir_simple = true,
|
||||||
@ -1164,8 +1165,9 @@ end
|
|||||||
|
|
||||||
minetest.register_node("default:chest_locked", {
|
minetest.register_node("default:chest_locked", {
|
||||||
description = "Locked Chest",
|
description = "Locked Chest",
|
||||||
tiles ={"default_chest_top.png", "default_chest_top.png", "default_chest_side.png",
|
tiles ={"default_chest.png^[sheet:2x2:0,0", "default_chest.png^[sheet:2x2:0,0",
|
||||||
"default_chest_side.png", "default_chest_side.png", "default_chest_lock.png"},
|
"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",
|
paramtype2 = "facedir",
|
||||||
groups = {snappy=2,choppy=2,oddly_breakable_by_hand=2},
|
groups = {snappy=2,choppy=2,oddly_breakable_by_hand=2},
|
||||||
legacy_facedir_simple = true,
|
legacy_facedir_simple = true,
|
||||||
|
BIN
games/minimal/mods/default/textures/default_chest.png
Normal file
BIN
games/minimal/mods/default/textures/default_chest.png
Normal file
Binary file not shown.
After Width: | Height: | Size: 263 B |
Binary file not shown.
Before Width: | Height: | Size: 114 B |
Binary file not shown.
Before Width: | Height: | Size: 145 B |
Binary file not shown.
Before Width: | Height: | Size: 98 B |
Binary file not shown.
Before Width: | Height: | Size: 93 B |
@ -1827,6 +1827,49 @@ bool TextureSource::generateImagePart(std::string part_of_name,
|
|||||||
baseimg->setPixel(x, y, c);
|
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
|
else
|
||||||
{
|
{
|
||||||
errorstream << "generateImagePart(): Invalid "
|
errorstream << "generateImagePart(): Invalid "
|
||||||
|
Loading…
Reference in New Issue
Block a user