diff --git a/server/gameserver/mapinstance.cc b/server/gameserver/mapinstance.cc index d0c56be..7e80009 100644 --- a/server/gameserver/mapinstance.cc +++ b/server/gameserver/mapinstance.cc @@ -66,7 +66,7 @@ void MapInstance::Init() NavMeshHelper::OutputObjFile(this); #endif #ifdef FIND_PATH_TEST - navmesh_ = NavMeshBuilder::Instance()->Build(this); + NavMeshBuilder::Instance()->Build(this); map_service_->SetNavMesh(navmesh_); #endif } diff --git a/server/gameserver/mapinstance.h b/server/gameserver/mapinstance.h index 87f627f..725685e 100644 --- a/server/gameserver/mapinstance.h +++ b/server/gameserver/mapinstance.h @@ -7,6 +7,7 @@ namespace MetaData } class dtNavMesh; +class dtTileCache; class Entity; class Obstacle; class Building; @@ -34,6 +35,7 @@ class MapInstance int AllocUniid(); private: + dtTileCache* tile_cache_ = nullptr; dtNavMesh* navmesh_ = nullptr; int current_uniid_ = 0; std::map uniid_hash_; diff --git a/server/gameserver/navmeshbuilder.cc b/server/gameserver/navmeshbuilder.cc index 0d0e96d..28547fc 100644 --- a/server/gameserver/navmeshbuilder.cc +++ b/server/gameserver/navmeshbuilder.cc @@ -20,14 +20,14 @@ void NavMeshBuilder::UnInit() } -dtNavMesh* NavMeshBuilder::Build(MapInstance* map_instance) +void NavMeshBuilder::Build(MapInstance* map_instance) { BuilderParams builder_params; InitBuilderParams(builder_params); CreateTileCache(builder_params); CreateNavMesh(builder_params); BuildTiles(builder_params); - return builder_params.navmesh; + BuildMapObstalce(builder_params); } void NavMeshBuilder::InitBuilderParams(BuilderParams& builder_params) @@ -359,3 +359,62 @@ bool NavMeshBuilder::CreateNavMesh(BuilderParams& builder_params) } return true; } + +void NavMeshBuilder::BuildMapObstalce(BuilderParams& builder_params) +{ + dtTileCache* tile_cache = builder_params.tile_cache; + for (auto& pair : builder_params.map_instance->uniid_hash_) { + for (ColliderComponent* collider : *pair.second->GetColliders()) { + switch (collider->type) { + case CT_Aabb: + { + AabbCollider* aabb = (AabbCollider*)collider; + + float bmin[3] = {0}; + bmin[0] = (aabb->owner->GetPos() + aabb->_min).x; + bmin[1] = 0; + bmin[2] = (aabb->owner->GetPos() + aabb->_min).y; + + float bmax[3] = {0}; + bmax[0] = (aabb->owner->GetPos() + aabb->_max).x; + bmax[1] = 0; + bmax[2] = (aabb->owner->GetPos() + aabb->_max).y; + + dtObstacleRef ref; + dtStatus status = tile_cache->addBoxObstacle(bmin, + bmax, + &ref + ); + if (status != DT_SUCCESS) { + abort(); + } + } + break; + case CT_Circle: + { + CircleCollider* circle = (CircleCollider*)collider; + + float pos[3] = {0}; + pos[0] = (circle->owner->GetPos() + circle->pos).x; + pos[1] = 0; + pos[2] = (circle->owner->GetPos() + circle->pos).y; + + dtObstacleRef ref; + dtStatus status = tile_cache->addObstacle(pos, + circle->rad, + 0, + &ref + ); + if (status != DT_SUCCESS) { + abort(); + } + } + break; + default: + { + } + break; + } + } + } +} diff --git a/server/gameserver/navmeshbuilder.h b/server/gameserver/navmeshbuilder.h index 572f495..500acad 100644 --- a/server/gameserver/navmeshbuilder.h +++ b/server/gameserver/navmeshbuilder.h @@ -17,7 +17,7 @@ public: void Init(); void UnInit(); - dtNavMesh* Build(MapInstance* map_instance); + void Build(MapInstance* map_instance); private: void InitBuilderParams(BuilderParams& builder_params); @@ -32,4 +32,5 @@ public: const int maxTiles); bool CreateTileCache(BuilderParams& builder_params); bool CreateNavMesh(BuilderParams& builder_params); + void BuildMapObstalce(BuilderParams& builder_params); };