#include "stdafx.h" #ifdef MAP_EDITOR #include "Terrain.h" #include "TerrainNode.h" #include "../Doing/DoingManager.h" #include "../Doing/TerrainBuilding.h" bool cTerrain::BackupBuilding( cTerrainBuildingInfo* info, unsigned int xbegin, unsigned int ybegin, unsigned int xend, unsigned int yend, const NiPoint3& pos, float outerRadius ) { assert( info ); cTerrainNodeBuildingInfo* n = &(info->mNodeArray[0]); unsigned int nodeCount = mCellCount / cTerrainLeafNode::mCellCount[0]; bool ret = false; for( unsigned int yi = ybegin, i = ybegin * nodeCount; yi < yend; ++yi, i += nodeCount ) { for( unsigned int xi = xbegin; xi < xend; ++xi, ++n ) { if( mNodeArray[i + xi]->BackupBuilding( n, pos, outerRadius ) ) { ret = true; } } } return ret; } void cTerrain::UpdateBuilding( cTerrainBuildingInfo* info, unsigned int xbegin, unsigned int ybegin, unsigned int xend, unsigned int yend, const NiPoint3& pos, float outerRadius ) { assert( info ); cTerrainNodeBuildingInfo* n = &(info->mNodeArray[0]); unsigned int nodeCount = mCellCount / cTerrainLeafNode::mCellCount[0]; for( unsigned int yi = ybegin, i = ybegin * nodeCount; yi < yend; ++yi, i += nodeCount ) { for( unsigned int xi = xbegin; xi < xend; ++xi, ++n ) { mNodeArray[i + xi]->UpdateBuilding( n, pos, outerRadius ); } } } bool cTerrain::Raise( const NiPoint3& pos, float innerRadius, float outerRadius, float strength ) { float maxValue = strength * (mMetersPerVertex * mUnitsPerMeter * 10); /// ¹üÀ§ °è»ê unsigned int xbegin, ybegin, xend, yend; if( CalcRange( &xbegin, &ybegin, &xend, ¥d, pos, outerRadius ) == false ) return false; /// ½ÇÇà Á¤º¸¸¦ ¼öÁý cTerrainBuildingInfo info; info.mNodeArray.Resize( (yend - ybegin) * (xend - xbegin) ); /// ¹üÀ§ ³»ÀÇ ¸®ÇÁ ³ëµåµéÀ» ¹é¾÷ /// ¹é¾÷ÇÑ ¸®ÇÁ ³ëµå°¡ Çϳªµµ ¾øÀ¸¸é ¹Ù·Î ¸®ÅÏÇÑ´Ù. if( BackupBuilding( &info, xbegin, ybegin, xend, yend, pos, outerRadius ) == false ) { return false; } /// ¹üÀ§ ³»ÀÇ ¸®ÇÁ ³ëµåµé¿¡ ´ëÇØ Àû¿ë unsigned int nodeCount = mCellCount / cTerrainLeafNode::mCellCount[0]; for( unsigned int yi = ybegin, i = ybegin * nodeCount; yi < yend; ++yi, i += nodeCount ) { for( unsigned int xi = xbegin; xi < xend; ++xi ) { mNodeArray[i + xi]->Raise( pos, innerRadius, outerRadius, maxValue ); } } /// ¹üÀ§ ³»ÀÇ ¸®ÇÁ ³ëµåµéÀ» °»½Å UpdateBuilding( &info, xbegin, ybegin, xend, yend, pos, outerRadius ); /// ½ÇÇà Á¤º¸¸¦ Ãß°¡ DOINGMAN->PushTerrainBuilding( info ); mModified = true; return true; } bool cTerrain::Lower( const NiPoint3& pos, float innerRadius, float outerRadius, float strength ) { float maxValue = strength * (mMetersPerVertex * mUnitsPerMeter * 10); /// ¹üÀ§ °è»ê unsigned int xbegin, ybegin, xend, yend; if( CalcRange( &xbegin, &ybegin, &xend, ¥d, pos, outerRadius ) == false ) return false; /// ½ÇÇà Á¤º¸¸¦ ¼öÁý cTerrainBuildingInfo info; info.mNodeArray.Resize( (yend - ybegin) * (xend - xbegin) ); /// ¹üÀ§ ³»ÀÇ ¸®ÇÁ ³ëµåµéÀ» ¹é¾÷ /// ¹é¾÷ÇÑ ¸®ÇÁ ³ëµå°¡ Çϳªµµ ¾øÀ¸¸é ¹Ù·Î ¸®ÅÏÇÑ´Ù. if( BackupBuilding( &info, xbegin, ybegin, xend, yend, pos, outerRadius ) == false ) { return false; } /// ¹üÀ§ ³»ÀÇ ¸®ÇÁ ³ëµåµé¿¡ ´ëÇØ Àû¿ë unsigned int nodeCount = mCellCount / cTerrainLeafNode::mCellCount[0]; for( unsigned int yi = ybegin, i = ybegin * nodeCount; yi < yend; ++yi, i += nodeCount ) { for( unsigned int xi = xbegin; xi < xend; ++xi ) { mNodeArray[i + xi]->Lower( pos, innerRadius, outerRadius, maxValue ); } } /// ¹üÀ§ ³»ÀÇ ¸®ÇÁ ³ëµåµéÀ» °»½Å UpdateBuilding( &info, xbegin, ybegin, xend, yend, pos, outerRadius ); /// ½ÇÇà Á¤º¸¸¦ Ãß°¡ DOINGMAN->PushTerrainBuilding( info ); mModified = true; return true; } bool cTerrain::Flatten( const NiPoint3& pos, float innerRadius, float outerRadius, float strength ) { float maxValue = strength * (mMetersPerVertex * mUnitsPerMeter * 10); /// ¹üÀ§ °è»ê unsigned int xbegin, ybegin, xend, yend; if( CalcRange( &xbegin, &ybegin, &xend, ¥d, pos, outerRadius ) == false ) return false; /// ½ÇÇà Á¤º¸¸¦ ¼öÁý cTerrainBuildingInfo info; info.mNodeArray.Resize( (yend - ybegin) * (xend - xbegin) ); /// ¹üÀ§ ³»ÀÇ ¸®ÇÁ ³ëµåµéÀ» ¹é¾÷ /// ¹é¾÷ÇÑ ¸®ÇÁ ³ëµå°¡ Çϳªµµ ¾øÀ¸¸é ¹Ù·Î ¸®ÅÏÇÑ´Ù. if( BackupBuilding( &info, xbegin, ybegin, xend, yend, pos, outerRadius ) == false ) { return false; } /// ¹üÀ§ ³»ÀÇ ¸®ÇÁ ³ëµåµé¿¡ ´ëÇØ Àû¿ë unsigned int nodeCount = mCellCount / cTerrainLeafNode::mCellCount[0]; for( unsigned int yi = ybegin, i = ybegin * nodeCount; yi < yend; ++yi, i += nodeCount ) { for( unsigned int xi = xbegin; xi < xend; ++xi ) { mNodeArray[i + xi]->Flatten( pos, innerRadius, outerRadius, maxValue ); } } /// ¹üÀ§ ³»ÀÇ ¸®ÇÁ ³ëµåµéÀ» °»½Å UpdateBuilding( &info, xbegin, ybegin, xend, yend, pos, outerRadius ); /// ½ÇÇà Á¤º¸¸¦ Ãß°¡ DOINGMAN->PushTerrainBuilding( info ); mModified = true; return true; } bool cTerrain::Smooth( const NiPoint3& pos, float outerRadius, float ratio ) { /// ¹üÀ§ °è»ê unsigned int xbegin, ybegin, xend, yend; if( CalcRange( &xbegin, &ybegin, &xend, ¥d, pos, outerRadius ) == false ) return false; /// ½ÇÇà Á¤º¸¸¦ ¼öÁý cTerrainBuildingInfo info; info.mNodeArray.Resize( (yend - ybegin) * (xend - xbegin) ); /// ¹üÀ§ ³»ÀÇ ¸®ÇÁ ³ëµåµéÀ» ¹é¾÷ /// ¹é¾÷ÇÑ ¸®ÇÁ ³ëµå°¡ Çϳªµµ ¾øÀ¸¸é ¹Ù·Î ¸®ÅÏÇÑ´Ù. if( BackupBuilding( &info, xbegin, ybegin, xend, yend, pos, outerRadius ) == false ) { return false; } /// ¹üÀ§ ³»ÀÇ ¸®ÇÁ ³ëµåµé¿¡ ´ëÇØ Àû¿ë unsigned int nodeCount = mCellCount / cTerrainLeafNode::mCellCount[0]; for( unsigned int yi = ybegin, i = ybegin * nodeCount; yi < yend; ++yi, i += nodeCount ) { for( unsigned int xi = xbegin; xi < xend; ++xi ) { mNodeArray[i + xi]->Smooth( pos, outerRadius, ratio ); } } /// ¹üÀ§ ³»ÀÇ ¸®ÇÁ ³ëµåµéÀ» °»½Å UpdateBuilding( &info, xbegin, ybegin, xend, yend, pos, outerRadius ); /// ½ÇÇà Á¤º¸¸¦ Ãß°¡ DOINGMAN->PushTerrainBuilding( info ); mModified = true; return true; } bool cTerrain::SyncToNaviMesh( const NiPoint3& pos, float innerRadius, float outerRadius ) { /// ¹üÀ§ °è»ê unsigned int xbegin, ybegin, xend, yend; if( CalcRange( &xbegin, &ybegin, &xend, ¥d, pos, outerRadius ) == false ) return false; /// ½ÇÇà Á¤º¸¸¦ ¼öÁý cTerrainBuildingInfo info; info.mNodeArray.Resize( (yend - ybegin) * (xend - xbegin) ); /// ¹üÀ§ ³»ÀÇ ¸®ÇÁ ³ëµåµéÀ» ¹é¾÷ /// ¹é¾÷ÇÑ ¸®ÇÁ ³ëµå°¡ Çϳªµµ ¾øÀ¸¸é ¹Ù·Î ¸®ÅÏÇÑ´Ù. if( BackupBuilding( &info, xbegin, ybegin, xend, yend, pos, outerRadius ) == false ) { return false; } /// ¹üÀ§ ³»ÀÇ ¸®ÇÁ ³ëµåµé¿¡ ´ëÇØ Àû¿ë unsigned int nodeCount = mCellCount / cTerrainLeafNode::mCellCount[0]; for( unsigned int yi = ybegin, i = ybegin * nodeCount; yi < yend; ++yi, i += nodeCount ) { for( unsigned int xi = xbegin; xi < xend; ++xi ) { mNodeArray[i + xi]->SyncToNaviMesh( pos, innerRadius, outerRadius ); } } /// ¹üÀ§ ³»ÀÇ ¸®ÇÁ ³ëµåµéÀ» °»½Å UpdateBuilding( &info, xbegin, ybegin, xend, yend, pos, outerRadius ); /// ½ÇÇà Á¤º¸¸¦ Ãß°¡ DOINGMAN->PushTerrainBuilding( info ); mModified = true; return true; } bool cTerrain::SyncToPickHeight( const NiPoint3& pos, float innerRadius, float outerRadius, float z ) { /// ¹üÀ§ °è»ê unsigned int xbegin, ybegin, xend, yend; if( CalcRange( &xbegin, &ybegin, &xend, ¥d, pos, outerRadius ) == false ) return false; /// ½ÇÇà Á¤º¸¸¦ ¼öÁý cTerrainBuildingInfo info; info.mNodeArray.Resize( (yend - ybegin) * (xend - xbegin) ); /// ¹üÀ§ ³»ÀÇ ¸®ÇÁ ³ëµåµéÀ» ¹é¾÷ /// ¹é¾÷ÇÑ ¸®ÇÁ ³ëµå°¡ Çϳªµµ ¾øÀ¸¸é ¹Ù·Î ¸®ÅÏÇÑ´Ù. if( BackupBuilding( &info, xbegin, ybegin, xend, yend, pos, outerRadius ) == false ) { return false; } /// ¹üÀ§ ³»ÀÇ ¸®ÇÁ ³ëµåµé¿¡ ´ëÇØ Àû¿ë unsigned int nodeCount = mCellCount / cTerrainLeafNode::mCellCount[0]; for( unsigned int yi = ybegin, i = ybegin * nodeCount; yi < yend; ++yi, i += nodeCount ) { for( unsigned int xi = xbegin; xi < xend; ++xi ) { mNodeArray[i + xi]->SyncToPickHeight( pos, innerRadius, outerRadius, z ); } } /// ¹üÀ§ ³»ÀÇ ¸®ÇÁ ³ëµåµéÀ» °»½Å UpdateBuilding( &info, xbegin, ybegin, xend, yend, pos, outerRadius ); /// ½ÇÇà Á¤º¸¸¦ Ãß°¡ DOINGMAN->PushTerrainBuilding( info ); mModified = true; return true; } #endif /// MAP_EDITOR