diff options
author | Perttu Ahola <celeron55@gmail.com> | 2011-11-08 16:17:38 +0200 |
---|---|---|
committer | Perttu Ahola <celeron55@gmail.com> | 2011-11-08 16:17:38 +0200 |
commit | 045e32b6ecb99432beac3363685fb622e9ec3457 (patch) | |
tree | 8cd881ec22499a5848e8682061a4cf10ae8bd91c /src/mapnode.cpp | |
parent | fea55a9b87b47eb7cac19587923c5debde8336b7 (diff) | |
download | minetest-045e32b6ecb99432beac3363685fb622e9ec3457.tar.gz minetest-045e32b6ecb99432beac3363685fb622e9ec3457.tar.bz2 minetest-045e32b6ecb99432beac3363685fb622e9ec3457.zip |
Fix water-glass and water-lava surfaces
Diffstat (limited to 'src/mapnode.cpp')
-rw-r--r-- | src/mapnode.cpp | 51 |
1 files changed, 51 insertions, 0 deletions
diff --git a/src/mapnode.cpp b/src/mapnode.cpp index 847608040..f81631999 100644 --- a/src/mapnode.cpp +++ b/src/mapnode.cpp @@ -174,6 +174,57 @@ void init_mapnode() } +/* + Nodes make a face if contents differ and solidness differs. + Return value: + 0: No face + 1: Face uses m1's content + 2: Face uses m2's content + equivalent: Whether the blocks share the same face (eg. water and glass) +*/ +u8 face_contents(content_t m1, content_t m2, bool *equivalent) +{ + *equivalent = false; + + if(m1 == CONTENT_IGNORE || m2 == CONTENT_IGNORE) + return 0; + + bool contents_differ = (m1 != m2); + + // Contents don't differ for different forms of same liquid + if(content_liquid(m1) && content_liquid(m2) + && make_liquid_flowing(m1) == make_liquid_flowing(m2)) + contents_differ = false; + + u8 c1 = content_solidness(m1); + u8 c2 = content_solidness(m2); + + bool solidness_differs = (c1 != c2); + bool makes_face = contents_differ && solidness_differs; + + if(makes_face == false) + return 0; + + if(c1 == 0) + c1 = content_features(m1).visual_solidness; + if(c2 == 0) + c2 = content_features(m2).visual_solidness; + + if(c1 == c2){ + *equivalent = true; + // If same solidness, liquid takes precense + if(content_features(m1).liquid_type != LIQUID_NONE) + return 1; + if(content_features(m2).liquid_type != LIQUID_NONE) + return 2; + } + + if(c1 > c2) + return 1; + else + return 2; +} + v3s16 facedir_rotate(u8 facedir, v3s16 dir) { /* |