171 lines
4.4 KiB
Lua
171 lines
4.4 KiB
Lua
local f = string.format
|
|
|
|
local function is_vertical_frames(animation)
|
|
return (animation.type == "vertical_frames" and animation.aspect_w and animation.aspect_h)
|
|
end
|
|
|
|
local function get_single_frame(animation, image_name)
|
|
return ("[combine:%ix%i^[noalpha^[colorize:#FFF:255^[mask:%s"):format(
|
|
animation.aspect_w,
|
|
animation.aspect_h,
|
|
image_name
|
|
)
|
|
end
|
|
|
|
local function is_sheet_2d(animation)
|
|
return (animation.type == "sheet_2d" and animation.frames_w and animation.frames_h)
|
|
end
|
|
|
|
local function get_sheet_2d(animation, image_name)
|
|
return ("%s^[sheet:%ix%i:0,0"):format(image_name, animation.frames_w, animation.frames_h)
|
|
end
|
|
|
|
local get_image_from_tile = futil.memoize1(function(tile)
|
|
if type(tile) == "string" then
|
|
return tile
|
|
elseif type(tile) == "table" then
|
|
local image_name
|
|
|
|
if type(tile.image) == "string" then
|
|
image_name = tile.image
|
|
elseif type(tile.name) == "string" then
|
|
image_name = tile.name
|
|
end
|
|
|
|
if image_name then
|
|
local animation = tile.animation
|
|
if animation then
|
|
if is_vertical_frames(animation) then
|
|
return get_single_frame(animation, image_name)
|
|
elseif is_sheet_2d(animation) then
|
|
return get_sheet_2d(animation, image_name)
|
|
end
|
|
end
|
|
|
|
return image_name
|
|
end
|
|
end
|
|
|
|
return "unknown_node.png"
|
|
end)
|
|
|
|
local function get_image_cube(tiles)
|
|
if #tiles >= 6 then
|
|
return minetest.inventorycube(
|
|
get_image_from_tile(tiles[1] or "no_texture.png"),
|
|
get_image_from_tile(tiles[6] or "no_texture.png"),
|
|
get_image_from_tile(tiles[3] or "no_texture.png")
|
|
)
|
|
elseif #tiles == 5 then
|
|
return minetest.inventorycube(
|
|
get_image_from_tile(tiles[1] or "no_texture.png"),
|
|
get_image_from_tile(tiles[5] or "no_texture.png"),
|
|
get_image_from_tile(tiles[3] or "no_texture.png")
|
|
)
|
|
elseif #tiles == 4 then
|
|
return minetest.inventorycube(
|
|
get_image_from_tile(tiles[1] or "no_texture.png"),
|
|
get_image_from_tile(tiles[4] or "no_texture.png"),
|
|
get_image_from_tile(tiles[3] or "no_texture.png")
|
|
)
|
|
elseif #tiles == 3 then
|
|
return minetest.inventorycube(
|
|
get_image_from_tile(tiles[1] or "no_texture.png"),
|
|
get_image_from_tile(tiles[3] or "no_texture.png"),
|
|
get_image_from_tile(tiles[3] or "no_texture.png")
|
|
)
|
|
elseif #tiles == 2 then
|
|
return minetest.inventorycube(
|
|
get_image_from_tile(tiles[1] or "no_texture.png"),
|
|
get_image_from_tile(tiles[2] or "no_texture.png"),
|
|
get_image_from_tile(tiles[2] or "no_texture.png")
|
|
)
|
|
elseif #tiles == 1 then
|
|
return minetest.inventorycube(
|
|
get_image_from_tile(tiles[1] or "no_texture.png"),
|
|
get_image_from_tile(tiles[1] or "no_texture.png"),
|
|
get_image_from_tile(tiles[1] or "no_texture.png")
|
|
)
|
|
end
|
|
|
|
return "no_texture.png"
|
|
end
|
|
|
|
local function is_normal_node(drawtype)
|
|
return (
|
|
drawtype == "normal"
|
|
or drawtype == "allfaces"
|
|
or drawtype == "allfaces_optional"
|
|
or drawtype == "glasslike"
|
|
or drawtype == "glasslike_framed"
|
|
or drawtype == "glasslike_framed_optional"
|
|
or drawtype == "liquid"
|
|
)
|
|
end
|
|
|
|
local cache = {}
|
|
|
|
function futil.get_wield_image(item)
|
|
if type(item) == "string" then
|
|
item = ItemStack(item)
|
|
end
|
|
|
|
if item:is_empty() then
|
|
return "blank.png"
|
|
end
|
|
|
|
local def = item:get_definition()
|
|
if not def then
|
|
return "unknown_item.png"
|
|
end
|
|
|
|
local itemstring = item:to_string()
|
|
local cached = cache[itemstring]
|
|
if cached then
|
|
return cached
|
|
end
|
|
|
|
local meta = item:get_meta()
|
|
local color = meta:get("color") or def.color
|
|
|
|
local image = "no_texture.png"
|
|
|
|
if def.wield_image and def.wield_image ~= "" then
|
|
local parts = { def.wield_image }
|
|
if color then
|
|
parts[#parts + 1] = f("[colorize:%s:alpha", futil.escape_texture(color))
|
|
end
|
|
if def.wield_overlay then
|
|
parts[#parts + 1] = def.wield_overlay
|
|
end
|
|
image = table.concat(parts, "^")
|
|
elseif def.inventory_image and def.inventory_image ~= "" then
|
|
local parts = { def.inventory_image }
|
|
if color then
|
|
parts[#parts + 1] = f("[colorize:%s:alpha", futil.escape_texture(color))
|
|
end
|
|
if def.inventory_overlay then
|
|
parts[#parts + 1] = def.inventory_overlay
|
|
end
|
|
image = table.concat(parts, "^")
|
|
elseif def.type == "node" then
|
|
if def.drawtype == "nodebox" or def.drawtype == "mesh" then
|
|
image = "no_texture.png"
|
|
else
|
|
local tiles = def.tiles
|
|
if type(tiles) == "string" then
|
|
image = get_image_from_tile(tiles)
|
|
elseif type(tiles) == "table" then
|
|
if is_normal_node(def.drawtype) then
|
|
image = get_image_cube(tiles)
|
|
else
|
|
image = get_image_from_tile(tiles[1])
|
|
end
|
|
end
|
|
end
|
|
end
|
|
|
|
cache[itemstring] = image
|
|
|
|
return image
|
|
end
|