New Super Mario Bros. U Headers
Loading...
Searching...
No Matches
ModelG3d.h
Go to the documentation of this file.
1#pragma once
2
3#include <graphics/LightMapMgr.h>
4#include <graphics/MaterialG3d.h>
5#include <graphics/Model.h>
6#include <graphics/ShaderParamAnimation.h>
7#include <graphics/ShapeAnimation.h>
8#include <graphics/SkeletalAnimation.h>
9#include <graphics/TexturePatternAnimation.h>
10#include <graphics/VisibilityAnimation.h>
11
12#include <common/aglDisplayList.h>
13#include <common/aglShaderProgramArchive.h>
14#include <common/aglUniformBlock.h>
15#include <container/seadBuffer.h>
16#include <container/seadPtrArray.h>
17#include <container/seadSafeArray.h>
18#include <g3d/aglModelEx.h>
19#include <math/seadBoundBox.h>
20
21#include <nw/g3d/g3d_SkeletalAnimObj.h>
22#include <nw/g3d/g3d_ShapeObj.h>
23
24class CullViewFrustum;
25
26class ModelG3d : public Model // vtbl Address: 0x100BCF30
27{
28 // getRuntimeTypeInfoStatic()::typeInfo initialization guard variable Address: 0x101E9F78
29 // getRuntimeTypeInfoStatic()::typeInfo Address: 0x101E9FA0
30 SEAD_RTTI_OVERRIDE(ModelG3d, Model)
31
32public:
70 static_assert(sizeof(ShaderAssign) == 0x64);
71
81 static_assert(sizeof(ShapeRenderInfo) == 0x30);
82
83 struct LightMap
84 {
85 void clear()
86 {
87 sead::MemUtil::fill(idx_lghtmap, u8(-1), sizeof(idx_lghtmap));
88 sead::MemUtil::fill(idx_sampler, u8(-1), sizeof(idx_sampler));
89 }
90
93 };
94 static_assert(sizeof(LightMap) == 0x10);
95
102 static_assert(sizeof(Shape) == 0x2C);
103
118 static_assert(sizeof(DrawInfo) == 0x28);
119
126 static_assert(cSamplerSlot_ReflectionMap == 14);
127
128private:
130 {
131 public:
133 {
135 }
136
137 void set(s32 index, bool enable)
138 {
139 if (index >= 32*10)
140 return;
141
142 if (enable)
143 mBuffer[index >> 5] |= 1 << (index & 0x1f);
144 else
145 mBuffer[index >> 5] &= ~(1 << (index & 0x1f));
146 }
147
148 bool get(s32 index) const
149 {
150 return mBuffer[index >> 5] & 1 << (index & 0x1f);
151 }
152
153 bool any() const
154 {
155 for (s32 i = 0; i < 10; i++)
156 if (mBuffer[i] != 0)
157 return true;
158
159 return false;
160 }
161
162 void setAll()
163 {
164 // ???
165 sead::MemUtil::fill(mBuffer.getBufferPtr(), u8(-1), sizeof(sead::BitFlag32) * 9);
166 // ??????
167 mBuffer[9] = u32(-1);
168 }
169
170 void resetAll()
171 {
172 sead::MemUtil::fillZero(mBuffer.getBufferPtr(), sizeof(mBuffer));
173 }
174
175 private:
177 };
178 static_assert(sizeof(BoundingFlagArray) == 0x28);
179
180public:
181 // Address: 0x024F301C
182 // Calculates the drawing resources for skeleton matrices, shapes and materials
184
185 // Address: 0x024F30DC
186 // Updates buffers for the GPU
187 void calcGPU(s32 view_index, const sead::Matrix34f& view_mtx, const sead::Matrix44f& proj_mtx, RenderObjRenderMgr* render_mgr) override;
188
189 // (Does nothing)
190 void updateView(s32 view_index, const sead::Matrix34f& view_mtx, const sead::Matrix44f& proj_mtx, RenderObjRenderMgr* render_mgr) override
191 {
192 }
193
194 ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
195
196 // Notes:
197 // 1. Shadow-only shapes and reflection-only shapes are always invisible
198 // 2. Shadow casting for a shape is automatically enabled if "shadow_cast" is not present in its material's render info
199
200 // Address: 0x024F3884
201 void drawOpa(s32 view_index, const sead::Matrix34f& view_mtx, const sead::Matrix44f& proj_mtx, RenderObjRenderMgr* render_mgr) override;
202 // Address: 0x024F398C
203 void drawXlu(s32 view_index, const sead::Matrix34f& view_mtx, const sead::Matrix44f& proj_mtx, RenderObjRenderMgr* render_mgr) override;
204
205 // Address: 0x024F3A94
206 // This draws the shadow of shadow-casting shapes
207 void drawShadowOpa(s32 view_index, const sead::Matrix34f& view_mtx, const sead::Matrix44f& proj_mtx, RenderObjRenderMgr* render_mgr) override;
208
209 // These draws the reflection on shapes
210 // Address: 0x024F3D64
211 void drawReflectionOpa(s32 view_index, const sead::Matrix34f& view_mtx, const sead::Matrix44f& proj_mtx, RenderObjRenderMgr* render_mgr) override;
212 // Address: 0x024F3E6C
213 void drawReflectionXlu(s32 view_index, const sead::Matrix34f& view_mtx, const sead::Matrix44f& proj_mtx, RenderObjRenderMgr* render_mgr) override;
214
215 ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
216
217 bool hasShadow() const override
218 {
219 return mShapeFlag.isOn(4);
220 }
221
222public:
223 // Address: 0x024F0800
225 // Address: 0x024F078C
226 virtual ~ModelG3d();
227
228 // Address: 0x024F4094
230 // Address: 0x024F4518
232
233 // Rotation + Translation matrix
234 void setMtxRT(const sead::Matrix34f& rt) override
235 {
236 mMtxRT = rt;
237 mBoundingEnableFlag.set(1 << 1);
238 }
239
240 const sead::Matrix34f& getMtxRT() const override
241 {
242 return mMtxRT;
243 }
244
245 void setScale(const sead::Vector3f& scale) override
246 {
247 mScale = scale;
248 mBoundingEnableFlag.set(1 << 1);
249 }
250
251 const sead::Vector3f& getScale() const override
252 {
253 return mScale;
254 }
255
256 // Address: 0x024F3F74
257 // Determines if there are any shapes that can be drawn by draw*Opa()
258 bool hasOpa() const override;
259 // Address: 0x024F3FD0
260 // Determines if there are any shapes that can be drawn by draw*Xlu()
261 bool hasXlu() const override;
262
263 // Address: 0x024F476C
264 s32 searchBoneIndex(const sead::SafeString& name) const override;
265 // Address: 0x024F47D8
266 const char* getBoneName(s32 index) const override;
267 // Address: 0x024F4820
268 u32 getBoneNum() const override;
269
270 // Address: 0x024F4628
271 void setBoneLocalMatrix(s32 index, const sead::Matrix34f& rt, const sead::Vector3f& scale) override;
272 // Address: 0x024F46A4
273 void getBoneLocalMatrix(s32 index, sead::Matrix34f* rt = nullptr, sead::Vector3f* scale = nullptr) const override;
274
275 // Address: 0x024F4724
276 void setBoneWorldMatrix(s32 index, const sead::Matrix34f& mtx) override;
277 // Address: 0x024F4748
278 void getBoneWorldMatrix(s32 index, sead::Matrix34f* mtx) const override;
279
280 // Address: 0x024F4B3C
281 void setBoneVisible(s32 index, bool visible) override;
282 // Address: Deleted
283 bool isBoneVisible(s32 index) const override;
284
285 // Address: 0x024F4A54
286 u32 getMaterialNum() const override;
287 // Address: 0x024F4A5C
288 s32 searchMaterialIndex(const sead::SafeString& name) const override;
289 // Address: 0x024F4AC8
290 const char* getMaterialName(s32 index) const override;
291
292 Material* getMaterial(s32 index) const override
293 {
294 return mMaterial[index];
295 }
296
297 // Address: 0x024F4B0C
298 void setMaterialVisible(s32 index, bool visible) override;
299 // Address: Deleted
300 bool isMaterialVisible(s32 index) const override;
301
302 void setBoundingEnable(bool enable) override // deleted
303 {
304 mBoundingEnableFlag.change(1 << 0, enable);
305 }
306
308 {
309 return mBoundingEnableFlag.isOn(1 << 0);
310 }
311
312 const sead::Sphere3f& getBounding() const override
313 {
314 return mBounding;
315 }
316
317 // Address: 0x024F4B6C
318 void calcViewShapeShadowFlags(agl::sdw::DepthShadow* depth_shadow, RenderObjLayerBase* shadow_layer, RenderObjRenderMgr* render_mgr) override;
319
320 sead::SafeString getName() const override
321 {
322 return mModelEx.GetResource()->GetName();
323 }
324
325 void setSklAnimBlendWeight(s32 index, f32 weight) override
326 {
327 mSklAnimBlendWeight[index] = weight;
328 }
329
330 f32 getSklAnimBlendWeight(s32 index) const override // deleted
331 {
332 return mSklAnimBlendWeight[index];
333 }
334
335 // Address: 0x024F4830
336 void setSklAnim(s32 index, Animation* anim) override;
337 // Address: 0x024F489C
338 void setTexAnim(s32 index, Animation* anim) override;
339 // Address: 0x024F4910
340 void setShuAnim(s32 index, Animation* anim) override;
341 // Address: 0x024F497C
342 void setVisAnim(s32 index, Animation* anim) override;
343 // Address: 0x024F49E8
344 void setShaAnim(s32 index, Animation* anim) override;
345
346private:
347 Animation* const* getSklAnims() const override
348 {
349 return reinterpret_cast<Animation* const*>(mSklAnim.getBufferPtr());
350 }
351
352 Animation* const* getTexAnims() const override
353 {
354 return reinterpret_cast<Animation* const*>(mTexAnim.getBufferPtr());
355 }
356
357 Animation* const* getShuAnims() const override
358 {
359 return reinterpret_cast<Animation* const*>(mShuAnim.getBufferPtr());
360 }
361
362 Animation* const* getVisAnims() const override
363 {
364 return reinterpret_cast<Animation* const*>(mVisAnim.getBufferPtr());
365 }
366
367 Animation* const* getShaAnims() const override
368 {
369 return reinterpret_cast<Animation* const*>(mShaAnim.getBufferPtr());
370 }
371
372public:
374 {
375 return const_cast<SkeletalAnimation**>(reinterpret_cast<SkeletalAnimation* const*>(getSklAnims()));
376 }
377
379 {
380 return const_cast<TexturePatternAnimation**>(reinterpret_cast<TexturePatternAnimation* const*>(getTexAnims()));
381 }
382
384 {
385 return const_cast<ShaderParamAnimation**>(reinterpret_cast<ShaderParamAnimation* const*>(getShuAnims()));
386 }
387
389 {
390 return const_cast<VisibilityAnimation**>(reinterpret_cast<VisibilityAnimation* const*>(getVisAnims()));
391 }
392
394 {
395 return const_cast<ShapeAnimation**>(reinterpret_cast<ShapeAnimation* const*>(getShaAnims()));
396 }
397
398public:
399 // Address: 0x024F1860
400 void initialize(nw::g3d::res::ResModel* res_model, const agl::ShaderProgramArchive* shader_archive, s32 num_view, s32 num_skl_anim, s32 num_tex_anim, s32 num_shu_anim, s32 num_vis_anim, s32 num_sha_anim, BoundingMode bounding_mode, sead::Heap* heap);
401
402 agl::g3d::ModelEx& getModelEx() { return mModelEx; }
403 const agl::g3d::ModelEx& getModelEx() const { return mModelEx; }
404
405 Shape& getShape(s32 index) { return mShape[index]; }
406 const Shape& getShape(s32 index) const { return mShape[index]; }
407
408 sead::BitFlag32& getRenderFlag() { return mRenderFlag; }
409 const sead::BitFlag32& getRenderFlag() const { return mRenderFlag; }
410
411 // Address: 0x024F0FE0
412 void activateMaterial(const agl::g3d::ModelShaderAssign& shader_assign, const nw::g3d::MaterialObj* material, const LightMap& light_map) const;
413
414 // Address: 0x024F50D8
416
417private:
418 // Address: 0x024F0B70
419 void createViewShapeShadowFlagBuffer_(s32 num_view, sead::Heap* heap);
420 // Address: 0x024F1098
421 void initializeShapeRenderInfo_(ShapeRenderInfo& render_info, const nw::g3d::MaterialObj* material, const nw::g3d::ShapeObj* shape);
422 // Address: 0x024F1850
424 // Address: 0x024F0C9C
426 // Address: 0x024F2CEC
427 void applyBlendWeight_(s32 shape_index);
428 // Address: 0x024F402C
429 static void setBoundingFlagArray_(BoundingFlagArray& flag_array, const SkeletalAnimation& anim);
430
431 // Address: 0x024F37B4
432 void drawOpa_(DrawInfo& draw_info, const RenderObjRenderMgr* render_mgr) const;
433 // Address: 0x024F381C
434 void drawXlu_(DrawInfo& draw_info, const RenderObjRenderMgr* render_mgr) const;
435
436 // Address: 0x024F30E8
437 void drawShape_(DrawInfo& draw_info, const ShapeRenderInfo& render_info, const RenderObjRenderMgr* render_mgr) const;
438
439private:
447 void* mBuffer;
465 sead::BitFlag32 mShapeFlag; // & 4: a shape has shadow cast, & 2: a shape has reflection, & 1: a shape is visible
470};
471static_assert(sizeof(ModelG3d) == 0x1AC);
Definition CullViewFrustum.h:16
Definition ModelG3d.h:130
bool get(s32 index) const
Definition ModelG3d.h:148
bool any() const
Definition ModelG3d.h:153
void setAll()
Definition ModelG3d.h:162
BoundingFlagArray()
Definition ModelG3d.h:132
sead::UnsafeArray< u32, 10 > mBuffer
Definition ModelG3d.h:176
void resetAll()
Definition ModelG3d.h:170
void set(s32 index, bool enable)
Definition ModelG3d.h:137
Definition ModelG3d.h:27
bool isBoundingEnable() const override
Definition ModelG3d.h:307
void createViewShapeShadowFlagBuffer_(s32 num_view, sead::Heap *heap)
void setSklAnim(s32 index, Animation *anim) override
void drawXlu_(DrawInfo &draw_info, const RenderObjRenderMgr *render_mgr) const
void drawReflectionXlu(s32 view_index, const sead::Matrix34f &view_mtx, const sead::Matrix44f &proj_mtx, RenderObjRenderMgr *render_mgr) override
void initializeShapeRenderInfo_(ShapeRenderInfo &render_info, const nw::g3d::MaterialObj *material, const nw::g3d::ShapeObj *shape)
void calcGPU(s32 view_index, const sead::Matrix34f &view_mtx, const sead::Matrix44f &proj_mtx, RenderObjRenderMgr *render_mgr) override
BoundingFlagArray mBoundingFlagArray
Definition ModelG3d.h:466
void setDisplayListDirty()
void setMtxRT(const sead::Matrix34f &rt) override
Definition ModelG3d.h:234
sead::BitFlag32 mRenderFlag
Definition ModelG3d.h:460
void drawShadowOpa(s32 view_index, const sead::Matrix34f &view_mtx, const sead::Matrix44f &proj_mtx, RenderObjRenderMgr *render_mgr) override
agl::g3d::ModelEx & getModelEx()
Definition ModelG3d.h:402
static s32 sortShapeRenderInfoCmp(const ShapeRenderInfo *a, const ShapeRenderInfo *b)
void setBoneVisible(s32 index, bool visible) override
void initialize(nw::g3d::res::ResModel *res_model, const agl::ShaderProgramArchive *shader_archive, s32 num_view, s32 num_skl_anim, s32 num_tex_anim, s32 num_shu_anim, s32 num_vis_anim, s32 num_sha_anim, BoundingMode bounding_mode, sead::Heap *heap)
sead::PtrArray< ShapeRenderInfo > mOpaShapeInfo
Definition ModelG3d.h:452
ShaderParamAnimation ** getShuAnimBuffer()
Definition ModelG3d.h:383
void applyBlendWeight_(s32 shape_index)
void setTexAnim(s32 index, Animation *anim) override
void setScale(const sead::Vector3f &scale) override
Definition ModelG3d.h:245
bool isBoneVisible(s32 index) const override
sead::BitFlag32 mViewDepthShadowEnableFlag
Definition ModelG3d.h:468
sead::Buffer< SkeletalAnimation * > mSklAnim
Definition ModelG3d.h:442
const char * getMaterialName(s32 index) const override
const sead::Vector3f & getScale() const override
Definition ModelG3d.h:251
Animation *const * getShuAnims() const override
Definition ModelG3d.h:357
sead::Sphere3f mBounding
Definition ModelG3d.h:463
const sead::Matrix34f & getMtxRT() const override
Definition ModelG3d.h:240
void setMaterialVisible(s32 index, bool visible) override
sead::Buffer< MaterialG3d * > mMaterial
Definition ModelG3d.h:455
bool hasOpa() const override
SkeletalAnimation ** getSklAnimBuffer()
Definition ModelG3d.h:373
bool hasShadow() const override
Definition ModelG3d.h:217
nw::g3d::SkeletalAnimBlender mSklAnimBlender
Definition ModelG3d.h:441
bool mDisplayListDirty
Definition ModelG3d.h:469
s32 searchMaterialIndex(const sead::SafeString &name) const override
void setBoneWorldMatrix(s32 index, const sead::Matrix34f &mtx) override
VisibilityAnimation ** getVisAnimBuffer()
Definition ModelG3d.h:388
void drawXlu(s32 view_index, const sead::Matrix34f &view_mtx, const sead::Matrix44f &proj_mtx, RenderObjRenderMgr *render_mgr) override
const sead::BitFlag32 & getRenderFlag() const
Definition ModelG3d.h:409
SamplerSlot
Definition ModelG3d.h:121
@ cSamplerSlot_ReflectionMap
Definition ModelG3d.h:123
@ cSamplerSlot_LightMap_0
Definition ModelG3d.h:122
@ cSamplerSlot_ShadowMap
Definition ModelG3d.h:124
sead::Vector3f mScale
Definition ModelG3d.h:458
const char * getBoneName(s32 index) const override
f32 getSklAnimBlendWeight(s32 index) const override
Definition ModelG3d.h:330
sead::BitFlag32 mShapeFlag
Definition ModelG3d.h:465
void calcViewShapeShadowFlags(agl::sdw::DepthShadow *depth_shadow, RenderObjLayerBase *shadow_layer, RenderObjRenderMgr *render_mgr) override
const agl::g3d::ModelEx & getModelEx() const
Definition ModelG3d.h:403
void * mSklAnimBlenderBuffer
Definition ModelG3d.h:450
sead::Buffer< VisibilityAnimation * > mVisAnim
Definition ModelG3d.h:445
void setSklAnimBlendWeight(s32 index, f32 weight) override
Definition ModelG3d.h:325
void drawShape_(DrawInfo &draw_info, const ShapeRenderInfo &render_info, const RenderObjRenderMgr *render_mgr) const
void calcBounding_()
u8 _128
Definition ModelG3d.h:459
virtual ~ModelG3d()
void drawReflectionOpa(s32 view_index, const sead::Matrix34f &view_mtx, const sead::Matrix44f &proj_mtx, RenderObjRenderMgr *render_mgr) override
sead::Buffer< TexturePatternAnimation * > mTexAnim
Definition ModelG3d.h:443
void calc() override
void drawOpa(s32 view_index, const sead::Matrix34f &view_mtx, const sead::Matrix44f &proj_mtx, RenderObjRenderMgr *render_mgr) override
sead::Buffer< ShaderAssign > mShaderAssign
Definition ModelG3d.h:454
u32 getBoneNum() const override
bool hasXlu() const override
Shape & getShape(s32 index)
Definition ModelG3d.h:405
sead::Matrix34f mMtxRT
Definition ModelG3d.h:457
sead::BitFlag32 mBoundingEnableFlag
Definition ModelG3d.h:461
sead::Buffer< ShaderParamAnimation * > mShuAnim
Definition ModelG3d.h:444
const sead::Sphere3f & getBounding() const override
Definition ModelG3d.h:312
void * mBuffer
Definition ModelG3d.h:447
static void setBoundingFlagArray_(BoundingFlagArray &flag_array, const SkeletalAnimation &anim)
agl::g3d::ModelEx mModelEx
Definition ModelG3d.h:440
void drawOpa_(DrawInfo &draw_info, const RenderObjRenderMgr *render_mgr) const
const Shape & getShape(s32 index) const
Definition ModelG3d.h:406
TexturePatternAnimation ** getTexAnimBuffer()
Definition ModelG3d.h:378
void setShaAnim(s32 index, Animation *anim) override
Animation *const * getTexAnims() const override
Definition ModelG3d.h:352
void setBoneLocalMatrix(s32 index, const sead::Matrix34f &rt, const sead::Vector3f &scale) override
void calcMdl() override
bool isMaterialVisible(s32 index) const override
sead::SafeString getName() const override
Definition ModelG3d.h:320
void getBoneWorldMatrix(s32 index, sead::Matrix34f *mtx) const override
void getBoneLocalMatrix(s32 index, sead::Matrix34f *rt=nullptr, sead::Vector3f *scale=nullptr) const override
Animation *const * getSklAnims() const override
Definition ModelG3d.h:347
sead::BitFlag32 & getRenderFlag()
Definition ModelG3d.h:408
Animation *const * getShaAnims() const override
Definition ModelG3d.h:367
s32 searchBoneIndex(const sead::SafeString &name) const override
sead::PtrArray< ShapeRenderInfo > mXluShapeInfo
Definition ModelG3d.h:453
Material * getMaterial(s32 index) const override
Definition ModelG3d.h:292
BoundingFlagArray mSubBoundingFlagArray
Definition ModelG3d.h:467
u32 getMaterialNum() const override
void updateView(s32 view_index, const sead::Matrix34f &view_mtx, const sead::Matrix44f &proj_mtx, RenderObjRenderMgr *render_mgr) override
Definition ModelG3d.h:190
void activateMaterial(const agl::g3d::ModelShaderAssign &shader_assign, const nw::g3d::MaterialObj *material, const LightMap &light_map) const
sead::BoundBox3f * mSubBounding
Definition ModelG3d.h:464
void setBoundingEnable(bool enable) override
Definition ModelG3d.h:302
void setShuAnim(s32 index, Animation *anim) override
sead::Buffer< f32 > mSklAnimBlendWeight
Definition ModelG3d.h:451
sead::Buffer< ShapeAnimation * > mShaAnim
Definition ModelG3d.h:446
void calcAnm() override
Animation *const * getVisAnims() const override
Definition ModelG3d.h:362
ShapeAnimation ** getShaAnimBuffer()
Definition ModelG3d.h:393
sead::Buffer< Shape > mShape
Definition ModelG3d.h:456
void * mBlockBuffer
Definition ModelG3d.h:448
size_t mBlockBufferSize
Definition ModelG3d.h:449
void setVisAnim(s32 index, Animation *anim) override
Definition ModelG3d.h:105
const agl::ShaderProgram * shader_program
Definition ModelG3d.h:109
ShaderAssign * shader_assign
Definition ModelG3d.h:110
agl::ShaderMode shader_mode
Definition ModelG3d.h:114
bool draw_shape
Definition ModelG3d.h:112
s32 polygon_offset
Definition ModelG3d.h:115
bool draw_reflection
Definition ModelG3d.h:113
const sead::Matrix44f * proj_mtx
Definition ModelG3d.h:108
const sead::Matrix34f * view_mtx
Definition ModelG3d.h:107
const CullViewFrustum * cull
Definition ModelG3d.h:116
s32 material_index
Definition ModelG3d.h:111
s32 view_index
Definition ModelG3d.h:106
Definition ModelG3d.h:84
s32 idx_lghtmap[LightMapMgr::cLightMapNum]
Definition ModelG3d.h:91
void clear()
Definition ModelG3d.h:85
s32 idx_sampler[LightMapMgr::cLightMapNum]
Definition ModelG3d.h:92
Definition ModelG3d.h:73
s32 priority
Definition ModelG3d.h:75
agl::DisplayList attrib_dl
Definition ModelG3d.h:78
sead::BitFlag32 flag
Definition ModelG3d.h:76
s32 idx_shape
Definition ModelG3d.h:74
agl::DisplayList mat_dl
Definition ModelG3d.h:79
s32 polygon_offset
Definition ModelG3d.h:77
Definition ModelG3d.h:97
LightMap light_map
Definition ModelG3d.h:99
sead::Buffer< nw::g3d::fnd::GfxBuffer > vtx_buffer
Definition ModelG3d.h:100
agl::UniformBlock uniform_block
Definition ModelG3d.h:98