#include "stdafx.h" #ifdef MAP_EDITOR #include "NaviMesh.h" #include "NaviMeshNode.h" #include "../Doing/DoingManager.h" #include "../Doing/NaviMeshBuilding.h" bool cNaviMesh::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; /// ½ÇÇà Á¤º¸¸¦ ¼öÁý cNaviMeshBuildingInfo info; info.mNodeArray.Resize( (yend - ybegin) * (xend - xbegin) ); /// ¹üÀ§ ³»ÀÇ ¸®ÇÁ ³ëµåµéÀ» ¹é¾÷ /// ¹é¾÷ÇÑ ¸®ÇÁ ³ëµå°¡ Çϳªµµ ¾øÀ¸¸é ¹Ù·Î ¸®ÅÏÇÑ´Ù. if( BackupBuilding( &info, xbegin, ybegin, xend, yend, pos, outerRadius ) == false ) { return false; } /// ¹üÀ§ ³»ÀÇ ¸®ÇÁ ³ëµåµé¿¡ ´ëÇØ Àû¿ë unsigned int nodeCount = mCellCount / cNaviMeshLeafNode::mCellCount; 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->PushNaviMeshBuilding( info ); mModified = true; return true; } bool cNaviMesh::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; /// ½ÇÇà Á¤º¸¸¦ ¼öÁý cNaviMeshBuildingInfo info; info.mNodeArray.Resize( (yend - ybegin) * (xend - xbegin) ); /// ¹üÀ§ ³»ÀÇ ¸®ÇÁ ³ëµåµéÀ» ¹é¾÷ /// ¹é¾÷ÇÑ ¸®ÇÁ ³ëµå°¡ Çϳªµµ ¾øÀ¸¸é ¹Ù·Î ¸®ÅÏÇÑ´Ù. if( BackupBuilding( &info, xbegin, ybegin, xend, yend, pos, outerRadius ) == false ) { return false; } /// ¹üÀ§ ³»ÀÇ ¸®ÇÁ ³ëµåµé¿¡ ´ëÇØ Àû¿ë unsigned int nodeCount = mCellCount / cNaviMeshLeafNode::mCellCount; 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->PushNaviMeshBuilding( info ); mModified = true; return true; } bool cNaviMesh::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; /// ½ÇÇà Á¤º¸¸¦ ¼öÁý cNaviMeshBuildingInfo info; info.mNodeArray.Resize( (yend - ybegin) * (xend - xbegin) ); /// ¹üÀ§ ³»ÀÇ ¸®ÇÁ ³ëµåµéÀ» ¹é¾÷ /// ¹é¾÷ÇÑ ¸®ÇÁ ³ëµå°¡ Çϳªµµ ¾øÀ¸¸é ¹Ù·Î ¸®ÅÏÇÑ´Ù. if( BackupBuilding( &info, xbegin, ybegin, xend, yend, pos, outerRadius ) == false ) { return false; } /// ¹üÀ§ ³»ÀÇ ¸®ÇÁ ³ëµåµé¿¡ ´ëÇØ Àû¿ë unsigned int nodeCount = mCellCount / cNaviMeshLeafNode::mCellCount; 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->PushNaviMeshBuilding( info ); mModified = true; return true; } bool cNaviMesh::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; /// ½ÇÇà Á¤º¸¸¦ ¼öÁý cNaviMeshBuildingInfo info; info.mNodeArray.Resize( (yend - ybegin) * (xend - xbegin) ); /// ¹üÀ§ ³»ÀÇ ¸®ÇÁ ³ëµåµéÀ» ¹é¾÷ /// ¹é¾÷ÇÑ ¸®ÇÁ ³ëµå°¡ Çϳªµµ ¾øÀ¸¸é ¹Ù·Î ¸®ÅÏÇÑ´Ù. if( BackupBuilding( &info, xbegin, ybegin, xend, yend, pos, outerRadius ) == false ) { return false; } /// ¹üÀ§ ³»ÀÇ ¸®ÇÁ ³ëµåµé¿¡ ´ëÇØ Àû¿ë unsigned int nodeCount = mCellCount / cNaviMeshLeafNode::mCellCount; 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->PushNaviMeshBuilding( info ); mModified = true; return true; } bool cNaviMesh::SyncToTerrain( const NiPoint3& pos, float innerRadius, float outerRadius ) { /// ¹üÀ§ °è»ê unsigned int xbegin, ybegin, xend, yend; if( CalcRange( &xbegin, &ybegin, &xend, ¥d, pos, outerRadius ) == false ) return false; /// ½ÇÇà Á¤º¸¸¦ ¼öÁý cNaviMeshBuildingInfo info; info.mNodeArray.Resize( (yend - ybegin) * (xend - xbegin) ); /// ¹üÀ§ ³»ÀÇ ¸®ÇÁ ³ëµåµéÀ» ¹é¾÷ /// ¹é¾÷ÇÑ ¸®ÇÁ ³ëµå°¡ Çϳªµµ ¾øÀ¸¸é ¹Ù·Î ¸®ÅÏÇÑ´Ù. if( BackupBuilding( &info, xbegin, ybegin, xend, yend, pos, outerRadius ) == false ) { return false; } /// ¹üÀ§ ³»ÀÇ ¸®ÇÁ ³ëµåµé¿¡ ´ëÇØ Àû¿ë unsigned int nodeCount = mCellCount / cNaviMeshLeafNode::mCellCount; for( unsigned int yi = ybegin, i = ybegin * nodeCount; yi < yend; ++yi, i += nodeCount ) { for( unsigned int xi = xbegin; xi < xend; ++xi ) { mNodeArray[i + xi]->SyncToTerrain( pos, innerRadius, outerRadius ); } } /// ¹üÀ§ ³»ÀÇ ¸®ÇÁ ³ëµåµéÀ» °»½Å UpdateBuilding( &info, xbegin, ybegin, xend, yend, pos, outerRadius ); /// ½ÇÇà Á¤º¸¸¦ Ãß°¡ DOINGMAN->PushNaviMeshBuilding( info ); mModified = true; return true; } bool cNaviMesh::SyncToObject( const NiPoint3& pos, float outerRadius ) { /// ¹üÀ§ °è»ê unsigned int xbegin, ybegin, xend, yend; if( CalcRange( &xbegin, &ybegin, &xend, ¥d, pos, outerRadius ) == false ) return false; /// ½ÇÇà Á¤º¸¸¦ ¼öÁý cNaviMeshBuildingInfo info; info.mNodeArray.Resize( (yend - ybegin) * (xend - xbegin) ); /// ¹üÀ§ ³»ÀÇ ¸®ÇÁ ³ëµåµéÀ» ¹é¾÷ /// ¹é¾÷ÇÑ ¸®ÇÁ ³ëµå°¡ Çϳªµµ ¾øÀ¸¸é ¹Ù·Î ¸®ÅÏÇÑ´Ù. if( BackupBuilding( &info, xbegin, ybegin, xend, yend, pos, outerRadius ) == false ) { return false; } /// ¹üÀ§ ³»ÀÇ ¸®ÇÁ ³ëµåµé¿¡ ´ëÇØ Àû¿ë unsigned int nodeCount = mCellCount / cNaviMeshLeafNode::mCellCount; for( unsigned int yi = ybegin, i = ybegin * nodeCount; yi < yend; ++yi, i += nodeCount ) { for( unsigned int xi = xbegin; xi < xend; ++xi ) { mNodeArray[i + xi]->SyncToObject( pos, outerRadius ); } } /// ¹üÀ§ ³»ÀÇ ¸®ÇÁ ³ëµåµéÀ» °»½Å UpdateBuilding( &info, xbegin, ybegin, xend, yend, pos, outerRadius ); /// ½ÇÇà Á¤º¸¸¦ Ãß°¡ DOINGMAN->PushNaviMeshBuilding( info ); mModified = true; return true; } bool cNaviMesh::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; /// ½ÇÇà Á¤º¸¸¦ ¼öÁý cNaviMeshBuildingInfo info; info.mNodeArray.Resize( (yend - ybegin) * (xend - xbegin) ); /// ¹üÀ§ ³»ÀÇ ¸®ÇÁ ³ëµåµéÀ» ¹é¾÷ /// ¹é¾÷ÇÑ ¸®ÇÁ ³ëµå°¡ Çϳªµµ ¾øÀ¸¸é ¹Ù·Î ¸®ÅÏÇÑ´Ù. if( BackupBuilding( &info, xbegin, ybegin, xend, yend, pos, outerRadius ) == false ) { return false; } /// ¹üÀ§ ³»ÀÇ ¸®ÇÁ ³ëµåµé¿¡ ´ëÇØ Àû¿ë unsigned int nodeCount = mCellCount / cNaviMeshLeafNode::mCellCount; 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->PushNaviMeshBuilding( info ); mModified = true; return true; } bool cNaviMesh::BackupBuilding( cNaviMeshBuildingInfo* info, unsigned int xbegin, unsigned int ybegin, unsigned int xend, unsigned int yend, const NiPoint3& pos, float outerRadius ) { assert( info ); cNaviMeshNodeBuildingInfo* n = &(info->mNodeArray[0]); unsigned int nodeCount = mCellCount / cNaviMeshLeafNode::mCellCount; 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 cNaviMesh::UpdateBuilding( cNaviMeshBuildingInfo* info, unsigned int xbegin, unsigned int ybegin, unsigned int xend, unsigned int yend, const NiPoint3& pos, float outerRadius ) { assert( info ); cNaviMeshNodeBuildingInfo* n = &(info->mNodeArray[0]); unsigned int nodeCount = mCellCount / cNaviMeshLeafNode::mCellCount; 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 ); } } } #endif /// MAP_EDITOR