Mapnode: Replace rotateAlongYAxis with improved version
authorparamat <mat.gregory@virginmedia.com>
Fri, 2 Oct 2015 00:07:57 +0000 (01:07 +0100)
committerparamat <mat.gregory@virginmedia.com>
Fri, 2 Oct 2015 05:03:36 +0000 (06:03 +0100)
Get facedir by using lowest 5 bits of param2 and limiting to 23
More robust, frees up higher param2 bits for other uses
Change lookup table and table index to u8

src/mapnode.cpp
src/mapnode.h
src/mg_schematic.cpp

index 64c0ea03f3d1d4cba6c913a368fa22ef74a312e1..671e949f1d22b73f3e1c5494f7cb36cda6bc7ecc 100644 (file)
@@ -164,29 +164,7 @@ void MapNode::rotateAlongYAxis(INodeDefManager *nodemgr, Rotation rot)
        ContentParamType2 cpt2 = nodemgr->get(*this).param_type_2;
 
        if (cpt2 == CPT2_FACEDIR) {
-               if (param2 >= 4)
-                       return;
-
-               u8 newrot = param2 & 3;
-               param2 &= ~3;
-               param2 |= (newrot + rot) & 3;
-       } 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];
-       }
-}
-
-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] = {
+               static const u8 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)
@@ -221,8 +199,10 @@ void MapNode::rotateAlongYAxisFull(INodeDefManager *nodemgr, Rotation rot)
                        22, 21, 20, 23,
                        23, 22, 21, 20
                };
-               u16 index = param2 * 4 + rot;
-               param2 = rotate_facedir[index];
+               u8 facedir = (param2 & 31) % 24;
+               u8 index = facedir * 4 + rot;
+               param2 &= ~31;
+               param2 |= rotate_facedir[index];
        } else if (cpt2 == CPT2_WALLMOUNTED) {
                u8 wmountface = (param2 & 7);
                if (wmountface <= 1)
index 271517391bdd6a86ddf6c79b6098c308939167c5..7cc25c60cfabde4b70036e1b80667ad67f69ebad 100644 (file)
@@ -236,7 +236,6 @@ 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 ca915b7b6c911a82fce840f6d7dc4b386b55e7cc..a5ffb20b8faa38e56e7873a4df11a4508be7e32d 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].rotateAlongYAxisFull(m_ndef, rot);
+                                       vm->m_data[vi].rotateAlongYAxis(m_ndef, rot);
                        }
                }
                y_map++;