From a56aedb4eae7d21864ab8dc56a82f644c4639f7a Mon Sep 17 00:00:00 2001 From: paramat Date: Mon, 21 Sep 2015 01:21:28 +0100 Subject: [PATCH] Mapnode: Add rotateAlongYAxisFull supporting 24 facedirs --- src/mapnode.cpp | 56 +++++++++++++++++++++++++++++++++++++++++++- src/mapnode.h | 1 + src/mg_schematic.cpp | 2 +- 3 files changed, 57 insertions(+), 2 deletions(-) diff --git a/src/mapnode.cpp b/src/mapnode.cpp index 73223783..64c0ea03 100644 --- a/src/mapnode.cpp +++ b/src/mapnode.cpp @@ -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 transformNodeBox(const MapNode &n, const NodeBox &nodebox, INodeDefManager *nodemgr) { diff --git a/src/mapnode.h b/src/mapnode.h index 7cc25c60..27151739 100644 --- a/src/mapnode.h +++ b/src/mapnode.h @@ -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)) diff --git a/src/mg_schematic.cpp b/src/mg_schematic.cpp index a5ffb20b..ca915b7b 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].rotateAlongYAxis(m_ndef, rot); + vm->m_data[vi].rotateAlongYAxisFull(m_ndef, rot); } } y_map++;