aboutsummaryrefslogtreecommitdiff
path: root/src/server/collision/DynamicTree.cpp
diff options
context:
space:
mode:
authorSubv <s.v.h21@hotmail.com>2012-02-11 19:23:18 -0500
committerSubv <s.v.h21@hotmail.com>2012-02-11 19:23:18 -0500
commitff9830c18d86889207198db2658eaa4ac9c119d4 (patch)
tree02986f982b6bed31c05755f42e53e67b555fd770 /src/server/collision/DynamicTree.cpp
parent1fc3470233f0073a7839b6776d77685b96faebb6 (diff)
Core/Spells: Blink wont be able to trespass solid objects anymore (walls/doors)
Refactored some code Signed-off-by: Subv <s.v.h21@hotmail.com>
Diffstat (limited to 'src/server/collision/DynamicTree.cpp')
-rw-r--r--src/server/collision/DynamicTree.cpp48
1 files changed, 48 insertions, 0 deletions
diff --git a/src/server/collision/DynamicTree.cpp b/src/server/collision/DynamicTree.cpp
index 1d6877d1209..89e76d426fe 100644
--- a/src/server/collision/DynamicTree.cpp
+++ b/src/server/collision/DynamicTree.cpp
@@ -176,6 +176,54 @@ struct DynamicTreeIntersectionCallback_WithLogger
bool didHit() const { return did_hit;}
};
+bool DynamicMapTree::getIntersectionTime(const uint32 phasemask, const G3D::Ray& ray, const Vector3& endPos, float& maxDist) const
+{
+ float distance = maxDist;
+ DynamicTreeIntersectionCallback callback(phasemask);
+ impl.intersectRay(ray, callback, distance, endPos);
+ if (callback.didHit())
+ maxDist = distance;
+ return callback.didHit();
+}
+
+bool DynamicMapTree::getObjectHitPos(const uint32 phasemask, const Vector3& startPos, const Vector3& endPos, Vector3& resultHit, float modifyDist) const
+{
+ bool result = false;
+ float maxDist = (endPos - startPos).magnitude();
+ // valid map coords should *never ever* produce float overflow, but this would produce NaNs too
+ ASSERT(maxDist < std::numeric_limits<float>::max());
+ // prevent NaN values which can cause BIH intersection to enter infinite loop
+ if (maxDist < 1e-10f)
+ {
+ resultHit = endPos;
+ return false;
+ }
+ Vector3 dir = (endPos - startPos)/maxDist; // direction with length of 1
+ G3D::Ray ray(startPos, dir);
+ float dist = maxDist;
+ if (getIntersectionTime(phasemask, ray, endPos, dist))
+ {
+ resultHit = startPos + dir * dist;
+ if (modifyDist < 0)
+ {
+ if ((resultHit - startPos).magnitude() > -modifyDist)
+ resultHit = resultHit + dir*modifyDist;
+ else
+ resultHit = startPos;
+ }
+ else
+ resultHit = resultHit + dir*modifyDist;
+
+ result = true;
+ }
+ else
+ {
+ resultHit = endPos;
+ result = false;
+ }
+ return result;
+}
+
bool DynamicMapTree::isInLineOfSight(float x1, float y1, float z1, float x2, float y2, float z2, uint32 phasemask) const
{
Vector3 v1(x1,y1,z1), v2(x2,y2,z2);