mirror of
https://github.com/AxioDL/PrimeWorldEditor.git
synced 2025-07-04 20:26:05 +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 "Core/CRayCollisionTester.h"
|
||||||
#include <Common/Math/MathUtil.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;
|
bool Hit = false;
|
||||||
float HitDist = 0.0f;
|
float HitDist = 0.0f;
|
||||||
|
@ -32,7 +32,7 @@ struct SSurface
|
|||||||
|
|
||||||
SSurface() = default;
|
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
|
#endif // SSURFACE_H
|
||||||
|
@ -132,7 +132,7 @@ void CModelNode::RayAABoxIntersectTest(CRayCollisionTester& rTester, const SView
|
|||||||
return;
|
return;
|
||||||
|
|
||||||
const CRay& rkRay = rTester.Ray();
|
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)
|
if (BoxResult.first)
|
||||||
rTester.AddNodeModel(this, mpModel);
|
rTester.AddNodeModel(this, mpModel);
|
||||||
@ -144,16 +144,16 @@ SRayIntersection CModelNode::RayNodeIntersectTest(const CRay& rkRay, uint32 Asse
|
|||||||
Out.pNode = this;
|
Out.pNode = this;
|
||||||
Out.ComponentIndex = AssetID;
|
Out.ComponentIndex = AssetID;
|
||||||
|
|
||||||
CRay TransformedRay = rkRay.Transformed(Transform().Inverse());
|
const CRay TransformedRay = rkRay.Transformed(Transform().Inverse());
|
||||||
FRenderOptions Options = rkViewInfo.pRenderer->RenderOptions();
|
const FRenderOptions Options = rkViewInfo.pRenderer->RenderOptions();
|
||||||
std::pair<bool,float> Result = mpModel->GetSurface(AssetID)->IntersectsRay(TransformedRay, ((Options & ERenderOption::EnableBackfaceCull) == 0));
|
const auto [intersects, distance] = mpModel->GetSurface(AssetID)->IntersectsRay(TransformedRay, ((Options & ERenderOption::EnableBackfaceCull) == 0));
|
||||||
|
|
||||||
if (Result.first)
|
if (intersects)
|
||||||
{
|
{
|
||||||
Out.Hit = true;
|
Out.Hit = true;
|
||||||
|
|
||||||
CVector3f HitPoint = TransformedRay.PointOnRay(Result.second);
|
const CVector3f HitPoint = TransformedRay.PointOnRay(distance);
|
||||||
CVector3f WorldHitPoint = Transform() * HitPoint;
|
const CVector3f WorldHitPoint = Transform() * HitPoint;
|
||||||
Out.Distance = Math::Distance(rkRay.Origin(), WorldHitPoint);
|
Out.Distance = Math::Distance(rkRay.Origin(), WorldHitPoint);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
|
@ -111,7 +111,7 @@ void CScriptAttachNode::RayAABoxIntersectTest(CRayCollisionTester& rTester, cons
|
|||||||
if (!pModel) return;
|
if (!pModel) return;
|
||||||
|
|
||||||
const CRay& rkRay = rTester.Ray();
|
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)
|
if (BoxResult.first)
|
||||||
rTester.AddNodeModel(this, pModel);
|
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)
|
SRayIntersection CScriptAttachNode::RayNodeIntersectTest(const CRay& rkRay, uint32 AssetID, const SViewInfo& rkViewInfo)
|
||||||
{
|
{
|
||||||
FRenderOptions Options = rkViewInfo.pRenderer->RenderOptions();
|
const FRenderOptions Options = rkViewInfo.pRenderer->RenderOptions();
|
||||||
|
|
||||||
SRayIntersection Out;
|
SRayIntersection Out;
|
||||||
Out.pNode = mpParent;
|
Out.pNode = mpParent;
|
||||||
Out.ComponentIndex = AssetID;
|
Out.ComponentIndex = AssetID;
|
||||||
|
|
||||||
CRay TransformedRay = rkRay.Transformed(Transform().Inverse());
|
const CRay TransformedRay = rkRay.Transformed(Transform().Inverse());
|
||||||
std::pair<bool,float> Result = Model()->GetSurface(AssetID)->IntersectsRay(TransformedRay, Options.HasFlag(ERenderOption::EnableBackfaceCull));
|
const auto [intersects, distance] = Model()->GetSurface(AssetID)->IntersectsRay(TransformedRay, Options.HasFlag(ERenderOption::EnableBackfaceCull));
|
||||||
|
|
||||||
if (Result.first)
|
if (intersects)
|
||||||
{
|
{
|
||||||
Out.Hit = true;
|
Out.Hit = true;
|
||||||
CVector3f HitPoint = TransformedRay.PointOnRay(Result.second);
|
const CVector3f HitPoint = TransformedRay.PointOnRay(distance);
|
||||||
CVector3f WorldHitPoint = Transform() * HitPoint;
|
const CVector3f WorldHitPoint = Transform() * HitPoint;
|
||||||
Out.Distance = rkRay.Origin().Distance(WorldHitPoint);
|
Out.Distance = rkRay.Origin().Distance(WorldHitPoint);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
|
@ -120,12 +120,12 @@ SRayIntersection CDoorExtra::RayNodeIntersectTest(const CRay& rkRay, uint32 Asse
|
|||||||
Out.ComponentIndex = AssetID;
|
Out.ComponentIndex = AssetID;
|
||||||
|
|
||||||
const CRay TransformedRay = rkRay.Transformed(Transform().Inverse());
|
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;
|
Out.Hit = true;
|
||||||
const CVector3f HitPoint = TransformedRay.PointOnRay(Result.second);
|
const CVector3f HitPoint = TransformedRay.PointOnRay(distance);
|
||||||
const CVector3f WorldHitPoint = Transform() * HitPoint;
|
const CVector3f WorldHitPoint = Transform() * HitPoint;
|
||||||
Out.Distance = rkRay.Origin().Distance(WorldHitPoint);
|
Out.Distance = rkRay.Origin().Distance(WorldHitPoint);
|
||||||
}
|
}
|
||||||
|
@ -163,18 +163,18 @@ bool CGizmo::CheckSelectedAxes(const CRay& rkRay)
|
|||||||
if (ModelBoxCheck)
|
if (ModelBoxCheck)
|
||||||
{
|
{
|
||||||
bool Hit = false;
|
bool Hit = false;
|
||||||
float Dist;
|
float Dist = 0.0f;
|
||||||
|
|
||||||
for (size_t iSurf = 0; iSurf < pModel->GetSurfaceCount(); iSurf++)
|
for (size_t iSurf = 0; iSurf < pModel->GetSurfaceCount(); iSurf++)
|
||||||
{
|
{
|
||||||
// Skip surface/box check - since we use lines the boxes might be too small
|
// Skip surface/box check - since we use lines the boxes might be too small
|
||||||
SSurface *pSurf = pModel->GetSurface(iSurf);
|
const SSurface* pSurf = pModel->GetSurface(iSurf);
|
||||||
std::pair<bool,float> SurfCheck = pSurf->IntersectsRay(rPartRay, false, 0.05f);
|
const auto [intersects, distance] = pSurf->IntersectsRay(rPartRay, false, 0.05f);
|
||||||
|
|
||||||
if (SurfCheck.first)
|
if (intersects)
|
||||||
{
|
{
|
||||||
if (!Hit || SurfCheck.second < Dist)
|
if (!Hit || distance < Dist)
|
||||||
Dist = SurfCheck.second;
|
Dist = distance;
|
||||||
|
|
||||||
Hit = true;
|
Hit = true;
|
||||||
}
|
}
|
||||||
|
Loading…
x
Reference in New Issue
Block a user