mirror of
https://github.com/luanti-org/luanti.git
synced 2025-06-27 16:36:03 +00:00
Soft node overlay (#5186)
This commit adds node overlays, which are tiles that are drawn on top of other tiles.
This commit is contained in:
parent
2ad74a9e8b
commit
1ffb180868
18 changed files with 763 additions and 467 deletions
|
@ -378,13 +378,13 @@ void ContentFeatures::reset()
|
|||
|
||||
void ContentFeatures::serialize(std::ostream &os, u16 protocol_version) const
|
||||
{
|
||||
if (protocol_version < 30) {
|
||||
if (protocol_version < 31) {
|
||||
serializeOld(os, protocol_version);
|
||||
return;
|
||||
}
|
||||
|
||||
// version
|
||||
writeU8(os, 9);
|
||||
writeU8(os, 10);
|
||||
|
||||
// general
|
||||
os << serializeString(name);
|
||||
|
@ -404,6 +404,8 @@ void ContentFeatures::serialize(std::ostream &os, u16 protocol_version) const
|
|||
writeU8(os, 6);
|
||||
for (u32 i = 0; i < 6; i++)
|
||||
tiledef[i].serialize(os, protocol_version);
|
||||
for (u32 i = 0; i < 6; i++)
|
||||
tiledef_overlay[i].serialize(os, protocol_version);
|
||||
writeU8(os, CF_SPECIAL_COUNT);
|
||||
for (u32 i = 0; i < CF_SPECIAL_COUNT; i++) {
|
||||
tiledef_special[i].serialize(os, protocol_version);
|
||||
|
@ -492,7 +494,7 @@ void ContentFeatures::deSerialize(std::istream &is)
|
|||
if (version < 9) {
|
||||
deSerializeOld(is, version);
|
||||
return;
|
||||
} else if (version > 9) {
|
||||
} else if (version > 10) {
|
||||
throw SerializationError("unsupported ContentFeatures version");
|
||||
}
|
||||
|
||||
|
@ -516,6 +518,9 @@ void ContentFeatures::deSerialize(std::istream &is)
|
|||
throw SerializationError("unsupported tile count");
|
||||
for (u32 i = 0; i < 6; i++)
|
||||
tiledef[i].deSerialize(is, version, drawtype);
|
||||
if (version >= 10)
|
||||
for (u32 i = 0; i < 6; i++)
|
||||
tiledef_overlay[i].deSerialize(is, version, drawtype);
|
||||
if (readU8(is) != CF_SPECIAL_COUNT)
|
||||
throw SerializationError("unsupported CF_SPECIAL_COUNT");
|
||||
for (u32 i = 0; i < CF_SPECIAL_COUNT; i++)
|
||||
|
@ -581,7 +586,7 @@ void ContentFeatures::deSerialize(std::istream &is)
|
|||
}
|
||||
|
||||
#ifndef SERVER
|
||||
void ContentFeatures::fillTileAttribs(ITextureSource *tsrc, TileSpec *tile,
|
||||
void ContentFeatures::fillTileAttribs(ITextureSource *tsrc, TileLayer *tile,
|
||||
TileDef *tiledef, u32 shader_id, bool use_normal_texture,
|
||||
bool backface_culling, u8 material_type)
|
||||
{
|
||||
|
@ -774,14 +779,18 @@ void ContentFeatures::updateTextures(ITextureSource *tsrc, IShaderSource *shdsrc
|
|||
|
||||
// Tiles (fill in f->tiles[])
|
||||
for (u16 j = 0; j < 6; j++) {
|
||||
fillTileAttribs(tsrc, &tiles[j], &tdef[j], tile_shader[j],
|
||||
fillTileAttribs(tsrc, &tiles[j].layers[0], &tdef[j], tile_shader[j],
|
||||
tsettings.use_normal_texture,
|
||||
tiledef[j].backface_culling, material_type);
|
||||
if (tiledef_overlay[j].name!="")
|
||||
fillTileAttribs(tsrc, &tiles[j].layers[1], &tiledef_overlay[j],
|
||||
tile_shader[j], tsettings.use_normal_texture,
|
||||
tiledef[j].backface_culling, material_type);
|
||||
}
|
||||
|
||||
// Special tiles (fill in f->special_tiles[])
|
||||
for (u16 j = 0; j < CF_SPECIAL_COUNT; j++) {
|
||||
fillTileAttribs(tsrc, &special_tiles[j], &tiledef_special[j],
|
||||
fillTileAttribs(tsrc, &special_tiles[j].layers[0], &tiledef_special[j],
|
||||
tile_shader[j], tsettings.use_normal_texture,
|
||||
tiledef_special[j].backface_culling, material_type);
|
||||
}
|
||||
|
@ -1538,8 +1547,19 @@ void ContentFeatures::serializeOld(std::ostream &os, u16 protocol_version) const
|
|||
if (protocol_version < 30 && drawtype == NDT_PLANTLIKE)
|
||||
compatible_visual_scale = sqrt(visual_scale);
|
||||
|
||||
TileDef compatible_tiles[6];
|
||||
for (u8 i = 0; i < 6; i++) {
|
||||
compatible_tiles[i] = tiledef[i];
|
||||
if (tiledef_overlay[i].name != "") {
|
||||
std::stringstream s;
|
||||
s << "(" << tiledef[i].name << ")^(" << tiledef_overlay[i].name
|
||||
<< ")";
|
||||
compatible_tiles[i].name = s.str();
|
||||
}
|
||||
}
|
||||
|
||||
// Protocol >= 24
|
||||
if (protocol_version < 30) {
|
||||
if (protocol_version < 31) {
|
||||
writeU8(os, protocol_version < 27 ? 7 : 8);
|
||||
|
||||
os << serializeString(name);
|
||||
|
@ -1553,7 +1573,7 @@ void ContentFeatures::serializeOld(std::ostream &os, u16 protocol_version) const
|
|||
writeF1000(os, compatible_visual_scale);
|
||||
writeU8(os, 6);
|
||||
for (u32 i = 0; i < 6; i++)
|
||||
tiledef[i].serialize(os, protocol_version);
|
||||
compatible_tiles[i].serialize(os, protocol_version);
|
||||
writeU8(os, CF_SPECIAL_COUNT);
|
||||
for (u32 i = 0; i < CF_SPECIAL_COUNT; i++)
|
||||
tiledef_special[i].serialize(os, protocol_version);
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue