aboutsummaryrefslogtreecommitdiff
path: root/src/common/Collision/DynamicTree.cpp
diff options
context:
space:
mode:
authorShauren <shauren.trinity@gmail.com>2024-07-17 00:21:03 +0200
committerOvahlord <dreadkiller@gmx.de>2024-07-18 22:37:10 +0200
commitd7a26b3897f30cb65ac49f74bfb29677def01057 (patch)
treeddbf120a9a1ff9bbd6a0900152a8ca09ff4c5b4f /src/common/Collision/DynamicTree.cpp
parente0adab82f8a64c9ab4ecf7377d606c7ab917130a (diff)
Core/GameObject: Implemented NotLOSBlocking door property
(cherry picked from commit 2756ca1c350a7545e3a9e848e9b4db9b904f3a14)
Diffstat (limited to 'src/common/Collision/DynamicTree.cpp')
-rw-r--r--src/common/Collision/DynamicTree.cpp22
1 files changed, 20 insertions, 2 deletions
diff --git a/src/common/Collision/DynamicTree.cpp b/src/common/Collision/DynamicTree.cpp
index c2d84e06864..dc21ebc44d8 100644
--- a/src/common/Collision/DynamicTree.cpp
+++ b/src/common/Collision/DynamicTree.cpp
@@ -143,7 +143,25 @@ struct DynamicTreeIntersectionCallback
bool operator()(G3D::Ray const& r, GameObjectModel const& obj, float& distance)
{
- _didHit = obj.intersectRay(r, distance, true, _phaseShift, VMAP::ModelIgnoreFlags::Nothing);
+ _didHit = obj.IntersectRay(r, distance, true, _phaseShift, VMAP::ModelIgnoreFlags::Nothing);
+ return _didHit;
+ }
+
+ bool didHit() const { return _didHit; }
+
+private:
+ bool _didHit;
+ PhaseShift const& _phaseShift;
+};
+
+struct DynamicTreeLosCallback
+{
+ DynamicTreeLosCallback(PhaseShift const& phaseShift) : _didHit(false), _phaseShift(phaseShift) { }
+
+ bool operator()(G3D::Ray const& r, GameObjectModel const& obj, float& distance)
+ {
+ if (!obj.IsLosBlockingDisabled())
+ _didHit = obj.IntersectRay(r, distance, true, _phaseShift, VMAP::ModelIgnoreFlags::Nothing);
return _didHit;
}
@@ -229,7 +247,7 @@ bool DynamicMapTree::isInLineOfSight(G3D::Vector3 const& startPos, G3D::Vector3
return true;
G3D::Ray r(startPos, (endPos - startPos) / maxDist);
- DynamicTreeIntersectionCallback callback(phaseShift);
+ DynamicTreeLosCallback callback(phaseShift);
impl->intersectRay(r, callback, maxDist, endPos);
return !callback.didHit();