This commit is contained in:
aozhiwei 2020-08-17 10:10:41 +08:00
parent 0ecb37d272
commit d8c3676876
4 changed files with 66 additions and 4 deletions

View File

@ -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
}

View File

@ -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<int, Entity*> uniid_hash_;

View File

@ -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;
}
}
}
}

View File

@ -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);
};