Files

254 lines
11 KiB
C++
Raw Permalink Normal View History

#ifndef _CANIMDATA
#define _CANIMDATA
2022-08-12 21:26:00 -04:00
#include "types.h"
#include "Kyoto/Animation/CBoolPOINode.hpp"
#include "Kyoto/Animation/CCharacterInfo.hpp"
#include "Kyoto/Animation/CInt32POINode.hpp"
#include "Kyoto/Animation/CParticlePOINode.hpp"
#include "Kyoto/Animation/CSoundPOINode.hpp"
2022-11-11 16:51:34 +02:00
#include "MetroidPrime/ActorCommon.hpp"
#include "MetroidPrime/CAdditiveAnimPlayback.hpp"
#include "MetroidPrime/CAnimPlaybackParms.hpp"
#include "MetroidPrime/CHierarchyPoseBuilder.hpp"
#include "MetroidPrime/CParticleDatabase.hpp"
#include "MetroidPrime/CPoseAsTransforms.hpp"
#include "Kyoto/Animation/CCharAnimTime.hpp"
2026-01-06 21:13:12 -08:00
#include "Kyoto/Animation/CCharLayoutInfo.hpp"
2022-09-13 00:26:54 -04:00
#include "Kyoto/Animation/CSkinnedModel.hpp"
2022-09-18 02:05:46 -04:00
#include "Kyoto/TToken.hpp"
#include "rstl/reserved_vector.hpp"
2022-12-01 15:45:36 +02:00
#include "rstl/set.hpp"
class CAnimationManager;
class CAnimSysContext;
class CAnimTreeNode;
class CCharacterFactory;
class CCharLayoutInfo;
class CRandom16;
class CSegIdList;
class CSegStatementSet;
class CSkinnedModel;
class CSkinnedModelWithAvgNormals;
class CTransitionManager;
2022-11-25 14:41:28 +02:00
class CVertexMorphEffect;
class CModelFlags;
2022-12-01 15:45:36 +02:00
class CPrimitive;
class CFrustumPlanes;
struct SAdvancementDeltas;
struct SAdvancementResults;
2022-08-12 21:26:00 -04:00
class CAnimData {
public:
enum EAnimDir {
kAD_Forward,
kAD_Backward,
};
CAnimData(uint, const CCharacterInfo&, int, int, bool, const TLockedToken< CCharLayoutInfo >&,
const TToken< CSkinnedModel >&, const rstl::optional_object< TLockedToken< CSkinnedModelWithAvgNormals > >&,
const rstl::ncrc_ptr< CAnimSysContext >&, const rstl::rc_ptr< CAnimationManager >&,
const rstl::rc_ptr< CTransitionManager >&, const TLockedToken< CCharacterFactory >&);
~CAnimData();
2022-08-15 22:14:28 -04:00
void PreRender();
void EnableLooping(bool v) {
x220_25_loop = v;
x220_24_animating = true;
}
2022-11-11 16:51:34 +02:00
2022-11-25 14:41:28 +02:00
const TLockedToken< CSkinnedModel >& GetModelData() const { return xd8_modelData; }
2022-09-18 02:05:46 -04:00
void SetIsAnimating(bool v) { x220_24_animating = v; }
void SetParticleEffectState(const rstl::string& name, bool active, CStateManager& mgr);
2026-03-19 20:55:56 -06:00
CAssetId GetSelfId() const { return x1d8_selfId; }
int GetCharacterIndex() const { return x204_charIdx; }
2022-10-09 01:37:23 -04:00
float GetAverageVelocity(int idx) const;
const CBoolPOINode* GetBoolPOIList(int& count) const {
count = x20c_passedBoolCount;
return mBoolPOINodes.data();
}
const CInt32POINode* GetInt32POIList(int& count) const {
count = x210_passedIntCount;
return mInt32POINodes.data();
}
const CParticlePOINode* GetParticlePOIList(int& count) const {
count = x214_passedParticleCount;
return mParticlePOINodes.data();
}
const CSoundPOINode* GetSoundPOIList(int& count) const {
count = x218_passedSoundCount;
return mSoundPOINodes.data();
}
2022-09-13 00:26:54 -04:00
CParticleDatabase& GetParticleDB() { return x120_particleDB; }
const CParticleDatabase& GetParticleDB() const { return x120_particleDB; }
// SetIsAnimating__9CAnimDataFb
// SetAnimDir__9CAnimDataFQ29CAnimData8EAnimDir
2022-12-05 23:35:31 +02:00
CAABox GetBoundingBox() const;
CAABox GetBoundingBox(const CTransform4f& xf) const;
CSegId GetLocatorSegId(const rstl::string& name) const;
void ResetPOILists();
// GetAverageVelocity__9CAnimDataCFi
void AdvanceParticles(const CTransform4f&, float, const CVector3f&, CStateManager&);
void PoseSkinnedModel(const CSkinnedModel&, const CPoseAsTransforms&,
const rstl::optional_object< CVertexMorphEffect >&, const float*) const;
void DrawSkinnedModel(const CSkinnedModel&, const CModelFlags&) const;
// InitializeCache__9CAnimDataFv
// FreeCache__9CAnimDataFv
void SetInfraModel(const TLockedToken< CModel >&, const TLockedToken< CSkinRules >&);
void SetXRayModel(const TLockedToken< CModel >&, const TLockedToken< CSkinRules >&);
void SubstituteModelData(const TCachedToken< CSkinnedModel >&);
void AdvanceAnim(CCharAnimTime&, CVector3f&, CQuaternion&);
SAdvancementDeltas Advance(float, const CVector3f&, CStateManager&, TAreaId, bool);
SAdvancementDeltas AdvanceIgnoreParticles(float, CRandom16&, bool);
SAdvancementDeltas DoAdvance(float, bool&, CRandom16&, bool);
2026-02-04 15:15:59 -08:00
void SetAnimation(const CAnimPlaybackParms& parms, const bool noTrans);
2022-12-01 15:45:36 +02:00
void GetAnimationPrimitives(const CAnimPlaybackParms& parms,
rstl::set< CPrimitive >& primsOut) const;
static void PrimitiveSetToTokenVector(const rstl::set< CPrimitive >&,
rstl::vector< CToken >&, bool);
void BuildPose();
// PreRender__9CAnimDataFv
void SetupRender(const CSkinnedModel&, const rstl::optional_object< CVertexMorphEffect >&,
const float*) const;
// Render__9CAnimDataCFRC13CSkinnedModelRC11CModelFlagsRCQ24rstl37optional_object<18CVertexMorphEffect>PCf
2022-12-07 01:14:03 -05:00
void Render(const CSkinnedModel&, const CModelFlags&,
const rstl::optional_object< CVertexMorphEffect >&, const float*) const;
void RenderAuxiliary(const CFrustumPlanes&) const;
void RecalcPoseBuilder(const CCharAnimTime*) const;
float GetAnimationDuration(int animIn) const;
2023-02-05 11:12:46 -08:00
float GetAnimTimeRemaining(const rstl::string& name) const;
// IsAnimTimeRemaining__9CAnimDataCFfRCQ24rstl66basic_string<c,Q24rstl14char_traits<c>,Q24rstl17rmemory_allocator>
2022-10-06 23:34:27 +03:00
bool IsAnimTimeRemaining(float, const rstl::string&) const;
CTransform4f GetLocatorTransform(const rstl::string&, const CCharAnimTime*) const;
CTransform4f GetLocatorTransform(CSegId, const CCharAnimTime*) const;
void CalcPlaybackAlignmentParms(const CAnimPlaybackParms&, const rstl::ncrc_ptr< CAnimTreeNode >&);
void SetRandomPlaybackRate(CRandom16& random);
void SetPlaybackRate(float set);
2022-10-20 08:43:17 -07:00
void MultiplyPlaybackRate(float scale);
2022-11-11 16:51:34 +02:00
CCharAnimTime GetTimeOfUserEvent(EUserEventType type, const CCharAnimTime& time) const;
// GetAdvancementDeltas__9CAnimDataCFRC13CCharAnimTimeRC13CCharAnimTime
void Touch(const CSkinnedModel&, int) const;
2023-10-19 18:51:57 -04:00
void InitializeEffects(CStateManager&, TAreaId, const CVector3f&);
// SetPhase__9CAnimDataFf -> SetPhase__11IAnimReaderFf
void SetPhase(float ph);
void AddAdditiveAnimation(uint idx, float weight, bool active, bool fadeOut);
2022-10-28 15:33:10 +03:00
void DelAdditiveAnimation(uint idx);
2022-11-11 01:23:57 +02:00
bool IsAdditiveAnimation(uint idx) const;
2022-11-11 16:51:34 +02:00
const rstl::rc_ptr< CAnimTreeNode >& GetAdditiveAnimationTree(uint idx) const;
const rstl::ncrc_ptr< CAnimTreeNode >& GetRootAnimationTree() const;
// GetAnimationTree__9CAnimDataCFv
// AnimationTree__9CAnimDataFv
// IsAdditiveAnimation__9CAnimDataCFUi
2022-10-28 15:33:10 +03:00
bool IsAdditiveAnimationAdded(uint idx) const;
SAdvancementDeltas UpdateAdditiveAnims(float);
SAdvancementDeltas AdvanceAdditiveAnims(float);
static SAdvancementResults AdvanceAdditiveAnim(rstl::rc_ptr< CAnimTreeNode >&,
const CCharAnimTime&);
void AddAdditiveSegData(const CSegIdList&, CSegStatementSet&) const;
2022-12-01 15:45:36 +02:00
int GetEventResourceIdForAnimResourceId(int id) const;
rstl::rc_ptr< CAnimationManager > GetAnimationManager();
// SetPoseValid__9CAnimDataFb
2022-11-10 20:50:42 +02:00
float GetAdditiveAnimationWeight(uint idx);
short GetCurrentAnimation() const { return x208_currentAnim; }
2022-10-07 00:07:41 +03:00
const CCharacterInfo& GetCharacterInfo() const { return xc_charInfo; }
2026-01-06 21:13:12 -08:00
const CCharLayoutInfo* GetCharLayoutInfo() const { return *xcc_layoutData; }
// GetDeltaRotation__9CAnimDataCFv
// GetDeltaOffset__9CAnimDataCFv
// IsDeltaOffsetInUse__9CAnimDataCFv
// GetAdvancementDeltas__19CAdvancementResultsCFv
// SetDeltaRotation__9CAnimDataFRC11CQuaternionb
// SetDeltaOffset__9CAnimDataFRC9CVector3fb
// SetDeltaOffsetInUse__9CAnimDataFv
// IsDeltaRotationInUse__9CAnimDataCFv
// IsDeltaOffsetPrimed__9CAnimDataCFv
// GetAnimDir__9CAnimDataCFv
// GetIsLoop__9CAnimDataCFv
// IsAnimating__9CAnimDataCFv
// SetPoseBuilderValid__9CAnimDataFb
rstl::rc_ptr< CAnimationManager > GetAnimationManager() const;
// GetPoseValid__9CAnimDataCFv
// GetPoseBuilderValid__9CAnimDataCFv
rstl::ncrc_ptr< CAnimSysContext > GetAnimSysContext() const;
// CacheInt32PoiList__9CAnimDataFRC13CCharAnimTimeiRCQ24rstl25ncrc_ptr<13CAnimTreeNode>
const rstl::optional_object< TLockedToken< CSkinnedModelWithAvgNormals > >& GetIceModel() const { return xe4_iceModelData; }
2023-02-05 11:12:46 -08:00
const CPASDatabase& GetPASDatabase() const { return xc_charInfo.GetPASDatabase(); }
// EnableLooping__9CAnimDataFb
// GetSkinnedModel__9CAnimDataCFv
// GetXRayModel__9CAnimDataCFv
// GetInfraModel__9CAnimDataCFv
// GetPose__9CAnimDataCFv
// PoseBuilder__9CAnimDataCFv
// GetPlaybackRate__9CAnimDataCFv
// Pose__9CAnimDataFv
// GetPoseBuilder__9CAnimDataCFv
// CacheSoundPoiList__9CAnimDataFRCQ24rstl25ncrc_ptr<13CAnimTreeNode>RC13CCharAnimTimei
// CacheParticlePoiList__9CAnimDataFRCQ24rstl25ncrc_ptr<13CAnimTreeNode>RC13CCharAnimTimei
// CacheBoolPoiList__9CAnimDataFRCQ24rstl25ncrc_ptr<13CAnimTreeNode>RC13CCharAnimTimei
// CacheInt32PoiList__9CAnimDataFRCQ24rstl25ncrc_ptr<13CAnimTreeNode>RC13CCharAnimTimei
2026-01-06 15:19:27 -08:00
void SetParticleLightIdx(int lightIdx) { x21c_particleLightIdx = lightIdx; }
2022-09-13 00:26:54 -04:00
static void InitializeCache();
static void FreeCache();
private:
TLockedToken< CCharacterFactory > x0_charFactory;
CCharacterInfo xc_charInfo;
TLockedToken< CCharLayoutInfo > xcc_layoutData;
TLockedToken< CSkinnedModel > xd8_modelData;
rstl::optional_object< TLockedToken< CSkinnedModelWithAvgNormals > > xe4_iceModelData;
rstl::rc_ptr< CSkinnedModel > xf4_xrayModel;
rstl::rc_ptr< CSkinnedModel > xf8_infraModel;
rstl::ncrc_ptr< CAnimSysContext > xfc_animCtx;
rstl::rc_ptr< CAnimationManager > x100_animMgr;
EAnimDir x104_animDir;
CAABox x108_aabb;
CParticleDatabase x120_particleDB;
CAssetId x1d8_selfId;
CVector3f x1dc_alignPos;
CQuaternion x1e8_alignRot;
rstl::ncrc_ptr< CAnimTreeNode > x1f8_animRoot;
rstl::rc_ptr< CTransitionManager > x1fc_transMgr;
2022-10-09 01:37:23 -04:00
float x200_speedScale;
int x204_charIdx;
short x208_currentAnim;
2022-10-09 01:37:23 -04:00
short x20a_padding;
int x20c_passedBoolCount;
int x210_passedIntCount;
int x214_passedParticleCount;
int x218_passedSoundCount;
int x21c_particleLightIdx;
2022-10-09 01:37:23 -04:00
uchar x220_24_animating : 1;
uchar x220_25_loop : 1;
uchar x220_26_aligningPos : 1;
uchar x220_27_ : 1;
uchar x220_28_ : 1;
uchar x220_29_animationJustStarted : 1;
uchar x220_30_poseBuilt : 1;
uchar x220_31_poseCached : 1;
CPoseAsTransforms x224_pose;
CHierarchyPoseBuilder x2fc_poseBuilder;
CAnimPlaybackParms x40c_playbackParms;
rstl::reserved_vector< rstl::pair< uint, CAdditiveAnimPlayback >, 8 > x434_additiveAnims;
static rstl::reserved_vector< CBoolPOINode, 8 > mBoolPOINodes;
static rstl::reserved_vector< CInt32POINode, 16 > mInt32POINodes;
static rstl::reserved_vector< CParticlePOINode, 20 > mParticlePOINodes;
static rstl::reserved_vector< CSoundPOINode, 20 > mSoundPOINodes;
// in cpp -> rstl::reserved_vector< CInt32POINode, 16 > sInt32TransientCache;
2022-08-12 21:26:00 -04:00
};
CHECK_SIZEOF(CAnimData, 0x434 + 0x144)
2022-08-12 21:26:00 -04:00
#endif // _CANIMDATA