diff options
| author | Egor Yusov <egor.yusov@gmail.com> | 2019-07-21 16:36:39 +0000 |
|---|---|---|
| committer | Egor Yusov <egor.yusov@gmail.com> | 2019-07-21 16:36:39 +0000 |
| commit | 67a167f237c3fbbffd82efb27b423b44c24404a6 (patch) | |
| tree | d85a6060285a535799bd95997f39b6e1e757d417 /Common/interface | |
| parent | Fixed formatting (diff) | |
| download | DiligentCore-67a167f237c3fbbffd82efb27b423b44c24404a6.tar.gz DiligentCore-67a167f237c3fbbffd82efb27b423b44c24404a6.zip | |
Math lib: updated visibility test functions
Diffstat (limited to 'Common/interface')
| -rw-r--r-- | Common/interface/AdvancedMath.h | 32 |
1 files changed, 11 insertions, 21 deletions
diff --git a/Common/interface/AdvancedMath.h b/Common/interface/AdvancedMath.h index 8ebf5e40..e610256f 100644 --- a/Common/interface/AdvancedMath.h +++ b/Common/interface/AdvancedMath.h @@ -171,7 +171,6 @@ enum class BoxVisibility FullyVisible }; -template<bool TestFullVisibility> inline BoxVisibility GetBoxVisibilityAgainstPlane(const Plane3D& Plane, const BoundBox &Box) { const float3& Normal = Plane.Normal; @@ -181,31 +180,23 @@ inline BoxVisibility GetBoxVisibilityAgainstPlane(const Plane3D& Plane, const Bo (Normal.y > 0) ? Box.Max.y : Box.Min.y, (Normal.z > 0) ? Box.Max.z : Box.Min.z ); - float DMax = dot( MaxPoint, Normal ) + Plane.Distance; - if( DMax < 0 ) return BoxVisibility::Invisible; - if (TestFullVisibility) - { - float3 MinPoint( - (Normal.x > 0) ? Box.Min.x : Box.Max.x, - (Normal.y > 0) ? Box.Min.y : Box.Max.y, - (Normal.z > 0) ? Box.Min.z : Box.Max.z - ); - - float DMin = dot(MinPoint, Normal) + Plane.Distance; - - if (DMin > 0) - return BoxVisibility::FullyVisible; - } + float3 MinPoint( + (Normal.x > 0) ? Box.Min.x : Box.Max.x, + (Normal.y > 0) ? Box.Min.y : Box.Max.y, + (Normal.z > 0) ? Box.Min.z : Box.Max.z + ); + float DMin = dot(MinPoint, Normal) + Plane.Distance; + if (DMin > 0) + return BoxVisibility::FullyVisible; return BoxVisibility::Intersecting; } // Tests if bounding box is visible by the camera -template<bool TestFullVisibility> inline BoxVisibility GetBoxVisibility(const ViewFrustum &ViewFrustum, const BoundBox &Box) { const Plane3D *pPlanes = reinterpret_cast<const Plane3D*>(&ViewFrustum); @@ -214,7 +205,7 @@ inline BoxVisibility GetBoxVisibility(const ViewFrustum &ViewFrustum, const Boun for(int iViewFrustumPlane = 0; iViewFrustumPlane < 6; iViewFrustumPlane++) { const Plane3D &CurrPlane = pPlanes[iViewFrustumPlane]; - auto VisibilityAgainstPlane = GetBoxVisibilityAgainstPlane<TestFullVisibility>(CurrPlane, Box); + auto VisibilityAgainstPlane = GetBoxVisibilityAgainstPlane(CurrPlane, Box); // If bounding box is "behind" one of the planes, it is definitely invisible if (VisibilityAgainstPlane == BoxVisibility::Invisible) @@ -225,13 +216,12 @@ inline BoxVisibility GetBoxVisibility(const ViewFrustum &ViewFrustum, const Boun ++NumPlanesInside; } - return (TestFullVisibility && NumPlanesInside == 6) ? BoxVisibility::FullyVisible : BoxVisibility::Intersecting; + return (NumPlanesInside == 6) ? BoxVisibility::FullyVisible : BoxVisibility::Intersecting; } -template<bool TestFullVisibility> inline BoxVisibility GetBoxVisibility(const ViewFrustumExt &ViewFrustumExt, const BoundBox &Box) { - auto Visibility = GetBoxVisibility<TestFullVisibility>(static_cast<const ViewFrustum&>(ViewFrustumExt), Box); + auto Visibility = GetBoxVisibility(static_cast<const ViewFrustum&>(ViewFrustumExt), Box); if (Visibility == BoxVisibility::FullyVisible || Visibility == BoxVisibility::Invisible) return Visibility; |
