From 08e0e57034cb1132c3f3427d8c4a8e52702223e4 Mon Sep 17 00:00:00 2001 From: elijah-thomas774 Date: Thu, 23 May 2024 00:16:00 -0400 Subject: [PATCH] lyt_pane matching --- config/SOUE01/config.yml | 1 + config/SOUE01/splits.txt | 12 + config/SOUE01/symbols.txt | 30 +- configure.py | 2 + include/nw4r/lyt/lyt_animation.h | 67 ++-- include/nw4r/lyt/lyt_drawInfo.h | 79 ++++- include/nw4r/lyt/lyt_init.h | 10 + include/nw4r/lyt/lyt_layout.h | 6 +- include/nw4r/lyt/lyt_material.h | 60 +++- include/nw4r/lyt/lyt_pane.h | 194 ++++++----- include/nw4r/lyt/lyt_types.h | 20 ++ include/nw4r/ut/ut_Rect.h | 16 +- src/egg/math/eggMatrix.cpp | 2 +- src/nw4r/lyt/lyt_common.cpp | 6 +- src/nw4r/lyt/lyt_init.cpp | 14 + src/nw4r/lyt/lyt_pane.cpp | 536 +++++++++++++++++++++++++++++++ 16 files changed, 901 insertions(+), 154 deletions(-) create mode 100644 include/nw4r/lyt/lyt_init.h create mode 100644 include/nw4r/lyt/lyt_types.h diff --git a/config/SOUE01/config.yml b/config/SOUE01/config.yml index 8ad52f93..bbe8cde0 100644 --- a/config/SOUE01/config.yml +++ b/config/SOUE01/config.yml @@ -18,6 +18,7 @@ force_active: [ "GetResource__Q34nw4r3lyt24MultiArcResourceAccessorFUlPCcPUl", "RegistFont__Q34nw4r3lyt24MultiArcResourceAccessorFPQ34nw4r3lyt11FontRefLink", "GetFont__Q34nw4r3lyt24MultiArcResourceAccessorFPCc", + "GetPaneRect__Q34nw4r3lyt4PaneCFRCQ34nw4r3lyt8DrawInfo", ] # modules: diff --git a/config/SOUE01/splits.txt b/config/SOUE01/splits.txt index e3515491..fd9e79d7 100644 --- a/config/SOUE01/splits.txt +++ b/config/SOUE01/splits.txt @@ -316,6 +316,18 @@ nw4r/db/db_directPrint.cpp: .sbss start:0x805765E8 end:0x805765EC .bss start:0x80636B80 end:0x80636BA4 +nw4r/lyt/lyt_init.cpp: + .text start:0x80486A70 end:0x80486AC4 + .data start:0x8056E3E8 end:0x8056E430 + .sdata start:0x80574EB0 end:0x80574EB8 + +nw4r/lyt/lyt_pane.cpp: + .text start:0x80486AD0 end:0x80487EAC + .ctors start:0x804DB974 end:0x804DB978 + .data start:0x8056E430 end:0x8056E4A8 + .sbss start:0x805766F0 end:0x805766F8 + .sdata2 start:0x8057F220 end:0x8057F240 + nw4r/lyt/lyt_resourceAccessor.cpp: .text start:0x80492000 end:0x80492058 .data start:0x8056E7E0 end:0x8056E7F8 diff --git a/config/SOUE01/symbols.txt b/config/SOUE01/symbols.txt index b016ae35..12d1ebfe 100644 --- a/config/SOUE01/symbols.txt +++ b/config/SOUE01/symbols.txt @@ -2880,7 +2880,7 @@ fn_80065E70 = .text:0x80065E70; // type:function size:0xC4 fn_80065F40 = .text:0x80065F40; // type:function size:0x28 fn_80065F70 = .text:0x80065F70; // type:function size:0x328 fn_800662A0 = .text:0x800662A0; // type:function size:0xD4 -fn_80066380 = .text:0x80066380; // type:function size:0x8 +GetRuntimeTypeInfo__Q34nw4r3lyt4PaneCFv = .text:0x80066380; // type:function size:0x8 fn_80066390 = .text:0x80066390; // type:function size:0xE8 fn_80066480 = .text:0x80066480; // type:function size:0xC fn_80066490 = .text:0x80066490; // type:function size:0x40 @@ -17361,7 +17361,7 @@ searchBaseByGroupType__10fManager_cFUcPC7fBase_c = .text:0x802E2980; // type:fun mainLoop__10fManager_cFv = .text:0x802E29E0; // type:function size:0xC0 __sinit_\f_manager_cpp = .text:0x802E2AA0; // type:function size:0x138 scope:local __ct__9fLiMgBa_cFv = .text:0x802E2BE0; // type:function size:0x10 -fn_802E2BF0 = .text:0x802E2BF0; // type:function size:0x1C scope:local +__arraydtor = .text:0x802E2BF0; // type:function size:0x1C scope:local walkPack__11fTrMgPTMF_cFv = .text:0x802E2C10; // type:function size:0x84 searchNodeByProfName__9fTrMgBa_cCFUsPC9fTrNdBa_c = .text:0x802E2CA0; // type:function size:0x68 searchNodeByGroupType__9fTrMgBa_cCFUcPC9fTrNdBa_c = .text:0x802E2D10; // type:function size:0x68 @@ -25854,15 +25854,13 @@ LytInit__Q24nw4r3lytFv = .text:0x80486A70; // type:function size:0x54 __ct__Q34nw4r3lyt4PaneFPCQ44nw4r3lyt3res4Pane = .text:0x80486AD0; // type:function size:0x128 __dt__Q34nw4r3lyt4PaneFv = .text:0x80486C00; // type:function size:0x13C AppendChild__Q34nw4r3lyt4PaneFPQ34nw4r3lyt4Pane = .text:0x80486D40; // type:function size:0x50 -RemoveChild__Q34nw4r3lyt4PaneFPQ34nw4r3lyt4P = .text:0x80486D90; // type:function size:0x3C -FUN_80486dd0 = .text:0x80486DD0; // type:function size:0x110 -FUN_80486ee0 = .text:0x80486EE0; // type:function size:0x110 +RemoveChild__Q34nw4r3lyt4PaneFPQ34nw4r3lyt4Pane = .text:0x80486D90; // type:function size:0x3C +GetPaneRect__Q34nw4r3lyt4PaneCFv = .text:0x80486DD0; // type:function size:0x110 +GetPaneRect__Q34nw4r3lyt4PaneCFRCQ34nw4r3lyt8DrawInfo = .text:0x80486EE0; // type:function size:0x110 GetVtxColor__Q34nw4r3lyt4PaneCFUl = .text:0x80486FF0; // type:function size:0xC SetVtxColor__Q34nw4r3lyt4PaneFUlQ34nw4r2ut5Color = .text:0x80487000; // type:function size:0x4 -GetColorElement__Q34nw4r3lyt4PaneCFUl = .text:0x80487010; // type:function size:0x20 -fn_80487030 = .text:0x80487030; // type:function size:0x4 -SetColorElement__Q34nw4r3lyt4PaneFUlUc = .text:0x80487040; // type:function size:0x20 -fn_80487060 = .text:0x80487060; // type:function size:0x4 +GetColorElement__Q34nw4r3lyt4PaneCFUl = .text:0x80487010; // type:function size:0x24 +SetColorElement__Q34nw4r3lyt4PaneFUlUc = .text:0x80487040; // type:function size:0x24 GetVtxColorElement__Q34nw4r3lyt4PaneCFUl = .text:0x80487070; // type:function size:0x8 SetVtxColorElement__Q34nw4r3lyt4PaneFUlUc = .text:0x80487080; // type:function size:0x4 FindPaneByName__Q34nw4r3lyt4PaneFPCcb = .text:0x80487090; // type:function size:0xA8 @@ -25886,10 +25884,10 @@ GetVtxPos__Q34nw4r3lyt4PaneCFv = .text:0x80487C80; // type:function size:0xC8 GetMaterialNum__Q34nw4r3lyt4PaneCFv = .text:0x80487D50; // type:function size:0x14 GetMaterial__Q34nw4r3lyt4PaneCFv = .text:0x80487D70; // type:function size:0x8 GetMaterial__Q34nw4r3lyt4PaneCFUl = .text:0x80487D80; // type:function size:0x20 -GetExtUserData__Q34nw4r3lyt4PaneCFv = .text:0x80487DA0; // type:function size:0x1C -GetExtUserDataNum__Q34nw4r3lyt4PaneCFv = .text:0x80487DC0; // type:function size:0x1C +GetExtUserDataNum__Q34nw4r3lyt4PaneCFv = .text:0x80487DA0; // type:function size:0x1C +GetExtUserData__Q34nw4r3lyt4PaneCFv = .text:0x80487DC0; // type:function size:0x1C FindExtUserDataByName__Q34nw4r3lyt4PaneFPCc = .text:0x80487DE0; // type:function size:0xBC -__sinit_lyt_pane_cpp = .text:0x80487EA0; // type:function size:0xC +__sinit_\lyt_pane_cpp = .text:0x80487EA0; // type:function size:0xC scope:local __ct__Q34nw4r3lyt5GroupFPCQ44nw4r3lyt3res5GroupPQ34nw4r3lyt4Pane = .text:0x80487EB0; // type:function size:0x114 __dt__Q34nw4r3lyt5GroupFv = .text:0x80487FD0; // type:function size:0xAC __dt__Q34nw4r3lyt14GroupContainerFv = .text:0x80488080; // type:function size:0xCC @@ -37073,8 +37071,8 @@ lbl_8056E32C = .data:0x8056E32C; // type:object size:0x14 lbl_8056E340 = .data:0x8056E340; // type:object size:0x10 lbl_8056E350 = .data:0x8056E350; // type:object size:0x38 lbl_8056E388 = .data:0x8056E388; // type:object size:0x60 -lbl_8056E3E8 = .data:0x8056E3E8; // type:object size:0x48 -lbl_8056E430 = .data:0x8056E430; // type:object size:0x78 +lbl_8056E3E8 = .data:0x8056E3E8; // type:object size:0x46 scope:local data:string +__vt__Q34nw4r3lyt4Pane = .data:0x8056E430; // type:object size:0x74 lbl_8056E4A8 = .data:0x8056E4A8; // type:object size:0x10 lbl_8056E4B8 = .data:0x8056E4B8; // type:object size:0x40 lbl_8056E4F8 = .data:0x8056E4F8; // type:object size:0x78 @@ -39586,7 +39584,7 @@ lbl_80574E94 = .sdata:0x80574E94; // type:object size:0x4 lbl_80574E98 = .sdata:0x80574E98; // type:object size:0x8 lbl_80574EA0 = .sdata:0x80574EA0; // type:object size:0x8 data:4byte lbl_80574EA8 = .sdata:0x80574EA8; // type:object size:0x8 data:4byte -lbl_80574EB0 = .sdata:0x80574EB0; // type:object size:0x8 data:4byte +NW4R_LYT_Version___22@unnamed@lyt_init_cpp@ = .sdata:0x80574EB0; // type:object size:0x4 scope:local data:4byte lbl_80574EB8 = .sdata:0x80574EB8; // type:object size:0x8 lbl_80574EC0 = .sdata:0x80574EC0; // type:object size:0x2 data:string lbl_80574EC4 = .sdata:0x80574EC4; // type:object size:0x3 data:string @@ -40877,7 +40875,7 @@ lbl_805766D0 = .sbss:0x805766D0; // type:object size:0x8 data:4byte lbl_805766D8 = .sbss:0x805766D8; // type:object size:0x8 data:byte lbl_805766E0 = .sbss:0x805766E0; // type:object size:0x8 data:byte lbl_805766E8 = .sbss:0x805766E8; // type:object size:0x8 data:4byte -lbl_805766F0 = .sbss:0x805766F0; // type:object size:0x8 data:4byte +typeInfo__Q34nw4r3lyt4Pane = .sbss:0x805766F0; // type:object size:0x4 data:4byte mspAllocator__Q34nw4r3lyt6Layout = .sbss:0x805766F8; // type:object size:0x8 data:4byte lbl_80576700 = .sbss:0x80576700; // type:object size:0x8 data:4byte lbl_80576708 = .sbss:0x80576708; // type:object size:0x8 data:4byte diff --git a/configure.py b/configure.py index d561bc3f..c46c9ec8 100644 --- a/configure.py +++ b/configure.py @@ -352,6 +352,8 @@ config.libs = [ nw4rLib( "lyt", [ + Object(Matching, "nw4r/lyt/lyt_init.cpp"), + Object(Matching, "nw4r/lyt/lyt_pane.cpp"), Object(Matching, "nw4r/lyt/lyt_resourceAccessor.cpp"), Object(Matching, "nw4r/lyt/lyt_arcResourceAccessor.cpp"), Object(Matching, "nw4r/lyt/lyt_common.cpp"), diff --git a/include/nw4r/lyt/lyt_animation.h b/include/nw4r/lyt/lyt_animation.h index fd26da01..c0d9f7cc 100644 --- a/include/nw4r/lyt/lyt_animation.h +++ b/include/nw4r/lyt/lyt_animation.h @@ -19,32 +19,25 @@ struct AnimationBlock { }; struct AnimTransform { - inline AnimTransform() : mNode(), mResource(NULL), mFrame(0.0f) {} + inline AnimTransform() : mLink(), mpRes(NULL), mFrame(0.0f) {} u16 GetFrameSize() const; bool IsLoopData() const; + virtual ~AnimTransform() = 0; + virtual void SetResource(const res::AnimationBlock *pRes, ResourceAccessor *pResAccessor) = 0; + virtual void SetResource(const res::AnimationBlock *pRes, ResourceAccessor *pResAccessor, u16 animNum) = 0; + virtual void Bind(Pane *pPane, bool bRecursive) = 0; + virtual void Bind(Material *pMaterial, bool bDisable) = 0; + virtual void Animate(u32 idx, Pane *pPane) = 0; + virtual void Animate(u32 idx, Material *pMaterial) = 0; - ut::LinkListNode mNode; // at 0x0 - AnimationBlock *mResource; // at 0xC - f32 mFrame; // at 0x10 -}; - -struct AnimTransformBasic : AnimTransform { - AnimTransformBasic(); - virtual ~AnimTransformBasic(); - virtual UNKTYPE SetResource(const res::AnimationBlock *, ResourceAccessor *); - virtual UNKTYPE Bind(Pane *, bool); - virtual UNKTYPE Bind(Material *); - virtual UNKTYPE Animate(u32, Pane *); - virtual UNKTYPE Animate(u32, Material *); - - u32 INT_0x14; - u32 INT_0x18; - u16 INT_0x1C; + ut::LinkListNode mLink; // at 0x0 + AnimationBlock *mpRes; // at 0xC + f32 mFrame; // at 0x10 }; struct AnimationLink { - inline AnimationLink() : mNode() { + inline AnimationLink() : mLink() { Reset(); } @@ -53,16 +46,38 @@ struct AnimationLink { } inline void Set(AnimTransform *pTransform, u16 us, bool b) { - mTransform = pTransform; - SHORT_0xC = us; - BOOL_0xE = b; + mAnimTrans = pTransform; + mIdx = us; + mbDisable = b; } - ut::LinkListNode mNode; // at 0x0 - AnimTransform *mTransform; // at 0x8 - u16 SHORT_0xC; - bool BOOL_0xE; + ut::LinkListNode mLink; // at 0x0 + AnimTransform *mAnimTrans; // at 0x8 + u16 mIdx; // at 0xC + bool mbDisable; // at 0xE }; +struct AnimTransformBasic : AnimTransform { + AnimTransformBasic(); + virtual ~AnimTransformBasic(); // at 0x08 + virtual void SetResource(const res::AnimationBlock *pRes, ResourceAccessor *pResAccessor); // at 0x0C + virtual void SetResource(const res::AnimationBlock *pRes, ResourceAccessor *pResAccessor, u16 animNum); // at 0x10 + virtual void Bind(Pane *pPane, bool bRecursive); // at 0x14 + virtual void Bind(Material *pMaterial, bool bDisable); // at 0x18 + virtual void Animate(u32 idx, Pane *pPane); // at 0x1C + virtual void Animate(u32 idx, Material *pMaterial); // at 0x20 + + void *mpFileResAry; // at 0x14 + AnimationLink *mAnimLinkAry; // at 0x18 + u16 mAnimLinkNum; // at 0x1C +}; + +namespace detail { +void UnbindAnimationLink(ut::LinkList *, AnimTransform *); +AnimationLink *FindAnimationLink(ut::LinkList *, AnimTransform *); +AnimationLink *FindAnimationLink(ut::LinkList *, const AnimResource &); +void UnbindAnimationLink(ut::LinkList *, AnimTransform *); +} // namespace detail + } // namespace lyt } // namespace nw4r diff --git a/include/nw4r/lyt/lyt_drawInfo.h b/include/nw4r/lyt/lyt_drawInfo.h index 636a1b4e..8aafd6e9 100644 --- a/include/nw4r/lyt/lyt_drawInfo.h +++ b/include/nw4r/lyt/lyt_drawInfo.h @@ -3,18 +3,93 @@ #include "common.h" #include "nw4r/math/math_types.h" #include "nw4r/ut/ut_Rect.h" - +#include namespace nw4r { namespace lyt { struct DrawInfo { virtual ~DrawInfo(); DrawInfo(); + bool isYAxisUp() const { + // NYI + } + // field accessors + const math::VEC2 &GetLocationAdjustScale() const { + return mScale; + } + void SetLocationAdjustScale(const math::VEC2 &scale) { + this->mScale = scale; + } + + const math::MTX34 &GetViewMtx() const { + return mViewMtx; + } + void SetViewMtx(const math::MTX34 &value) { + this->mViewMtx = value; + } + + f32 GetGlobalAlpha() const { + return mGlobalAlpha; + } + void SetGlobalAlpha(f32 alpha) { + this->mGlobalAlpha = alpha; + } + + const ut::Rect &GetViewRect() const { + return this->mViewRect; + } + void SetViewRect(const ut::Rect &value) { + this->mViewRect = value; + } + + // mFlags accessors + bool IsInvisiblePaneCalculateMtx() const { + return mFlags.invisiblePaneCalculateMtx; + } + void SetInvisiblePaneCalculateMtx(bool bEnable) { + this->mFlags.invisiblePaneCalculateMtx = bEnable; + } + + bool IsLocationAdjust() const { + return mFlags.locationAdjust; + } + void SetLocationAdjust(bool bEnable) { + this->mFlags.locationAdjust = bEnable; + } + + bool IsMultipleViewMtxOnDraw() const { + return mFlags.mulViewDraw; + } + void SetMultipleViewMtxOnDraw(bool bEnable) { + this->mFlags.mulViewDraw = bEnable; + } + + bool IsInfluencedAlpha() const { + return mFlags.influencedAlpha; + } + void SetInfluencedAlpha(bool bEnable) { + this->mFlags.influencedAlpha = bEnable; + } + + bool IsDebugDrawMode() const { + return mFlags.debugDrawMode; + } + void SetDebugDrawMode(bool bEnable) { + this->mFlags.debugDrawMode = bEnable; + } + +private: math::MTX34 mViewMtx; // at 0x0 ut::Rect mViewRect; // at 0x34 math::VEC2 mScale; // at 0x44 f32 mGlobalAlpha; // at 0x48 - u8 mFlags; // at 0x50 + struct { + u8 mulViewDraw : 1; + u8 influencedAlpha : 1; + u8 locationAdjust : 1; + u8 invisiblePaneCalculateMtx : 1; + u8 debugDrawMode : 1; + } mFlags; // at 0x50 }; } // namespace lyt } // namespace nw4r diff --git a/include/nw4r/lyt/lyt_init.h b/include/nw4r/lyt/lyt_init.h new file mode 100644 index 00000000..be28d65f --- /dev/null +++ b/include/nw4r/lyt/lyt_init.h @@ -0,0 +1,10 @@ +#ifndef NW4R_LYT_INIT_H +#define NW4R_LYT_INIT_H + +namespace nw4r { +namespace lyt { +void LytInit(); +} +} // namespace nw4r + +#endif diff --git a/include/nw4r/lyt/lyt_layout.h b/include/nw4r/lyt/lyt_layout.h index 156e13f3..8bd38837 100644 --- a/include/nw4r/lyt/lyt_layout.h +++ b/include/nw4r/lyt/lyt_layout.h @@ -41,8 +41,10 @@ struct Layout { template static void DeleteObj(T *t) { - t->~T(); - FreeMemory(t); + if (t) { + t->~T(); + FreeMemory(t); + } } template diff --git a/include/nw4r/lyt/lyt_material.h b/include/nw4r/lyt/lyt_material.h index fec6d500..e6586c63 100644 --- a/include/nw4r/lyt/lyt_material.h +++ b/include/nw4r/lyt/lyt_material.h @@ -2,22 +2,60 @@ #define NW4R_LYT_MATERIAL_H #include "nw4r/lyt/lyt_animation.h" #include "nw4r/ut/ut_LinkList.h" +#include #include +#define MATERIAL_NAME_SIZE 20 + namespace nw4r { namespace lyt { -// TO-DO + +struct BitGXNums { + union { + u32 texSRT; + u32 texCoordGen; + u32 indSRT; + u32 indStage; + u32 tevSwap; + u32 tevStage; + u32 chanCtrl; + u32 matCol; + u32 alpComp; + u32 blendMode; + }; +}; + struct Material { - ut::LinkList mAnimLinks; // at 0x4 - // . . . - GXColorS10 COLOR_0x10; - GXColorS10 COLOR_0x18; - GXColorS10 COLOR_0x20; - // . . . - UNKWORD WORD_0x40; - // . . . - u8 BYTE_0x59; - // . . . + // SetupGX__Q34nw4r3lyt8MaterialFbUc + // BindAnimation__Q34nw4r3lyt8MaterialFPQ34nw4r3lyt13AnimTransform + // UnbindAnimation__Q34nw4r3lyt8MaterialFPQ34nw4r3lyt13AnimTransform + // UnbindAllAnimation__Q34nw4r3lyt8MaterialFv + // Animate__Q34nw4r3lyt8MaterialFv + // FindAnimationLink__Q34nw4r3lyt8MaterialFPQ34nw4r3lyt13AnimTransform + // FindAnimationLink__Q34nw4r3lyt8MaterialFRCQ34nw4r3lyt12AnimResource + // SetAnimationEnable__Q34nw4r3lyt8MaterialFPQ34nw4r3lyt13AnimTransformb + // SetAnimationEnable__Q34nw4r3lyt8MaterialFRCQ34nw4r3lyt12AnimResourceb + + virtual ~Material(); // at 0x08 + virtual bool SetupGX(bool bModVtxCok, u8 alpha); // at 0x0C + virtual void BindAnimation(AnimTransform *pAnimTrans); // at 0x10 + virtual void UnbindAnimation(AnimTransform *pAnimTrans); // at 0x14 + virtual void UnbindAllAnimation(); // at 0x18 + virtual void Animate(); // at 0x1C + virtual AnimationLink *FindAnimationLink(AnimTransform *pAnimTrans); // at 0x20 + virtual AnimationLink *FindAnimationLink(const AnimResource &animRes); // at 0x24 + virtual void SetAnimationEnable(AnimTransform *pAnimTrans, bool bEnable); // at 0x28 + virtual void SetAnimationEnable(const AnimResource &animRes, bool bEnable); // at 0x2C + + ut::LinkList mAnimList; // at 0x4 + GXColorS10 mTevCols[3]; // at 0x10 + ut::Color mTevKCols[4]; // at 0x28 + BitGXNums mGXMemCap; // at 0x38 + BitGXNums mGXMemNum; // at 0x3C + void *mpGXMem; // at 0x40 + char mName[MATERIAL_NAME_SIZE + 1]; // at 0x44 + bool mbUserAllocated; // at 0x59 + u8 mPadding[2]; // at 0x5A }; } // namespace lyt } // namespace nw4r diff --git a/include/nw4r/lyt/lyt_pane.h b/include/nw4r/lyt/lyt_pane.h index b31f2ccb..272e226d 100644 --- a/include/nw4r/lyt/lyt_pane.h +++ b/include/nw4r/lyt/lyt_pane.h @@ -7,51 +7,63 @@ #include "nw4r/ut/ut_LinkList.h" #include "nw4r/ut/ut_RuntimeTypeInfo.h" #include "nw4r/ut/ut_algorithm.h" -#include +#include +#include -#define PANE_NAME_SIZE 17 -#define PANE_USERDATA_SIZE 9 +#define PANE_NAME_SIZE 16 +#define PANE_USERDATA_SIZE 8 #define ANIMTARGET_PANE_MAX 10 namespace nw4r { namespace lyt { -void LytInit(); struct Size { - inline Size() : x(), y() {} + inline Size() : width(), height() {} inline Size &operator=(const Size &rhs) { - x = rhs.x; - y = rhs.y; + width = rhs.width; + height = rhs.height; return *this; } - f32 x, y; + f32 width, height; }; namespace detail { struct PaneBase { - inline PaneBase() : mNode() {} - + PaneBase(); virtual ~PaneBase(); - ut::LinkListNode mNode; // at 0x4 + ut::LinkListNode mLink; // at 0x4 }; + } // namespace detail +// TODO: Find proper place? +// GUESS: In the FindExtUserDataByName function it iterates through ExtUserData +struct ExtUserData { + u32 stringOffs; + u32 UNK_0x04; + u32 UNK_0x08; +}; namespace res { + +struct ExtUserDataList { + DataBlockHeader blockHeader; // at 0x00 + u16 num; // at 0x08 + u16 padding; // at 0x0A +}; struct Pane { - u32 mMagic; // "pan1", at 0x0 - u32 mLength; // at 0x4 - u8 BYTE_0x8; - u8 BYTE_0x9; - u8 BYTE_0xA; - u8 BYTE_0xB; // NO REFERENCES - char mName[PANE_NAME_SIZE]; // at 0xC + DataBlockHeader blockHeader; // at 0x00 "pan1" + u8 flag; // at 0x08 + u8 basePosition; // at 0x09 + u8 alpha; // at 0x0A + u8 padding; // + char name[PANE_NAME_SIZE]; // at 0x0C char mUserData[PANE_USERDATA_SIZE]; // at 0x1C - math::VEC3 VEC3_0x24; - math::VEC3 VEC3_0x30; - math::VEC2 VEC2_0x3C; - Size mSize; // at 0x44 + math::VEC3 translate; // at 0x24 + math::VEC3 rotate; // at 0x30 + math::VEC2 scale; // at 0x3C + Size size; // at 0x44 }; } // namespace res @@ -59,77 +71,81 @@ struct Pane : detail::PaneBase { // For use with TestBit enum PaneBits { VISIBLE, INFLUENCED_ALPHA, LOCATION_ADJUST }; - inline void Init() { - mParent = NULL; - mMaterial = NULL; - BYTE_0xD6 = 0; - INT_0xB4 = 0; + bool IsVisible() const { + return detail::TestBit(mFlag, VISIBLE); + } + bool IsInfluencedAlpha() const { + return detail::TestBit(mFlag, INFLUENCED_ALPHA); + } + bool IsLocationAdjust() const { + return detail::TestBit(mFlag, LOCATION_ADJUST); } - inline void SetName(const char *pName) { - strncpy(mName, pName, PANE_NAME_SIZE); - mName[PANE_NAME_SIZE - 1] = '\0'; - } + Pane(const res::Pane *pBlock); + void Init(); + void SetName(const char *pName); + void SetUserData(const char *pData); + void AppendChild(Pane *pChild); + void PrependChild(Pane *pChild); + void InsertChild(Pane *at, Pane *pChild); + void InsertChild(ut::LinkList::Iterator next, Pane *pChild); + void RemoveChild(Pane *pChild); + ut::Rect GetPaneRect() const; + ut::Rect GetPaneRect(const DrawInfo &) const; + void AddAnimationLink(AnimationLink *pAnimationLink); + math::VEC2 GetVtxPos() const; + void CalculateMtxChild(const DrawInfo &drawInfo); + u16 GetExtUserDataNum() const; + ExtUserData *GetExtUserData() const; + ExtUserData *FindExtUserDataByName(const char *name); - inline void SetUserData(const char *pData) { - strncpy(mUserData, pData, PANE_USERDATA_SIZE); - mUserData[PANE_USERDATA_SIZE - 1] = '\0'; - } + virtual ~Pane(); // at 0x8 + virtual const ut::detail::RuntimeTypeInfo *GetRuntimeTypeInfo() const; // at 0xC + virtual void CalculateMtx(const DrawInfo &drawInfo); // at 0x10 + virtual void Draw(const DrawInfo &); // at 0x14 + virtual void DrawSelf(const DrawInfo &); // at 0x18 + virtual void Animate(u32); // at 0x1C + virtual void AnimateSelf(u32); // at 0x20 + virtual ut::Color GetVtxColor(u32) const; // at 0x24 + virtual void SetVtxColor(u32, ut::Color); // at 0x28 + virtual u8 GetColorElement(u32 idx) const; // at 0x2C + virtual void SetColorElement(u32 idx, u8 value); // at 0x30 + virtual u8 GetVtxColorElement(u32 idx) const; // at 0x34 + virtual void SetVtxColorElement(u32 idx, u8 value); // at 0x38 + virtual Pane *FindPaneByName(const char *findName, bool bRecursive); // at 0x3C + virtual Material *FindMaterialByName(const char *findName, bool bRecursive); // at 0x40 + virtual void BindAnimation(AnimTransform *pAnimTrans, bool bRecursive, bool bDisable); // at 0x44 + virtual void UnbindAnimation(AnimTransform *pAnimTrans, bool bRecusive); // at 0x48 + virtual void UnbindAllAnimation(bool bRecursive); // at 0x4C + virtual void UnbindAnimationSelf(AnimTransform *pAnimTrans); // at 0x50 + virtual AnimationLink *FindAnimationLinkSelf(AnimTransform *pAnimTrans); // at 0x54 + virtual AnimationLink *FindAnimationLinkSelf(const AnimResource &animRes); // at 0x58 + virtual void SetAnimationEnable(AnimTransform *pAnimTrans, bool bEnable, bool bRecursive); // at 0x5C + virtual void SetAnimationEnable(const AnimResource &animRes, bool bEnable, bool bRecursive); // at 0x60 + virtual u8 GetMaterialNum() const; // at 0x64 + virtual Material *GetMaterial() const; // at 0x68 + virtual Material *GetMaterial(u32 idx) const; // at 0x6C + virtual void LoadMtx(const DrawInfo &drawInfo); // at 0x70 - inline void InsertChild(ut::LinkList::Iterator iter, lyt::Pane *pChild) { - mChildren.Insert(iter, pChild); - pChild->mParent = this; - } - - Pane(const res::Pane *); - virtual ~Pane(); // at 0x8 - virtual const ut::detail::RuntimeTypeInfo *GetRuntimeTypeInfo() const; // at 0xC - virtual UNKTYPE CalculateMtx(const DrawInfo &); // at 0x10 - virtual UNKTYPE Draw(const DrawInfo &); // at 0x14 - virtual void DrawSelf(const DrawInfo &); // at 0x18 - virtual UNKTYPE Animate(u32); // at 0x1C - virtual UNKTYPE AnimateSelf(u32); // at 0x20 - virtual ut::Color GetVtxColor(u32) const; // at 0x24 - virtual void SetVtxColor(u32, ut::Color); // at 0x28 - virtual UNKTYPE GetColorElement(u32) const; // at 0x2C - virtual UNKTYPE SetColorElement(u32, u8); // at 0x30 - virtual u8 GetVtxColorElement(u32) const; // at 0x34 - virtual void SetVtxColorElement(u32, u8); // at 0x38 - virtual Pane *FindPaneByName(const char *, bool); // at 0x3C - virtual UNKTYPE FindMaterialByName(const char *, bool); // at 0x40 - virtual UNKTYPE BindAnimation(AnimTransform *, bool); // at 0x44 - virtual UNKTYPE UnbindAnimation(AnimTransform *, bool); // at 0x48 - virtual UNKTYPE UnbindAllAnimation(bool); // at 0x4C - virtual UNKTYPE UnbindAnimationSelf(AnimTransform *); // at 0x50 - virtual UNKTYPE FindAnimationLink(AnimTransform *); // at 0x54 - virtual UNKTYPE SetAnimationEnable(AnimTransform *, bool, bool); // at 0x58 - virtual UNKTYPE GetMaterial() const; // at 0x5C - virtual UNKTYPE LoadMtx(const DrawInfo &); // at 0x60 - void AppendChild(Pane *); - void RemoveChild(Pane *); - UNKTYPE GetPaneRect(const DrawInfo &) const; - UNKTYPE AddAnimationLink(AnimationLink *); - UNKTYPE GetVtxPos() const; - - ut::LinkListNode mNode; // at 0x4 - Pane *mParent; // at 0x8 - ut::LinkList mChildren; // at 0x14 - ut::LinkList mAnims; // at 0x20; - Material *mMaterial; // at 0x2C - math::VEC3 mTranslate; // at 0x30 - math::VEC3 VEC3_0x3C; - math::VEC2 mScale; // at 0x48 - Size mSize; // at 0x50 - math::MTX34 MTX34_0x58; - math::MTX34 mGlobalMtx; // at 0x84 - int INT_0xB4; - u8 mAlpha; // at 0xB8 - u8 BYTE_0xB9; - u8 BYTE_0xBA; - u8 mFlags; // at 0xBB - char mName[PANE_NAME_SIZE]; // at 0xBC - char mUserData[PANE_USERDATA_SIZE]; // at 0xCD - u8 BYTE_0xD6; + Pane *mpParent; // at 0x0C + ut::LinkList mChildList; // at 0x10 + ut::LinkList mAnimList; // at 0x1C; + Material *mpMaterial; // at 0x28 + math::VEC3 mTranslate; // at 0x2C + math::VEC3 mRotate; // at 0x38 + math::VEC2 mScale; // at 0x44 + Size mSize; // at 0x4C + math::MTX34 mMtx; // at 0x54 + math::MTX34 mGlbMtx; // at 0x84 + res::ExtUserDataList *mpExtUserDataList; // at 0xB4 + u8 mAlpha; // at 0xB8 + u8 mGlbAlpha; // at 0xB9 + u8 mBasePosition; // at 0xBA + u8 mFlag; // at 0xBB + char mName[PANE_NAME_SIZE + 1]; // at 0xBC + char mUserData[PANE_USERDATA_SIZE + 1]; // at 0xCD + bool mbUserAllocated; // at 0xD6 + u8 mPadding; // at 0xD7 static ut::detail::RuntimeTypeInfo typeInfo; }; diff --git a/include/nw4r/lyt/lyt_types.h b/include/nw4r/lyt/lyt_types.h new file mode 100644 index 00000000..e9ece89e --- /dev/null +++ b/include/nw4r/lyt/lyt_types.h @@ -0,0 +1,20 @@ +#ifndef NW4R_LYT_TYPES_H +#define NW4R_LYT_TYPES_H + +#include + +namespace nw4r { +namespace lyt { +namespace detail { +template +inline bool TestBit(T bits, int index) { + T mask = 1 << index; + return bits & mask; +} +} // namespace detail + +} // namespace lyt + +} // namespace nw4r + +#endif diff --git a/include/nw4r/ut/ut_Rect.h b/include/nw4r/ut/ut_Rect.h index 3a4ec1e2..4b9bd9b3 100644 --- a/include/nw4r/ut/ut_Rect.h +++ b/include/nw4r/ut/ut_Rect.h @@ -16,11 +16,19 @@ struct Rect { Rect(f32 l, f32 t, f32 r, f32 b) : left(l), top(t), right(r), bottom(b) {} ~Rect() {} - void SetWidth(f32 width) { right = left + width; } - f32 GetWidth() const { return right - left; } + void SetWidth(f32 width) { + right = left + width; + } + f32 GetWidth() const { + return right - left; + } - void SetHeight(f32 height) { bottom = top + height; } - f32 GetHeight() const { return bottom - top; } + void SetHeight(f32 height) { + bottom = top - height; + } + f32 GetHeight() const { + return bottom - top; + } void Normalize() { f32 l = left; diff --git a/src/egg/math/eggMatrix.cpp b/src/egg/math/eggMatrix.cpp index 68f0049f..9fef71b7 100644 --- a/src/egg/math/eggMatrix.cpp +++ b/src/egg/math/eggMatrix.cpp @@ -239,7 +239,7 @@ void Matrix34f::makeT(const Vector3f &t) { } void Matrix34f::fromQuat(const Quatf &q) { - m[0][0] = 1.0f - (2.0f * q.y * q.y) - (2.0f * q.z * q.z); + m[0][0] = 1.0f - (2 * q.y * q.y) - (2.0f * q.z * q.z); m[0][1] = (2.0f * q.x * q.y) - (2.0f * q.w * q.z); m[0][2] = (2.0f * q.x * q.z) + (2.0f * q.w * q.y); diff --git a/src/nw4r/lyt/lyt_common.cpp b/src/nw4r/lyt/lyt_common.cpp index c5cda80e..795a908f 100644 --- a/src/nw4r/lyt/lyt_common.cpp +++ b/src/nw4r/lyt/lyt_common.cpp @@ -146,7 +146,7 @@ void detail::DrawQuad(const math::VEC2 &basePt, const Size &size, u8 texCoordNum GXTexCoord2f32(texCoords[i][0].x, texCoords[i][0].y); } - GXPosition2f32(basePt.x + size.x, basePt.y); + GXPosition2f32(basePt.x + size.width, basePt.y); if (vtxColors != NULL) { GXColor1u32(vtxColors[1]); } @@ -154,7 +154,7 @@ void detail::DrawQuad(const math::VEC2 &basePt, const Size &size, u8 texCoordNum GXTexCoord2f32(texCoords[i][1].x, texCoords[i][1].y); } - GXPosition2f32(basePt.x + size.x, basePt.y - size.y); + GXPosition2f32(basePt.x + size.width, basePt.y - size.height); if (vtxColors != NULL) { GXColor1u32(vtxColors[3]); } @@ -162,7 +162,7 @@ void detail::DrawQuad(const math::VEC2 &basePt, const Size &size, u8 texCoordNum GXTexCoord2f32(texCoords[i][3].x, texCoords[i][3].y); } - GXPosition2f32(basePt.x, basePt.y - size.y); + GXPosition2f32(basePt.x, basePt.y - size.height); if (vtxColors != NULL) { GXColor1u32(vtxColors[2]); } diff --git a/src/nw4r/lyt/lyt_init.cpp b/src/nw4r/lyt/lyt_init.cpp index e69de29b..9acb89c0 100644 --- a/src/nw4r/lyt/lyt_init.cpp +++ b/src/nw4r/lyt/lyt_init.cpp @@ -0,0 +1,14 @@ +#include +namespace { +const char *NW4R_LYT_Version_ = "<< NW4R - LYT \tfinal build: Mar 15 2010 02:17:33 (0x4302_158) >>"; +} + +namespace nw4r { +namespace lyt { +void LytInit() { + OSRegisterVersion(NW4R_LYT_Version_); + OSInitFastCast(); +} +} // namespace lyt + +} // namespace nw4r diff --git a/src/nw4r/lyt/lyt_pane.cpp b/src/nw4r/lyt/lyt_pane.cpp index e69de29b..0b60a834 100644 --- a/src/nw4r/lyt/lyt_pane.cpp +++ b/src/nw4r/lyt/lyt_pane.cpp @@ -0,0 +1,536 @@ +#include +#include +#include +#include +#include +#include +#include +#include + +// ReverseYAxis__22@unnamed@lyt_pane_cpp@FPQ34nw4r4math5MTX34 + +void float_order() { + 0.0f; + 1.0f; +} + +namespace nw4r { + +namespace lyt { +namespace detail { +// __ct__Q44nw4r3lyt6detail8PaneBaseFv +PaneBase::PaneBase() : mLink() {} + +// __dt__Q44nw4r3lyt6detail8PaneBaseFv +PaneBase::~PaneBase() {} + +} // namespace detail + +NW4R_UT_RTTI_DEF_BASE(Pane); + +// 80486a70 +// __ct__Q34nw4r3lyt4PaneFv + +// __dt__Q34nw4r2ut38LinkListFv + +// __dt__Q34nw4r2ut28LinkListFv + +// __ct__Q34nw4r3lyt4PaneFPCQ44nw4r3lyt3res4Pane +Pane::Pane(const res::Pane *pBlock) : mChildList(), mAnimList(), mSize() { + this->mpParent = nullptr; + this->mpMaterial = nullptr; + this->mbUserAllocated = false; + this->mpExtUserDataList = nullptr; + this->mBasePosition = pBlock->basePosition; + strncpy(this->mName, pBlock->name, PANE_NAME_SIZE); + this->mName[PANE_NAME_SIZE] = '\0'; + strncpy(this->mUserData, pBlock->mUserData, PANE_USERDATA_SIZE); + this->mUserData[PANE_USERDATA_SIZE] = '\0'; + this->mTranslate = pBlock->translate; + this->mRotate = pBlock->rotate; + this->mScale = pBlock->scale; + this->mSize = pBlock->size; + this->mGlbAlpha = this->mAlpha = pBlock->alpha; + this->mFlag = pBlock->flag; +} + +// Init__Q34nw4r3lyt4PaneFv +void Pane::Init() { + this->mpParent = NULL; + this->mpMaterial = NULL; + this->mbUserAllocated = false; + this->mpExtUserDataList = NULL; +} + +// __dt__Q34nw4r3lyt4PaneFv +Pane::~Pane() { + ut::LinkList::Iterator it = this->mChildList.GetBeginIter(); + while (it != this->mChildList.GetEndIter()) { + ut::LinkList::Iterator currIt = it++; + mChildList.Erase(currIt); + if (!currIt->mbUserAllocated) { + Layout::DeleteObj(&*currIt); + } + } + this->UnbindAnimationSelf(nullptr); + if (this->mpMaterial && !this->mpMaterial->mbUserAllocated) { + Layout::DeleteObj(this->mpMaterial); + } +} + +// SetName__Q34nw4r3lyt4PaneFPCc +void Pane::SetName(const char *pName) { + strncpy(this->mName, pName, PANE_NAME_SIZE); + this->mName[PANE_NAME_SIZE - 1] = '\0'; +} + +// SetUserData__Q34nw4r3lyt4PaneFPCc +void Pane::SetUserData(const char *pData) { + strncpy(this->mUserData, pData, PANE_USERDATA_SIZE); + this->mUserData[PANE_USERDATA_SIZE - 1] = '\0'; +} + +// AppendChild__Q34nw4r3lyt4PaneFPQ34nw4r3lyt4Pane +void Pane::AppendChild(Pane *pChild) { + InsertChild(this->mChildList.GetEndIter(), pChild); +} + +// PrependChild__Q34nw4r3lyt4PaneFPQ34nw4r3lyt4Pane +void Pane::PrependChild(Pane *pChild) { + InsertChild(this->mChildList.GetBeginIter(), pChild); +} + +// InsertChild__Q34nw4r3lyt4PaneFPQ34nw4r3lyt4PanePQ34nw4r3lyt4Pane +void Pane::InsertChild(Pane *at, Pane *pChild) { + this->mChildList.Insert(mChildList.GetIteratorFromPointer(&at->mLink), pChild); + pChild->mpParent = this; +} + +// InsertChild__Q34nw4r3lyt4PaneFQ44nw4r2ut28LinkList8IteratorPQ34nw4r3lyt4Pane +// Guess for now. Not in SS +void Pane::InsertChild(ut::LinkList::Iterator next, Pane *pChild) { + this->mChildList.Insert(next, pChild); + pChild->mpParent = this; +} + +// RemoveChild__Q34nw4r3lyt4PaneFPQ34nw4r3lyt4Pane +void Pane::RemoveChild(Pane *pChild) { + this->mChildList.Erase(pChild); + pChild->mpParent = nullptr; +} +// GetPaneRect__Q34nw4r3lyt4PaneCFv +ut::Rect Pane::GetPaneRect() const { + ut::Rect ret; + math::VEC2 basePt = GetVtxPos(); + + ret.left = basePt.x; + ret.top = basePt.y; + ret.right = basePt.x + mSize.width; + ret.bottom = basePt.y - mSize.height; + + return ret; +} + +// GetPaneRect__Q34nw4r3lyt4PaneCFRCQ34nw4r3lyt8DrawInfo +ut::Rect Pane::GetPaneRect(const DrawInfo &) const { + return GetPaneRect(); +} + +// GetVtxColor__Q34nw4r3lyt4PaneCFUl +ut::Color Pane::GetVtxColor(u32) const { + return ut::Color(); +} + +// SetVtxColor__Q34nw4r3lyt4PaneFUlQ34nw4r2ut5Color +void Pane::SetVtxColor(u32, ut::Color) {} + +// GetColorElement__Q34nw4r3lyt4PaneCFUl +u8 Pane::GetColorElement(u32 idx) const { + if (idx == 0x10) { + return this->mAlpha; + } else { + return GetVtxColorElement(idx); + } +} + +// SetColorElement__Q34nw4r3lyt4PaneFUlUc +void Pane::SetColorElement(u32 idx, u8 value) { + if (idx == 0x10) { + this->mAlpha = value; + } else { + return SetVtxColorElement(idx, value); + } +} + +// GetVtxColorElement__Q34nw4r3lyt4PaneCFUl +u8 Pane::GetVtxColorElement(u32 idx) const { + return 0xFF; +} + +// SetVtxColorElement__Q34nw4r3lyt4PaneFUlUc +void Pane::SetVtxColorElement(u32 idx, u8 value) {} + +// FindPaneByName__Q34nw4r3lyt4PaneFPCcb +Pane *Pane::FindPaneByName(const char *findName, bool bRecursive) { + if (detail::EqualsResName(this->mName, findName)) { + return this; + } + if (bRecursive) { + for (ut::LinkList::Iterator it = this->mChildList.GetBeginIter(); it != this->mChildList.GetEndIter(); + it++) { + Pane *pPane = it->FindPaneByName(findName, bRecursive); + if (pPane != nullptr) { + return pPane; + } + } + } + return nullptr; +} + +// FindMaterialByName__Q34nw4r3lyt4PaneFPCcb +Material *Pane::FindMaterialByName(const char *findName, bool bRecursive) { + if (this->mpMaterial && detail::EqualsMaterialName(this->mpMaterial->mName, findName)) { + return this->mpMaterial; + } + if (bRecursive) { + for (ut::LinkList::Iterator it = this->mChildList.GetBeginIter(); it != this->mChildList.GetEndIter(); + it++) { + Material *pPane = it->FindMaterialByName(findName, bRecursive); + if (pPane != nullptr) { + return pPane; + } + } + } + return nullptr; +} + +// CalculateMtx__Q34nw4r3lyt4PaneFRCQ34nw4r3lyt8DrawInfo +void Pane::CalculateMtx(const DrawInfo &drawInfo) { + if (!IsVisible() && !drawInfo.IsInvisiblePaneCalculateMtx()) { + return; + } + + math::VEC2 scale = this->mScale; + + if (drawInfo.IsLocationAdjust() && IsLocationAdjust()) { + scale.x *= drawInfo.GetLocationAdjustScale().x; + scale.y *= drawInfo.GetLocationAdjustScale().y; + } + if (mRotate.x != 0.0f || mRotate.y != 0.0f) { + f32 sinx, siny, sinz; + f32 cosx, cosy, cosz; + + math::SinCosDeg(&sinx, &cosx, mRotate.x); + math::SinCosDeg(&siny, &cosy, mRotate.y); + math::SinCosDeg(&sinz, &cosz, mRotate.z); + const f32 cosz_cosx = cosz * cosx; + const f32 siny_sinx = siny * sinx; + const f32 sinz_cosx = sinz * cosx; + this->mMtx._00 = cosz * cosy * scale.x; + this->mMtx._10 = (sinz * cosy) * scale.x; + this->mMtx._20 = (-siny) * scale.x; + this->mMtx._01 = (-sinz_cosx + cosz * siny_sinx) * scale.y; + this->mMtx._11 = (cosz_cosx + sinz * siny_sinx) * scale.y; + this->mMtx._21 = (cosy * sinx) * scale.y; + this->mMtx._02 = (sinz * sinx) + (cosz_cosx * siny); + this->mMtx._12 = (-cosz * sinx) + (sinz_cosx * siny); + this->mMtx._22 = (cosy * cosx); + + } else if (mRotate.z != 0.0f) { + f32 sinz; + f32 cosz; + math::SinCosDeg(&sinz, &cosz, mRotate.z); + this->mMtx._00 = cosz * scale.x; + this->mMtx._01 = -sinz * scale.y; + this->mMtx._02 = 0.0f; + this->mMtx._10 = sinz * scale.x; + this->mMtx._11 = cosz * scale.y; + this->mMtx._12 = 0.0f; + this->mMtx._20 = 0.0f; + this->mMtx._21 = 0.0f; + this->mMtx._22 = 1.0f; + } else { + this->mMtx._00 = scale.x; + this->mMtx._01 = 0.0f; + this->mMtx._02 = 0.0f; + this->mMtx._10 = 0.0f; + this->mMtx._11 = scale.y; + this->mMtx._12 = 0.0f; + this->mMtx._20 = 0.0f; + this->mMtx._21 = 0.0f; + this->mMtx._22 = 1.0f; + } + this->mMtx._03 = this->mTranslate.x; + this->mMtx._13 = this->mTranslate.y; + this->mMtx._23 = this->mTranslate.z; + if (this->mpParent) { + PSMTXConcat(this->mpParent->mGlbMtx, this->mMtx, this->mGlbMtx); + } else { + if (drawInfo.IsMultipleViewMtxOnDraw()) { + this->mGlbMtx = this->mMtx; + } else { + PSMTXConcat(drawInfo.GetViewMtx(), this->mMtx, this->mGlbMtx); + } + } + + u8 alpha; + bool b = drawInfo.IsInfluencedAlpha() && this->mpParent; + if (b) { + alpha = this->mAlpha * drawInfo.GetGlobalAlpha(); + } else { + alpha = this->mAlpha; + } + this->mGlbAlpha = alpha; + + if (IsInfluencedAlpha() && this->mAlpha != 0xFF) { + DrawInfo &mtDrawInfo = const_cast(drawInfo); + const f32 crGlobalAlpha = drawInfo.GetGlobalAlpha(); + const bool bCdInfluenced = drawInfo.IsInfluencedAlpha(); + mtDrawInfo.SetGlobalAlpha(crGlobalAlpha * mAlpha * (1.0f / 0xFF)); + mtDrawInfo.SetInfluencedAlpha(true); + CalculateMtxChild(drawInfo); + mtDrawInfo.SetGlobalAlpha(crGlobalAlpha); + mtDrawInfo.SetInfluencedAlpha(bCdInfluenced); + } else { + CalculateMtxChild(drawInfo); + } +} + +// CalculateMtxChild__Q34nw4r3lyt4PaneFRCQ34nw4r3lyt8DrawInfo +// Guess but makes sense +void Pane::CalculateMtxChild(const DrawInfo &drawInfo) { + for (ut::LinkList::Iterator it = this->mChildList.GetBeginIter(); it != this->mChildList.GetEndIter(); + it++) { + it->CalculateMtx(drawInfo); + } +} + +// Draw__Q34nw4r3lyt4PaneFRCQ34nw4r3lyt8DrawInfo +void Pane::Draw(const DrawInfo &drawInfo) { + if (IsVisible()) { + this->DrawSelf(drawInfo); + for (ut::LinkList::Iterator it = this->mChildList.GetBeginIter(); it != this->mChildList.GetEndIter(); + it++) { + it->Draw(drawInfo); + } + } +} + +// DrawSelf__Q34nw4r3lyt4PaneFRCQ34nw4r3lyt8DrawInfo +void Pane::DrawSelf(const DrawInfo &drawInfo) {} + +// Animate__Q34nw4r3lyt4PaneFUl +void Pane::Animate(u32 option) { + this->AnimateSelf(option); + if (IsVisible() || !(option & 1)) { + for (ut::LinkList::Iterator it = this->mChildList.GetBeginIter(); it != this->mChildList.GetEndIter(); + it++) { + it->Animate(option); + } + } +} + +// AnimateSelf__Q34nw4r3lyt4PaneFUl +void Pane::AnimateSelf(u32 option) { + for (ut::LinkList::Iterator it = this->mAnimList.GetBeginIter(); + it != this->mAnimList.GetEndIter(); it++) { + if (!it->mbDisable) { + AnimTransform *animTrans = it->mAnimTrans; + animTrans->Animate(it->mIdx, this); + } + } + if (IsVisible() || !(option & 1)) { + if (this->mpMaterial) { + mpMaterial->Animate(); + } + } +} + +// BindAnimation__Q34nw4r3lyt4PaneFPQ34nw4r3lyt13AnimTransformbb +void Pane::BindAnimation(AnimTransform *pAnimTrans, bool bRecursive, bool bDisable) { + pAnimTrans->Bind(this, bRecursive); +} + +// UnbindAnimation__Q34nw4r3lyt4PaneFPQ34nw4r3lyt13AnimTransformb +void Pane::UnbindAnimation(AnimTransform *pAnimTrans, bool bRecusive) { + this->UnbindAnimationSelf(pAnimTrans); + if (bRecusive) { + for (ut::LinkList::Iterator it = this->mChildList.GetBeginIter(); it != this->mChildList.GetEndIter(); + it++) { + it->UnbindAnimation(pAnimTrans, bRecusive); + } + } +} + +// UnbindAllAnimation__Q34nw4r3lyt4PaneFb +void Pane::UnbindAllAnimation(bool bRecursive) { + UnbindAnimation(nullptr, bRecursive); +} + +// UnbindAnimationSelf__Q34nw4r3lyt4PaneFPQ34nw4r3lyt13AnimTransform +void Pane::UnbindAnimationSelf(AnimTransform *pAnimTrans) { + if (this->mpMaterial) { + this->mpMaterial->UnbindAnimation(pAnimTrans); + } + detail::UnbindAnimationLink(&this->mAnimList, pAnimTrans); +} + +// AddAnimationLink__Q34nw4r3lyt4PaneFPQ34nw4r3lyt13AnimationLink +void Pane::AddAnimationLink(AnimationLink *pAnimationLink) { + this->mAnimList.PushBack(pAnimationLink); +} + +// FindAnimationLinkSelf__Q34nw4r3lyt4PaneFPQ34nw4r3lyt13AnimTransform +AnimationLink *Pane::FindAnimationLinkSelf(AnimTransform *pAnimTrans) { + return detail::FindAnimationLink(&this->mAnimList, pAnimTrans); +} + +// FindAnimationLinkSelf__Q34nw4r3lyt4PaneFRCQ34nw4r3lyt12AnimResource +AnimationLink *Pane::FindAnimationLinkSelf(const AnimResource &animRes) { + return detail::FindAnimationLink(&this->mAnimList, animRes); +} + +// SetAnimationEnable__Q34nw4r3lyt4PaneFPQ34nw4r3lyt13AnimTransformbb +void Pane::SetAnimationEnable(AnimTransform *pAnimTrans, bool bEnable, bool bRecursive) { + AnimationLink *pAnimLink = FindAnimationLinkSelf(pAnimTrans); + if (pAnimLink) { + pAnimLink->mbDisable = !bEnable; + } + + u8 materialNum = GetMaterialNum(); + for (u8 i = 0; i < materialNum; i++) { + GetMaterial(i)->SetAnimationEnable(pAnimTrans, bEnable); + } + if (bRecursive) { + for (ut::LinkList::Iterator it = this->mChildList.GetBeginIter(); it != this->mChildList.GetEndIter(); + it++) { + it->SetAnimationEnable(pAnimTrans, bEnable, bRecursive); + } + } +} + +// SetAnimationEnable__Q34nw4r3lyt4PaneFRCQ34nw4r3lyt12AnimResourcebb +void Pane::SetAnimationEnable(const AnimResource &animRes, bool bEnable, bool bRecursive) { + AnimationLink *pAnimLink = FindAnimationLinkSelf(animRes); + if (pAnimLink) { + pAnimLink->mbDisable = !bEnable; + } + + u8 materialNum = GetMaterialNum(); + for (u8 i = 0; i < materialNum; i++) { + GetMaterial(i)->SetAnimationEnable(animRes, bEnable); + } + if (bRecursive) { + for (ut::LinkList::Iterator it = this->mChildList.GetBeginIter(); it != this->mChildList.GetEndIter(); + it++) { + it->SetAnimationEnable(animRes, bEnable, bRecursive); + } + } +} + +// LoadMtx__Q34nw4r3lyt4PaneFRCQ34nw4r3lyt8DrawInfo +void Pane::LoadMtx(const DrawInfo &drawInfo) { + math::MTX34 mtx; + math::MTX34 *mtxPtr; + if (drawInfo.IsMultipleViewMtxOnDraw()) { + PSMTXConcat(drawInfo.GetViewMtx(), this->mGlbMtx, mtx); + mtxPtr = &mtx; + } else { + mtxPtr = &this->mGlbMtx; + } + GXLoadPosMtxImm(*mtxPtr, GX_PNMTX0); + GXSetCurrentMtx(GX_PNMTX0); +} + +// GetVtxPos__Q34nw4r3lyt4PaneCFv +math::VEC2 Pane::GetVtxPos() const { + math::VEC2 basePt(0.0f, 0.0f); + + switch (this->mBasePosition % 3) { + default: + basePt.x = 0.0f; + break; + case 1: + basePt.x = -this->mSize.width / 2; + break; + case 2: + basePt.x = -this->mSize.width; + break; + } + switch (this->mBasePosition / 3) { + default: + basePt.y = 0.0f; + break; + case 1: + basePt.y = this->mSize.height / 2; + break; + case 2: + basePt.y = this->mSize.height; + break; + } + return basePt; +} + +// GetMaterialNum__Q34nw4r3lyt4PaneCFv +u8 Pane::GetMaterialNum() const { + if (this->mpMaterial) { + return 1; + } else { + return 0; + } +} + +// GetMaterial__Q34nw4r3lyt4PaneCFv +Material *Pane::GetMaterial() const { + return this->mpMaterial; +} + +// GetMaterial__Q34nw4r3lyt4PaneCFUl +Material *Pane::GetMaterial(u32 idx) const { + if (idx == 0) { + return GetMaterial(); + } + return nullptr; +} + +u16 Pane::GetExtUserDataNum() const { + if (this->mpExtUserDataList) { + return this->mpExtUserDataList->num; + } + return 0; +} +ExtUserData *Pane::GetExtUserData() const { + if (this->mpExtUserDataList) { + return (ExtUserData *)(this->mpExtUserDataList + 1); + } + return nullptr; +} + +ExtUserData *Pane::FindExtUserDataByName(const char *name) { + ExtUserData *pUserData = GetExtUserData(); + + if (!pUserData) { + return nullptr; + } + int i = 0; + for (int i = 0; i < this->mpExtUserDataList->num;) { + u32 offset = pUserData->stringOffs; + const char *str = 0; + if (offset != 0) { + str = (const char *)(pUserData) + offset; + } else { + str = 0; + } + + if (strcmp(name, str) == 0) { + return pUserData; + }; + i++; + pUserData++; + } + return nullptr; +} + +} // namespace lyt + +} // namespace nw4r