mirror of
https://github.com/AxioDL/PrimeWorldEditor.git
synced 2025-07-06 13:16:00 +00:00
CDamageableTriggerExtra: Make use of std::array
Stronger typing.
This commit is contained in:
parent
e875c2bf08
commit
75be364148
@ -6,11 +6,7 @@
|
|||||||
|
|
||||||
CDamageableTriggerExtra::CDamageableTriggerExtra(CScriptObject *pInstance, CScene *pScene, CScriptNode *pParent)
|
CDamageableTriggerExtra::CDamageableTriggerExtra(CScriptObject *pInstance, CScene *pScene, CScriptNode *pParent)
|
||||||
: CScriptExtra(pInstance, pScene, pParent)
|
: CScriptExtra(pInstance, pScene, pParent)
|
||||||
, mpMat(nullptr)
|
|
||||||
{
|
{
|
||||||
for (uint32 iTex = 0; iTex < 3; iTex++)
|
|
||||||
mpTextures[iTex] = nullptr;
|
|
||||||
|
|
||||||
SetInheritance(true, false, false);
|
SetInheritance(true, false, false);
|
||||||
CreateMaterial();
|
CreateMaterial();
|
||||||
|
|
||||||
@ -18,17 +14,20 @@ CDamageableTriggerExtra::CDamageableTriggerExtra(CScriptObject *pInstance, CScen
|
|||||||
|
|
||||||
// Fetch render side
|
// Fetch render side
|
||||||
mRenderSide = TEnumRef<ERenderSide>(pInstance->PropertyData(), pProperties->ChildByIndex(5));
|
mRenderSide = TEnumRef<ERenderSide>(pInstance->PropertyData(), pProperties->ChildByIndex(5));
|
||||||
if (mRenderSide.IsValid()) PropertyModified(mRenderSide.Property());
|
if (mRenderSide.IsValid())
|
||||||
|
PropertyModified(mRenderSide.Property());
|
||||||
|
|
||||||
// Fetch scale
|
// Fetch scale
|
||||||
mPlaneSize = CVectorRef(pInstance->PropertyData(), pProperties->ChildByIndex(2));
|
mPlaneSize = CVectorRef(pInstance->PropertyData(), pProperties->ChildByIndex(2));
|
||||||
if (mPlaneSize.IsValid()) PropertyModified(mPlaneSize.Property());
|
if (mPlaneSize.IsValid())
|
||||||
|
PropertyModified(mPlaneSize.Property());
|
||||||
|
|
||||||
// Fetch textures
|
// Fetch textures
|
||||||
for (uint32 TextureIdx = 0; TextureIdx < 3; TextureIdx++)
|
for (uint32 TextureIdx = 0; TextureIdx < 3; TextureIdx++)
|
||||||
{
|
{
|
||||||
mTextureAssets[TextureIdx] = CAssetRef(pInstance->PropertyData(), pProperties->ChildByIndex(6 + TextureIdx));
|
mTextureAssets[TextureIdx] = CAssetRef(pInstance->PropertyData(), pProperties->ChildByIndex(6 + TextureIdx));
|
||||||
if (mTextureAssets[TextureIdx].IsValid()) PropertyModified(mTextureAssets[TextureIdx].Property());
|
if (mTextureAssets[TextureIdx].IsValid())
|
||||||
|
PropertyModified(mTextureAssets[TextureIdx].Property());
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -47,7 +46,7 @@ void CDamageableTriggerExtra::CreateMaterial()
|
|||||||
mpMat->SetBlendMode(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
|
mpMat->SetBlendMode(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
|
||||||
mpMat->SetLightingEnabled(true);
|
mpMat->SetLightingEnabled(true);
|
||||||
mpMat->SetOptions(EMaterialOption::Transparent);
|
mpMat->SetOptions(EMaterialOption::Transparent);
|
||||||
mpMat->SetKonst(CColor((float) 1.f, 1.f, 1.f, 0.2f), 0);
|
mpMat->SetKonst(CColor(1.f, 1.f, 1.f, 0.2f), 0);
|
||||||
mpMat->SetNumPasses(3);
|
mpMat->SetNumPasses(3);
|
||||||
|
|
||||||
CMaterialPass *pPassA = mpMat->Pass(0);
|
CMaterialPass *pPassA = mpMat->Pass(0);
|
||||||
@ -79,14 +78,14 @@ void CDamageableTriggerExtra::CreateMaterial()
|
|||||||
|
|
||||||
void CDamageableTriggerExtra::UpdatePlaneTransform()
|
void CDamageableTriggerExtra::UpdatePlaneTransform()
|
||||||
{
|
{
|
||||||
CVector3f Extent = mPlaneSize.Get() / 2.f;
|
const CVector3f Extent = mPlaneSize.Get() / 2.f;
|
||||||
|
|
||||||
switch (mRenderSide)
|
switch (mRenderSide)
|
||||||
{
|
{
|
||||||
case ERenderSide::North:
|
case ERenderSide::North:
|
||||||
case ERenderSide::South:
|
case ERenderSide::South:
|
||||||
{
|
{
|
||||||
float Scalar = (mRenderSide == ERenderSide::North ? 1.f : -1.f);
|
const float Scalar = (mRenderSide == ERenderSide::North ? 1.f : -1.f);
|
||||||
|
|
||||||
mPosition = CVector3f(0.f, Extent.Y * Scalar, 0.f);
|
mPosition = CVector3f(0.f, Extent.Y * Scalar, 0.f);
|
||||||
mRotation = CQuaternion::FromEuler(CVector3f(90.f * Scalar, 0.f, 0.f));
|
mRotation = CQuaternion::FromEuler(CVector3f(90.f * Scalar, 0.f, 0.f));
|
||||||
@ -98,7 +97,7 @@ void CDamageableTriggerExtra::UpdatePlaneTransform()
|
|||||||
case ERenderSide::West:
|
case ERenderSide::West:
|
||||||
case ERenderSide::East:
|
case ERenderSide::East:
|
||||||
{
|
{
|
||||||
float Scalar = (mRenderSide == ERenderSide::West ? 1.f : -1.f);
|
const float Scalar = (mRenderSide == ERenderSide::West ? 1.f : -1.f);
|
||||||
|
|
||||||
mPosition = CVector3f(-Extent.X * Scalar, 0.f, 0.f);
|
mPosition = CVector3f(-Extent.X * Scalar, 0.f, 0.f);
|
||||||
mRotation = CQuaternion::FromEuler(CVector3f(0.f, 90.f * Scalar, 0.f));
|
mRotation = CQuaternion::FromEuler(CVector3f(0.f, 90.f * Scalar, 0.f));
|
||||||
@ -110,8 +109,8 @@ void CDamageableTriggerExtra::UpdatePlaneTransform()
|
|||||||
case ERenderSide::Up:
|
case ERenderSide::Up:
|
||||||
case ERenderSide::Down:
|
case ERenderSide::Down:
|
||||||
{
|
{
|
||||||
float Scalar = (mRenderSide == ERenderSide::Up ? 1.f : -1.f);
|
const float Scalar = (mRenderSide == ERenderSide::Up ? 1.f : -1.f);
|
||||||
float RotAngle = (mRenderSide == ERenderSide::Up ? 180.f : 0.f);
|
const float RotAngle = (mRenderSide == ERenderSide::Up ? 180.f : 0.f);
|
||||||
|
|
||||||
mPosition = CVector3f(0.f, 0.f, Extent.Z * Scalar);
|
mPosition = CVector3f(0.f, 0.f, Extent.Z * Scalar);
|
||||||
mRotation = CQuaternion::FromEuler(CVector3f(0.f, RotAngle, 0.f));
|
mRotation = CQuaternion::FromEuler(CVector3f(0.f, RotAngle, 0.f));
|
||||||
@ -133,17 +132,17 @@ void CDamageableTriggerExtra::UpdatePlaneTransform()
|
|||||||
CDamageableTriggerExtra::ERenderSide CDamageableTriggerExtra::RenderSideForDirection(const CVector3f& rkDir)
|
CDamageableTriggerExtra::ERenderSide CDamageableTriggerExtra::RenderSideForDirection(const CVector3f& rkDir)
|
||||||
{
|
{
|
||||||
// Get the index of the largest XYZ component
|
// Get the index of the largest XYZ component
|
||||||
CVector3f AbsDir(Math::Abs(rkDir.X), Math::Abs(rkDir.Y), Math::Abs(rkDir.Z));
|
const CVector3f AbsDir(Math::Abs(rkDir.X), Math::Abs(rkDir.Y), Math::Abs(rkDir.Z));
|
||||||
uint32 Max = (AbsDir.X > AbsDir.Y ? 0 : 1);
|
uint32 Max = (AbsDir.X > AbsDir.Y ? 0 : 1);
|
||||||
Max = (AbsDir[Max] > AbsDir.Z ? Max : 2);
|
Max = (AbsDir[Max] > AbsDir.Z ? Max : 2);
|
||||||
|
|
||||||
// Check whether the direction is positive or negative. If the absolute value of the component matches the input one, then it's positive.
|
// Check whether the direction is positive or negative. If the absolute value of the component matches the input one, then it's positive.
|
||||||
bool Positive = (rkDir[Max] == AbsDir[Max]);
|
const bool Positive = (rkDir[Max] == AbsDir[Max]);
|
||||||
|
|
||||||
// Return corresponding side for direction
|
// Return corresponding side for direction
|
||||||
if (Max == 0) return (Positive ? ERenderSide::East : ERenderSide::West);
|
if (Max == 0) return (Positive ? ERenderSide::East : ERenderSide::West);
|
||||||
else if (Max == 1) return (Positive ? ERenderSide::North : ERenderSide::South);
|
if (Max == 1) return (Positive ? ERenderSide::North : ERenderSide::South);
|
||||||
else if (Max == 2) return (Positive ? ERenderSide::Up : ERenderSide::Down);
|
if (Max == 2) return (Positive ? ERenderSide::Up : ERenderSide::Down);
|
||||||
|
|
||||||
return ERenderSide::NoRender;
|
return ERenderSide::NoRender;
|
||||||
}
|
}
|
||||||
@ -152,7 +151,7 @@ CDamageableTriggerExtra::ERenderSide CDamageableTriggerExtra::TransformRenderSid
|
|||||||
{
|
{
|
||||||
// DamageableTrigger has a convenience feature implemented that changes the
|
// DamageableTrigger has a convenience feature implemented that changes the
|
||||||
// render side when the area's been rotated, so we need to replicate it here.
|
// render side when the area's been rotated, so we need to replicate it here.
|
||||||
CQuaternion AreaRotation = mpScriptNode->Instance()->Area()->Transform().ExtractRotation();
|
const CQuaternion AreaRotation = mpScriptNode->Instance()->Area()->Transform().ExtractRotation();
|
||||||
|
|
||||||
switch (Side)
|
switch (Side)
|
||||||
{
|
{
|
||||||
@ -184,7 +183,6 @@ void CDamageableTriggerExtra::PropertyModified(IProperty* pProperty)
|
|||||||
{
|
{
|
||||||
UpdatePlaneTransform();
|
UpdatePlaneTransform();
|
||||||
}
|
}
|
||||||
|
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
for (uint32 TextureIdx = 0; TextureIdx < 3; TextureIdx++)
|
for (uint32 TextureIdx = 0; TextureIdx < 3; TextureIdx++)
|
||||||
@ -232,10 +230,10 @@ void CDamageableTriggerExtra::Draw(FRenderOptions Options, int /*ComponentIndex*
|
|||||||
mpMat->SetCurrent(Options);
|
mpMat->SetCurrent(Options);
|
||||||
|
|
||||||
// Note: The plane the game renders this onto is 5x4.5, which is why we divide the tex coords by this value
|
// Note: The plane the game renders this onto is 5x4.5, which is why we divide the tex coords by this value
|
||||||
CVector2f TexUL(0.f, mCoordScale.Y / 4.5f);
|
const CVector2f TexUL(0.f, mCoordScale.Y / 4.5f);
|
||||||
CVector2f TexUR(mCoordScale.X / 5.f, mCoordScale.Y / 4.5f);
|
const CVector2f TexUR(mCoordScale.X / 5.f, mCoordScale.Y / 4.5f);
|
||||||
CVector2f TexBR(mCoordScale.X / 5.f, 0.f);
|
const CVector2f TexBR(mCoordScale.X / 5.f, 0.f);
|
||||||
CVector2f TexBL(0.f, 0.f);
|
const CVector2f TexBL(0.f, 0.f);
|
||||||
CDrawUtil::DrawSquare(TexUL, TexUR, TexBR, TexBL);
|
CDrawUtil::DrawSquare(TexUL, TexUR, TexBR, TexBL);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -251,12 +249,15 @@ void CDamageableTriggerExtra::DrawSelection()
|
|||||||
|
|
||||||
void CDamageableTriggerExtra::RayAABoxIntersectTest(CRayCollisionTester& rTester, const SViewInfo& rkViewInfo)
|
void CDamageableTriggerExtra::RayAABoxIntersectTest(CRayCollisionTester& rTester, const SViewInfo& rkViewInfo)
|
||||||
{
|
{
|
||||||
if (mRenderSide == ERenderSide::NoRender) return;
|
if (mRenderSide == ERenderSide::NoRender)
|
||||||
if (rkViewInfo.GameMode && !mpInstance->IsActive()) return;
|
return;
|
||||||
|
|
||||||
|
if (rkViewInfo.GameMode && !mpInstance->IsActive())
|
||||||
|
return;
|
||||||
|
|
||||||
const CRay& rkRay = rTester.Ray();
|
const CRay& rkRay = rTester.Ray();
|
||||||
|
|
||||||
if (rkViewInfo.pRenderer->RenderOptions() & ERenderOption::EnableBackfaceCull)
|
if ((rkViewInfo.pRenderer->RenderOptions() & ERenderOption::EnableBackfaceCull) != 0)
|
||||||
{
|
{
|
||||||
// We're guaranteed to be axis-aligned, so we can take advantage of that
|
// We're guaranteed to be axis-aligned, so we can take advantage of that
|
||||||
// to perform a very simple backface check.
|
// to perform a very simple backface check.
|
||||||
@ -276,7 +277,7 @@ void CDamageableTriggerExtra::RayAABoxIntersectTest(CRayCollisionTester& rTester
|
|||||||
|
|
||||||
if (Result.first)
|
if (Result.first)
|
||||||
{
|
{
|
||||||
rTester.AddNode(this, -1, Result.second);
|
rTester.AddNode(this, UINT32_MAX, Result.second);
|
||||||
mCachedRayDistance = Result.second;
|
mCachedRayDistance = Result.second;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -285,5 +286,5 @@ SRayIntersection CDamageableTriggerExtra::RayNodeIntersectTest(const CRay& rkRay
|
|||||||
{
|
{
|
||||||
// The bounding box and all other tests already passed in RayAABoxIntersectTest, so we
|
// The bounding box and all other tests already passed in RayAABoxIntersectTest, so we
|
||||||
// already know that we have a positive.
|
// already know that we have a positive.
|
||||||
return SRayIntersection(true, mCachedRayDistance, rkRay.PointOnRay(mCachedRayDistance), mpParent, -1);
|
return SRayIntersection(true, mCachedRayDistance, rkRay.PointOnRay(mCachedRayDistance), mpParent, UINT32_MAX);
|
||||||
}
|
}
|
||||||
|
@ -2,6 +2,7 @@
|
|||||||
#define CDAMAGEABLETRIGGEREXTRA_H
|
#define CDAMAGEABLETRIGGEREXTRA_H
|
||||||
|
|
||||||
#include "CScriptExtra.h"
|
#include "CScriptExtra.h"
|
||||||
|
#include <array>
|
||||||
|
|
||||||
class CDamageableTriggerExtra : public CScriptExtra
|
class CDamageableTriggerExtra : public CScriptExtra
|
||||||
{
|
{
|
||||||
@ -21,13 +22,13 @@ public:
|
|||||||
private:
|
private:
|
||||||
CVectorRef mPlaneSize;
|
CVectorRef mPlaneSize;
|
||||||
TEnumRef<ERenderSide> mRenderSide;
|
TEnumRef<ERenderSide> mRenderSide;
|
||||||
CAssetRef mTextureAssets[3];
|
std::array<CAssetRef, 3> mTextureAssets;
|
||||||
|
|
||||||
CMaterial* mpMat;
|
CMaterial* mpMat = nullptr;
|
||||||
CTexture* mpTextures[3];
|
std::array<CTexture*, 3> mpTextures{};
|
||||||
CVector2f mCoordScale;
|
CVector2f mCoordScale;
|
||||||
|
|
||||||
float mCachedRayDistance;
|
float mCachedRayDistance = 0.0f;
|
||||||
|
|
||||||
public:
|
public:
|
||||||
explicit CDamageableTriggerExtra(CScriptObject *pInstance, CScene *pScene, CScriptNode *pParent = nullptr);
|
explicit CDamageableTriggerExtra(CScriptObject *pInstance, CScene *pScene, CScriptNode *pParent = nullptr);
|
||||||
|
Loading…
x
Reference in New Issue
Block a user