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)
|
||||
: CScriptExtra(pInstance, pScene, pParent)
|
||||
, mpMat(nullptr)
|
||||
{
|
||||
for (uint32 iTex = 0; iTex < 3; iTex++)
|
||||
mpTextures[iTex] = nullptr;
|
||||
|
||||
SetInheritance(true, false, false);
|
||||
CreateMaterial();
|
||||
|
||||
@ -18,17 +14,20 @@ CDamageableTriggerExtra::CDamageableTriggerExtra(CScriptObject *pInstance, CScen
|
||||
|
||||
// Fetch render side
|
||||
mRenderSide = TEnumRef<ERenderSide>(pInstance->PropertyData(), pProperties->ChildByIndex(5));
|
||||
if (mRenderSide.IsValid()) PropertyModified(mRenderSide.Property());
|
||||
if (mRenderSide.IsValid())
|
||||
PropertyModified(mRenderSide.Property());
|
||||
|
||||
// Fetch scale
|
||||
mPlaneSize = CVectorRef(pInstance->PropertyData(), pProperties->ChildByIndex(2));
|
||||
if (mPlaneSize.IsValid()) PropertyModified(mPlaneSize.Property());
|
||||
if (mPlaneSize.IsValid())
|
||||
PropertyModified(mPlaneSize.Property());
|
||||
|
||||
// Fetch textures
|
||||
for (uint32 TextureIdx = 0; TextureIdx < 3; 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->SetLightingEnabled(true);
|
||||
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);
|
||||
|
||||
CMaterialPass *pPassA = mpMat->Pass(0);
|
||||
@ -79,14 +78,14 @@ void CDamageableTriggerExtra::CreateMaterial()
|
||||
|
||||
void CDamageableTriggerExtra::UpdatePlaneTransform()
|
||||
{
|
||||
CVector3f Extent = mPlaneSize.Get() / 2.f;
|
||||
const CVector3f Extent = mPlaneSize.Get() / 2.f;
|
||||
|
||||
switch (mRenderSide)
|
||||
{
|
||||
case ERenderSide::North:
|
||||
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);
|
||||
mRotation = CQuaternion::FromEuler(CVector3f(90.f * Scalar, 0.f, 0.f));
|
||||
@ -98,7 +97,7 @@ void CDamageableTriggerExtra::UpdatePlaneTransform()
|
||||
case ERenderSide::West:
|
||||
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);
|
||||
mRotation = CQuaternion::FromEuler(CVector3f(0.f, 90.f * Scalar, 0.f));
|
||||
@ -110,8 +109,8 @@ void CDamageableTriggerExtra::UpdatePlaneTransform()
|
||||
case ERenderSide::Up:
|
||||
case ERenderSide::Down:
|
||||
{
|
||||
float Scalar = (mRenderSide == ERenderSide::Up ? 1.f : -1.f);
|
||||
float RotAngle = (mRenderSide == ERenderSide::Up ? 180.f : 0.f);
|
||||
const float Scalar = (mRenderSide == ERenderSide::Up ? 1.f : -1.f);
|
||||
const float RotAngle = (mRenderSide == ERenderSide::Up ? 180.f : 0.f);
|
||||
|
||||
mPosition = CVector3f(0.f, 0.f, Extent.Z * Scalar);
|
||||
mRotation = CQuaternion::FromEuler(CVector3f(0.f, RotAngle, 0.f));
|
||||
@ -133,17 +132,17 @@ void CDamageableTriggerExtra::UpdatePlaneTransform()
|
||||
CDamageableTriggerExtra::ERenderSide CDamageableTriggerExtra::RenderSideForDirection(const CVector3f& rkDir)
|
||||
{
|
||||
// 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);
|
||||
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.
|
||||
bool Positive = (rkDir[Max] == AbsDir[Max]);
|
||||
const bool Positive = (rkDir[Max] == AbsDir[Max]);
|
||||
|
||||
// Return corresponding side for direction
|
||||
if (Max == 0) return (Positive ? ERenderSide::East : ERenderSide::West);
|
||||
else if (Max == 1) return (Positive ? ERenderSide::North : ERenderSide::South);
|
||||
else if (Max == 2) return (Positive ? ERenderSide::Up : ERenderSide::Down);
|
||||
if (Max == 0) return (Positive ? ERenderSide::East : ERenderSide::West);
|
||||
if (Max == 1) return (Positive ? ERenderSide::North : ERenderSide::South);
|
||||
if (Max == 2) return (Positive ? ERenderSide::Up : ERenderSide::Down);
|
||||
|
||||
return ERenderSide::NoRender;
|
||||
}
|
||||
@ -152,7 +151,7 @@ CDamageableTriggerExtra::ERenderSide CDamageableTriggerExtra::TransformRenderSid
|
||||
{
|
||||
// DamageableTrigger has a convenience feature implemented that changes the
|
||||
// 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)
|
||||
{
|
||||
@ -184,7 +183,6 @@ void CDamageableTriggerExtra::PropertyModified(IProperty* pProperty)
|
||||
{
|
||||
UpdatePlaneTransform();
|
||||
}
|
||||
|
||||
else
|
||||
{
|
||||
for (uint32 TextureIdx = 0; TextureIdx < 3; TextureIdx++)
|
||||
@ -232,10 +230,10 @@ void CDamageableTriggerExtra::Draw(FRenderOptions Options, int /*ComponentIndex*
|
||||
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
|
||||
CVector2f TexUL(0.f, mCoordScale.Y / 4.5f);
|
||||
CVector2f TexUR(mCoordScale.X / 5.f, mCoordScale.Y / 4.5f);
|
||||
CVector2f TexBR(mCoordScale.X / 5.f, 0.f);
|
||||
CVector2f TexBL(0.f, 0.f);
|
||||
const CVector2f TexUL(0.f, mCoordScale.Y / 4.5f);
|
||||
const CVector2f TexUR(mCoordScale.X / 5.f, mCoordScale.Y / 4.5f);
|
||||
const CVector2f TexBR(mCoordScale.X / 5.f, 0.f);
|
||||
const CVector2f TexBL(0.f, 0.f);
|
||||
CDrawUtil::DrawSquare(TexUL, TexUR, TexBR, TexBL);
|
||||
}
|
||||
|
||||
@ -251,12 +249,15 @@ void CDamageableTriggerExtra::DrawSelection()
|
||||
|
||||
void CDamageableTriggerExtra::RayAABoxIntersectTest(CRayCollisionTester& rTester, const SViewInfo& rkViewInfo)
|
||||
{
|
||||
if (mRenderSide == ERenderSide::NoRender) return;
|
||||
if (rkViewInfo.GameMode && !mpInstance->IsActive()) return;
|
||||
if (mRenderSide == ERenderSide::NoRender)
|
||||
return;
|
||||
|
||||
if (rkViewInfo.GameMode && !mpInstance->IsActive())
|
||||
return;
|
||||
|
||||
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
|
||||
// to perform a very simple backface check.
|
||||
@ -276,7 +277,7 @@ void CDamageableTriggerExtra::RayAABoxIntersectTest(CRayCollisionTester& rTester
|
||||
|
||||
if (Result.first)
|
||||
{
|
||||
rTester.AddNode(this, -1, Result.second);
|
||||
rTester.AddNode(this, UINT32_MAX, 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
|
||||
// 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
|
||||
|
||||
#include "CScriptExtra.h"
|
||||
#include <array>
|
||||
|
||||
class CDamageableTriggerExtra : public CScriptExtra
|
||||
{
|
||||
@ -21,13 +22,13 @@ public:
|
||||
private:
|
||||
CVectorRef mPlaneSize;
|
||||
TEnumRef<ERenderSide> mRenderSide;
|
||||
CAssetRef mTextureAssets[3];
|
||||
std::array<CAssetRef, 3> mTextureAssets;
|
||||
|
||||
CMaterial* mpMat;
|
||||
CTexture* mpTextures[3];
|
||||
CMaterial* mpMat = nullptr;
|
||||
std::array<CTexture*, 3> mpTextures{};
|
||||
CVector2f mCoordScale;
|
||||
|
||||
float mCachedRayDistance;
|
||||
float mCachedRayDistance = 0.0f;
|
||||
|
||||
public:
|
||||
explicit CDamageableTriggerExtra(CScriptObject *pInstance, CScene *pScene, CScriptNode *pParent = nullptr);
|
||||
|
Loading…
x
Reference in New Issue
Block a user