Skip to content

Commit

Permalink
Mapnode: Add rotateAlongYAxisFull supporting 24 facedirs
Browse files Browse the repository at this point in the history
  • Loading branch information
paramat committed Sep 22, 2015
1 parent 1adc7bf commit a56aedb
Show file tree
Hide file tree
Showing 3 changed files with 57 additions and 2 deletions.
56 changes: 55 additions & 1 deletion src/mapnode.cpp
Expand Up @@ -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) {
Expand All @@ -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)
{
Expand Down
1 change: 1 addition & 0 deletions src/mapnode.h
Expand Up @@ -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))
Expand Down
2 changes: 1 addition & 1 deletion src/mg_schematic.cpp
Expand Up @@ -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++;
Expand Down

0 comments on commit a56aedb

Please sign in to comment.