From ce955f37ba9f431122ca3c46e5a7dac63ffd65ea Mon Sep 17 00:00:00 2001 From: kwolekr Date: Mon, 8 Jul 2013 15:19:22 -0400 Subject: [PATCH] Decoration: Handle facedir and wallmounted param2types with schematic rotation --- src/mapgen.cpp | 9 +++++++-- src/mapgen.h | 14 ++++---------- src/mapnode.cpp | 26 ++++++++++++++++++++++++++ src/mapnode.h | 13 +++++++++++++ 4 files changed, 50 insertions(+), 12 deletions(-) diff --git a/src/mapgen.cpp b/src/mapgen.cpp index fe1cfb3a4..6bc487331 100644 --- a/src/mapgen.cpp +++ b/src/mapgen.cpp @@ -237,6 +237,8 @@ Decoration::~Decoration() { void Decoration::resolveNodeNames(INodeDefManager *ndef) { + this->ndef = ndef; + if (c_place_on == CONTENT_IGNORE) c_place_on = ndef->getId(place_on_name); } @@ -553,7 +555,7 @@ std::string DecoSchematic::getName() { void DecoSchematic::blitToVManip(v3s16 p, ManualMapVoxelManipulator *vm, - int rot, bool force_placement) { + Rotation rot, bool force_placement) { int xstride = 1; int ystride = size.X; int zstride = size.X * size.Y; @@ -594,7 +596,7 @@ void DecoSchematic::blitToVManip(v3s16 p, ManualMapVoxelManipulator *vm, u32 vi = vm->m_area.index(p.X + x, p.Y + y, p.Z + z); if (!vm->m_area.contains(vi)) continue; - + if (schematic[i].getContent() == CONTENT_IGNORE) continue; @@ -609,6 +611,9 @@ void DecoSchematic::blitToVManip(v3s16 p, ManualMapVoxelManipulator *vm, vm->m_data[vi] = schematic[i]; vm->m_data[vi].param1 = 0; + + if (rot) + vm->m_data[vi].rotateAlongYAxis(ndef, rot); } } } diff --git a/src/mapgen.h b/src/mapgen.h index 2287445ee..b167978d7 100644 --- a/src/mapgen.h +++ b/src/mapgen.h @@ -23,6 +23,7 @@ with this program; if not, write to the Free Software Foundation, Inc., #include "irrlichttypes_extrabloated.h" #include "util/container.h" // UniqueQueue #include "gamedef.h" +#include "nodedef.h" #include "mapnode.h" #include "noise.h" #include "settings.h" @@ -63,7 +64,6 @@ class EmergeManager; class MapBlock; class ManualMapVoxelManipulator; class VoxelManipulator; -class INodeDefManager; struct BlockMakeData; class VoxelArea; class Map; @@ -216,6 +216,8 @@ struct CutoffData { class Decoration { public: + INodeDefManager *ndef; + int mapseed; std::string place_on_name; content_t c_place_on; @@ -262,14 +264,6 @@ public: #define MTSCHEM_FILE_SIGNATURE 0x4d54534d // 'MTSM' -enum Rotation { - ROTATE_0, - ROTATE_90, - ROTATE_180, - ROTATE_270, - ROTATE_RAND, -}; - class DecoSchematic : public Decoration { public: std::string filename; @@ -291,7 +285,7 @@ public: virtual std::string getName(); void blitToVManip(v3s16 p, ManualMapVoxelManipulator *vm, - int rot, bool force_placement); + Rotation rot, bool force_placement); bool loadSchematicFile(); void saveSchematicFile(INodeDefManager *ndef); diff --git a/src/mapnode.cpp b/src/mapnode.cpp index bba845fcc..388818c42 100644 --- a/src/mapnode.cpp +++ b/src/mapnode.cpp @@ -28,6 +28,14 @@ with this program; if not, write to the Free Software Foundation, Inc., #include #include +static const Rotation wallmounted_to_rot[] = { + ROTATE_0, ROTATE_180, ROTATE_90, ROTATE_270 +}; +static const u8 rot_to_wallmounted[] = { + 2, 4, 3, 5 +}; + + /* MapNode */ @@ -132,6 +140,24 @@ v3s16 MapNode::getWallMountedDir(INodeDefManager *nodemgr) const } } +void MapNode::rotateAlongYAxis(INodeDefManager *nodemgr, Rotation rot) { + ContentParamType2 cpt2 = nodemgr->get(*this).param_type_2; + + if (cpt2 == CPT2_FACEDIR) { + 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]; + } +} + static std::vector transformNodeBox(const MapNode &n, const NodeBox &nodebox, INodeDefManager *nodemgr) { diff --git a/src/mapnode.h b/src/mapnode.h index 1c8c5c49c..60211b87c 100644 --- a/src/mapnode.h +++ b/src/mapnode.h @@ -61,6 +61,17 @@ enum LightBank LIGHTBANK_NIGHT }; +/* + Simple rotation enum. +*/ +enum Rotation { + ROTATE_0, + ROTATE_90, + ROTATE_180, + ROTATE_270, + ROTATE_RAND, +}; + /* Masks for MapNode.param2 of flowing liquids */ @@ -181,6 +192,8 @@ struct MapNode u8 getFaceDir(INodeDefManager *nodemgr) const; u8 getWallMounted(INodeDefManager *nodemgr) const; v3s16 getWallMountedDir(INodeDefManager *nodemgr) const; + + void rotateAlongYAxis(INodeDefManager *nodemgr, Rotation rot); /* Gets list of node boxes (used for rendering (NDT_NODEBOX)