1#include "egg/gfxe/eggFrustum.h"
2#include "egg/gfxe/eggScreen.h"
3#include "game/mLib/m_2d/animation.hpp"
4#include "game/mLib/m_2d/simple.hpp"
5#include "game/mLib/m_mtx.hpp"
6#include "nw4r/lyt/lyt_group.h"
7#include "nw4r/lyt/lyt_pane.h"
8#include "revolution/MTX/mtx.h"
9#include "revolution/SC/scapi.h"
10#include <game/mLib/m_2d.hpp>
11#include <lib/egg/core/eggExpHeap.h>
13#include <revolution/GX.h>
14#include <constants/sjis_constants.h>
20 nw4r::ut::List_Init(&m2d::l_list, 0);
23bool m2d::create(
EGG::Heap *parentHeap,
size_t size) {
25 EGG::ExpHeap *heap = EGG::ExpHeap::create(size, parentHeap, 4);
26 heap->mpName = M2D_HEAP_NAME;
28 l_allocator->attach(heap, 4);
29 nw4r::lyt::Layout::SetAllocator(l_allocator);
34void m2d::defaultSet() {
35 GXSetCullMode(GX_CULL_NONE);
36 GXSetZMode(0, GX_ALWAYS, 0);
37 static const GXColor l_clearColor = { 0x00000000 };
38 GXSetFog(GX_FOG_NONE, l_clearColor, 0.0f, 0.0f, 0.0f, 0.0f);
45 while (next !=
nullptr) {
47 next = (
m2d::Base_c *) nw4r::ut::List_GetNext(&m2d::l_list, next);
52void m2d::drawBefore(u8 maxDrawOrder) {
54 while (next !=
nullptr) {
55 if (next->mDrawOrder >= maxDrawOrder) {
59 next = (
m2d::Base_c *) nw4r::ut::List_GetNext(&m2d::l_list, next);
63void m2d::drawAfter(u8 minDrawOrder) {
65 while (next !=
nullptr) {
66 if (next->mDrawOrder > minDrawOrder) {
69 next = (
m2d::Base_c *) nw4r::ut::List_GetNext(&m2d::l_list, next);
73void m2d::drawBtween(u8 minDrawOrder, u8 maxDrawOrder) {
75 while (next !=
nullptr) {
76 if (next->mDrawOrder > maxDrawOrder) {
79 if (next->mDrawOrder >= minDrawOrder) {
82 next = (
m2d::Base_c *) nw4r::ut::List_GetNext(&m2d::l_list, next);
93void DUMMY_ORDERING() {
94 float dummy_float = 1.0f;
95 float dummy_float2 = -1.0f;
97 float dummy_float3 = (float) tmp;
101 nw4r::lyt::AnimTransform *transform = nw4r::lyt::Layout::CreateAnimTransform(binary, accessor);
102 if (transform !=
nullptr) {
103 mAnimTransList.Erase(transform);
108bool m2d::Layout_c::bindAnimationAuto(
const nw4r::lyt::AnimResource &res, nw4r::lyt::ResourceAccessor *resAccessor) {
109 u16 groupNum = res.GetGroupNum();
110 u16 shareInfoNum = res.GetAnimationShareInfoNum();
111 if (groupNum == 0 || shareInfoNum != 0) {
112 return BindAnimationAuto(res, resAccessor);
113 }
else if (GetRootPane() ==
nullptr) {
115 }
else if (res.GetResourceBlock() ==
nullptr) {
118 const nw4r::lyt::AnimationGroupRef *arr = res.GetGroupArray();
119 for (
int i = 0; i < groupNum; i++) {
120 nw4r::lyt::Group *group = GetGroupContainer()->FindGroupByName(arr[i].GetName());
121 u16 animNum = res.CalcAnimationNum(group, res.IsDescendingBind());
122 nw4r::lyt::AnimTransform *animTransform = nw4r::lyt::Layout::CreateAnimTransform();
123 animTransform->SetResource(res.GetResourceBlock(), resAccessor, animNum);
124 nw4r::lyt::BindAnimation(group, animTransform, res.IsDescendingBind(),
true);
130bool m2d::ResAccIf_c::attach(
void *resource,
const char *rootDir) {
131 if (mpResource !=
nullptr) {
134 mpResource = resource;
135 return mpResAccessor->Attach(mpResource, rootDir);
138void m2d::ResAccIf_c::detach() {
139 mpResource =
nullptr;
140 mpResAccessor->Detach();
143void *m2d::ResAccIf_c::getResource(ulong type,
const char *name) {
144 return mpResAccessor->GetResource(type, name,
nullptr);
147void m2d::FrameCtrl_c::play() {
148 mPrevFrame = mCurrFrame;
149 float frame = mCurrFrame;
150 if (mFlags & REVERSE) {
151 if (frame >= mRate) {
153 }
else if (mFlags & NO_LOOP) {
156 frame += mEndFrame - mRate;
160 if (mFlags & NO_LOOP) {
161 if (frame > getLastActiveFrame()) {
162 frame = getLastActiveFrame();
164 }
else if (frame >= mEndFrame) {
171void m2d::FrameCtrl_c::set(
float endFrame, u8 flags,
float rate,
float currFrame) {
172 if (currFrame < 0.0f) {
175 mEndFrame = endFrame;
176 mCurrFrame = currFrame;
179 mPrevFrame = mCurrFrame;
182void m2d::FrameCtrl_c::setFrame(
float frame) {
187void m2d::FrameCtrl_c::setRate(
float rate) {
191bool m2d::FrameCtrl_c::isStop()
const {
194 return mCurrFrame >= getLastActiveFrame();
195 case NO_LOOP | REVERSE:
196 return mCurrFrame <= 0.0f;
202void m2d::Base_c::entry() {
203 m2d::Base_c *next = (m2d::Base_c *) nw4r::ut::List_GetNext(&m2d::l_list,
nullptr);
204 while (next !=
nullptr) {
205 if (next->mDrawOrder > mDrawOrder) {
206 nw4r::ut::List_Insert(&m2d::l_list, next,
this);
209 next = (m2d::Base_c *) nw4r::ut::List_GetNext(&m2d::l_list, next);
211 nw4r::ut::List_Append(&m2d::l_list,
this);
214m2d::Simple_c::Simple_c() {
216 mPos.set(0.0f, 0.0f, 0.0f);
218 if (SCGetAspectRatio() == SC_ASPECT_WIDE) {
219 mDrawInfo.SetLocationAdjustScale(nw4r::math::VEC2(19.0f / 26.0f, 1.0f));
220 mDrawInfo.SetLocationAdjust(
true);
224void m2d::Simple_c::calc() {
229 PSMTXTransApply(mtx, mtx, pos.x, pos.y, pos.z);
230 mDrawInfo.SetViewMtx(mtx);
234void m2d::Simple_c::calcBefore() {
236 if (mFlags & SKIP_INVISIBLE) {
237 option = nw4r::lyt::ANIMOPTION_SKIP_INVISIBLE;
239 mLayout.Animate(option);
242void m2d::Simple_c::calcAfter() {
243 mDrawInfo.SetViewRect(mLayout.GetLayoutRect());
244 mLayout.CalculateMtx(mDrawInfo);
247void m2d::Simple_c::draw() {
248 nw4r::ut::Rect rect = mLayout.GetLayoutRect();
252 bool isWide = EGG::Screen::sTVMode == EGG::Screen::TV_MODE_16_9;
253 float width_16_9 = EGG::Screen::sTVModeInfo[EGG::Screen::TV_MODE_16_9].width;
254 float width_4_3 = EGG::Screen::sTVModeInfo[EGG::Screen::TV_MODE_4_3].width;
255 float left = isWide ? width_16_9 * rect.left / width_4_3 : rect.left;
256 float right = isWide ? width_16_9 * rect.right / width_4_3 : rect.right;
257 screen.mProjType = EGG::Frustum::PROJ_ORTHO;
258 screen.ResetOrthographic(rect.top, rect.bottom, left, right, near, far);
260 screen.mScale = nw4r::math::VEC3(width_4_3 / width_16_9, 1.0f, 1.0f);
262 screen.SetProjectionGX();
263 mLayout.Draw(mDrawInfo);
266bool m2d::Simple_c::build(
const char *lytName, m2d::ResAccIf_c *resAcc) {
267 if (mLayout.GetRootPane() !=
nullptr) {
270 if (resAcc ==
nullptr) {
272 if (resAcc ==
nullptr) {
276 void *res = resAcc->getResource(0, lytName);
277 if (res ==
nullptr) {
280 bool result = mLayout.Build(res, resAcc->getResAccessor());
287int m2d::Simple_c::patrolPane_local(nw4r::lyt::Pane *pane, patrolPaneFunc1 func1, patrolPaneFunc2 func2,
void *arg) {
289 if (func2 ==
nullptr || func2(pane) == 1) {
290 if (ret = func1(pane, arg), ret != 0) {
294 nw4r::lyt::PaneList &list = pane->GetChildList();
296 nw4r::lyt::PaneList::RevIterator it = list.GetEndReverseIter();
297 it != list.GetBeginReverseIter();
300 ret = patrolPane_local(&*it, func1, func2, arg);
308bool m2d::Simple_c::patrolPane(patrolPaneFunc1 func1, patrolPaneFunc2 func2,
void *arg) {
309 nw4r::lyt::Pane *pane = mLayout.GetRootPane();
310 int ret = patrolPane_local(pane, func1, func2, arg);
314bool m2d::AnmResV2_c::create(
const char *name, m2d::ResAccIf_c *resAcc, m2d::Layout_c *layout,
bool useOverride) {
315 mAnimResource.Set(resAcc->getResource(0, name));
317 layout->bindAnimationAuto(mAnimResource, resAcc->getResAccessor());
319 layout->BindAnimationAuto(mAnimResource, resAcc->getResAccessor());
321 mGroupNum = mAnimResource.GetGroupNum();
323 const nw4r::lyt::AnimationGroupRef *groupArray = mAnimResource.GetGroupArray();
324 for (
int i = 0; i < mGroupNum; i++) {
325 nw4r::lyt::AnimTransform *transform =
nullptr;
326 nw4r::lyt::Group *group = layout->GetGroupContainer()->FindGroupByName(groupArray->GetName());
327 mGroupAnim[i].mpGroup = group;
328 nw4r::lyt::detail::PaneLinkList &list = group->GetPaneList();
330 nw4r::lyt::detail::PaneLinkList::Iterator it = list.GetBeginIter();
331 it != list.GetEndIter();
334 nw4r::lyt::AnimationLink *link = findAnmLink(it->mTarget,
false);
335 if (link !=
nullptr) {
336 transform = link->GetAnimTransform();
340 mGroupAnim[i].mpAnimTransform = transform;
346bool m2d::AnmResV2_c::remove() {
348 mGroupAnim =
nullptr;
352m2d::GroupAnimTransform_s *m2d::AnmResV2_c::getGroupAnimTransform(
const char *name) {
354 for (
int i = 0; i < mGroupNum; i++) {
355 if (strcmp(name, mGroupAnim[i].mpGroup->GetName()) == 0) {
356 res = &mGroupAnim[i];
363void m2d::AnmResV2_c::setAnmEnable(nw4r::lyt::Group *group,
bool enable) {
365 nw4r::lyt::detail::PaneLinkList::Iterator it = group->GetPaneList().GetBeginIter();
366 it != group->GetPaneList().GetEndIter();
369 nw4r::lyt::AnimationLink *link = findAnmLink(it->mTarget,
false);
370 if (link !=
nullptr) {
371 it->mTarget->SetAnimationEnable(link->GetAnimTransform(), enable,
false);
376void m2d::AnmResV2_c::updateFrame(nw4r::lyt::Group *group,
float frame) {
378 nw4r::lyt::detail::PaneLinkList::Iterator it = group->GetPaneList().GetBeginIter();
379 it != group->GetPaneList().GetEndIter();
382 nw4r::lyt::Pane *pane = it->mTarget;
383 nw4r::lyt::AnimationLink *link = findAnmLink(pane,
false);
384 if (link !=
nullptr) {
385 setAnmFrame(pane, frame);
390nw4r::lyt::AnimationLink *m2d::AnmResV2_c::findAnmLink(nw4r::lyt::Pane *pane,
bool recursive) {
391 nw4r::lyt::AnimationLink *res = pane->FindAnimationLinkSelf(mAnimResource);
392 if (res !=
nullptr) {
395 u8 matNum = pane->GetMaterialNum();
396 for (u8 i = 0; i < matNum; i++) {
397 res = pane->GetMaterial(i)->FindAnimationLink(mAnimResource);
398 if (res !=
nullptr) {
404 nw4r::lyt::PaneList::Iterator it = pane->GetChildList().GetBeginIter();
405 it != pane->GetChildList().GetEndIter();
408 res = findAnmLink(&*it,
true);
409 if (res !=
nullptr) {
417void m2d::AnmResV2_c::setAnmFrame(nw4r::lyt::Pane *pane,
float frame) {
418 nw4r::lyt::AnimationLink *res = pane->FindAnimationLinkSelf(mAnimResource);
419 if (res !=
nullptr) {
420 res->GetAnimTransform()->SetFrame(frame);
422 u8 matNum = pane->GetMaterialNum();
423 for (u8 i = 0; i < matNum; i++) {
424 res = pane->GetMaterial(i)->FindAnimationLink(mAnimResource);
425 if (res !=
nullptr) {
426 res->GetAnimTransform()->SetFrame(frame);
431bool m2d::AnmGroupBase_c::create(
AnmResV2_c *anmRes,
const char *name) {
433 mpGroupAnim = mpAnmRes->getGroupAnimTransform(name);
434 if (mpGroupAnim !=
nullptr) {
435 u8 flags = FrameCtrl_c::NO_LOOP;
436 if (mpGroupAnim->mpAnimTransform->IsLoopData()) {
439 mpFrameCtrl->set(mpGroupAnim->mpAnimTransform->GetFrameSize(), flags, 1.0f, -1.0f);
445void m2d::AnmGroupBase_c::setAnmEnable(
bool enable) {
446 mpAnmRes->setAnmEnable(mpGroupAnim->mpGroup, enable);
448 mFlags |= FLAG_ENABLED;
450 mFlags &= ~FLAG_ENABLED;
454void m2d::AnmGroupBase_c::updateFrame() {
455 mpAnmRes->updateFrame(mpGroupAnim->mpGroup, mpFrameCtrl->getFrame());
An allocator class that wraps an EGG:Allocator .