mirror of
https://github.com/AxioDL/PrimeWorldEditor.git
synced 2025-07-02 03:13:38 +00:00
SSurface: Make IntersectsRay() a const member function
This commit is contained in:
parent
5b0ae09cf3
commit
2b7513b156
@ -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;
|
||||
|
@ -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
|
||||
|
@ -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
|
||||
|
@ -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
|
||||
|
@ -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);
|
||||
}
|
||||
|
@ -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;
|
||||
}
|
||||
|
Loading…
x
Reference in New Issue
Block a user