New Super Mario Bros. U Headers
Loading...
Searching...
No Matches
AnimModel.h
Go to the documentation of this file.
1#pragma once
2
3#include <graphics/Model.h>
4#include <graphics/ModelResourceMgr.h>
5#include <graphics/Renderer.h>
6#include <graphics/SkeletalAnimation.h>
7#include <graphics/TexturePatternAnimation.h>
8#include <graphics/ShaderParamAnimation.h>
9#include <graphics/VisibilityAnimation.h>
10#include <graphics/ShapeAnimation.h>
11
12#include <container/seadBuffer.h>
13#include <container/seadPtrArray.h>
14#include <heap/seadHeap.h>
15
16class ModelResource;
17
19{
20public:
21 static AnimModel* create(
22 ModelResource* mdl_res,
23 Model* model,
24 s32 skl_anim_num, s32 tex_anim_num, s32 shu_anim_num, s32 vis_anim_num, s32 sha_anim_num,
25 sead::Heap* heap = nullptr,
26 const sead::PtrArray<ModelResource>* anim_mdl_res_array = nullptr
27 );
28
29 static AnimModel* create(
30 ModelResource* mdl_res,
31 const sead::SafeString& name,
32 s32 skl_anim_num, s32 tex_anim_num, s32 shu_anim_num, s32 vis_anim_num, s32 sha_anim_num,
33 Model::BoundingMode bounding_mode = Model::cBoundingMode_Disable,
34 sead::Heap* heap = nullptr,
35 const sead::PtrArray<ModelResource>* anim_mdl_res_array = nullptr
36 );
37
38 static AnimModel* create(
39 ModelResource* mdl_res,
40 const sead::SafeString& name,
41 s32 view_num,
42 s32 skl_anim_num, s32 tex_anim_num, s32 shu_anim_num, s32 vis_anim_num, s32 sha_anim_num,
43 Model::BoundingMode bounding_mode,
44 sead::Heap* heap = nullptr,
45 const sead::PtrArray<ModelResource>* anim_mdl_res_array = nullptr
46 );
47
48 static AnimModel* create(
49 const sead::SafeString& resource_key,
50 const sead::SafeString& name,
51 s32 skl_anim_num = 0, s32 tex_anim_num = 0, s32 shu_anim_num = 0, s32 vis_anim_num = 0, s32 sha_anim_num = 0,
52 Model::BoundingMode bounding_mode = Model::cBoundingMode_Disable,
53 sead::Heap* heap = nullptr,
54 const sead::PtrArray<ModelResource>* anim_mdl_res_array = nullptr
55 );
56
57 static AnimModel* create(
58 const sead::SafeString& resource_key,
59 const sead::SafeString& name,
60 s32 view_num,
61 s32 skl_anim_num, s32 tex_anim_num, s32 shu_anim_num, s32 vis_anim_num, s32 sha_anim_num,
62 Model::BoundingMode bounding_mode,
63 sead::Heap* heap = nullptr,
64 const sead::PtrArray<ModelResource>* anim_mdl_res_array = nullptr
65 );
66
67 static void destroy(
68 AnimModel*& anim_model
69 );
70
71public:
72 // Address: 0x024D4798
73 AnimModel(Model* model, s32 skl_anim_num, s32 tex_anim_num, s32 shu_anim_num, s32 vis_anim_num, s32 sha_anim_num);
74
75 Model* getModel() const { return mModel; }
77
78 void draw() const { Renderer::instance()->drawModel(this); }
79 void setBaseModelMtx(const sead::Matrix34f& rt) { mModel->setBaseModelMtx(rt); }
80 void setLocalScale(const sead::Vector3f& scale) { mModel->setLocalScale(scale); }
81
82 void update(const sead::Vector3f& pos, const sead::Vector3u& rot, const sead::Vector3f& scale, bool animate = true)
83 {
84 sead::Matrix34f mtx;
85 mtx.makeRTIdx(rot, pos);
86 setBaseModelMtx(mtx);
87 setLocalScale(scale);
88 calc();
89
90 if (animate)
92 }
93
94 SkeletalAnimation* getSklAnim(u32 index) const { return mSklAnim[index]; }
95 TexturePatternAnimation* getTexAnim(u32 index) const { return mTexAnim[index]; }
96 ShaderParamAnimation* getShuAnim(u32 index) const { return mShuAnim[index]; }
97 VisibilityAnimation* getVisAnim(u32 index) const { return mVisAnim[index]; }
98 ShapeAnimation* getShaAnim(u32 index) const { return mShaAnim[index]; }
99
100 void playSklAnim(const sead::SafeString& name, u32 idx = 0) { mSklAnim[idx]->play(mModelResource, name); }
101 void playTexAnim(const sead::SafeString& name, u32 idx = 0) { mTexAnim[idx]->play(mModelResource, name); }
102 void playColorAnim(const sead::SafeString& name, u32 idx = 0) { mShuAnim[idx]->playColorAnim(mModelResource, name); }
103 void playTexSrtAnim(const sead::SafeString& name, u32 idx = 0) { mShuAnim[idx]->playTexSrtAnim(mModelResource, name); }
104 void playBoneVisAnim(const sead::SafeString& name, u32 idx = 0) { mVisAnim[idx]->playBoneVisAnim(mModelResource, name); }
105 void playMatVisAnim(const sead::SafeString& name, u32 idx = 0) { mVisAnim[idx]->playMatVisAnim(mModelResource, name); }
106 void playShapeAnim(const sead::SafeString& name, u32 idx = 0) { mShaAnim[idx]->play(mModelResource, name); }
107
108 // Address: 0x024D49A0
109 void init(ModelResource* mdl_res, const sead::PtrArray<ModelResource>* anim_mdl_res_array = nullptr, sead::Heap* heap = nullptr);
110
111 // Progress frame counters for all bound animations
112 // Address: 0x024D4D20
114
115 // Apply animations & do world-space calculations
116 // Note: "playAnmFrameCtrl" should be called at some point before this function
117 // Address: 0x024D4E84
118 void calc();
119
120private:
128};
129static_assert(sizeof(AnimModel) == 0x30);
130
131inline AnimModel* AnimModel::create(
132 ModelResource* mdl_res,
133 Model* model,
134 s32 skl_anim_num, s32 tex_anim_num, s32 shu_anim_num, s32 vis_anim_num, s32 sha_anim_num,
135 sead::Heap* heap,
136 const sead::PtrArray<ModelResource>* anim_mdl_res_array
137)
138{
139 AnimModel* anim_model = new (heap) AnimModel(model, skl_anim_num, tex_anim_num, shu_anim_num, vis_anim_num, sha_anim_num);
140 anim_model->init(mdl_res, anim_mdl_res_array, heap);
141 return anim_model;
142}
143
144inline AnimModel* AnimModel::create(
145 ModelResource* mdl_res,
146 const sead::SafeString& name,
147 s32 skl_anim_num, s32 tex_anim_num, s32 shu_anim_num, s32 vis_anim_num, s32 sha_anim_num,
148 Model::BoundingMode bounding_mode,
149 sead::Heap* heap,
150 const sead::PtrArray<ModelResource>* anim_mdl_res_array
151)
152{
153 Model* model = ModelUtil::createG3d(*mdl_res, name, skl_anim_num, tex_anim_num, shu_anim_num, vis_anim_num, sha_anim_num, bounding_mode, heap);
154 return create(mdl_res, model, skl_anim_num, tex_anim_num, shu_anim_num, vis_anim_num, sha_anim_num, heap, anim_mdl_res_array);
155}
156
157inline AnimModel* AnimModel::create(
158 ModelResource* mdl_res,
159 const sead::SafeString& name,
160 s32 view_num,
161 s32 skl_anim_num, s32 tex_anim_num, s32 shu_anim_num, s32 vis_anim_num, s32 sha_anim_num,
162 Model::BoundingMode bounding_mode,
163 sead::Heap* heap,
164 const sead::PtrArray<ModelResource>* anim_mdl_res_array
165)
166{
167 Model* model = ModelUtil::createG3d(*mdl_res, name, view_num, skl_anim_num, tex_anim_num, shu_anim_num, vis_anim_num, sha_anim_num, bounding_mode, heap);
168 return create(mdl_res, model, skl_anim_num, tex_anim_num, shu_anim_num, vis_anim_num, sha_anim_num, heap, anim_mdl_res_array);
169}
170
171inline AnimModel* AnimModel::create(
172 const sead::SafeString& resource_key,
173 const sead::SafeString& name,
174 s32 skl_anim_num, s32 tex_anim_num, s32 shu_anim_num, s32 vis_anim_num, s32 sha_anim_num,
175 Model::BoundingMode bounding_mode,
176 sead::Heap* heap,
177 const sead::PtrArray<ModelResource>* anim_mdl_res_array
178)
179{
180 ModelResource* mdl_res = ModelResourceMgr::instance()->getResource(resource_key);
181 return create(mdl_res, name, skl_anim_num, tex_anim_num, shu_anim_num, vis_anim_num, sha_anim_num, bounding_mode, heap, anim_mdl_res_array);
182}
183
184inline AnimModel* AnimModel::create(
185 const sead::SafeString& resource_key,
186 const sead::SafeString& name,
187 s32 view_num,
188 s32 skl_anim_num, s32 tex_anim_num, s32 shu_anim_num, s32 vis_anim_num, s32 sha_anim_num,
189 Model::BoundingMode bounding_mode,
190 sead::Heap* heap,
191 const sead::PtrArray<ModelResource>* anim_mdl_res_array
192)
193{
194 ModelResource* mdl_res = ModelResourceMgr::instance()->getResource(resource_key);
195 return create(mdl_res, name, view_num, skl_anim_num, tex_anim_num, shu_anim_num, vis_anim_num, sha_anim_num, bounding_mode, heap, anim_mdl_res_array);
196}
197
198inline void AnimModel::destroy(
199 AnimModel*& anim_model
200)
201{
202 if (anim_model != nullptr)
203 {
204 Model* model = anim_model->getModel();
205
206 // TODO: This function may not be worth it,
207 // since a lot of resources would need to be freed manually
208 // for perfectly isolated destruction
209 // (It's more worthwhile to make proper use of sead heaps)
210
211 delete anim_model;
212 anim_model = nullptr;
213
214 delete model;
215 }
216}
Definition AnimModel.h:19
AnimModel(Model *model, s32 skl_anim_num, s32 tex_anim_num, s32 shu_anim_num, s32 vis_anim_num, s32 sha_anim_num)
ModelResource * mModelResource
Definition AnimModel.h:122
static void destroy(AnimModel *&anim_model)
Definition AnimModel.h:198
sead::Buffer< TexturePatternAnimation * > mTexAnim
Definition AnimModel.h:124
void playShapeAnim(const sead::SafeString &name, u32 idx=0)
Definition AnimModel.h:106
VisibilityAnimation * getVisAnim(u32 index) const
Definition AnimModel.h:97
sead::Buffer< VisibilityAnimation * > mVisAnim
Definition AnimModel.h:126
static AnimModel * create(ModelResource *mdl_res, Model *model, s32 skl_anim_num, s32 tex_anim_num, s32 shu_anim_num, s32 vis_anim_num, s32 sha_anim_num, sead::Heap *heap=nullptr, const sead::PtrArray< ModelResource > *anim_mdl_res_array=nullptr)
Definition AnimModel.h:131
void playColorAnim(const sead::SafeString &name, u32 idx=0)
Definition AnimModel.h:102
void init(ModelResource *mdl_res, const sead::PtrArray< ModelResource > *anim_mdl_res_array=nullptr, sead::Heap *heap=nullptr)
void playBoneVisAnim(const sead::SafeString &name, u32 idx=0)
Definition AnimModel.h:104
void draw() const
Definition AnimModel.h:78
void calc()
sead::Buffer< ShaderParamAnimation * > mShuAnim
Definition AnimModel.h:125
static AnimModel * create(const sead::SafeString &resource_key, const sead::SafeString &name, s32 skl_anim_num=0, s32 tex_anim_num=0, s32 shu_anim_num=0, s32 vis_anim_num=0, s32 sha_anim_num=0, Model::BoundingMode bounding_mode=Model::cBoundingMode_Disable, sead::Heap *heap=nullptr, const sead::PtrArray< ModelResource > *anim_mdl_res_array=nullptr)
Definition AnimModel.h:171
void playMatVisAnim(const sead::SafeString &name, u32 idx=0)
Definition AnimModel.h:105
ModelResource * getModelResource() const
Definition AnimModel.h:76
sead::Buffer< ShapeAnimation * > mShaAnim
Definition AnimModel.h:127
ShapeAnimation * getShaAnim(u32 index) const
Definition AnimModel.h:98
TexturePatternAnimation * getTexAnim(u32 index) const
Definition AnimModel.h:95
sead::Buffer< SkeletalAnimation * > mSklAnim
Definition AnimModel.h:123
Model * getModel() const
Definition AnimModel.h:75
SkeletalAnimation * getSklAnim(u32 index) const
Definition AnimModel.h:94
void playTexSrtAnim(const sead::SafeString &name, u32 idx=0)
Definition AnimModel.h:103
void playAnmFrameCtrl()
Model * mModel
Definition AnimModel.h:121
static AnimModel * create(ModelResource *mdl_res, const sead::SafeString &name, s32 skl_anim_num, s32 tex_anim_num, s32 shu_anim_num, s32 vis_anim_num, s32 sha_anim_num, Model::BoundingMode bounding_mode=Model::cBoundingMode_Disable, sead::Heap *heap=nullptr, const sead::PtrArray< ModelResource > *anim_mdl_res_array=nullptr)
Definition AnimModel.h:144
void update(const sead::Vector3f &pos, const sead::Vector3u &rot, const sead::Vector3f &scale, bool animate=true)
Definition AnimModel.h:82
static AnimModel * create(ModelResource *mdl_res, const sead::SafeString &name, s32 view_num, s32 skl_anim_num, s32 tex_anim_num, s32 shu_anim_num, s32 vis_anim_num, s32 sha_anim_num, Model::BoundingMode bounding_mode, sead::Heap *heap=nullptr, const sead::PtrArray< ModelResource > *anim_mdl_res_array=nullptr)
Definition AnimModel.h:157
ShaderParamAnimation * getShuAnim(u32 index) const
Definition AnimModel.h:96
void setBaseModelMtx(const sead::Matrix34f &rt)
Definition AnimModel.h:79
void playTexAnim(const sead::SafeString &name, u32 idx=0)
Definition AnimModel.h:101
void playSklAnim(const sead::SafeString &name, u32 idx=0)
Definition AnimModel.h:100
static AnimModel * create(const sead::SafeString &resource_key, const sead::SafeString &name, s32 view_num, s32 skl_anim_num, s32 tex_anim_num, s32 shu_anim_num, s32 vis_anim_num, s32 sha_anim_num, Model::BoundingMode bounding_mode, sead::Heap *heap=nullptr, const sead::PtrArray< ModelResource > *anim_mdl_res_array=nullptr)
Definition AnimModel.h:184
void setLocalScale(const sead::Vector3f &scale)
Definition AnimModel.h:80
Definition ModelResource.h:13