mirror of
https://github.com/luanti-org/luanti.git
synced 2025-06-27 16:36:03 +00:00
Hardware coloring for itemstacks
Adds the possibility to colorize item stacks based on their metadata. In the item/node definition you can specify palette (an image file) and color (fallback color if the item has no palette or metadata). Then you can add palette_index to the metadata. Dropped itemstacks with different colors do not merge.
This commit is contained in:
parent
d4e9dd4643
commit
58d83a7bb2
23 changed files with 308 additions and 139 deletions
|
@ -82,6 +82,8 @@ ItemDefinition& ItemDefinition::operator=(const ItemDefinition &def)
|
|||
sound_place = def.sound_place;
|
||||
sound_place_failed = def.sound_place_failed;
|
||||
range = def.range;
|
||||
palette_image = def.palette_image;
|
||||
color = def.color;
|
||||
return *this;
|
||||
}
|
||||
|
||||
|
@ -104,6 +106,8 @@ void ItemDefinition::reset()
|
|||
description = "";
|
||||
inventory_image = "";
|
||||
wield_image = "";
|
||||
palette_image = "";
|
||||
color = video::SColor(0xFFFFFFFF);
|
||||
wield_scale = v3f(1.0, 1.0, 1.0);
|
||||
stack_max = 99;
|
||||
usable = false;
|
||||
|
@ -153,6 +157,8 @@ void ItemDefinition::serialize(std::ostream &os, u16 protocol_version) const
|
|||
writeF1000(os, range);
|
||||
os << serializeString(sound_place_failed.name);
|
||||
writeF1000(os, sound_place_failed.gain);
|
||||
os << serializeString(palette_image);
|
||||
writeU32(os, color.color);
|
||||
}
|
||||
|
||||
void ItemDefinition::deSerialize(std::istream &is)
|
||||
|
@ -209,6 +215,8 @@ void ItemDefinition::deSerialize(std::istream &is)
|
|||
try {
|
||||
sound_place_failed.name = deSerializeString(is);
|
||||
sound_place_failed.gain = readF1000(is);
|
||||
palette_image = deSerializeString(is);
|
||||
color.set(readU32(is));
|
||||
} catch(SerializationError &e) {};
|
||||
}
|
||||
|
||||
|
@ -224,11 +232,13 @@ class CItemDefManager: public IWritableItemDefManager
|
|||
struct ClientCached
|
||||
{
|
||||
video::ITexture *inventory_texture;
|
||||
scene::IMesh *wield_mesh;
|
||||
ItemMesh wield_mesh;
|
||||
Palette *palette;
|
||||
|
||||
ClientCached():
|
||||
inventory_texture(NULL),
|
||||
wield_mesh(NULL)
|
||||
wield_mesh(),
|
||||
palette(NULL)
|
||||
{}
|
||||
};
|
||||
#endif
|
||||
|
@ -250,8 +260,8 @@ public:
|
|||
i = values.begin(); i != values.end(); ++i)
|
||||
{
|
||||
ClientCached *cc = *i;
|
||||
if (cc->wield_mesh)
|
||||
cc->wield_mesh->drop();
|
||||
if (cc->wield_mesh.mesh)
|
||||
cc->wield_mesh.mesh->drop();
|
||||
delete cc;
|
||||
}
|
||||
|
||||
|
@ -335,8 +345,9 @@ public:
|
|||
ItemStack item = ItemStack();
|
||||
item.name = def.name;
|
||||
|
||||
scene::IMesh *mesh = getItemMesh(client, item);
|
||||
cc->wield_mesh = mesh;
|
||||
getItemMesh(client, item, &(cc->wield_mesh));
|
||||
|
||||
cc->palette = tsrc->getPalette(def.palette_image);
|
||||
|
||||
// Put in cache
|
||||
m_clientcached.set(name, cc);
|
||||
|
@ -390,13 +401,41 @@ public:
|
|||
return cc->inventory_texture;
|
||||
}
|
||||
// Get item wield mesh
|
||||
virtual scene::IMesh* getWieldMesh(const std::string &name,
|
||||
virtual ItemMesh* getWieldMesh(const std::string &name,
|
||||
Client *client) const
|
||||
{
|
||||
ClientCached *cc = getClientCached(name, client);
|
||||
if(!cc)
|
||||
return NULL;
|
||||
return cc->wield_mesh;
|
||||
return &(cc->wield_mesh);
|
||||
}
|
||||
|
||||
// Get item palette
|
||||
virtual Palette* getPalette(const std::string &name,
|
||||
Client *client) const
|
||||
{
|
||||
ClientCached *cc = getClientCached(name, client);
|
||||
if(!cc)
|
||||
return NULL;
|
||||
return cc->palette;
|
||||
}
|
||||
|
||||
virtual video::SColor getItemstackColor(const ItemStack &stack,
|
||||
Client *client) const
|
||||
{
|
||||
// Look for direct color definition
|
||||
const std::string &colorstring = stack.metadata.getString("color", 0);
|
||||
video::SColor directcolor;
|
||||
if ((colorstring != "")
|
||||
&& parseColorString(colorstring, directcolor, true))
|
||||
return directcolor;
|
||||
// See if there is a palette
|
||||
Palette *palette = getPalette(stack.name, client);
|
||||
const std::string &index = stack.metadata.getString("palette_index", 0);
|
||||
if ((palette != NULL) && (index != ""))
|
||||
return (*palette)[mystoi(index, 0, 255)];
|
||||
// Fallback color
|
||||
return get(stack.name).color;
|
||||
}
|
||||
#endif
|
||||
void clear()
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue