NSMBW-Decomp
A decompilation of New Super Mario Bros. Wii
Loading...
Searching...
No Matches
anm_mat_clr.cpp
1#include <game/mLib/m_3d.hpp>
2#include <game/mLib/m_heap.hpp>
3
4size_t m3d::anmMatClr_c::child_c::heapCost(nw4r::g3d::ResMdl mdl, nw4r::g3d::ResAnmClr anmClr, bool calcAligned) {
5 size_t size = 0;
6 nw4r::g3d::AnmObjMatClrRes::Construct(nullptr, &size, anmClr, mdl, false);
7 if (calcAligned) {
8 size = nw4r::ut::RoundUp(mHeap::frmHeapCost(size, 0x20), 0x20);
9 }
10 return size;
11}
12
13bool m3d::anmMatClr_c::child_c::create(nw4r::g3d::ResMdl mdl, nw4r::g3d::ResAnmClr anmClr, mAllocator_c *allocator, size_t *objSize) {
14 if (allocator == nullptr) {
15 allocator = m3d::internal::l_allocator_p;
16 }
17
18 size_t size;
19 if (objSize == nullptr) {
20 objSize = &size;
21 }
22
23 *objSize = heapCost(mdl, anmClr, false);
24 if (!createAllocator(allocator, objSize)) {
25 return false;
26 }
27
28 mpObj = nw4r::g3d::AnmObjMatClrRes::Construct(&mAllocator, nullptr, anmClr, mdl, false);
29 if (!mpObj->Bind(mdl)) {
30 remove();
31 return false;
32 }
33 setFrmCtrlDefault(anmClr, PLAYMODE_INHERIT);
34 return true;
35}
36
37void m3d::anmMatClr_c::child_c::setAnm(m3d::bmdl_c &mdl, nw4r::g3d::ResAnmClr anmClr, m3d::playMode_e playMode) {
38 releaseAnm();
39 mpObj = nw4r::g3d::AnmObjMatClrRes::Construct(&mAllocator, nullptr, anmClr, mdl.getResMdl(), false);
40 mpObj->Bind(mdl.getResMdl());
41 setFrmCtrlDefault(anmClr, playMode);
42}
43
44void m3d::anmMatClr_c::child_c::releaseAnm() {
45 if (mpObj == nullptr) {
46 return;
47 }
48 mpObj->Release();
49 mpHeap->free(MEM_FRMHEAP_FREE_ALL);
50 mpObj = nullptr;
51}
52
53void m3d::anmMatClr_c::child_c::setFrmCtrlDefault(nw4r::g3d::ResAnmClr &anmClr, m3d::playMode_e playMode) {
54 if (playMode == PLAYMODE_INHERIT) {
55 playMode = (anmClr.p->mAnimateType == nw4r::g3d::ANM_POLICY_ONCE) ? FORWARD_ONCE : FORWARD_LOOP;
56 }
57 fanm_c::set(anmClr.getDuration(), playMode, 1.0f, -1.0f);
58}
59
60size_t m3d::anmMatClr_c::heapCost(nw4r::g3d::ResMdl mdl, nw4r::g3d::ResAnmClr anmClr, long count, bool calcAligned) {
61 size_t size = 0;
62 nw4r::g3d::AnmObjMatClrOverride::Construct(nullptr, &size, mdl, count);
63 size += nw4r::ut::RoundUp(count * sizeof(child_c), 0x20);
64 size += nw4r::ut::RoundUp(child_c::heapCost(mdl, anmClr, true), 0x20) * count;
65 if (calcAligned) {
66 size = nw4r::ut::RoundUp(mHeap::frmHeapCost(size, 0x20), 0x20);
67 }
68 return size;
69}
70
71bool m3d::anmMatClr_c::create(nw4r::g3d::ResMdl mdl, nw4r::g3d::ResAnmClr anmClr, mAllocator_c *allocator, size_t *objSize, long count) {
72 if (allocator == nullptr) {
73 allocator = m3d::internal::l_allocator_p;
74 }
75
76 size_t size = 0;
77 if (objSize == nullptr) {
78 objSize = &size;
79 }
80
81 *objSize = heapCost(mdl, anmClr, count, false);
82 if (!createAllocator(allocator, objSize)) {
83 return false;
84 }
85
86 mpObj = nw4r::g3d::AnmObjMatClrOverride::Construct(&mAllocator, nullptr, mdl, count);
87 children = (m3d::anmMatClr_c::child_c *) MEMAllocFromAllocator(&mAllocator, nw4r::ut::RoundUp(count * sizeof(child_c), 0x20));
88
89 nw4r::g3d::AnmObjMatClrOverride *matClrOverride = nw4r::g3d::G3dObj::DynamicCast<nw4r::g3d::AnmObjMatClrOverride>(mpObj);
90
91 child_c *child = &children[0];
92 for (int i = 0; i < count; i++) {
93 new(child) child_c();
94 if (!child->create(mdl, anmClr, &mAllocator, nullptr)) {
95 mHeap::destroyFrmHeap(mpHeap);
96 return false;
97 }
98 if (i == 0) {
99 nw4r::g3d::AnmObjMatClrRes *clrRes = nw4r::g3d::G3dObj::DynamicCast<nw4r::g3d::AnmObjMatClrRes>(child->getObj());
100 matClrOverride->Attach(i, clrRes);
101 } else {
102 child->releaseAnm();
103 }
104 child++;
105 }
106 return true;
107}
108
109m3d::anmMatClr_c::~anmMatClr_c() {
110 anmMatClr_c::remove();
111}
112
113void m3d::anmMatClr_c::remove() {
114 nw4r::g3d::AnmObjMatClrOverride *matClr = nw4r::g3d::G3dObj::DynamicCast<nw4r::g3d::AnmObjMatClrOverride>(mpObj);
115 if (matClr != nullptr && children != nullptr) {
116 int count = matClr->getCount();
117 for (int i = 0; i < count; i++) {
118 children[i].remove();
119 }
120 children = nullptr;
121 }
122 banm_c::remove();
123}
124
125void m3d::anmMatClr_c::setAnm(m3d::bmdl_c &mdl, nw4r::g3d::ResAnmClr clr, long idx, m3d::playMode_e playMode) {
126 nw4r::g3d::AnmObjMatClrOverride *matClr = nw4r::g3d::G3dObj::DynamicCast<nw4r::g3d::AnmObjMatClrOverride>(mpObj);
127 matClr->Detach(idx);
128 children[idx].setAnm(mdl, clr, playMode);
129 nw4r::g3d::AnmObjMatClrRes *clrRes = nw4r::g3d::G3dObj::DynamicCast<nw4r::g3d::AnmObjMatClrRes>(children[idx].getObj());
130 matClr->Attach(idx, clrRes);
131}
132
133void m3d::anmMatClr_c::releaseAnm(long idx) {
134 nw4r::g3d::AnmObjMatClrOverride *matClr = nw4r::g3d::G3dObj::DynamicCast<nw4r::g3d::AnmObjMatClrOverride>(mpObj);
135 matClr->Detach(idx);
136 children[idx].releaseAnm();
137}
138
139void m3d::anmMatClr_c::play() {
140 nw4r::g3d::AnmObjMatClrOverride *matClr = nw4r::g3d::G3dObj::DynamicCast<nw4r::g3d::AnmObjMatClrOverride>(mpObj);
141 int count = matClr->getCount();
142 for (int i = 0; i < count; i++) {
143 play(i);
144 }
145}
146
147void m3d::anmMatClr_c::play(long idx) {
148 if (children[idx].IsBound()) {
149 children[idx].play();
150 }
151}
152
153float m3d::anmMatClr_c::getFrame(long idx) const {
154 return children[idx].getFrame();
155}
156
157void m3d::anmMatClr_c::setFrame(float frame, long idx) {
158 children[idx].setFrame(frame);
159}
160
161float m3d::anmMatClr_c::getRate(long idx) const {
162 return children[idx].getRate();
163}
164
165void m3d::anmMatClr_c::setRate(float rate, long idx) {
166 children[idx].setRate(rate);
167}
168
169bool m3d::anmMatClr_c::isStop(long idx) const {
170 return children[idx].isStop();
171}
172
173bool m3d::anmMatClr_c::checkFrame(float frame, long idx) const {
174 return children[idx].checkFrame(frame);
175}
176
177void m3d::anmMatClr_c::setPlayMode(m3d::playMode_e playMode, long idx) {
178 children[idx].mPlayMode = playMode;
179}
180
181float m3d::anmMatClr_c::getFrameMax(long idx) const {
182 return children[idx].mFrameMax;
183}
184
185float m3d::anmMatClr_c::getFrameStart(long idx) const {
186 return children[idx].mFrameStart;
187}
@ 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
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
T RoundUp(T x, u32 base)
Rounds x up to a multiple of base.
Definition inlines.hpp:21