#include "precompile.h" #include "navigation_handle.h" namespace f8 { int NavMeshLayer::FindStraightPath(const a8::Vec3& start, const a8::Vec3& end, std::vector& path_list) { return 0; } int NavMeshLayer::FindRandomPointAroundCircle(const a8::Vec3& center_pos, std::vector& points, int max_points, float max_radius) { return 0; } int NavMeshLayer::Raycast(const a8::Vec3& start, const a8::Vec3& end, std::vector& hit_points) { return 0; } bool NavMeshLayer::AddObstacle(a8::Vec3& pos, const float radius, const float height, ObstacleRef* obstacle_ref) { if (obstacle_ref) { *obstacle_ref = 0; } float p[3]; p[0] = pos.x; p[1] = pos.y; p[2] = pos.z; dtStatus status = tile_cache_->addObstacle(p, radius, height, obstacle_ref); return status == DT_SUCCESS || status == DT_IN_PROGRESS; } bool NavMeshLayer::AddBoxObstacle(a8::Vec3& bmin, a8::Vec3& bmax, ObstacleRef* obstacle_ref) { if (obstacle_ref) { *obstacle_ref = 0; } float pmin[3]; pmin[0] = bmin.x; pmin[1] = bmin.y; pmin[2] = bmin.z; float pmax[3]; pmax[0] = bmax.x; pmax[1] = bmax.y; pmax[2] = bmax.z; dtStatus status = tile_cache_->addBoxObstacle(pmin, pmax, obstacle_ref); return status == DT_SUCCESS || status == DT_IN_PROGRESS; } bool NavMeshLayer::RemoveObstacle(const ObstacleRef& obstacle_ref) { dtStatus status = tile_cache_->removeObstacle(obstacle_ref); return status == DT_SUCCESS || status == DT_IN_PROGRESS; } void NavMeshLayer::WaitRebuildOk() { while (!Update()) {} } bool NavMeshLayer::Update() { bool up_to_date = false; tile_cache_->update(0, navmesh_, &up_to_date); return up_to_date; } NavMeshLayer* NavigationHandle::GetLayer(int layer) { auto itr = navmesh_layers_.find(layer); return itr != navmesh_layers_.end() ? &itr->second : nullptr; } void NavigationHandle::WaitRebuildOk() { for (auto& pair : navmesh_layers_) { pair.second.WaitRebuildOk(); } } bool NavigationHandle::Update() { bool up_to_date = true; for (auto& pair : navmesh_layers_) { if (!pair.second.Update() && up_to_date) { up_to_date = false; } } return up_to_date; } }