aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/mapnode.cpp56
-rw-r--r--src/mapnode.h1
-rw-r--r--src/mg_schematic.cpp2
3 files changed, 57 insertions, 2 deletions
diff --git a/src/mapnode.cpp b/src/mapnode.cpp
index 732237833..64c0ea03f 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<aabb3f> transformNodeBox(const MapNode &n,
const NodeBox &nodebox, INodeDefManager *nodemgr)
{
diff --git a/src/mapnode.h b/src/mapnode.h
index 7cc25c60c..271517391 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 a5ffb20b8..ca915b7b6 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++;