CDamageableTriggerExtra: Make use of std::array

Stronger typing.
This commit is contained in:
Lioncash 2020-06-19 00:26:07 -04:00
parent e875c2bf08
commit 75be364148
2 changed files with 35 additions and 33 deletions

View File

@ -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);
} }

View File

@ -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);