Files
FC1/CryAnimation/BoneLightDynamicBind.cpp
romkazvo 34d6c5d489 123
2023-08-07 19:29:24 +08:00

94 lines
3.3 KiB
C++

#include "stdafx.h"
#include "cvars.h"
#include "DebugUtils.h"
#include "MathUtils.h"
#include "BoneLightDynamicBind.h"
/*
* Here is the sample code from Renderer.cpp, line 3000:
dl->m_Orientation.m_vForward = Vec3d(1,0,0);
dl->m_Orientation.m_vUp = Vec3d(0,1,0);
dl->m_Orientation.m_vRight = Vec3d(0,0,1);
dl->m_Orientation.rotate(Vec3d(1,0,0), dl->m_ProjAngles.x);
dl->m_Orientation.rotate(Vec3d(0,1,0), dl->m_ProjAngles.y);
dl->m_Orientation.rotate(Vec3d(0,0,1), dl->m_ProjAngles.z);
* it converts the light angles into the matrix
*/
// initializes this object out of the given DLight structure and bone index
// this is one-time call that is only required for construction out of the DLight
// to initialize the constant parameters
void CBoneLightDynamicBind::init (ICryCharInstance* pParent, CDLight* pDLight, unsigned nBone, const Matrix44& matBone, bool bCopyLight)
{
m_pDLight = bCopyLight?new CDLight(*pDLight):pDLight;
m_bDeleteLight = bCopyLight;
m_nBone = nBone;
m_fRadius = pDLight->m_fRadius;
m_nDLightFlags = pDLight->m_Flags;
m_matLight.SetRotationXYZ(DEG2RAD(pDLight->m_ProjAngles));
m_matLight.SetTranslationOLD(pDLight->m_vObjectSpacePos);
m_pDLight->m_pCharInstance = pParent;
// at this point, we have the m_matLight in character object coordinates
// now let's transform it into the bone coordinates
m_matLight = m_matLight * OrthoUniformGetInverted(matBone);
/*
pDLight->m_Orientation.m_vForward = Vec3d(1,0,0);
pDLight->m_Orientation.m_vUp = Vec3d(0,1,0);
pDLight->m_Orientation.m_vRight = Vec3d(0,0,1);
pDLight->m_Orientation.rotate(Vec3d(1,0,0), pDLight->m_ProjAngles.x);
pDLight->m_Orientation.rotate(Vec3d(0,1,0), pDLight->m_ProjAngles.y);
pDLight->m_Orientation.rotate(Vec3d(0,0,1), pDLight->m_ProjAngles.z);
*/
}
// deletes the light object, if needed
void CBoneLightDynamicBind::done()
{
m_pDLight->m_pCharInstance = NULL;
if (m_bDeleteLight)
delete m_pDLight;
}
// per-frame update of the DLight structure. Updates the light position and radius
void CBoneLightDynamicBind::updateDLight (const Matrix44& matBone, const Matrix44& matModel, float fRadiusMultiplier)
{
Matrix44 matLightObject = m_matLight * matBone;
Matrix44 matLightWorld = matLightObject * matModel;
m_pDLight->m_Origin = matLightWorld.GetTranslationOLD();
m_pDLight->m_vObjectSpacePos = matLightObject.GetTranslationOLD();
m_pDLight->m_ProjAngles = RAD2DEG(Ang3::GetAnglesXYZ(Matrix33(matLightWorld)));
m_pDLight->m_fRadius = m_fRadius * fRadiusMultiplier;
static const float fColor[3][4] =
{
{1,0.8f,0.8f,1},
{0.8f,1,0.8f,1},
{0.8f,0.8f,1,1}
};
if (g_GetCVars()->ca_DrawLHelpers())
{
float fTripodScale = 1;
debugDrawLine (m_pDLight->m_Origin, matLightWorld.TransformPointOLD(Vec3d(fTripodScale,0,0)), fColor[0]);
debugDrawLine (m_pDLight->m_Origin, matLightWorld.TransformPointOLD(Vec3d(0,fTripodScale,0)), fColor[1]);
debugDrawLine (m_pDLight->m_Origin, matLightWorld.TransformPointOLD(Vec3d(0,0,fTripodScale)), fColor[2]);
}
}
// returns true if this light source is local (affects only the character)
bool CBoneLightDynamicBind::isLocal()const
{
return (m_nDLightFlags & DLF_LOCAL) != 0;
}
bool CBoneLightDynamicBind::isHeatSource()const
{
return (m_nDLightFlags & DLF_HEATSOURCE) != 0;
}
bool CBoneLightDynamicBind::isLightSource()const
{
return (m_nDLightFlags & DLF_LIGHTSOURCE) != 0;
}