diff options
author | paramat <mat.gregory@virginmedia.com> | 2015-10-02 01:07:57 +0100 |
---|---|---|
committer | paramat <mat.gregory@virginmedia.com> | 2015-10-02 06:03:36 +0100 |
commit | 8aaae7db05917dbbedebbd1b5616db976dfc2e8e (patch) | |
tree | bf39d114556ef25e477ab4305cbc4c2bd95039f9 | |
parent | 0bf1984d2c9fb3a9dc73303551c18906c3c9482b (diff) | |
download | minetest-8aaae7db05917dbbedebbd1b5616db976dfc2e8e.tar.gz minetest-8aaae7db05917dbbedebbd1b5616db976dfc2e8e.tar.bz2 minetest-8aaae7db05917dbbedebbd1b5616db976dfc2e8e.zip |
Mapnode: Replace rotateAlongYAxis with improved version
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
-rw-r--r-- | src/mapnode.cpp | 30 | ||||
-rw-r--r-- | src/mapnode.h | 1 | ||||
-rw-r--r-- | src/mg_schematic.cpp | 2 |
3 files changed, 6 insertions, 27 deletions
diff --git a/src/mapnode.cpp b/src/mapnode.cpp index 64c0ea03f..671e949f1 100644 --- a/src/mapnode.cpp +++ b/src/mapnode.cpp @@ -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) diff --git a/src/mapnode.h b/src/mapnode.h index 271517391..7cc25c60c 100644 --- a/src/mapnode.h +++ b/src/mapnode.h @@ -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)) diff --git a/src/mg_schematic.cpp b/src/mg_schematic.cpp index ca915b7b6..a5ffb20b8 100644 --- a/src/mg_schematic.cpp +++ b/src/mg_schematic.cpp @@ -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++; |