Mapnode: Add rotateAlongYAxisFull supporting 24 facedirs
authorparamat <mat.gregory@virginmedia.com>
Mon, 21 Sep 2015 00:21:28 +0000 (01:21 +0100)
committerparamat <mat.gregory@virginmedia.com>
Tue, 22 Sep 2015 19:54:25 +0000 (20:54 +0100)
src/mapnode.cpp
src/mapnode.h
src/mg_schematic.cpp

index 732237833c4e391abb5d7281824e1fd09a141d62..64c0ea03f3d1d4cba6c913a368fa22ef74a312e1 100644 (file)
@@ -159,7 +159,8 @@ v3s16 MapNode::getWallMountedDir(INodeDefManager *nodemgr) const
        }
 }
 
-void MapNode::rotateAlongYAxis(INodeDefManager *nodemgr, Rotation rot) {
+void MapNode::rotateAlongYAxis(INodeDefManager *nodemgr, Rotation rot)
+{
        ContentParamType2 cpt2 = nodemgr->get(*this).param_type_2;
 
        if (cpt2 == CPT2_FACEDIR) {
@@ -180,6 +181,59 @@ void MapNode::rotateAlongYAxis(INodeDefManager *nodemgr, Rotation rot) {
        }
 }
 
+void MapNode::rotateAlongYAxisFull(INodeDefManager *nodemgr, Rotation rot)
+{
+       ContentParamType2 cpt2 = nodemgr->get(*this).param_type_2;
+
+       if (cpt2 == CPT2_FACEDIR) {
+               static const u16 rotate_facedir[24 * 4] = {
+                       // Table value = rotated facedir
+                       // Columns: 0, 90, 180, 270 degrees rotation around vertical axis
+                       // Rotation is anticlockwise as seen from above (+Y)
+
+                       0, 1, 2, 3,  // Initial facedir 0 to 3
+                       1, 2, 3, 0,
+                       2, 3, 0, 1,
+                       3, 0, 1, 2,
+
+                       4, 13, 10, 19,  // 4 to 7
+                       5, 14, 11, 16,
+                       6, 15, 8, 17,
+                       7, 12, 9, 18,
+
+                       8, 17, 6, 15,  // 8 to 11
+                       9, 18, 7, 12,
+                       10, 19, 4, 13,
+                       11, 16, 5, 14,
+
+                       12, 9, 18, 7,  // 12 to 15
+                       13, 10, 19, 4,
+                       14, 11, 16, 5,
+                       15, 8, 17, 6,
+
+                       16, 5, 14, 11,  // 16 to 19
+                       17, 6, 15, 8,
+                       18, 7, 12, 9,
+                       19, 4, 13, 10,
+
+                       20, 23, 22, 21,  // 20 to 23
+                       21, 20, 23, 22,
+                       22, 21, 20, 23,
+                       23, 22, 21, 20
+               };
+               u16 index = param2 * 4 + rot;
+               param2 = rotate_facedir[index];
+       } else if (cpt2 == CPT2_WALLMOUNTED) {
+               u8 wmountface = (param2 & 7);
+               if (wmountface <= 1)
+                       return;
+
+               Rotation oldrot = wallmounted_to_rot[wmountface - 2];
+               param2 &= ~7;
+               param2 |= rot_to_wallmounted[(oldrot - rot) & 3];
+       }
+}
+
 static std::vector<aabb3f> transformNodeBox(const MapNode &n,
                const NodeBox &nodebox, INodeDefManager *nodemgr)
 {
index 7cc25c60cfabde4b70036e1b80667ad67f69ebad..271517391bdd6a86ddf6c79b6098c308939167c5 100644 (file)
@@ -236,6 +236,7 @@ struct MapNode
        v3s16 getWallMountedDir(INodeDefManager *nodemgr) const;
 
        void rotateAlongYAxis(INodeDefManager *nodemgr, Rotation rot);
+       void rotateAlongYAxisFull(INodeDefManager *nodemgr, Rotation rot);
 
        /*
                Gets list of node boxes (used for rendering (NDT_NODEBOX))
index a5ffb20b8faa38e56e7873a4df11a4508be7e32d..ca915b7b6c911a82fce840f6d7dc4b386b55e7cc 100644 (file)
@@ -167,7 +167,7 @@ void Schematic::blitToVManip(v3s16 p, MMVManip *vm, Rotation rot, bool force_pla
                                vm->m_data[vi].param1 = 0;
 
                                if (rot)
-                                       vm->m_data[vi].rotateAlongYAxis(m_ndef, rot);
+                                       vm->m_data[vi].rotateAlongYAxisFull(m_ndef, rot);
                        }
                }
                y_map++;