NSMBW-Decomp
A decompilation of New Super Mario Bros. Wii
Loading...
Searching...
No Matches
anm_chr.cpp
1#include <game/mLib/m_3d.hpp>
2#include <game/mLib/m_heap.hpp>
3#include <lib/nw4r/g3d/anm_obj_chr.hpp>
4
5bool m3d::anmChr_c::create(nw4r::g3d::ResMdl mdl, nw4r::g3d::ResAnmChr anmChr, mAllocator_c *allocator, size_t *objSize) {
6 if (allocator == nullptr) {
7 allocator = internal::l_allocator_p;
8 }
9
10 size_t size;
11 if (objSize == nullptr) {
12 objSize = &size;
13 }
14
15 nw4r::g3d::AnmObjChrRes::Construct(nullptr, objSize, anmChr, mdl, false);
16 if (!createAllocator(allocator, objSize)) {
17 return false;
18 }
19
20 mpObj = nw4r::g3d::AnmObjChrRes::Construct(&mAllocator, &size, anmChr, mdl, false);
21 if (!mpObj->Bind(mdl)) {
22 remove();
23 return false;
24 }
25
26 setFrmCtrlDefault(anmChr, PLAYMODE_INHERIT);
27 return true;
28}
29
30void m3d::anmChr_c::setAnm(m3d::bmdl_c &mdl, nw4r::g3d::ResAnmChr anmChr, m3d::playMode_e playMode) {
31 nw4r::g3d::ScnMdlSimple::AnmObjType anmType = (nw4r::g3d::ScnMdlSimple::AnmObjType) getType();
32 mdl.removeAnm(anmType);
33 setAnmAfter(mdl, anmChr, playMode);
34}
35
36void m3d::anmChr_c::setAnmAfter(m3d::bmdl_c &mdl, nw4r::g3d::ResAnmChr anmChr, m3d::playMode_e playMode) {
37 nw4r::g3d::AnmObj *n = mpObj->getNode();
38
39 nw4r::g3d::AnmObjChrNode *chrNode;
40 int nodeIdx;
41 float weight;
42 if (n != nullptr) {
43 chrNode = nw4r::g3d::G3dObj::DynamicCast<nw4r::g3d::AnmObjChrNode>(n);
44
45 nodeIdx = 0;
46 while (nodeIdx < chrNode->getCount()) {
47 if (chrNode->arr[nodeIdx] != mpObj) {
48 nodeIdx++;
49 } else {
50 break;
51 }
52 }
53
54 weight = chrNode->GetWeight(nodeIdx);
55 chrNode->Detach(nodeIdx);
56 }
57
58 mpObj->Release();
59 mpHeap->free(MEM_FRMHEAP_FREE_ALL);
60
61 size_t size;
62 mpObj = nw4r::g3d::AnmObjChrRes::Construct(&mAllocator, &size, anmChr, mdl.getResMdl(), false);
63 mpObj->Bind(mdl.getResMdl());
64 setFrmCtrlDefault(anmChr, playMode);
65 if (n == nullptr) {
66 return;
67 }
68
69 // Newly constructed object is at the last position
70 nw4r::g3d::AnmObjChrRes *chrRes = nw4r::g3d::G3dObj::DynamicCast<nw4r::g3d::AnmObjChrRes>(mpObj);
71 chrNode->SetWeight(nodeIdx, weight);
72 chrNode->Attach(nodeIdx, chrRes);
73}
74
75void m3d::anmChr_c::setFrmCtrlDefault(nw4r::g3d::ResAnmChr &anmChr, m3d::playMode_e playMode) {
76 if (playMode == PLAYMODE_INHERIT) {
77 playMode = (anmChr.p->mAnimateType == nw4r::g3d::ANM_POLICY_ONCE) ? FORWARD_ONCE : FORWARD_LOOP;
78 }
79 fanm_c::set(anmChr.getDuration(), playMode, 1.0f, -1.0f);
80}
@ MEM_FRMHEAP_FREE_ALL
Deallocates all memory blocks from the heap.
Definition MEMFrmHeap.h:13
void set(float duration, m3d::playMode_e playMode, float updateRate, float startFrame)
Starts the animation with the given parameters.
Definition fanm.cpp:51
An allocator class that wraps an EGG:Allocator .
playMode_e
Definition banm.hpp:7
@ FORWARD_ONCE
Play the animation forward once.
Definition banm.hpp:9
@ FORWARD_LOOP
Play the animation forward in a loop.
Definition banm.hpp:8
@ PLAYMODE_INHERIT
Use the play mode of the parent.
Definition banm.hpp:12