aboutsummaryrefslogtreecommitdiff
path: root/src/mapnode.cpp
diff options
context:
space:
mode:
authorPerttu Ahola <celeron55@gmail.com>2011-11-08 16:17:38 +0200
committerPerttu Ahola <celeron55@gmail.com>2011-11-08 16:17:38 +0200
commit045e32b6ecb99432beac3363685fb622e9ec3457 (patch)
tree8cd881ec22499a5848e8682061a4cf10ae8bd91c /src/mapnode.cpp
parentfea55a9b87b47eb7cac19587923c5debde8336b7 (diff)
downloadminetest-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.cpp51
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)
{
/*