summaryrefslogtreecommitdiff
path: root/src/nodedef.cpp
diff options
context:
space:
mode:
authorAuke Kok <sofar@foo-projects.org>2016-01-21 14:40:24 -0800
committerest31 <MTest31@outlook.com>2016-01-23 16:33:24 +0100
commit735e3b70596e16d04de1edcd878deec3c539c6ed (patch)
treed83b056ed67845d9fd484304799d72ff4ecddb0d /src/nodedef.cpp
parentef779b0ab6d7460fe074d8b2eda05864c822d905 (diff)
downloadminetest-735e3b70596e16d04de1edcd878deec3c539c6ed.tar.gz
minetest-735e3b70596e16d04de1edcd878deec3c539c6ed.tar.bz2
minetest-735e3b70596e16d04de1edcd878deec3c539c6ed.zip
Backface culling: Ignore setting in tiledef from old servers.
Outdated servers are always sending tiledefs with culling enabled no matter what, as the value was previously entirely ignored. To compensate, we must (1) detect that we're running against an old server with a new client, and (2) disable culling for mesh, plantlike, firelike and liquid draw types no matter what the server is telling us. In order to achieve this, we need to bump the protocol version since we cannot rely on the tiledef version, and test for it being older. I've bumped the protocol version, although that should have likely happened in the actual change that introduced the new backface_culling PR #3578. Fortunately that's only 2 commits back at this point. We also explicitly test for the drawtype to assure we are not changing the culling value for other nodes, where it should remain enabled. This was tested against various pub servers, including 0.4.13 and 0.4.12. Fixes #3598
Diffstat (limited to 'src/nodedef.cpp')
-rw-r--r--src/nodedef.cpp34
1 files changed, 26 insertions, 8 deletions
diff --git a/src/nodedef.cpp b/src/nodedef.cpp
index 0bcc00e47..e30cf6f12 100644
--- a/src/nodedef.cpp
+++ b/src/nodedef.cpp
@@ -139,7 +139,7 @@ void TileDef::serialize(std::ostream &os, u16 protocol_version) const
}
}
-void TileDef::deSerialize(std::istream &is)
+void TileDef::deSerialize(std::istream &is, bool culling_ignore)
{
int version = readU8(is);
name = deSerializeString(is);
@@ -153,6 +153,11 @@ void TileDef::deSerialize(std::istream &is)
tileable_horizontal = readU8(is);
tileable_vertical = readU8(is);
}
+ // when connecting to old servers - do not use
+ // provided values here since culling needs to be
+ // disabled by default for these drawtypes
+ if (culling_ignore)
+ backface_culling = false;
}
@@ -339,15 +344,22 @@ void ContentFeatures::deSerialize(std::istream &is)
groups[name] = value;
}
drawtype = (enum NodeDrawType)readU8(is);
+
+ bool ignore_culling = ((version <= 26) &&
+ ((drawtype == NDT_MESH) ||
+ (drawtype == NDT_PLANTLIKE) ||
+ (drawtype == NDT_FIRELIKE) ||
+ (drawtype == NDT_LIQUID)));
+
visual_scale = readF1000(is);
if(readU8(is) != 6)
throw SerializationError("unsupported tile count");
for(u32 i = 0; i < 6; i++)
- tiledef[i].deSerialize(is);
+ tiledef[i].deSerialize(is, ignore_culling);
if(readU8(is) != CF_SPECIAL_COUNT)
throw SerializationError("unsupported CF_SPECIAL_COUNT");
for(u32 i = 0; i < CF_SPECIAL_COUNT; i++)
- tiledef_special[i].deSerialize(is);
+ tiledef_special[i].deSerialize(is, ignore_culling);
alpha = readU8(is);
post_effect_color.setAlpha(readU8(is));
post_effect_color.setRed(readU8(is));
@@ -1258,7 +1270,6 @@ void ContentFeatures::serializeOld(std::ostream &os, u16 protocol_version) const
"Unsupported version requested");
}
-
void ContentFeatures::deSerializeOld(std::istream &is, int version)
{
if (version == 5) // In PROTOCOL_VERSION 13
@@ -1272,15 +1283,22 @@ void ContentFeatures::deSerializeOld(std::istream &is, int version)
groups[name] = value;
}
drawtype = (enum NodeDrawType)readU8(is);
+
+ bool ignore_culling = ((version <= 26) &&
+ ((drawtype == NDT_MESH) ||
+ (drawtype == NDT_PLANTLIKE) ||
+ (drawtype == NDT_FIRELIKE) ||
+ (drawtype == NDT_LIQUID)));
+
visual_scale = readF1000(is);
if (readU8(is) != 6)
throw SerializationError("unsupported tile count");
for (u32 i = 0; i < 6; i++)
- tiledef[i].deSerialize(is);
+ tiledef[i].deSerialize(is, ignore_culling);
if (readU8(is) != CF_SPECIAL_COUNT)
throw SerializationError("unsupported CF_SPECIAL_COUNT");
for (u32 i = 0; i < CF_SPECIAL_COUNT; i++)
- tiledef_special[i].deSerialize(is);
+ tiledef_special[i].deSerialize(is, ignore_culling);
alpha = readU8(is);
post_effect_color.setAlpha(readU8(is));
post_effect_color.setRed(readU8(is));
@@ -1324,12 +1342,12 @@ void ContentFeatures::deSerializeOld(std::istream &is, int version)
if (readU8(is) != 6)
throw SerializationError("unsupported tile count");
for (u32 i = 0; i < 6; i++)
- tiledef[i].deSerialize(is);
+ tiledef[i].deSerialize(is, drawtype);
// CF_SPECIAL_COUNT in version 6 = 2
if (readU8(is) != 2)
throw SerializationError("unsupported CF_SPECIAL_COUNT");
for (u32 i = 0; i < 2; i++)
- tiledef_special[i].deSerialize(is);
+ tiledef_special[i].deSerialize(is, drawtype);
alpha = readU8(is);
post_effect_color.setAlpha(readU8(is));
post_effect_color.setRed(readU8(is));