1#include <game/mLib/m_3d.hpp>
2#include <game/mLib/m_heap.hpp>
6 nw4r::g3d::AnmObjMatClrRes::Construct(
nullptr, &size, anmClr, mdl,
false);
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;
19 if (objSize ==
nullptr) {
23 *objSize = heapCost(mdl, anmClr,
false);
24 if (!createAllocator(allocator, objSize)) {
28 mpObj = nw4r::g3d::AnmObjMatClrRes::Construct(&mAllocator,
nullptr, anmClr, mdl,
false);
29 if (!mpObj->Bind(mdl)) {
37void m3d::anmMatClr_c::child_c::setAnm(m3d::bmdl_c &mdl, nw4r::g3d::ResAnmClr anmClr,
m3d::playMode_e playMode) {
39 mpObj = nw4r::g3d::AnmObjMatClrRes::Construct(&mAllocator,
nullptr, anmClr, mdl.getResMdl(),
false);
40 mpObj->Bind(mdl.getResMdl());
41 setFrmCtrlDefault(anmClr, playMode);
44void m3d::anmMatClr_c::child_c::releaseAnm() {
45 if (mpObj ==
nullptr) {
53void m3d::anmMatClr_c::child_c::setFrmCtrlDefault(nw4r::g3d::ResAnmClr &anmClr,
m3d::playMode_e playMode) {
57 fanm_c::set(anmClr.getDuration(), playMode, 1.0f, -1.0f);
60size_t m3d::anmMatClr_c::heapCost(nw4r::g3d::ResMdl mdl, nw4r::g3d::ResAnmClr anmClr,
long count,
bool calcAligned) {
62 nw4r::g3d::AnmObjMatClrOverride::Construct(
nullptr, &size, mdl, count);
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;
77 if (objSize ==
nullptr) {
81 *objSize = heapCost(mdl, anmClr, count,
false);
82 if (!createAllocator(allocator, objSize)) {
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));
89 nw4r::g3d::AnmObjMatClrOverride *matClrOverride = nw4r::g3d::G3dObj::DynamicCast<nw4r::g3d::AnmObjMatClrOverride>(mpObj);
92 for (
int i = 0; i < count; i++) {
94 if (!child->create(mdl, anmClr, &mAllocator,
nullptr)) {
95 mHeap::destroyFrmHeap(mpHeap);
99 nw4r::g3d::AnmObjMatClrRes *clrRes = nw4r::g3d::G3dObj::DynamicCast<nw4r::g3d::AnmObjMatClrRes>(child->getObj());
100 matClrOverride->Attach(i, clrRes);
109m3d::anmMatClr_c::~anmMatClr_c() {
110 anmMatClr_c::remove();
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();
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);
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);
133void m3d::anmMatClr_c::releaseAnm(
long idx) {
134 nw4r::g3d::AnmObjMatClrOverride *matClr = nw4r::g3d::G3dObj::DynamicCast<nw4r::g3d::AnmObjMatClrOverride>(mpObj);
136 children[idx].releaseAnm();
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++) {
147void m3d::anmMatClr_c::play(
long idx) {
148 if (children[idx].IsBound()) {
149 children[idx].play();
153float m3d::anmMatClr_c::getFrame(
long idx)
const {
154 return children[idx].getFrame();
157void m3d::anmMatClr_c::setFrame(
float frame,
long idx) {
158 children[idx].setFrame(frame);
161float m3d::anmMatClr_c::getRate(
long idx)
const {
162 return children[idx].getRate();
165void m3d::anmMatClr_c::setRate(
float rate,
long idx) {
166 children[idx].setRate(rate);
169bool m3d::anmMatClr_c::isStop(
long idx)
const {
170 return children[idx].isStop();
173bool m3d::anmMatClr_c::checkFrame(
float frame,
long idx)
const {
174 return children[idx].checkFrame(frame);
177void m3d::anmMatClr_c::setPlayMode(
m3d::playMode_e playMode,
long idx) {
178 children[idx].mPlayMode = playMode;
181float m3d::anmMatClr_c::getFrameMax(
long idx)
const {
182 return children[idx].mFrameMax;
185float m3d::anmMatClr_c::getFrameStart(
long idx)
const {
186 return children[idx].mFrameStart;
@ MEM_FRMHEAP_FREE_ALL
Deallocates all memory blocks from the heap.
void set(float duration, m3d::playMode_e playMode, float updateRate, float startFrame)
Starts the animation with the given parameters.
@ FORWARD_ONCE
Play the animation forward once.
@ FORWARD_LOOP
Play the animation forward in a loop.
@ PLAYMODE_INHERIT
Use the play mode of the parent.
T RoundUp(T x, u32 base)
Rounds x up to a multiple of base.