mirror of
https://github.com/AxioDL/metaforce.git
synced 2025-12-09 22:27:41 +00:00
Merge branch 'master' of https://github.com/AxioDL/urde
This commit is contained in:
@@ -1,10 +1,112 @@
|
||||
#include "CActorLights.hpp"
|
||||
#include "Graphics/CModel.hpp"
|
||||
|
||||
namespace urde
|
||||
{
|
||||
|
||||
CActorLights::CActorLights(u32, const zeus::CVector3f& vec, int, int, float)
|
||||
CActorLights::CActorLights(u32 unk, const zeus::CVector3f& vec, int a, int b, int c, int d, int e, float f1)
|
||||
: x2a8_(unk), x2ac_(vec), x2b8_b(b), x2bc_a(a), x2cc_(f1 * f1)
|
||||
{
|
||||
x298_24_ = true;
|
||||
x298_25_ = true;
|
||||
|
||||
x298_28_inArea = (!e && b > 0) ? true : false;
|
||||
x298_29_ = c;
|
||||
x298_30_ = d;
|
||||
x298_31_ = e;
|
||||
x299_24_ = true;
|
||||
}
|
||||
|
||||
void CActorLights::BuildConstantAmbientLighting()
|
||||
{
|
||||
x299_26_ = true;
|
||||
x298_24_ = true;
|
||||
x29c_ = -1;
|
||||
x2a0_ = -1;
|
||||
}
|
||||
|
||||
void CActorLights::BuildConstantAmbientLighting(const zeus::CColor& color)
|
||||
{
|
||||
x299_26_ = false;
|
||||
x288_ambientColor = color;
|
||||
x294_aid = kInvalidAreaId;
|
||||
x298_24_ = true;
|
||||
x298_26_ = true;
|
||||
x29c_ = -1;
|
||||
x2a0_ = -1;
|
||||
}
|
||||
|
||||
void CActorLights::BuildFakeLightList(const std::vector<CLight>& lights, const zeus::CColor& color)
|
||||
{
|
||||
BuildConstantAmbientLighting(color);
|
||||
x144_dynamicLights = lights;
|
||||
}
|
||||
|
||||
void CActorLights::BuildFaceLightList(CStateManager& mgr, const CGameArea& area, const zeus::CAABox& aabb)
|
||||
{
|
||||
}
|
||||
|
||||
void CActorLights::BuildDynamicLightList(CStateManager& mgr, const zeus::CAABox& aabb)
|
||||
{
|
||||
}
|
||||
|
||||
void CActorLights::MoveAmbienceToLights(const zeus::CVector3f& vec)
|
||||
{
|
||||
}
|
||||
|
||||
void CActorLights::ActivateLights(CBooModel& model) const
|
||||
{
|
||||
std::vector<CLight> lights;
|
||||
if (x298_28_inArea)
|
||||
{
|
||||
if (!x298_26_ || !x299_26_)
|
||||
{
|
||||
model.ActivateLights(lights);
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
||||
lights.push_back(CLight::BuildLocalAmbient(zeus::CVector3f::skZero, x288_ambientColor));
|
||||
|
||||
if (x0_areaLights.size())
|
||||
{
|
||||
if (x2dc_overrideDist && x299_25_overrideFirstDist)
|
||||
{
|
||||
CLight overrideLight = x0_areaLights[0];
|
||||
overrideLight.SetColor(overrideLight.GetColor() * (1.f - x2dc_overrideDist / 15.f));
|
||||
lights.push_back(overrideLight);
|
||||
}
|
||||
else
|
||||
lights.push_back(x0_areaLights[0]);
|
||||
|
||||
for (auto it = x0_areaLights.begin() + 1 ; it != x0_areaLights.end() ; ++it)
|
||||
{
|
||||
lights.push_back(*it);
|
||||
}
|
||||
}
|
||||
|
||||
for (const CLight& light : x144_dynamicLights)
|
||||
lights.push_back(light);
|
||||
|
||||
model.ActivateLights(lights);
|
||||
}
|
||||
|
||||
const CLight& CActorLights::GetLight(u32 idx) const
|
||||
{
|
||||
if (x298_28_inArea)
|
||||
{
|
||||
if (idx < x0_areaLights.size())
|
||||
return x0_areaLights[idx];
|
||||
return x144_dynamicLights[idx - x0_areaLights.size()];
|
||||
}
|
||||
return x144_dynamicLights[idx];
|
||||
}
|
||||
|
||||
u32 CActorLights::GetActiveLightCount() const
|
||||
{
|
||||
if (x298_28_inArea)
|
||||
return x0_areaLights.size() + x144_dynamicLights.size();
|
||||
return x144_dynamicLights.size();
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@@ -3,15 +3,70 @@
|
||||
|
||||
#include "RetroTypes.hpp"
|
||||
#include "zeus/CVector3f.hpp"
|
||||
#include "zeus/CColor.hpp"
|
||||
#include "zeus/CAABox.hpp"
|
||||
#include "Graphics/CLight.hpp"
|
||||
|
||||
namespace urde
|
||||
{
|
||||
class CBooModel;
|
||||
class CStateManager;
|
||||
class CGameArea;
|
||||
|
||||
class CActorLights
|
||||
{
|
||||
std::vector<CLight> x0_areaLights;
|
||||
std::vector<CLight> x144_dynamicLights;
|
||||
zeus::CColor x288_ambientColor;
|
||||
TAreaId x294_aid = kInvalidAreaId;
|
||||
|
||||
union
|
||||
{
|
||||
struct
|
||||
{
|
||||
bool x298_24_ : 1;
|
||||
bool x298_25_ : 1;
|
||||
bool x298_26_ : 1;
|
||||
bool x298_27_ : 1;
|
||||
bool x298_28_inArea : 1;
|
||||
bool x298_29_ : 1;
|
||||
bool x298_30_ : 1;
|
||||
bool x298_31_ : 1;
|
||||
bool x299_24_ : 1;
|
||||
bool x299_25_overrideFirstDist : 1;
|
||||
bool x299_26_ : 1;
|
||||
};
|
||||
u16 _dummy = 0;
|
||||
};
|
||||
bool x29a_ = false;
|
||||
u32 x29c_ = -1;
|
||||
u32 x2a0_ = -1;
|
||||
u32 x2a4_ = 0;
|
||||
u32 x2a8_;
|
||||
zeus::CVector3f x2ac_;
|
||||
int x2b8_b;
|
||||
int x2bc_a;
|
||||
zeus::CVector3f x2c0_;
|
||||
float x2cc_;
|
||||
float x2d0_ = 0.f;
|
||||
float x2d4_ = 1.f;
|
||||
u32 x2d8_ = -1;
|
||||
u32 x2dc_overrideDist = 0;
|
||||
|
||||
public:
|
||||
CActorLights(u32, const zeus::CVector3f& vec, int, int, float);
|
||||
void ActivateLights() const {}
|
||||
CActorLights(u32, const zeus::CVector3f& vec, int, int, int, int, int, float);
|
||||
|
||||
void BuildConstantAmbientLighting();
|
||||
void BuildConstantAmbientLighting(const zeus::CColor& color);
|
||||
void BuildFakeLightList(const std::vector<CLight>& lights, const zeus::CColor& color);
|
||||
void BuildFaceLightList(CStateManager& mgr, const CGameArea& area, const zeus::CAABox& aabb);
|
||||
void BuildDynamicLightList(CStateManager& mgr, const zeus::CAABox& aabb);
|
||||
void MoveAmbienceToLights(const zeus::CVector3f& vec);
|
||||
void ActivateLights(CBooModel& model) const;
|
||||
|
||||
void SetAmbientColor(const zeus::CColor& color) { x288_ambientColor = color; }
|
||||
const CLight& GetLight(u32 idx) const;
|
||||
u32 GetActiveLightCount() const;
|
||||
};
|
||||
|
||||
}
|
||||
|
||||
@@ -13,6 +13,8 @@
|
||||
#include "CParticleGenInfo.hpp"
|
||||
#include "IAnimReader.hpp"
|
||||
#include "CAnimTreeNode.hpp"
|
||||
#include "CAnimPerSegmentData.hpp"
|
||||
#include "CSegStatementSet.hpp"
|
||||
|
||||
namespace urde
|
||||
{
|
||||
@@ -49,9 +51,9 @@ CAnimData::CAnimData(ResId id,
|
||||
x1fc_transMgr(transMgr),
|
||||
x204_charIdx(charIdx),
|
||||
x208_defaultAnim(defaultAnim),
|
||||
x21c_25_loop(loop),
|
||||
x220_pose(layout->GetSegIdList().GetList().size()),
|
||||
x2f8_poseBuilder(layout)
|
||||
x220_25_loop(loop),
|
||||
x224_pose(layout->GetSegIdList().GetList().size()),
|
||||
x2fc_poseBuilder(layout)
|
||||
{
|
||||
if (iceModel)
|
||||
xe4_iceModelData = *iceModel;
|
||||
@@ -72,7 +74,7 @@ ResId CAnimData::GetEventResourceIdForAnimResourceId(ResId id) const
|
||||
|
||||
void CAnimData::AddAdditiveSegData(const CSegIdList& list, CSegStatementSet& stSet)
|
||||
{
|
||||
for (std::pair<u32, CAdditiveAnimPlayback>& additive : x1044_additiveAnims)
|
||||
for (std::pair<u32, CAdditiveAnimPlayback>& additive : x1048_additiveAnims)
|
||||
if (additive.second.GetTargetWeight() > 0.00001f)
|
||||
additive.second.AddToSegStatementSet(list, *xcc_layoutData.GetObj(), stSet);
|
||||
}
|
||||
@@ -85,7 +87,7 @@ void CAnimData::AdvanceAdditiveAnims(float dt)
|
||||
{
|
||||
CCharAnimTime time(dt);
|
||||
|
||||
for (std::pair<u32, CAdditiveAnimPlayback>& additive : x1044_additiveAnims)
|
||||
for (std::pair<u32, CAdditiveAnimPlayback>& additive : x1048_additiveAnims)
|
||||
{
|
||||
if (additive.second.GetA())
|
||||
{
|
||||
@@ -203,8 +205,23 @@ std::shared_ptr<CAnimationManager> CAnimData::GetAnimationManager() const
|
||||
return {};
|
||||
}
|
||||
|
||||
void CAnimData::RecalcPoseBuilder(const CCharAnimTime*) const
|
||||
void CAnimData::RecalcPoseBuilder(const CCharAnimTime* time)
|
||||
{
|
||||
const CSegIdList& segIdList = GetCharLayoutInfo().GetSegIdList();
|
||||
CSegStatementSet segSet;
|
||||
if (time)
|
||||
x1f8_animRoot->VGetSegStatementSet(segIdList, segSet, *time);
|
||||
else
|
||||
x1f8_animRoot->VGetSegStatementSet(segIdList, segSet);
|
||||
|
||||
AddAdditiveSegData(segIdList, segSet);
|
||||
for (const CSegId& id : segIdList.GetList())
|
||||
{
|
||||
if (id == 3)
|
||||
continue;
|
||||
CAnimPerSegmentData& segData = segSet[id];
|
||||
x2fc_poseBuilder.Insert(id, segData.x0_rotation, segData.x10_offset);
|
||||
}
|
||||
}
|
||||
|
||||
void CAnimData::RenderAuxiliary(const CFrustumPlanes& frustum) const
|
||||
@@ -225,6 +242,12 @@ void CAnimData::SetupRender(const CSkinnedModel& model,
|
||||
|
||||
void CAnimData::PreRender()
|
||||
{
|
||||
if (!x220_31_poseCached)
|
||||
{
|
||||
RecalcPoseBuilder(nullptr);
|
||||
x220_31_poseCached = true;
|
||||
x220_30_ = false;
|
||||
}
|
||||
}
|
||||
|
||||
void CAnimData::BuildPose()
|
||||
|
||||
@@ -61,7 +61,7 @@ class CAnimData
|
||||
ResId x1d8_selfId;
|
||||
zeus::CVector3f x1dc_;
|
||||
zeus::CQuaternion x1e8_;
|
||||
std::shared_ptr<IMetaAnim> x1f8_animRoot;
|
||||
std::shared_ptr<CAnimTreeNode> x1f8_animRoot;
|
||||
std::shared_ptr<CTransitionManager> x1fc_transMgr;
|
||||
|
||||
float x200_ = 1.f;
|
||||
@@ -74,34 +74,34 @@ class CAnimData
|
||||
|
||||
union
|
||||
{
|
||||
u32 x21c_flags = 0;
|
||||
u32 x220_flags = 0;
|
||||
struct
|
||||
{
|
||||
bool x21c_24_animating : 1;
|
||||
bool x21c_25_loop : 1;
|
||||
bool x21c_26_ : 1;
|
||||
bool x21c_27_ : 1;
|
||||
bool x21c_28_ : 1;
|
||||
bool x21c_29_ : 1;
|
||||
bool x21c_30_ : 1;
|
||||
bool x21c_31_ : 1;
|
||||
bool x220_24_animating : 1;
|
||||
bool x220_25_loop : 1;
|
||||
bool x220_26_ : 1;
|
||||
bool x220_27_ : 1;
|
||||
bool x220_28_ : 1;
|
||||
bool x220_29_ : 1;
|
||||
bool x220_30_ : 1;
|
||||
bool x220_31_poseCached : 1;
|
||||
};
|
||||
};
|
||||
|
||||
CPoseAsTransforms x220_pose;
|
||||
CHierarchyPoseBuilder x2f8_poseBuilder;
|
||||
CPoseAsTransforms x224_pose;
|
||||
CHierarchyPoseBuilder x2fc_poseBuilder;
|
||||
|
||||
u32 x101c_ = -1;
|
||||
u32 x1020_ = -1;
|
||||
float x1024_ = 1.f;
|
||||
bool x1028_ = true;
|
||||
u32 x102c_ = 0;
|
||||
u32 x10204_ = -1;
|
||||
float x1028_ = 1.f;
|
||||
bool x102c_ = true;
|
||||
u32 x1030_ = 0;
|
||||
bool x1034_ = false;
|
||||
u32 x1038_ = 0;
|
||||
u32 x1034_ = 0;
|
||||
bool x1038_ = false;
|
||||
u32 x103c_ = 0;
|
||||
u32 x1040_ = 0;
|
||||
rstl::reserved_vector<std::pair<u32, CAdditiveAnimPlayback>, 8> x1044_additiveAnims;
|
||||
u32 x1044_ = 0;
|
||||
rstl::reserved_vector<std::pair<u32, CAdditiveAnimPlayback>, 8> x1048_additiveAnims;
|
||||
|
||||
static rstl::reserved_vector<CBoolPOINode, 8> g_BoolPOINodes;
|
||||
static rstl::reserved_vector<CInt32POINode, 16> g_Int32POINodes;
|
||||
@@ -130,6 +130,7 @@ public:
|
||||
void DelAdditiveAnimation(u32);
|
||||
void AddAdditiveAnimation(u32, float, bool, bool);
|
||||
std::shared_ptr<CAnimationManager> GetAnimationManager();
|
||||
const CCharLayoutInfo& GetCharLayoutInfo() const { return *xcc_layoutData.GetObj(); }
|
||||
void SetPhase(float);
|
||||
void Touch(const CSkinnedModel& model, int shaderIdx) const;
|
||||
SAdvancementDeltas GetAdvancementDeltas(const CCharAnimTime& a, const CCharAnimTime& b) const;
|
||||
@@ -144,12 +145,12 @@ public:
|
||||
bool IsAnimTimeRemaining(float, const std::string& name) const;
|
||||
float GetAnimTimeRemaining(const std::string& name) const;
|
||||
float GetAnimationDuration(int) const;
|
||||
bool GetIsLoop() const {return x21c_25_loop;}
|
||||
void EnableLooping(bool val) {x21c_25_loop = val; x21c_24_animating = true;}
|
||||
bool IsAnimating() const {return x21c_24_animating;}
|
||||
bool GetIsLoop() const {return x220_25_loop;}
|
||||
void EnableLooping(bool val) {x220_25_loop = val; x220_24_animating = true;}
|
||||
bool IsAnimating() const {return x220_24_animating;}
|
||||
std::shared_ptr<CAnimSysContext> GetAnimSysContext() const;
|
||||
std::shared_ptr<CAnimationManager> GetAnimationManager() const;
|
||||
void RecalcPoseBuilder(const CCharAnimTime*) const;
|
||||
void RecalcPoseBuilder(const CCharAnimTime*);
|
||||
void RenderAuxiliary(const CFrustumPlanes& frustum) const;
|
||||
void Render(const CSkinnedModel& model, const CModelFlags& drawFlags,
|
||||
const std::experimental::optional<CVertexMorphEffect>& morphEffect,
|
||||
|
||||
@@ -135,6 +135,16 @@ void CHierarchyPoseBuilder::BuildNoScale(CPoseAsTransforms& pose)
|
||||
RecursivelyBuildNoScale(xcec_rootId, node, pose, quat, mtx, vec);
|
||||
}
|
||||
|
||||
void CHierarchyPoseBuilder::Insert(const CSegId& boneId, const zeus::CQuaternion& quat)
|
||||
{
|
||||
x0_treeMap[boneId] = CTreeNode(quat);
|
||||
}
|
||||
|
||||
void CHierarchyPoseBuilder::Insert(const CSegId& boneId, const zeus::CQuaternion& quat, const zeus::CVector3f& offset)
|
||||
{
|
||||
x0_treeMap[boneId] = CTreeNode(quat, offset);
|
||||
}
|
||||
|
||||
CHierarchyPoseBuilder::CHierarchyPoseBuilder(const CLayoutDescription& layout)
|
||||
: xcf4_layoutDesc(layout)
|
||||
{
|
||||
|
||||
@@ -22,6 +22,9 @@ class CHierarchyPoseBuilder
|
||||
zeus::CVector3f x14_offset;
|
||||
CTreeNode() = default;
|
||||
CTreeNode(const zeus::CVector3f& offset) : x14_offset(offset) {}
|
||||
CTreeNode(const zeus::CQuaternion& quat) : x4_rotation(quat) {}
|
||||
CTreeNode(const zeus::CQuaternion& quat, const zeus::CVector3f& offset)
|
||||
: x4_rotation(quat), x14_offset(offset) {}
|
||||
};
|
||||
TSegIdMap<CTreeNode> x0_treeMap;
|
||||
|
||||
@@ -42,6 +45,8 @@ public:
|
||||
|
||||
void BuildTransform(const CSegId& boneId, zeus::CTransform& xfOut) const;
|
||||
void BuildNoScale(CPoseAsTransforms& pose);
|
||||
void Insert(const CSegId& boneId, const zeus::CQuaternion& quat);
|
||||
void Insert(const CSegId& boneId, const zeus::CQuaternion& quat, const zeus::CVector3f& offset);
|
||||
};
|
||||
|
||||
}
|
||||
|
||||
@@ -45,7 +45,7 @@ SAdvancementDeltas CModelData::GetAdvancementDeltas(const CCharAnimTime& a,
|
||||
}
|
||||
|
||||
void CModelData::Render(const CStateManager& stateMgr, const zeus::CTransform& xf,
|
||||
const CActorLights* lights, const CModelFlags& drawFlags) const
|
||||
const CActorLights* lights, const CModelFlags& drawFlags)
|
||||
{
|
||||
Render(GetRenderingModel(stateMgr), xf, lights, drawFlags);
|
||||
}
|
||||
@@ -63,9 +63,9 @@ CModelData::EWhichModel CModelData::GetRenderingModel(const CStateManager& state
|
||||
}
|
||||
}
|
||||
|
||||
const CSkinnedModel& CModelData::PickAnimatedModel(EWhichModel which) const
|
||||
CSkinnedModel& CModelData::PickAnimatedModel(EWhichModel which) const
|
||||
{
|
||||
const CSkinnedModel* ret = nullptr;
|
||||
CSkinnedModel* ret = nullptr;
|
||||
switch (which)
|
||||
{
|
||||
case EWhichModel::XRay:
|
||||
@@ -79,9 +79,9 @@ const CSkinnedModel& CModelData::PickAnimatedModel(EWhichModel which) const
|
||||
return *x10_animData->xd8_modelData.GetObj();
|
||||
}
|
||||
|
||||
const TLockedToken<CModel>& CModelData::PickStaticModel(EWhichModel which) const
|
||||
TLockedToken<CModel>& CModelData::PickStaticModel(EWhichModel which)
|
||||
{
|
||||
const TLockedToken<CModel>* ret = nullptr;
|
||||
TLockedToken<CModel>* ret = nullptr;
|
||||
switch (which)
|
||||
{
|
||||
case EWhichModel::XRay:
|
||||
@@ -135,16 +135,16 @@ void CModelData::SetInfraModel(const std::pair<ResId, ResId>& modelSkin)
|
||||
}
|
||||
}
|
||||
|
||||
bool CModelData::IsDefinitelyOpaque(EWhichModel which) const
|
||||
bool CModelData::IsDefinitelyOpaque(EWhichModel which)
|
||||
{
|
||||
if (x10_animData)
|
||||
{
|
||||
const CSkinnedModel& model = PickAnimatedModel(which);
|
||||
CSkinnedModel& model = PickAnimatedModel(which);
|
||||
return model.GetModel()->GetInstance().IsOpaque();
|
||||
}
|
||||
else
|
||||
{
|
||||
const TLockedToken<CModel>& model = PickStaticModel(which);
|
||||
TLockedToken<CModel>& model = PickStaticModel(which);
|
||||
return model->GetInstance().IsOpaque();
|
||||
}
|
||||
}
|
||||
@@ -269,7 +269,7 @@ void CModelData::RenderParticles(const CFrustumPlanes& frustum) const
|
||||
x10_animData->RenderAuxiliary(frustum);
|
||||
}
|
||||
|
||||
void CModelData::Touch(EWhichModel which, int shaderIdx) const
|
||||
void CModelData::Touch(EWhichModel which, int shaderIdx)
|
||||
{
|
||||
if (x10_animData)
|
||||
x10_animData->Touch(PickAnimatedModel(which), shaderIdx);
|
||||
@@ -277,13 +277,13 @@ void CModelData::Touch(EWhichModel which, int shaderIdx) const
|
||||
PickStaticModel(which)->Touch(shaderIdx);
|
||||
}
|
||||
|
||||
void CModelData::Touch(const CStateManager& stateMgr, int shaderIdx) const
|
||||
void CModelData::Touch(const CStateManager& stateMgr, int shaderIdx)
|
||||
{
|
||||
Touch(GetRenderingModel(stateMgr), shaderIdx);
|
||||
}
|
||||
|
||||
void CModelData::RenderThermal(const zeus::CTransform& xf,
|
||||
const zeus::CColor& a, const zeus::CColor& b) const
|
||||
const zeus::CColor& a, const zeus::CColor& b)
|
||||
{
|
||||
CGraphics::SetModelMatrix(xf * zeus::CTransform::Scale(x0_particleScale));
|
||||
CGraphics::DisableAllLights();
|
||||
@@ -304,7 +304,7 @@ void CModelData::RenderThermal(const zeus::CTransform& xf,
|
||||
}
|
||||
|
||||
void CModelData::RenderUnsortedParts(EWhichModel which, const zeus::CTransform& xf,
|
||||
const CActorLights* lights, const CModelFlags& drawFlags) const
|
||||
const CActorLights* lights, const CModelFlags& drawFlags)
|
||||
{
|
||||
if ((x14_25_sortThermal && which == EWhichModel::Thermal) ||
|
||||
x10_animData || !x1c_normalModel || drawFlags.m_blendMode > 2)
|
||||
@@ -314,23 +314,22 @@ void CModelData::RenderUnsortedParts(EWhichModel which, const zeus::CTransform&
|
||||
}
|
||||
|
||||
CGraphics::SetModelMatrix(xf * zeus::CTransform::Scale(x0_particleScale));
|
||||
if (lights)
|
||||
lights->ActivateLights();
|
||||
else
|
||||
{
|
||||
CGraphics::DisableAllLights();
|
||||
// Also set ambient to x18_ambientColor
|
||||
}
|
||||
|
||||
PickStaticModel(which)->DrawUnsortedParts(drawFlags);
|
||||
TLockedToken<CModel>& model = PickStaticModel(which);
|
||||
if (lights)
|
||||
lights->ActivateLights(model->GetInstance());
|
||||
else
|
||||
model->GetInstance().ActivateLights({});
|
||||
|
||||
model->DrawUnsortedParts(drawFlags);
|
||||
// Set ambient to white
|
||||
CGraphics::DisableAllLights();
|
||||
((CModelData*)this)->x14_24_renderSorted = true;
|
||||
}
|
||||
|
||||
void CModelData::Render(EWhichModel which, const zeus::CTransform& xf,
|
||||
const CActorLights* lights, const CModelFlags& drawFlags) const
|
||||
{
|
||||
const CActorLights* lights, const CModelFlags& drawFlags)
|
||||
{
|
||||
if (x14_25_sortThermal && which == EWhichModel::Thermal)
|
||||
{
|
||||
zeus::CColor mul(drawFlags.color.a, drawFlags.color.a, drawFlags.color.a, drawFlags.color.a);
|
||||
@@ -339,21 +338,25 @@ void CModelData::Render(EWhichModel which, const zeus::CTransform& xf,
|
||||
else
|
||||
{
|
||||
CGraphics::SetModelMatrix(xf * zeus::CTransform::Scale(x0_particleScale));
|
||||
if (lights)
|
||||
lights->ActivateLights();
|
||||
else
|
||||
{
|
||||
CGraphics::DisableAllLights();
|
||||
// Also set ambient to x18_ambientColor
|
||||
}
|
||||
|
||||
if (x10_animData)
|
||||
{
|
||||
x10_animData->Render(PickAnimatedModel(which), drawFlags, {}, nullptr);
|
||||
CSkinnedModel& model = PickAnimatedModel(which);
|
||||
if (lights)
|
||||
lights->ActivateLights(model.GetModel()->GetInstance());
|
||||
else
|
||||
model.GetModel()->GetInstance().ActivateLights({});
|
||||
|
||||
x10_animData->Render(model, drawFlags, {}, nullptr);
|
||||
}
|
||||
else
|
||||
{
|
||||
const TLockedToken<CModel>& model = PickStaticModel(which);
|
||||
TLockedToken<CModel>& model = PickStaticModel(which);
|
||||
if (lights)
|
||||
lights->ActivateLights(model->GetInstance());
|
||||
else
|
||||
model->GetInstance().ActivateLights({});
|
||||
|
||||
if (x14_24_renderSorted)
|
||||
model->DrawSortedParts(drawFlags);
|
||||
else
|
||||
|
||||
@@ -101,13 +101,13 @@ public:
|
||||
|
||||
SAdvancementDeltas GetAdvancementDeltas(const CCharAnimTime& a, const CCharAnimTime& b) const;
|
||||
void Render(const CStateManager& stateMgr, const zeus::CTransform& xf,
|
||||
const CActorLights* lights, const CModelFlags& drawFlags) const;
|
||||
const CActorLights* lights, const CModelFlags& drawFlags);
|
||||
EWhichModel GetRenderingModel(const CStateManager& stateMgr) const;
|
||||
const CSkinnedModel& PickAnimatedModel(EWhichModel which) const;
|
||||
const TLockedToken<CModel>& PickStaticModel(EWhichModel which) const;
|
||||
CSkinnedModel& PickAnimatedModel(EWhichModel which) const;
|
||||
TLockedToken<CModel>& PickStaticModel(EWhichModel which);
|
||||
void SetXRayModel(const std::pair<ResId, ResId>& modelSkin);
|
||||
void SetInfraModel(const std::pair<ResId, ResId>& modelSkin);
|
||||
bool IsDefinitelyOpaque(EWhichModel) const;
|
||||
bool IsDefinitelyOpaque(EWhichModel);
|
||||
bool GetIsLoop() const;
|
||||
float GetAnimationDuration(int) const;
|
||||
void EnableLooping(bool);
|
||||
@@ -123,13 +123,13 @@ public:
|
||||
bool IsAnimating() const;
|
||||
bool IsInFrustum(const zeus::CTransform& xf, const CFrustumPlanes& frustum) const;
|
||||
void RenderParticles(const CFrustumPlanes& frustum) const;
|
||||
void Touch(EWhichModel, int shaderIdx) const;
|
||||
void Touch(const CStateManager& stateMgr, int shaderIdx) const;
|
||||
void RenderThermal(const zeus::CTransform& xf, const zeus::CColor& a, const zeus::CColor& b) const;
|
||||
void Touch(EWhichModel, int shaderIdx);
|
||||
void Touch(const CStateManager& stateMgr, int shaderIdx);
|
||||
void RenderThermal(const zeus::CTransform& xf, const zeus::CColor& a, const zeus::CColor& b);
|
||||
void RenderUnsortedParts(EWhichModel, const zeus::CTransform& xf,
|
||||
const CActorLights* lights, const CModelFlags& drawFlags) const;
|
||||
const CActorLights* lights, const CModelFlags& drawFlags);
|
||||
void Render(EWhichModel, const zeus::CTransform& xf,
|
||||
const CActorLights* lights, const CModelFlags& drawFlags) const;
|
||||
const CActorLights* lights, const CModelFlags& drawFlags);
|
||||
|
||||
CAnimData* AnimationData() { return x10_animData.get(); }
|
||||
bool IsNull() { return !x10_animData && !x1c_normalModel; }
|
||||
|
||||
@@ -16,6 +16,8 @@ public:
|
||||
CAnimPerSegmentData x4_segData[100];
|
||||
void Add(const CSegIdList& list, const CCharLayoutInfo& layout,
|
||||
const CSegStatementSet& other, float weight);
|
||||
|
||||
CAnimPerSegmentData& operator[](size_t idx) { return x4_segData[idx]; }
|
||||
};
|
||||
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user