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