SSurface: Make IntersectsRay() a const member function

This commit is contained in:
Lioncash 2020-06-21 19:44:22 -04:00
parent 5b0ae09cf3
commit 2b7513b156
6 changed files with 25 additions and 25 deletions

View File

@ -3,7 +3,7 @@
#include "Core/CRayCollisionTester.h"
#include <Common/Math/MathUtil.h>
std::pair<bool,float> SSurface::IntersectsRay(const CRay& rkRay, bool AllowBackfaces, float LineThreshold)
std::pair<bool,float> SSurface::IntersectsRay(const CRay& rkRay, bool AllowBackfaces, float LineThreshold) const
{
bool Hit = false;
float HitDist = 0.0f;

View File

@ -32,7 +32,7 @@ struct SSurface
SSurface() = default;
std::pair<bool,float> IntersectsRay(const CRay& rkRay, bool AllowBackfaces = false, float LineThreshold = 0.02f);
std::pair<bool,float> IntersectsRay(const CRay& rkRay, bool AllowBackfaces = false, float LineThreshold = 0.02f) const;
};
#endif // SSURFACE_H

View File

@ -132,7 +132,7 @@ void CModelNode::RayAABoxIntersectTest(CRayCollisionTester& rTester, const SView
return;
const CRay& rkRay = rTester.Ray();
std::pair<bool,float> BoxResult = AABox().IntersectsRay(rkRay);
const std::pair<bool, float> BoxResult = AABox().IntersectsRay(rkRay);
if (BoxResult.first)
rTester.AddNodeModel(this, mpModel);
@ -144,16 +144,16 @@ SRayIntersection CModelNode::RayNodeIntersectTest(const CRay& rkRay, uint32 Asse
Out.pNode = this;
Out.ComponentIndex = AssetID;
CRay TransformedRay = rkRay.Transformed(Transform().Inverse());
FRenderOptions Options = rkViewInfo.pRenderer->RenderOptions();
std::pair<bool,float> Result = mpModel->GetSurface(AssetID)->IntersectsRay(TransformedRay, ((Options & ERenderOption::EnableBackfaceCull) == 0));
const CRay TransformedRay = rkRay.Transformed(Transform().Inverse());
const FRenderOptions Options = rkViewInfo.pRenderer->RenderOptions();
const auto [intersects, distance] = mpModel->GetSurface(AssetID)->IntersectsRay(TransformedRay, ((Options & ERenderOption::EnableBackfaceCull) == 0));
if (Result.first)
if (intersects)
{
Out.Hit = true;
CVector3f HitPoint = TransformedRay.PointOnRay(Result.second);
CVector3f WorldHitPoint = Transform() * HitPoint;
const CVector3f HitPoint = TransformedRay.PointOnRay(distance);
const CVector3f WorldHitPoint = Transform() * HitPoint;
Out.Distance = Math::Distance(rkRay.Origin(), WorldHitPoint);
}
else

View File

@ -111,7 +111,7 @@ void CScriptAttachNode::RayAABoxIntersectTest(CRayCollisionTester& rTester, cons
if (!pModel) return;
const CRay& rkRay = rTester.Ray();
std::pair<bool,float> BoxResult = AABox().IntersectsRay(rkRay);
const std::pair<bool, float> BoxResult = AABox().IntersectsRay(rkRay);
if (BoxResult.first)
rTester.AddNodeModel(this, pModel);
@ -119,20 +119,20 @@ void CScriptAttachNode::RayAABoxIntersectTest(CRayCollisionTester& rTester, cons
SRayIntersection CScriptAttachNode::RayNodeIntersectTest(const CRay& rkRay, uint32 AssetID, const SViewInfo& rkViewInfo)
{
FRenderOptions Options = rkViewInfo.pRenderer->RenderOptions();
const FRenderOptions Options = rkViewInfo.pRenderer->RenderOptions();
SRayIntersection Out;
Out.pNode = mpParent;
Out.ComponentIndex = AssetID;
CRay TransformedRay = rkRay.Transformed(Transform().Inverse());
std::pair<bool,float> Result = Model()->GetSurface(AssetID)->IntersectsRay(TransformedRay, Options.HasFlag(ERenderOption::EnableBackfaceCull));
const CRay TransformedRay = rkRay.Transformed(Transform().Inverse());
const auto [intersects, distance] = Model()->GetSurface(AssetID)->IntersectsRay(TransformedRay, Options.HasFlag(ERenderOption::EnableBackfaceCull));
if (Result.first)
if (intersects)
{
Out.Hit = true;
CVector3f HitPoint = TransformedRay.PointOnRay(Result.second);
CVector3f WorldHitPoint = Transform() * HitPoint;
const CVector3f HitPoint = TransformedRay.PointOnRay(distance);
const CVector3f WorldHitPoint = Transform() * HitPoint;
Out.Distance = rkRay.Origin().Distance(WorldHitPoint);
}
else

View File

@ -120,12 +120,12 @@ SRayIntersection CDoorExtra::RayNodeIntersectTest(const CRay& rkRay, uint32 Asse
Out.ComponentIndex = AssetID;
const CRay TransformedRay = rkRay.Transformed(Transform().Inverse());
const std::pair<bool, float> Result = mpShieldModel->GetSurface(AssetID)->IntersectsRay(TransformedRay, ((Options & ERenderOption::EnableBackfaceCull) == 0));
const auto [intersects, distance] = mpShieldModel->GetSurface(AssetID)->IntersectsRay(TransformedRay, ((Options & ERenderOption::EnableBackfaceCull) == 0));
if (Result.first)
if (intersects)
{
Out.Hit = true;
const CVector3f HitPoint = TransformedRay.PointOnRay(Result.second);
const CVector3f HitPoint = TransformedRay.PointOnRay(distance);
const CVector3f WorldHitPoint = Transform() * HitPoint;
Out.Distance = rkRay.Origin().Distance(WorldHitPoint);
}

View File

@ -163,18 +163,18 @@ bool CGizmo::CheckSelectedAxes(const CRay& rkRay)
if (ModelBoxCheck)
{
bool Hit = false;
float Dist;
float Dist = 0.0f;
for (size_t iSurf = 0; iSurf < pModel->GetSurfaceCount(); iSurf++)
{
// Skip surface/box check - since we use lines the boxes might be too small
SSurface *pSurf = pModel->GetSurface(iSurf);
std::pair<bool,float> SurfCheck = pSurf->IntersectsRay(rPartRay, false, 0.05f);
const SSurface* pSurf = pModel->GetSurface(iSurf);
const auto [intersects, distance] = pSurf->IntersectsRay(rPartRay, false, 0.05f);
if (SurfCheck.first)
if (intersects)
{
if (!Hit || SurfCheck.second < Dist)
Dist = SurfCheck.second;
if (!Hit || distance < Dist)
Dist = distance;
Hit = true;
}