diff --git a/Source/Engine/Core/Math/BoundingFrustum.cpp b/Source/Engine/Core/Math/BoundingFrustum.cpp index 88f35b8ca..11601d8e5 100644 --- a/Source/Engine/Core/Math/BoundingFrustum.cpp +++ b/Source/Engine/Core/Math/BoundingFrustum.cpp @@ -178,3 +178,14 @@ ContainmentType BoundingFrustum::Contains(const BoundingSphere& sphere) const return ContainmentType::Contains; } } + +bool BoundingFrustum::Intersects(const BoundingSphere& sphere) const +{ + for (int32 i = 0; i < 6; i++) + { + const Real distance = Vector3::Dot(_planes[i].Normal, sphere.Center) + _planes[i].D; + if (distance < -sphere.Radius) + return false; + } + return true; +} diff --git a/Source/Engine/Core/Math/BoundingFrustum.h b/Source/Engine/Core/Math/BoundingFrustum.h index 2ceed02ab..693db318e 100644 --- a/Source/Engine/Core/Math/BoundingFrustum.h +++ b/Source/Engine/Core/Math/BoundingFrustum.h @@ -235,10 +235,7 @@ public: /// /// The sphere. /// True if the current BoundingFrustum intersects a BoundingSphere, otherwise false. - FORCE_INLINE bool Intersects(const BoundingSphere& sphere) const - { - return Contains(sphere) != ContainmentType::Disjoint; - } + bool Intersects(const BoundingSphere& sphere) const; /// /// Checks whether the current BoundingFrustum intersects a BoundingBox. diff --git a/Source/Engine/Core/Math/Vector3.cs b/Source/Engine/Core/Math/Vector3.cs index 1bf05ee8c..cb967f3f4 100644 --- a/Source/Engine/Core/Math/Vector3.cs +++ b/Source/Engine/Core/Math/Vector3.cs @@ -907,6 +907,7 @@ namespace FlaxEngine /// First source vector. /// Second source vector. /// When the method completes, contains the dot product of the two vectors. + [MethodImpl(MethodImplOptions.AggressiveInlining)] public static void Dot(ref Vector3 left, ref Vector3 right, out Real result) { result = left.X * right.X + left.Y * right.Y + left.Z * right.Z; @@ -918,6 +919,7 @@ namespace FlaxEngine /// First source vector. /// Second source vector. /// The dot product of the two vectors. + [MethodImpl(MethodImplOptions.AggressiveInlining)] public static Real Dot(ref Vector3 left, ref Vector3 right) { return left.X * right.X + left.Y * right.Y + left.Z * right.Z; @@ -929,6 +931,7 @@ namespace FlaxEngine /// First source vector. /// Second source vector. /// The dot product of the two vectors. + [MethodImpl(MethodImplOptions.AggressiveInlining)] public static Real Dot(Vector3 left, Vector3 right) { return left.X * right.X + left.Y * right.Y + left.Z * right.Z; diff --git a/Source/Engine/Core/Math/Vector3.h b/Source/Engine/Core/Math/Vector3.h index d7390c499..179a4cbf7 100644 --- a/Source/Engine/Core/Math/Vector3.h +++ b/Source/Engine/Core/Math/Vector3.h @@ -622,7 +622,7 @@ public: } // dot product with another vector - static T Dot(const Vector3Base& a, const Vector3Base& b) + FORCE_INLINE static T Dot(const Vector3Base& a, const Vector3Base& b) { return a.X * b.X + a.Y * b.Y + a.Z * b.Z; }