30#include <G3D/Vector3.h>
34int CHECK_TREE_PERIOD = 200;
118 return impl->contains(mdl);
128 impl->update(t_diff);
187 float distance = maxDist;
189 impl->intersectRay(ray, callback, distance, endPos);
198 float maxDist = (endPos - startPos).magnitude();
200 ASSERT(maxDist < std::numeric_limits<float>::max());
202 if (maxDist < 1e-10f)
204 resultHitPos = endPos;
207 G3D::Vector3 dir = (endPos - startPos)/maxDist;
208 G3D::Ray ray(startPos, dir);
209 float dist = maxDist;
212 resultHitPos = startPos + dir * dist;
215 if ((resultHitPos - startPos).magnitude() > -modifyDist)
216 resultHitPos += dir * modifyDist;
218 resultHitPos = startPos;
221 resultHitPos += dir * modifyDist;
227 resultHitPos = endPos;
235 float maxDist = (endPos - startPos).magnitude();
237 if (!G3D::fuzzyGt(maxDist, 0) )
240 G3D::Ray r(startPos, (endPos - startPos) / maxDist);
242 impl->intersectRay(r, callback, maxDist, endPos);
244 return !callback.
didHit();
249 G3D::Vector3 v(x, y, z);
250 G3D::Ray r(v, G3D::Vector3(0, 0, -1));
252 impl->intersectZAllignedRay(r, callback, maxSearchDist);
255 return v.z - maxSearchDist;
262 G3D::Vector3 v(x, y, z + 0.5f);
264 impl->intersectPoint(v, intersectionCallBack);
272 data.
liquidInfo.emplace(liquidType, liquidLevel);
RegularGrid2D< GameObjectModel, BIHWrap< GameObjectModel > > ParentTree
std::optional< T > Optional
Optional helper class to wrap optional values within.
bool contains(GameObjectModel const &) const
bool getIntersectionTime(G3D::Ray const &ray, G3D::Vector3 const &endPos, PhaseShift const &phaseShift, float &maxDist) const
bool isInLineOfSight(G3D::Vector3 const &startPos, G3D::Vector3 const &endPos, PhaseShift const &phaseShift) const
void insert(GameObjectModel const &)
bool getObjectHitPos(G3D::Vector3 const &startPos, G3D::Vector3 const &endPos, G3D::Vector3 &resultHitPos, float modifyDist, PhaseShift const &phaseShift) const
std::unique_ptr< DynTreeImpl > impl
std::span< GameObjectModel const *const > getModelsInGrid(uint32 gx, uint32 gy) const
float getHeight(float x, float y, float z, float maxSearchDist, PhaseShift const &phaseShift) const
bool getAreaAndLiquidData(float x, float y, float z, PhaseShift const &phaseShift, Optional< uint8 > reqLiquidType, VMAP::AreaAndLiquidData &data) const
void remove(GameObjectModel const &)
uint8 GetNameSetId() const
const G3D::AABox & getBounds() const
G3D::Vector3 const & GetPosition() const
bool GetLocationInfo(G3D::Vector3 const &point, VMAP::LocationInfo &info, PhaseShift const &phaseShift) const
bool GetLiquidLevel(G3D::Vector3 const &point, VMAP::LocationInfo &info, float &liqHeight) const
bool IsLosBlockingDisabled() const
bool IntersectRay(G3D::Ray const &ray, float &maxDist, bool stopAtFirstHit, PhaseShift const &phaseShift, VMAP::ModelIgnoreFlags ignoreFlags) const
void remove(T const &value)
void insert(T const &value)
uint32 GetLiquidType() const
uint32 GetMogpFlags() const
static VMapManager * createOrGetVMapManager()
void operator()(GameObjectModel const *g, G3D::AABox &out) const
static void getBounds(GameObjectModel const &g, G3D::AABox &out)
void insert(Model const &mdl)
TimeTracker rebalance_timer
void remove(Model const &mdl)
void update(uint32 difftime)
bool operator()(G3D::Ray const &r, GameObjectModel const &obj, float &distance)
PhaseShift const & _phaseShift
DynamicTreeIntersectionCallback(PhaseShift const &phaseShift)
VMAP::LocationInfo _locationInfo
DynamicTreeLocationInfoCallback(PhaseShift const &phaseShift)
void operator()(G3D::Vector3 const &p, GameObjectModel const &obj)
VMAP::LocationInfo & GetLocationInfo()
GameObjectModel const * GetHitModel() const
PhaseShift const & _phaseShift
GameObjectModel const * _hitModel
PhaseShift const & _phaseShift
DynamicTreeLosCallback(PhaseShift const &phaseShift)
bool operator()(G3D::Ray const &r, GameObjectModel const &obj, float &distance)
static void getPosition(GameObjectModel const &g, G3D::Vector3 &p)
Optional< AreaInfo > areaInfo
Optional< LiquidInfo > liquidInfo
GroupModel const * hitModel