From 7ac31319846221186dcd4e2f7e093871c2d815d0 Mon Sep 17 00:00:00 2001 From: "madmaxoft@gmail.com" Date: Mon, 25 Mar 2013 20:14:36 +0000 Subject: [PATCH] BlockArea: Implemented rotation without meta manipulation git-svn-id: http://mc-server.googlecode.com/svn/trunk@1317 0a769ca7-a7f5-676a-18bf-c427514a06d6 --- MCServer/Plugins/Debuggers/Debuggers.lua | 12 ++++ source/BlockArea.cpp | 82 ++++++++++++++++++++++-- 2 files changed, 88 insertions(+), 6 deletions(-) diff --git a/MCServer/Plugins/Debuggers/Debuggers.lua b/MCServer/Plugins/Debuggers/Debuggers.lua index 74b91db97..588b9b407 100644 --- a/MCServer/Plugins/Debuggers/Debuggers.lua +++ b/MCServer/Plugins/Debuggers/Debuggers.lua @@ -92,6 +92,18 @@ function Initialize(Plugin) BA1:MirrorYZNoMeta(); BA1:SaveToSchematicFile("schematics/lt_YZ2.schematic"); end + + -- Debug block area rotation: + if (BA1:LoadFromSchematicFile("schematics/rot.schematic")) then + BA1:RotateCWNoMeta(); + BA1:SaveToSchematicFile("schematics/rot1.schematic"); + BA1:RotateCWNoMeta(); + BA1:SaveToSchematicFile("schematics/rot2.schematic"); + BA1:RotateCWNoMeta(); + BA1:SaveToSchematicFile("schematics/rot3.schematic"); + BA1:RotateCWNoMeta(); + BA1:SaveToSchematicFile("schematics/rot4.schematic"); + end return true end diff --git a/source/BlockArea.cpp b/source/BlockArea.cpp index 229098967..c037c1115 100644 --- a/source/BlockArea.cpp +++ b/source/BlockArea.cpp @@ -969,20 +969,90 @@ void cBlockArea::MirrorYZ(void) -void cBlockArea::RotateCWNoMeta(void) +void cBlockArea::RotateCCWNoMeta(void) { - ASSERT(!"Not implemented yet"); - // TODO + if (HasBlockTypes()) + { + BLOCKTYPE * NewTypes = new BLOCKTYPE[m_SizeX * m_SizeY * m_SizeZ]; + for (int x = 0; x < m_SizeX; x++) + { + int NewZ = m_SizeX - x - 1; + for (int z = 0; z < m_SizeZ; z++) + { + int NewX = z; + for (int y = 0; y < m_SizeY; y++) + { + NewTypes[NewX + NewZ * m_SizeX + y * m_SizeX * m_SizeZ] = m_BlockTypes[MakeIndex(x, y, z)]; + } // for y + } // for z + } // for x + std::swap(m_BlockTypes, NewTypes); + delete[] NewTypes; + } + if (HasBlockTypes()) + { + NIBBLETYPE * NewMetas = new NIBBLETYPE[m_SizeX * m_SizeY * m_SizeZ]; + for (int x = 0; x < m_SizeX; x++) + { + int NewZ = m_SizeX - x - 1; + for (int z = 0; z < m_SizeZ; z++) + { + int NewX = z; + for (int y = 0; y < m_SizeY; y++) + { + NewMetas[NewX + NewZ * m_SizeX + y * m_SizeX * m_SizeZ] = m_BlockMetas[MakeIndex(x, y, z)]; + } // for y + } // for z + } // for x + std::swap(m_BlockMetas, NewMetas); + delete[] NewMetas; + } + std::swap(m_SizeX, m_SizeZ); } -void cBlockArea::RotateCCWNoMeta(void) +void cBlockArea::RotateCWNoMeta(void) { - ASSERT(!"Not implemented yet"); - // TODO + if (HasBlockTypes()) + { + BLOCKTYPE * NewTypes = new BLOCKTYPE[m_SizeX * m_SizeY * m_SizeZ]; + for (int z = 0; z < m_SizeZ; z++) + { + int NewX = m_SizeZ - z - 1; + for (int x = 0; x < m_SizeX; x++) + { + int NewZ = x; + for (int y = 0; y < m_SizeY; y++) + { + NewTypes[NewX + NewZ * m_SizeX + y * m_SizeX * m_SizeZ] = m_BlockTypes[MakeIndex(x, y, z)]; + } // for y + } // for x + } // for z + std::swap(m_BlockTypes, NewTypes); + delete[] NewTypes; + } + if (HasBlockTypes()) + { + NIBBLETYPE * NewMetas = new NIBBLETYPE[m_SizeX * m_SizeY * m_SizeZ]; + for (int z = 0; z < m_SizeZ; z++) + { + int NewX = m_SizeZ - z - 1; + for (int x = 0; x < m_SizeX; x++) + { + int NewZ = x; + for (int y = 0; y < m_SizeY; y++) + { + NewMetas[NewX + NewZ * m_SizeX + y * m_SizeX * m_SizeZ] = m_BlockMetas[MakeIndex(x, y, z)]; + } // for y + } // for x + } // for z + std::swap(m_BlockMetas, NewMetas); + delete[] NewMetas; + } + std::swap(m_SizeX, m_SizeZ); }