lyt_layout progress

This commit is contained in:
elijah-thomas774
2024-05-24 15:55:55 -04:00
parent 752f760c32
commit 467e1a61ce
58 changed files with 866 additions and 1317 deletions
+19 -13
View File
@@ -1,17 +1,17 @@
Sections:
.init type:code
extab type:rodata
extabindex type:rodata
.text type:code
.ctors type:rodata
.dtors type:rodata
.rodata type:rodata
.data type:data
.sdata type:data
.sbss type:bss
.sdata2 type:rodata
.sbss2 type:bss
.bss type:bss
.init type:code align:4
extab type:rodata align:8
extabindex type:rodata align:4
.text type:code align:32
.ctors type:rodata align:16
.dtors type:rodata align:32
.rodata type:rodata align:32
.data type:data align:32
.sdata type:data align:32
.sbss type:bss align:16
.sdata2 type:rodata align:8
.sbss2 type:bss align:16
.bss type:bss align:64
toBeSorted/save_file.cpp:
.text start:0x800099B0 end:0x80009D28
@@ -332,6 +332,12 @@ nw4r/lyt/lyt_group.cpp:
.text start:0x80487EB0 end:0x8048820C
.data start:0x8056E4A8 end:0x8056E4B4
nw4r/lyt/lyt_layout.cpp:
.text start:0x80488210 end:0x80489268
.data start:0x8056E4B8 end:0x8056E4F8
.sbss start:0x805766F8 end:0x805766FC
.sdata2 start:0x8057F240 end:0x8057F248
nw4r/lyt/lyt_resourceAccessor.cpp:
.text start:0x80492000 end:0x80492058
.data start:0x8056E7E0 end:0x8056E7F8
+4 -4
View File
@@ -37074,7 +37074,7 @@ lbl_8056E388 = .data:0x8056E388; // type:object size:0x60
lbl_8056E3E8 = .data:0x8056E3E8; // type:object size:0x46 scope:local data:string
__vt__Q34nw4r3lyt4Pane = .data:0x8056E430; // type:object size:0x74
__vt__Q34nw4r3lyt5Group = .data:0x8056E4A8; // type:object size:0xC
lbl_8056E4B8 = .data:0x8056E4B8; // type:object size:0x40
__vt__Q34nw4r3lyt6Layout = .data:0x8056E4B8; // type:object size:0x40
lbl_8056E4F8 = .data:0x8056E4F8; // type:object size:0x78
lbl_8056E570 = .data:0x8056E570; // type:object size:0x88
lbl_8056E5F8 = .data:0x8056E5F8; // type:object size:0x3C
@@ -40876,9 +40876,9 @@ 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
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
mspAllocator__Q34nw4r3lyt6Layout = .sbss:0x805766F8; // type:object size:0x4 data:4byte
typeInfo__Q34nw4r3lyt7Picture = .sbss:0x80576700; // type:object size:0x4 data:4byte
typeInfo__Q34nw4r3lyt7TextBox = .sbss:0x80576708; // type:object size:0x4 data:4byte
lbl_80576710 = .sbss:0x80576710; // type:object size:0x8 data:4byte
lbl_80576718 = .sbss:0x80576718; // type:object size:0x8 data:4byte
@GUARD@SetSize__Q44nw4r3lyt6detail11TexCoordAryFUc@texCoords = .sbss:0x80576720; // type:object size:0x1 data:byte
+1
View File
@@ -355,6 +355,7 @@ config.libs = [
Object(Matching, "nw4r/lyt/lyt_init.cpp"),
Object(Matching, "nw4r/lyt/lyt_pane.cpp"),
Object(Matching, "nw4r/lyt/lyt_group.cpp"),
Object(NonMatching, "nw4r/lyt/lyt_layout.cpp"),
Object(Matching, "nw4r/lyt/lyt_resourceAccessor.cpp"),
Object(Matching, "nw4r/lyt/lyt_arcResourceAccessor.cpp"),
Object(Matching, "nw4r/lyt/lyt_common.cpp"),
-11
View File
@@ -1,11 +0,0 @@
#ifndef NW4R_EF_ANIMCURVE_H
#define NW4R_EF_ANIMCURVE_H
#include "common.h"
namespace nw4r {
namespace ef {
UNKTYPE AnimCurveExecuteF32(u8 *, float *, u32, u16, u32);
}
} // namespace nw4r
#endif
-38
View File
@@ -1,38 +0,0 @@
#ifndef NW4R_EF_CREATIONQUEUE
#define NW4R_EF_CREATIONQUEUE
#include "common.h"
#include "ef_emitter.h"
namespace nw4r {
namespace ef {
enum CreationType { CreationType_Particle, CreationType_Emitter };
// sizeof(UNK_CREATIONQUEUE) = 0x14
struct Creation {
u8 mType; // at 0x0
u16 SHORT_0x2;
EmitterInheritSetting mInheritSetting; // at 0x4
Particle *mParticle; // at 0x8
EmitterResource *mResource; // at 0xc
};
struct CreationQueue {
CreationQueue();
void AddParticleCreation(const EmitterInheritSetting *, Particle *, EmitterResource *, u16);
void AddEmitterCreation(const EmitterInheritSetting *, Particle *, EmitterResource *, u16);
int mSize;
Creation mCreations[0x400];
inline bool IsEmpty() {
return mSize == 0;
}
void Execute();
};
} // namespace ef
} // namespace nw4r
#endif
-16
View File
@@ -1,16 +0,0 @@
#ifndef NW4R_EF_CUBE_H
#define NW4R_EF_CUBE_H
#include "ef_emitterform.h"
namespace nw4r
{
namespace ef
{
struct EmitterFormCube : EmitterForm
{
virtual UNKTYPE Emission(Emitter *, ParticleManager *, int, u32, float *, u16, float, const math::MTX34 *);
};
}
}
#endif
-16
View File
@@ -1,16 +0,0 @@
#ifndef NW4R_EF_CYLINDER_H
#define NW4R_EF_CYLINDER_H
#include "ef_emitterform.h"
namespace nw4r
{
namespace ef
{
struct EmitterFormCylinder : EmitterForm
{
virtual UNKTYPE Emission(Emitter *, ParticleManager *, int, u32, float *, u16, float, const math::MTX34 *);
};
}
}
#endif
-16
View File
@@ -1,16 +0,0 @@
#ifndef NW4R_EF_DISC_H
#define NW4R_EF_DISC_H
#include "ef_emitterform.h"
namespace nw4r
{
namespace ef
{
struct EmitterFormDisc : EmitterForm
{
virtual UNKTYPE Emission(Emitter *, ParticleManager *, int, u32, float *, u16, float, const math::MTX34 *);
};
}
}
#endif
@@ -1,19 +0,0 @@
#ifndef NW4R_EF_DRAW_BILLBOARD_STRATEGY_H
#define NW4R_EF_DRAW_BILLBOARD_STRATEGY_H
#include "common.h"
#include "ef_drawstrategyimpl.h"
namespace nw4r {
namespace ef {
class DrawBillboardStrategy : public DrawStrategyImpl {
public:
DrawBillboardStrategy();
virtual ~DrawBillboardStrategy() {} // at 0x8
virtual UNKTYPE GetCalcAheadFunc(ParticleManager *); // at 0x18
void Draw(const DrawInfo &, ParticleManager *);
};
} // namespace ef
} // namespace nw4r
#endif
@@ -1,19 +0,0 @@
#ifndef NW4R_EF_DRAW_DIRECTIONAL_STRATEGY_H
#define NW4R_EF_DRAW_DIRECTIONAL_STRATEGY_H
#include "common.h"
#include "ef_drawstrategyimpl.h"
namespace nw4r {
namespace ef {
class DrawDirectionalStrategy : public DrawStrategyImpl {
public:
DrawDirectionalStrategy();
virtual ~DrawDirectionalStrategy() {} // at 0x8
virtual UNKTYPE GetCalcAheadFunc(ParticleManager *); // at 0x18
void Draw(const DrawInfo &, ParticleManager *);
};
} // namespace ef
} // namespace nw4r
#endif
-18
View File
@@ -1,18 +0,0 @@
#ifndef NW4R_EF_DRAW_FREE_STRATEGY_H
#define NW4R_EF_DRAW_FREE_STRATEGY_H
#include "common.h"
#include "ef_drawstrategyimpl.h"
namespace nw4r {
namespace ef {
class DrawFreeStrategy : public DrawStrategyImpl {
public:
DrawFreeStrategy();
virtual ~DrawFreeStrategy() {} // at 0x8
UNKTYPE Draw(const DrawInfo &, ParticleManager *);
};
} // namespace ef
} // namespace nw4r
#endif
-11
View File
@@ -1,11 +0,0 @@
#ifndef NW4R_EF_DRAWINFO
#define NW4R_EF_DRAWINFO
#include "common.h"
namespace nw4r {
namespace ef {
struct DrawInfo {};
} // namespace ef
} // namespace nw4r
#endif
-18
View File
@@ -1,18 +0,0 @@
#ifndef NW4R_EF_DRAW_LINE_STRATEGY_H
#define NW4R_EF_DRAW_LINE_STRATEGY_H
#include "common.h"
#include "ef_drawstrategyimpl.h"
namespace nw4r {
namespace ef {
class DrawLineStrategy : public DrawStrategyImpl {
public:
DrawLineStrategy();
virtual ~DrawLineStrategy() {} // at 0x8
UNKTYPE Draw(const DrawInfo &, ParticleManager *);
};
} // namespace ef
} // namespace nw4r
#endif
-17
View File
@@ -1,17 +0,0 @@
#ifndef NW4R_EF_DRAWORDER
#define NW4R_EF_DRAWORDER
#include "common.h"
#include "ef_draworderbase.h"
#include "ef_particlemanager.h"
namespace nw4r {
namespace ef {
struct DrawOrder : DrawOrderBase {
void Draw(Effect *, const DrawInfo &);
void Add(Effect *, ParticleManager *);
void Remove(Effect *, ParticleManager *);
};
} // namespace ef
} // namespace nw4r
#endif
-18
View File
@@ -1,18 +0,0 @@
#ifndef NW4R_EF_DRAWORDERBASE
#define NW4R_EF_DRAWORDERBASE
#include "ef_particlemanager.h"
#include "ut_list.h"
#include <common.h>
namespace nw4r {
namespace ef {
struct DrawOrderBase {
virtual void Add(Effect *, ParticleManager *) = 0;
virtual void Remove(Effect *, ParticleManager *) = 0;
virtual void Draw(Effect *, const DrawInfo &) = 0;
};
} // namespace ef
} // namespace nw4r
#endif
-19
View File
@@ -1,19 +0,0 @@
#ifndef NW4R_EF_DRAW_POINT_STRATEGY_H
#define NW4R_EF_DRAW_POINT_STRATEGY_H
#include "common.h"
#include "ef_drawstrategyimpl.h"
namespace nw4r {
namespace ef {
class DrawPointStrategy : public DrawStrategyImpl {
public:
DrawPointStrategy();
virtual ~DrawPointStrategy() {} // at 0x8
void Draw(const DrawInfo &, ParticleManager *);
void InitGraphics(const DrawInfo &, ParticleManager *);
};
} // namespace ef
} // namespace nw4r
#endif
@@ -1,19 +0,0 @@
#ifndef NW4R_EF_DRAW_SMOOTH_STRIPE_STRATEGY_H
#define NW4R_EF_DRAW_SMOOTH_STRIPE_STRATEGY_H
#include "common.h"
#include "ef_drawstrategyimpl.h"
namespace nw4r {
namespace ef {
class DrawSmoothStripeStrategy : public DrawStrategyImpl {
public:
DrawSmoothStripeStrategy();
virtual ~DrawSmoothStripeStrategy() {} // at 0x8
virtual UNKTYPE GetCalcAheadFunc(ParticleManager *); // at 0x18
UNKTYPE Draw(const DrawInfo &, ParticleManager *);
};
} // namespace ef
} // namespace nw4r
#endif
-14
View File
@@ -1,14 +0,0 @@
#ifndef NW4R_EF_DRAWSTRATEGY_H
#define NW4R_EF_DRAWSTRATEGY_H
#include "common.h"
namespace nw4r {
namespace ef {
struct DrawStrategy {
inline virtual ~DrawStrategy() {}
virtual UNKTYPE Draw(const DrawInfo &, ParticleManager *) = 0;
};
} // namespace ef
} // namespace nw4r
#endif
-23
View File
@@ -1,23 +0,0 @@
#ifndef NW4R_EF_DRAWSTRATEGYBUILDER_H
#define NW4R_EF_DRAWSTRATEGYBUILDER_H
#include "common.h"
namespace nw4r {
namespace ef {
enum DrawStrategyType {
DrawStratType_Point,
DrawStratType_Line,
DrawStratType_Free,
DrawStratType_Billboard,
DrawStratType_Directional,
DrawStratType_Stripe,
DrawStratType_SmoothStripe
};
struct DrawStrategyBuilder {
virtual DrawStrategy *Create(u32);
};
} // namespace ef
} // namespace nw4r
#endif
-40
View File
@@ -1,40 +0,0 @@
#ifndef NW4R_EF_DRAW_STRATEGY_IMPL_H
#define NW4R_EF_DRAW_STRATEGY_IMPL_H
#include "common.h"
#include "ef_drawstrategy.h"
#include "math_types.h"
namespace nw4r {
namespace ef {
class DrawStrategyImpl : public DrawStrategy {
public:
struct PrevTexture {
UNKWORD WORD_0x0;
f32 FLOAT_0x4;
f32 FLOAT_0x8;
f32 FLOAT_0xC;
f32 FLOAT_0x10;
UNKWORD WORD_0x14;
UNKWORD WORD_0x18;
math::VEC2 VEC2_0x1C;
f32 FLOAT_0x24;
math::VEC2 VEC2_0x28;
};
public:
DrawStrategyImpl();
virtual UNKTYPE GetGetFirstDrawParticleFunc(int);
virtual UNKTYPE GetGetNextDrawParticleFunc(int);
void InitTexture(const EmitterDrawSetting &);
void InitTev(const EmitterDrawSetting &, const DrawInfo &);
void InitColor(ParticleManager *, const EmitterDrawSetting &, const DrawInfo &);
private:
PrevTexture mPrevTextures[3]; // at 0x4
char UNK_0x94[0xBC - 0x94];
};
} // namespace ef
} // namespace nw4r
#endif
-19
View File
@@ -1,19 +0,0 @@
#ifndef NW4R_EF_DRAW_STRIPE_STRATEGY_H
#define NW4R_EF_DRAW_STRIPE_STRATEGY_H
#include "common.h"
#include "ef_drawstrategyimpl.h"
namespace nw4r {
namespace ef {
class DrawStripeStrategy : public DrawStrategyImpl {
public:
DrawStripeStrategy();
virtual ~DrawStripeStrategy() {} // at 0x8
virtual UNKTYPE GetCalcAheadFunc(ParticleManager *); // at 0x18
UNKTYPE Draw(const DrawInfo &, ParticleManager *);
};
} // namespace ef
} // namespace nw4r
#endif
-56
View File
@@ -1,56 +0,0 @@
#ifndef NW4R_EF_EFFECT
#define NW4R_EF_EFFECT
#include "common.h"
#include "ef_list.h"
#include "ef_ref.h"
#include "ef_util.h"
#include "math_types.h"
#include "ut_list.h"
namespace nw4r {
namespace ef {
struct Effect : ReferencedObject {
EffectSystem *mSystem; // at 0x20
ActivityList mEmitters; // at 0x24
u32 INDEX_0x40;
void (*mEmissionPrologue)(Emitter *, ParticleManager *, int *, u32 *, float *, u16 *, float *,
math::MTX34 *); // at 0x44
UNKWORD WORD_0x48;
UNKWORD WORD_0x4C;
u32 mFlags; // at 0x50
math::MTX34 mRootMtx; // at 0x54
math::VEC3 VEC_0x84;
ut::List UTLIST_0x90;
DrawOrder *mDrawOrder; // at 0x9c
Effect();
~Effect();
virtual bool Initialize(EffectSystem *, EmitterResource *, u16);
virtual Emitter *CreateEmitter(ResEmitter, u8, u16);
virtual void Calc(bool);
virtual void Draw(const DrawInfo &);
bool SendClosing();
UNKTYPE DestroyFunc();
bool Closing(Emitter *);
Emitter *CreateEmitter(EmitterResource *, u8, u16);
bool RetireEmitter(Emitter *);
u16 RetireEmitterAll();
u16 RetireParticleAll();
u16 GetNumEmitter() const;
Emitter *GetEmitter(u16);
u16 ForeachParticleManager(Action, u32, bool);
u16 ForeachEmitterFrom(Action, u32, bool, Emitter *);
UNKTYPE SetRootMtx(const math::MTX34 &);
inline bool GetFlagDisableDraw() {
return mFlags & 2;
}
};
} // namespace ef
} // namespace nw4r
#endif
-53
View File
@@ -1,53 +0,0 @@
#ifndef NW4R_EF_EFFECTSYSTEM
#define NW4R_EF_EFFECTSYSTEM
#include "common.h"
#include "ef_creationqueue.h"
#include "ef_list.h"
#include "ef_rand.h"
#include "ef_ref.h"
namespace nw4r {
namespace ef {
struct EffectSystem {
static bool mDisplayVersion;
static EffectSystem instance;
MemoryManager *mMemoryManager; // at 0x0
DrawOrder *mDrawOrder; // at 0x4
DrawStrategyBuilder *mDrawStrategyBuilder; // at 0x8
EmitFormBuilder *mEmitFormBuilder; // at 0xc
CreationQueue mCreationQueue; // at 0x10
u32 mNumGroup;
ActivityList *ARR_0x5018;
Random mRandom; // at 0x501C
math::VEC3 VEC_0x5020;
math::MTX34 MTX_0x502C;
float FLOAT_0x505C;
float FLOAT_0x5060;
char BYTE_0x5064;
inline MemoryManager *GetMemoryManager() const {
return mMemoryManager;
}
EffectSystem();
~EffectSystem();
static EffectSystem *GetInstance();
bool Initialize(u32);
bool Closing(Effect *);
Effect *CreateEffect(const char *, u32, u16);
bool RetireEffect(Effect *);
u16 RetireEffectAll(u32);
u16 RetireEmitterAll(u32);
u16 RetireParticleAll(u32);
void Calc(u32, bool);
void Draw(const DrawInfo &, u32);
};
} // namespace ef
} // namespace nw4r
#endif
-23
View File
@@ -1,23 +0,0 @@
#ifndef NW4R_EF_EMFORM_H
#define NW4R_EF_EMFORM_H
#include "common.h"
namespace nw4r {
namespace ef {
enum EmitFormType {
EmitForm_Disc,
EmitForm_Line,
EmitForm_Cube = 5,
EmitForm_Cylinder = 7,
EmitForm_Sphere,
EmitForm_Point,
EmitForm_Torus
};
struct EmitFormBuilder {
virtual EmitterForm *Create(EmitFormType);
};
} // namespace ef
} // namespace nw4r
#endif
-247
View File
@@ -1,247 +0,0 @@
#ifndef NW4R_EF_EMITTER
#define NW4R_EF_EMITTER
#include "ef_animcurve.h"
#include "ef_list.h"
#include "ef_rand.h"
#include "ef_ref.h"
#include "ef_util.h"
#include "ut_list.h"
#include <math.h>#include "common.h"
namespace nw4r {
namespace ef {
struct ResEmitter {
EmitterResource *mPtr;
inline EmitterResource *ptr() {
return mPtr;
}
};
struct EmitterInheritSetting {
s16 SHORT_0x0;
u8 BYTE_0x2;
u8 BYTE_0x3;
u8 BYTE_0x4;
u8 BYTE_0x5;
u8 BYTE_0x6;
u8 BYTE_0x7;
};
struct EmitterDesc {
UNKWORD FLAGS_0x0; // at 0x0/0x8
UNKWORD EMFORMTYPE_0x4; // at 0x4/0xc
u16 SHORT_0x8; // at 0x8/0x10
u16 SHORT_0xA; // at 0xa/0x12
s8 SBYTE_0xC; // at 0xc/0x14
s8 SBYTE_0xD; // at 0xd/0x15
s8 SBYTE_0xE; // at 0xe/0x16
s8 SBYTE_0xF; // at 0xf/0x17
float FLOAT_0x10; // at 0x10/0x18
u16 SHORT_0x14; // at 0x14/0x1c
u16 SHORT_0x16; // at 0x16/0x1e
u16 SHORT_0x18; // at 0x18/0x20
s8 BYTE_0x1A; // at 0x1a/0x22
s8 BYTE_0x1B; // at 0x1b/0x23
float FLOAT_0x1C;
float FLOAT_0x20;
float FLOAT_0x24;
float FLOAT_0x28;
float FLOAT_0x2C;
float FLOAT_0x30;
u16 SHORT_0x34;
u8 BYTE_0x36;
u8 BYTE_0x37;
float FLOAT_0x38;
float FLOAT_0x3C;
float FLOAT_0x40;
float FLOAT_0x44;
float FLOAT_0x48;
float FLOAT_0x4C;
float FLOAT_0x50;
float FLOAT_0x54;
float FLOAT_0x58;
float FLOAT_0x5C;
float FLOAT_0x60;
float FLOAT_0x64;
float FLOAT_0x68;
float FLOAT_0x6C;
float FLOAT_0x70;
float FLOAT_0x74;
float FLOAT_0x78;
float FLOAT_0x7C;
float FLOAT_0x80;
u8 BYTE_0x84; // at 0x84/0x8c
u8 BYTE_0x85; // at 0x85/0x8d
u8 BYTE_0x86; // at 0x86/0x8e
UNKWORD WORD_0x88;
};
struct EmitTrack {
u8 BYTE_0x0;
u8 BYTE_0x1;
u16 SHORT_0x2;
u8 BYTE_0x4;
};
struct EmitterResource {
char UNK_0x0[0x4];
u32 OFFSET_0x4;
EmitterDesc STRUCT_0x8;
inline UNKTYPE *SkipEmitterDesc() {
return (char *)&STRUCT_0x8 + OFFSET_0x4;
}
inline UNKTYPE *SkipParticleParameterDesc() {
char *particleDesc = (char *)SkipEmitterDesc();
return particleDesc + *(int *)particleDesc;
}
inline u16 NumEmitInitTrack() {
u16 *ptr = (u16 *)SkipParticleParameterDesc();
return ptr[(4 * *(ptr += 2)) + 3];
}
inline u16 NumEmitTrack() {
u16 *ptr = (u16 *)SkipParticleParameterDesc();
return ptr[(4 * *(ptr += 2)) + 2];
}
inline EmitTrack *GetEmitTrack(u16 i) {
u16 *ptr = (u16 *)SkipParticleParameterDesc();
return reinterpret_cast<EmitTrack **>(ptr)[(2 * *(ptr += 1)) + 1 + i];
}
};
struct Emitter : ReferencedObject {
virtual bool Initialize(Effect *, EmitterResource *, u8); // at 0x10
virtual Emitter *CreateEmitter(EmitterResource *, EmitterInheritSetting *, Particle *, u16); // at 0x14
virtual void CalcEmitter(); // at 0x18
virtual void CalcParticle(); // at 0x1c
virtual void CalcEmission(); // at 0x20
virtual void CalcBillboard(); // at 0x24
u32 mFlags;
UNKWORD WORD_0x24;
// char UNK_0x28[0x8C];
float FLOAT_0x28;
float FLOAT_0x2C;
short SHORT_0x30;
short SHORT_0x32;
float FLOAT_0x34;
float FLOAT_0x38;
short SHORT_0x3C;
float FLOAT_0x40;
float FLOAT_0x44;
float FLOAT_0x48;
float FLOAT_0x4C;
float FLOAT_0x50;
float FLOAT_0x54;
float FLOAT_0x58;
float FLOAT_0x5C;
float FLOAT_0x60;
u8 BYTE_0x64;
s8 BYTE_0x65;
u8 BYTE_0x66;
s8 BYTE_0x67;
float FLOAT_0x68;
float FLOAT_0x6C;
float FLOAT_0x70;
float FLOAT_0x74;
float FLOAT_0x78;
float FLOAT_0x7C;
float FLOAT_0x80;
float FLOAT_0x84;
float FLOAT_0x88;
float FLOAT_0x8C;
/*
float FLOAT_0x90;
float FLOAT_0x94;
float FLOAT_0x98;
*/
math::VEC3 VEC_0x90;
/*
float FLOAT_0x9C;
float FLOAT_0xA0;
float FLOAT_0xA4;
*/
math::VEC3 VEC_0x9C;
/*
float FLOAT_0xA8;
float FLOAT_0xAC;
float FLOAT_0xB0;
*/
math::VEC3 VEC_0xA8;
UNKWORD WORD_0xB4;
EmitterResource *mResource; // at 0xb8
Effect *mEffect; // at 0xbc
ActivityList mManagers; // at 0xc0
char UNK_0xDA[0x2];
u8 BYTE_0xDC;
u16 SHORT_0xDE;
u16 SHORT_0xE0;
UNKWORD WORD_0xE4;
u16 SHORT_0xE8;
u16 SHORT_0xEA;
Random mRandom; // at 0xec
EmitterForm *mForm; // at 0xf0
Emitter *mParent; // at 0xf4
Particle *REF_0xF8; // at 0xf8
EmitterInheritSetting mInheritSettings; // at 0xfc
bool mMtxDirtyFlag; // at 0x104
math::MTX34 mGlobalMtx; // at 0x108
Emitter();
~Emitter();
u16 RetireParticleAll();
bool SendClosing();
void DestroyFunc();
bool Closing(ParticleManager *);
bool RetireParticleManager(ParticleManager *);
u16 RetireParticleManagerAll();
bool InitializeDatas(EmitterResource *, Effect *);
ParticleManager *FindParticleManager(EmitterResource *, bool, bool, s8, u8);
UNKTYPE CreateEmitterTmp(EmitterResource *, EmitterInheritSetting *, Particle *, u16);
float GetLODratio(math::VEC3 &, math::VEC3 &, float, float, float, float);
u16 ForeachParticleManager(Action, u32, bool, bool);
UNKTYPE Emission(ParticleManager *, const math::MTX34 *);
math::MTX34 *CalcGlobalMtx(math::MTX34 *);
UNKTYPE SetMtxDirty();
static math::MTX34 *RestructMatrix(math::MTX34 *, math::MTX34 *, bool, bool, s8);
u16 GetNumParticleManager() const;
ParticleManager *GetParticleManager(u16);
inline bool GetFlagDisableCalc() const {
return mFlags & 0x200;
}
};
} // namespace ef
} // namespace nw4r
#endif
-17
View File
@@ -1,17 +0,0 @@
#ifndef NW4R_EF_EMITTERFORM_H
#define NW4R_EF_EMITTERFORM_H
#include "common.h"
namespace nw4r {
namespace ef {
struct EmitterForm {
virtual UNKTYPE Emission(Emitter *, ParticleManager *, int, u32, float *, u16, float, const math::MTX34 *) = 0;
UNKTYPE CalcVelocity(math::VEC3 *, Emitter *, const math::VEC3 &, const math::VEC3 &, const math::VEC3 &,
const math::VEC3 &) const;
u16 CalcLife(u16, float, Emitter *);
};
} // namespace ef
} // namespace nw4r
#endif
-25
View File
@@ -1,25 +0,0 @@
#ifndef NW4R_EF_HANDLE_H
#define NW4R_EF_HANDLE_H
#include "common.h"
namespace nw4r {
namespace ef {
struct LinkedObject {
char UNK_0x0[8];
LinkedObject *PTR_0x8;
};
struct HandleBase {
LinkedObject *PTR_0x0;
LinkedObject *mPtr;
HandleBase();
HandleBase &operator=(const HandleBase &);
HandleBase &operator=(LinkedObject *);
bool IsValid() const;
LinkedObject *GetPtr() const;
};
} // namespace ef
} // namespace nw4r
#endif
-16
View File
@@ -1,16 +0,0 @@
#ifndef NW4R_EF_LINE_H
#define NW4R_EF_LINE_H
#include "ef_emitterform.h"
namespace nw4r
{
namespace ef
{
struct EmitterFormLine : EmitterForm
{
virtual UNKTYPE Emission(Emitter *, ParticleManager *, int, u32, float *, u16, float, const math::MTX34 *);
};
}
}
#endif
-57
View File
@@ -1,57 +0,0 @@
#ifndef NW4R_EF_LIST
#define NW4R_EF_LIST
#include "common.h"
#include "ut_list.h"
namespace nw4r {
namespace ef {
// sizeof(ActivityList) = 0x1C
struct ActivityList {
ut::List mActive;
ut::List mClosing;
u16 mNumActive;
inline void SetOffset(u16 offset) {
ut::List_Init(&mActive, offset);
ut::List_Init(&mClosing, offset);
mNumActive = 0;
}
inline ActivityList(u16 offset) {
SetOffset(offset);
}
inline ActivityList() {
SetOffset(0);
}
inline void Initialize() {
mActive.first = NULL;
mActive.size = 0;
mActive.last = NULL;
mClosing.first = NULL;
mClosing.size = 0;
mClosing.last = NULL;
mNumActive = 0;
}
inline void ToActive(void *pNode) {
ut::List_Append(&mActive, pNode);
mNumActive++;
}
inline void ToClosing(void *pNode) {
ut::List_Remove(&mActive, pNode);
ut::List_Append(&mClosing, pNode);
}
inline void ToWait(void *pNode) {
mNumActive--;
}
};
} // namespace ef
} // namespace nw4r
#endif
-16
View File
@@ -1,16 +0,0 @@
#ifndef NW4R_EF_MEMORYMANAGER
#define NW4R_EF_MEMORYMANAGER
#include "ef_memorymanagerbase.h"
namespace nw4r
{
namespace ef
{
struct MemoryManager : MemoryManagerBase
{
};
}
}
#endif
-40
View File
@@ -1,40 +0,0 @@
#ifndef NW4R_EF_MEMORYMANAGERBASE
#define NW4R_EF_MEMORYMANAGERBASE
#include "common.h"
namespace nw4r {
namespace ef {
struct MemoryManagerBase {
virtual ~MemoryManagerBase(); // at 0x8
virtual UNKTYPE GarbageCollection() = 0; // at 0xc
virtual Effect *AllocEffect() = 0; // at 0x10
virtual UNKTYPE FreeEffect(void *) = 0; // at 0x14
virtual UNKWORD GetNumAllocEffect() const = 0; // at 0x18
virtual UNKWORD GetNumActiveEffect() const = 0; // at 0x1c
virtual UNKWORD GetNumFreeEffect() const = 0; // at 0x20
virtual Emitter *AllocEmitter() = 0; // at 0x24
virtual UNKTYPE FreeEmitter(void *) = 0; // at 0x28
virtual UNKWORD GetNumAllocEmitter() const = 0; // at 0x2c
virtual UNKWORD GetNumActiveEmitter() const = 0; // at 0x30
virtual UNKWORD GetNumFreeEmitter() const = 0; // at 0x34
virtual ParticleManager *AllocParticleManager() = 0; // at 0x38
virtual UNKTYPE FreeParticleManager(void *) = 0; // at 0x3c
virtual UNKWORD GetNumAllocParticleManager() const = 0; // at 0x40
virtual UNKWORD GetNumActiveParticleManager() const = 0; // at 0x44
virtual UNKWORD GetNumFreeParticleManager() const = 0; // at 0x48
virtual Particle *AllocParticle() = 0; // at 0x4c
virtual UNKTYPE FreeParticle(void *) = 0; // at 0x50
virtual UNKWORD GetNumAllocParticle() const = 0; // at 0x54
virtual UNKWORD GetNumActiveParticle() const = 0; // at 0x58
virtual UNKWORD GetNumFreeParticle() const = 0; // at 0x5c
virtual void *AllocHeap(u32) = 0; // at 0x60
};
} // namespace ef
} // namespace nw4r
#endif
-21
View File
@@ -1,21 +0,0 @@
#ifndef NW4R_EF_PARTICLE_H
#define NW4R_EF_PARTICLE_H
#include "common.h"
#include "ef_ref.h"
namespace nw4r {
namespace ef {
struct Particle : ReferencedObject {
char UNK_0x20[0x8C];
math::VEC3 VEC_0xAC;
math::VEC3 VEC_0xB8;
char UNK_0xC4[0x4];
ParticleManager *mManager; // at 0xc8
};
} // namespace ef
} // namespace nw4r
#endif
-83
View File
@@ -1,83 +0,0 @@
#ifndef NW4R_EF_PARTICLEMANAGER
#define NW4R_EF_PARTICLEMANAGER
#include "common.h"
#include "ef_list.h"
#include "ef_ref.h"
#include "math_types.h"
#include "ut_Color.h"
namespace nw4r {
namespace ef {
struct ParticleManager : ReferencedObject {
struct ParticleModifier {
math::VEC2 mScale; // at 0x0
math::VEC3 mRotate; // at 0x8
struct SimpleLight {
u8 mType; // at 0x0
ut::Color mAmbColor; // at 0x1
} mLight;
};
UNKTYPE BeginDraw();
UNKTYPE EndDraw();
UNKTYPE BeginCalc(bool);
UNKTYPE EndCalc();
bool SendClosing();
UNKTYPE DestroyFunc();
virtual bool Initialize(Emitter *, EmitterResource *);
virtual UNKTYPE CreateParticle(u16, math::VEC3, math::VEC3, const math::MTX34 *, float,
const EmitterInheritSetting *, Particle *, u16);
virtual UNKTYPE Calc();
virtual UNKTYPE Draw(const DrawInfo &);
Emitter *mEmitter; // at 0x20
EmitterResource *mResource; // at 0x24
UNKWORD FLAGS_0x28;
char UNK_0x2C[0xC];
ActivityList EFLIST_0x38;
char UNK_0x54[0x4];
ParticleModifier mMod; // at 0x58
char UNK_0x74[0x14];
s8 BYTE_0x88;
u8 BYTE_0x89;
bool BOOL_0x8A;
UNKWORD FLAGS_0xB4;
u16 RetireParticleAll();
UNKTYPE CalcGlobalMtx(math::MTX34 *);
static void ModifierTravFunc_SetSimpleLightType(void *p, u32 payload) {
ParticleManager *mgr = (ParticleManager *)p;
u8 type = (u8)payload;
mgr->mMod.mLight.mType = type;
}
static void ModifierTravFunc_SetSimpleLightAmbient(void *p, u32 payload) {
ParticleManager *mgr = (ParticleManager *)p;
ut::Color *color = (ut::Color *)payload;
mgr->mMod.mLight.mAmbColor = *color;
}
static void ModifierTravFunc_SetScale(void *p, u32 payload) {
ParticleManager *mgr = (ParticleManager *)p;
math::VEC2 *scale = (math::VEC2 *)payload;
mgr->mMod.mScale = *scale;
}
static void ModifierTravFunc_SetRotate(void *p, u32 payload) {
ParticleManager *mgr = (ParticleManager *)p;
math::VEC3 *rot = (math::VEC3 *)payload;
mgr->mMod.mRotate = *rot;
}
};
} // namespace ef
} // namespace nw4r
#endif
-16
View File
@@ -1,16 +0,0 @@
#ifndef NW4R_EF_POINT_H
#define NW4R_EF_POINT_H
#include "ef_emitterform.h"
namespace nw4r
{
namespace ef
{
struct EmitterFormPoint : EmitterForm
{
virtual UNKTYPE Emission(Emitter *, ParticleManager *, int, u32, float *, u16, float, const math::MTX34 *);
};
}
}
#endif
-31
View File
@@ -1,31 +0,0 @@
#ifndef NW4R_EF_RAND_H
#define NW4R_EF_RAND_H
#include "common.h"
namespace nw4r {
namespace ef {
struct Random {
u32 mSeed; // at 0x0
inline u32 MixRandomSeed() {
return mSeed = mSeed * 0x343fd + 0x269ec3;
}
inline void Srand(u32 seed) {
mSeed = seed;
}
inline u32 Rand() {
// WARNING: THIS INLINE FUNCTION MAY NOT BE ACCURATE
return MixRandomSeed() >> 0x10;
}
inline float RandFloat() {
// WARNING: THIS INLINE FUNCTION MAY NOT BE ACCURATE
return (float)Rand() / 0xFFFF;
}
};
} // namespace ef
} // namespace nw4r
#endif
-45
View File
@@ -1,45 +0,0 @@
#ifndef NW4R_EF_REF
#define NW4R_EF_REF
#include "common.h"
#include "math_types.h"
namespace nw4r {
namespace ef {
struct ReferencedObject {
char UNK_0x0[0xC];
UNKWORD WORD_0xC;
u32 mRefCount; // at 0x10
char UNK_0x14[0x8];
virtual bool SendClosing();
virtual UNKTYPE DestroyFunc();
inline void Initialize() {
mRefCount = 0;
WORD_0xC = 1;
}
inline void Ref() {
mRefCount++;
}
inline void UnRef() {
if (--mRefCount == 0 && WORD_0xC == 2) {
SendClosing();
}
}
inline void Destroy() {
DestroyFunc();
WORD_0xC = 2;
if (mRefCount == 0) {
SendClosing();
}
}
};
typedef ReferencedObject UNKREF;
} // namespace ef
} // namespace nw4r
#endif
-15
View File
@@ -1,15 +0,0 @@
#ifndef NW4R_EF_RESOURCE
#define NW4R_EF_RESOURCE
#include "common.h"
namespace nw4r {
namespace ef {
struct Resource {
EmitterResource *_FindEmitter(const char *, EffectProject *) const;
static Resource *GetInstance();
};
} // namespace ef
} // namespace nw4r
#endif
-16
View File
@@ -1,16 +0,0 @@
#ifndef NW4R_EF_SPHERE_H
#define NW4R_EF_SPHERE_H
#include "ef_emitterform.h"
namespace nw4r
{
namespace ef
{
struct EmitterFormSphere : EmitterForm
{
virtual UNKTYPE Emission(Emitter *, ParticleManager *, int, u32, float *, u16, float, const math::MTX34 *);
};
}
}
#endif
-16
View File
@@ -1,16 +0,0 @@
#ifndef NW4R_EF_TORUS_H
#define NW4R_EF_TORUS_H
#include "ef_emitterform.h"
namespace nw4r
{
namespace ef
{
struct EmitterFormTorus : EmitterForm
{
virtual UNKTYPE Emission(Emitter *, ParticleManager *, int, u32, float *, u16, float, const math::MTX34 *);
};
}
}
#endif
-20
View File
@@ -1,20 +0,0 @@
#ifndef NW4R_EF_UTIL
#define NW4R_EF_UTIL
#include "common.h"
#include "ut_list.h"
namespace nw4r {
namespace ef {
typedef void (*Action)(void *, u32);
u16 UtlistToArray(const ut::List *, void **, int);
UNKTYPE GetDirMtxY(math::MTX34 *, const math::VEC3 &);
UNKTYPE MtxGetRotation(const math::MTX34 &, math::VEC3 *);
UNKTYPE MtxGetTranslate(const math::MTX34 &, math::VEC3 *);
UNKTYPE MtxGetRotationMtx(const math::MTX34 &, math::MTX34 *);
UNKTYPE MtxGetScale(const math::MTX34 &, math::VEC3 *);
} // namespace ef
} // namespace nw4r
#endif
+68 -12
View File
@@ -1,21 +1,77 @@
#ifndef NW4R_LYT_ANIMATION_H
#define NW4R_LYT_ANIMATION_H
#include "common.h"
#include "nw4r/lyt/lyt_common.h"
#include "nw4r/lyt/lyt_resourceAccessor.h"
#include "nw4r/ut/ut_LinkList.h"
#include <nw4r/lyt/lyt_common.h>
#include <nw4r/lyt/lyt_resourceAccessor.h>
#include <nw4r/lyt/lyt_types.h>
#include <nw4r/ut/ut_LinkList.h>
namespace nw4r {
namespace lyt {
namespace res {
struct AnimationBlock {};
struct AnimationBlock {
DataBlockHeader blockHeader; // at 0x00
u16 frameSize; // at 0x08
bool loop; // at 0x0A
u8 padding1; // at 0x0B
u16 fileNum; // at 0x0C
u16 animContNum; // at 0x0E
u32 animContOffsetsOffset; // at 0x10
};
struct AnimationTagBlock {
DataBlockHeader blockHeader; // at 0x00
u16 tagOrder; // at 0x08
u16 groupNum; // at 0x0A
u32 nameOffset; // at 0x0C
u32 groupsOffset; // at 0x10
u16 startFrame; // at 0x14
u16 endFrame; // at 0x16
u8 flag; // at 0x18
u8 padding[3]; // at 0x19
};
struct AnimationShareBlock {
DataBlockHeader blockHeader; // at 0x00
u32 animShareInfoOffset; // at 0x04
u16 shareNum; // at 0x0C
u8 padding[2]; // at 0x0E
};
} // namespace res
struct AnimationBlock {
res::DataBlockHeader header; // at 0x0
u16 frameSize; // at 0x8
bool loop; // at 0xA
// . . .
struct AnimResource {
AnimResource(const void *anmResBuf) {
// TODO
}
const res::BinaryFileHeader *mpFileHeader; // at 0x00
const res::AnimationBlock *mpResBlock; // at 0x04
const res::AnimationTagBlock *mpTagBlock; // at 0x08
const res::AnimationShareBlock *mpShareBlock; // at 0x0C
};
namespace detail {
struct AnimPaneTree {
AnimPaneTree(Pane *pTargetPane, const AnimResource &animRes) : mAnimRes(animRes) {
// TODO
}
bool IsEnabled() const {
// TODO
return false;
}
AnimResource mAnimRes; // at 0x00
u16 mAnimPaneIdx; // at 0x10
u16 mLinkNum; // at 0x12
u16 mAnimMatIdx[9]; // at 0x14
u8 mAnimMatCnt; // at 0x26
};
} // namespace detail
struct AnimationGroupRef {
char name[17]; // at 0x00
u8 flag; // at 0x11
u8 padding[2]; // at 0x12
};
struct AnimTransform {
@@ -31,9 +87,9 @@ struct AnimTransform {
virtual void Animate(u32 idx, Pane *pPane) = 0;
virtual void Animate(u32 idx, Material *pMaterial) = 0;
ut::LinkListNode mLink; // at 0x0
AnimationBlock *mpRes; // at 0xC
f32 mFrame; // at 0x10
ut::LinkListNode mLink; // at 0x4
res::AnimationBlock *mpRes; // at 0xC
f32 mFrame; // at 0x10
};
struct AnimationLink {
+10 -5
View File
@@ -2,6 +2,7 @@
#define NW4R_LYT_BOUNDING_H
#include "common.h"
#include "nw4r/lyt/lyt_drawInfo.h"
#include "nw4r/lyt/lyt_material.h"
#include "nw4r/lyt/lyt_pane.h"
namespace nw4r {
@@ -10,15 +11,19 @@ namespace res {
struct Bounding : Pane {};
} // namespace res
struct ResBlockSet {};
struct ResBlockSet {
const res::TextureList *pTextureList; // at 0x00
const res::FontList *pFontList; // at 0x04
const res::MaterialList *pMaterialList; // at 0x08
ResourceAccessor *pResAccessor; // at 0x0C
};
struct Bounding : Pane {
class Bounding : public Pane {
public:
Bounding(const res::Bounding *, const ResBlockSet &);
virtual ~Bounding();
virtual const ut::detail::RuntimeTypeInfo *GetRuntimeTypeInfo() const;
NW4R_UT_RTTI_DECL(Bounding);
virtual void DrawSelf(const DrawInfo &);
static ut::detail::RuntimeTypeInfo typeInfo;
};
} // namespace lyt
} // namespace nw4r
+19 -1
View File
@@ -12,7 +12,14 @@
namespace nw4r {
namespace lyt {
namespace res {
struct BinaryFileHeader : ut::BinaryFileHeader {};
struct BinaryFileHeader {
char signature[4]; // at 0x00
u16 byteOrder; // at 0x04;
u16 version; // at 0x06
u32 fileSize; // at 0x08
u16 headerSize; // at 0x0C
u16 dataBlocks; // at 0x0E
};
struct DataBlockHeader {
u32 kind; // at 0x0
@@ -46,6 +53,17 @@ void SetVertexFormat(bool, u8);
void DrawQuad(const math::VEC2 &, const Size &, u8, const TexCoordData *, const ut::Color *);
void DrawQuad(const math::VEC2 &, const Size &, u8, const TexCoordData *, const ut::Color *, u8);
void DrawLine(const math::VEC2 &pos, const Size &size, ut::Color color);
s32 GetSignatureInt(const char *sig) {
return *((s32 *)sig);
}
bool TestFileVersion(const res::BinaryFileHeader &fileHeader) {
u32 majorVer = (fileHeader.version >> 8) & 0xFF;
u32 minorVer = fileHeader.version & 0xFF;
bool ret = majorVer == 0 && (minorVer > 7 && minorVer <= 10);
return ret;
}
} // namespace detail
} // namespace lyt
} // namespace nw4r
+14 -1
View File
@@ -23,12 +23,25 @@ struct PaneLink {
};
} // namespace detail
struct Group {
class Group {
public:
Group(const res::Group *pResGroup, Pane *pRootPane);
virtual ~Group();
void AppendPane(Pane *pPane);
void Init();
ut::LinkList<detail::PaneLink, 0> *GetPaneList() {
return &mPaneListLink;
}
bool IsUserAllocated() const {
return mbUserAllocated;
}
const char *GetName() const {
return mName;
}
private:
ut::LinkListNode mLink; // at 0x04
ut::LinkList<detail::PaneLink, 0> mPaneListLink; // at 0x0C
char mName[NW4R_RES_NAME_SIZE + 1]; // at 0x18
+60 -2
View File
@@ -2,13 +2,45 @@
#define NW4R_LYT_LAYOUT_H
#include "common.h"
#include <new.h>
#include <nw4r/lyt/lyt_animation.h>
#include <nw4r/lyt/lyt_types.h>
#include <rvl/MEM/mem_allocator.h>
namespace nw4r {
namespace lyt {
struct Layout {
// TO-DO: Class members
namespace res {
struct Layout {
DataBlockHeader blockheader; // at 0x00
u8 originType; // at 0x08
u8 padding[3]; // at 0x09
Size layoutSize; // at 0x0C
};
} // namespace res
class Layout {
public:
ut::Rect GetLayoutRect() const;
static Pane *BuildPaneObj(s32 kind, const void *dataPtr, const ResBlockSet &ResBlockSet);
Layout();
virtual ~Layout(); // at 0x08
virtual bool Build(const void *lytResBuf, ResourceAccessor *pResAcsr); // at 0x0C
virtual AnimTransform *CreateAnimTransform(); // at 0x10
virtual AnimTransform *CreateAnimTransform(const void *animResBuf, ResourceAccessor *pResAcsr); // at 0x14
virtual AnimTransform *CreateAnimTransform(const AnimResource &animRes, ResourceAccessor *pResAcsr); // at 0x18
virtual void BindAnimation(AnimTransform *pAnimTrans); // at 0x1C
virtual void UnbindAnimation(AnimTransform *pAnimTrans); // at 0x20
virtual void UnbindAllAnimation(); // at 0x24
virtual bool BindAnimationAuto(const AnimResource &animRes, ResourceAccessor *pResAcsr); // at 0x28
virtual void SetAnimationEnable(AnimTransform *pAnimTrans, bool bEnable); // at 0x2C
virtual void CalculateMtx(const DrawInfo &drawInfo); // at 0x30
virtual void Draw(const DrawInfo &drawInfo); // at 0x34
virtual void Animate(u32 option); // at 0x38
virtual void SetTagProcessor(ut::TagProcessorBase<wchar_t> *pTagProcessor); // at 0x3C
// STATICS
static void FreeMemory(void *p) {
MEMFreeToAllocator(mspAllocator, p);
}
@@ -57,6 +89,32 @@ struct Layout {
}
}
template <typename T, typename T2>
static T *NewObj(T2 p2) {
T *obj = (T *)AllocMemory(sizeof(T));
if (obj) {
return new (obj) T(p2);
} else {
return nullptr;
}
}
template <typename T, typename T2, typename T3>
static T *NewObj(T2 p2, T3 p3) {
T *obj = (T *)AllocMemory(sizeof(T));
if (obj) {
return new (obj) T(p2, p3);
} else {
return nullptr;
}
}
private:
ut::LinkList<AnimTransform, 4> mAnimTransList; // at 0x04
Pane *mpRootPane; // at 0x10
GroupContainer *mpGroupContainer; // at 0x14
Size mLayoutSize; // at 0x18
static MEMAllocator *mspAllocator;
};
} // namespace lyt
+30 -9
View File
@@ -10,6 +10,15 @@
namespace nw4r {
namespace lyt {
namespace res {
struct MaterialList {
DataBlockHeader blockHeader; // at 0x00
u16 materialNum; // at 0x08
u8 padding[2]; // at 0x0A
};
} // namespace res
struct BitGXNums {
union {
u32 texSRT;
@@ -26,15 +35,26 @@ struct BitGXNums {
};
struct Material {
// SetupGX__Q34nw4r3lyt8MaterialFbUc
// BindAnimation__Q34nw4r3lyt8MaterialFPQ34nw4r3lyt13AnimTransform
// UnbindAnimation__Q34nw4r3lyt8MaterialFPQ34nw4r3lyt13AnimTransform
// UnbindAllAnimation__Q34nw4r3lyt8MaterialFv
// Animate__Q34nw4r3lyt8MaterialFv
// FindAnimationLink__Q34nw4r3lyt8MaterialFPQ34nw4r3lyt13AnimTransform
// FindAnimationLink__Q34nw4r3lyt8MaterialFRCQ34nw4r3lyt12AnimResource
// SetAnimationEnable__Q34nw4r3lyt8MaterialFPQ34nw4r3lyt13AnimTransformb
// SetAnimationEnable__Q34nw4r3lyt8MaterialFRCQ34nw4r3lyt12AnimResourceb
// IsBlendModeCap__Q34nw4r3lyt8MaterialCFv
// IsAlphaCompareCap__Q34nw4r3lyt8MaterialCFv
// IsTevSwapCap__Q34nw4r3lyt8MaterialCFv
// IsMatColorCap__Q34nw4r3lyt8MaterialCFv
// IsChanCtrlCap__Q34nw4r3lyt8MaterialCFv
// SetTexSRTElement__Q34nw4r3lyt8MaterialFUlUlf
// GetTexturePtr__Q34nw4r3lyt8MaterialFUc
// GetTexSRTCap__Q34nw4r3lyt8MaterialCFv
// GetIndTexSRTCap__Q34nw4r3lyt8MaterialCFv
// SetIndTexSRTElement__Q34nw4r3lyt8MaterialFUlUlf
ut::LinkList<AnimationLink, 0> *GetAnimationList() {
return &mAnimList;
}
bool IsUserAllocated() const {
return mbUserAllocated;
}
const char *GetName() const {
return mName;
}
virtual ~Material(); // at 0x08
virtual bool SetupGX(bool bModVtxCok, u8 alpha); // at 0x0C
@@ -47,6 +67,7 @@ struct Material {
virtual void SetAnimationEnable(AnimTransform *pAnimTrans, bool bEnable); // at 0x28
virtual void SetAnimationEnable(const AnimResource &animRes, bool bEnable); // at 0x2C
private:
ut::LinkList<AnimationLink, 0> mAnimList; // at 0x4
GXColorS10 mTevCols[3]; // at 0x10
ut::Color mTevKCols[4]; // at 0x28
+81 -42
View File
@@ -16,19 +16,6 @@
namespace nw4r {
namespace lyt {
struct Size {
inline Size() : width(), height() {}
inline Size &operator=(const Size &rhs) {
width = rhs.width;
height = rhs.height;
return *this;
}
f32 width, height;
};
namespace detail {
struct PaneBase {
PaneBase();
@@ -38,14 +25,17 @@ struct PaneBase {
} // namespace detail
namespace res {
// TODO: Find proper place?
// GUESS: In the FindExtUserDataByName function it iterates through ExtUserData
struct ExtUserData {
u32 stringOffs;
u32 UNK_0x04;
u32 UNK_0x08;
u32 nameOffs; // at 0x00
u32 datOffs; // at 0x04
u16 numEntries; // at 0x08
u8 type; // at 0x0A
u8 padding; // at 0x0B
};
namespace res {
struct ExtUserDataList {
DataBlockHeader blockHeader; // at 0x00
@@ -67,20 +57,70 @@ struct Pane {
};
} // namespace res
struct Pane : detail::PaneBase {
class Pane : detail::PaneBase {
public:
// For use with TestBit<Uc>
enum PaneBits { VISIBLE, INFLUENCED_ALPHA, LOCATION_ADJUST };
bool IsVisible() const {
return detail::TestBit<u8>(mFlag, VISIBLE);
}
void SetVisible(bool bVisible) {
detail::SetBit(&mFlag, VISIBLE, bVisible);
}
bool IsInfluencedAlpha() const {
return detail::TestBit<u8>(mFlag, INFLUENCED_ALPHA);
}
bool IsLocationAdjust() const {
return detail::TestBit<u8>(mFlag, LOCATION_ADJUST);
}
bool IsUserAllocated() const {
return mbUserAllocated;
}
ut::LinkList<Pane, 4> *GetChildList() {
return &mChildList;
}
ut::LinkList<AnimationLink, 0> *GetAnimationList() {
return &mAnimList;
}
const math::MTX34 *GetGlobalMtx() const {
return &mGlbMtx;
}
Pane *GetParent() const {
return mpParent;
}
const math::VEC2 *GetScale() const {
return &mScale;
}
void SetScale(const math::VEC2 &value) {
mScale = value;
}
u8 GetAlpha() const {
return mAlpha;
}
void SetAlpha(u8 value) {
mAlpha = value;
}
const Size *GetSize() const {
return &mSize;
}
void SetSize(const Size &value) {
mSize = value;
}
const res::ExtUserDataList *GetExtUserDataList() const {
return mpExtUserDataList;
}
void SetExtUserDataList(const res::ExtUserDataList *pBlock) {
mpExtUserDataList = pBlock;
}
Pane();
Pane(const res::Pane *pBlock);
void Init();
void SetName(const char *pName);
@@ -96,11 +136,11 @@ struct Pane : detail::PaneBase {
math::VEC2 GetVtxPos() const;
void CalculateMtxChild(const DrawInfo &drawInfo);
u16 GetExtUserDataNum() const;
ExtUserData *GetExtUserData() const;
ExtUserData *FindExtUserDataByName(const char *name);
res::ExtUserData *GetExtUserData() const;
res::ExtUserData *FindExtUserDataByName(const char *name);
virtual ~Pane(); // at 0x8
virtual const ut::detail::RuntimeTypeInfo *GetRuntimeTypeInfo() const; // at 0xC
NW4R_UT_RTTI_DECL(Pane); // at 0x0C
virtual void CalculateMtx(const DrawInfo &drawInfo); // at 0x10
virtual void Draw(const DrawInfo &); // at 0x14
virtual void DrawSelf(const DrawInfo &); // at 0x18
@@ -127,27 +167,26 @@ struct Pane : detail::PaneBase {
virtual Material *GetMaterial(u32 idx) const; // at 0x6C
virtual void LoadMtx(const DrawInfo &drawInfo); // at 0x70
Pane *mpParent; // at 0x0C
ut::LinkList<Pane, 4> mChildList; // at 0x10
ut::LinkList<AnimationLink, 0> 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;
private:
Pane *mpParent; // at 0x0C
ut::LinkList<Pane, 4> mChildList; // at 0x10
ut::LinkList<AnimationLink, 0> 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
const 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
};
} // namespace lyt
} // namespace nw4r
+32
View File
@@ -0,0 +1,32 @@
#ifndef NW4R_LYT_PICTURE_H
#define NW4R_LYT_PICTURE_H
#include <nw4r/lyt/lyt_common.h>
#include <nw4r/lyt/lyt_pane.h>
namespace nw4r {
namespace lyt {
namespace res {
struct Picture : public Pane {};
} // namespace res
class Picture : public Pane {
public:
Picture(const res::Picture *, const ResBlockSet &resDataSet);
virtual ~Picture();
NW4R_UT_RTTI_DECL(Picture);
private:
ut::Color mVtxColors[4]; // at 0xD8
detail::TexCoordAry mTexCoordAry; // at 0xE8
};
} // namespace lyt
} // namespace nw4r
#endif
+55
View File
@@ -0,0 +1,55 @@
#ifndef LYT_TEXT_BOX_H
#define LYT_TEXT_BOX_H
#include <nw4r/lyt/lyt_pane.h>
namespace nw4r {
namespace lyt {
namespace res {
struct TextBox : public Pane {
u16 textBufBytes; // at 0x4C
u16 materialIdx; // at 0x50
u16 fontIdx; // at 0x52
u8 textPosition; // at 0x54
u8 textAlignment; // at 0x55
u8 padding[2]; // at 0x56
u32 textStrOffset; // at 0x58
u32 textCols[2]; // at 0x5C
Size fontSize; // at 0x64
f32 charSpace; // at 0x6C
f32 lineSpace; // at 0x70
};
} // namespace res
class TextBox : public Pane {
public:
void SetTagProcessor(ut::TagProcessorBase<wchar_t> *pTagProcessor) {
mpTagProcessor = pTagProcessor;
}
TextBox(const res::TextBox *, const ResBlockSet &resBlockSet);
virtual ~TextBox();
NW4R_UT_RTTI_DECL(TextBox);
wchar_t *mTextBuf; // at 0xD8 // ptr to is Guess
ut::Color mTextColors[2]; // at 0xDC
ut::Font *mpFont; // at 0xE4
Size mFontSize; // at 0xE8
f32 mLineSpace; // at 0xF0
f32 mCharSpace; // at 0xF4
ut::TagProcessorBase<wchar_t> *mpTagProcessor; // at 0xF8
u16 mTextBufBytes; // at 0xFC
u16 mTextLen; // at 0xFE
u8 mTextPosition; // at 0x100
struct { //
u8 bAllocFont : 1; //
u8 textAligntment : 1; //
} mBits; // at 0x101
};
} // namespace lyt
} // namespace nw4r
#endif
+65
View File
@@ -1,16 +1,81 @@
#ifndef NW4R_LYT_TYPES_H
#define NW4R_LYT_TYPES_H
#include <nw4r/lyt/lyt_common.h>
#include <nw4r/ut/ut_algorithm.h>
namespace nw4r {
namespace lyt {
struct Size {
inline Size() : width(), height() {}
inline Size &operator=(const Size &rhs) {
width = rhs.width;
height = rhs.height;
return *this;
}
f32 width, height;
};
namespace res {
// struct AnimationBlock {}; // in lyt_animation.h
// struct AnimationTagBlock {}; // in lyt_animation.h
// struct AnimationShareBlock {}; // in lyt_animation.h
// struct Bounding {}; // in lyt_bounding.h
// struct Group {}; // in lyt_group.h
// struct Material {}; // in lyt_material.h
// struct Pane {}; // in lyt_pane.h
// struct TextBox {}; // in lyt_textbox.h
// struct Window {}; // in lyt_window.h
// struct BinaryFileHeader {}; // in lyt_common.h
// IDK Proper place for this one
struct FontList {
DataBlockHeader blockHeader; // at 0x00
u16 fontNum; // at 0x08
u8 padding[2]; // at 0x0A
};
struct TextureList {
DataBlockHeader blockHeader; // at 0x00
u16 texNum; // at 0x08
u8 padding[2]; // at 0x0A
};
// belong in Animation?
struct HermiteKey {};
struct StepKey {};
} // namespace res
struct AnimationShareInfo {
const char *GetSrcPaneName() const {
return srcPaneName;
}
char srcPaneName[17]; // at 0x00
char targetGroupName[17]; // at 0x11
u8 padding[2]; // at 0x12
};
namespace detail {
template <typename T>
inline bool TestBit(T bits, int index) {
T mask = 1 << index;
return bits & mask;
}
template <typename T>
inline bool SetBit(T *bits, int pos, bool val) {
T mask = T(1 << pos);
*bits = T((*bits & ~mask)) | (val << pos);
}
template <typename T>
T *ConvertOffsetToPtr(const void *baseAddress, unsigned int offset) {
return (T *)((u32)baseAddress + offset);
}
} // namespace detail
} // namespace lyt
+69
View File
@@ -0,0 +1,69 @@
#ifndef NW4R_LYT_WINDOW_H
#define NW4R_LYT_WINDOW_H
#include <common.h>
#include <nw4r/lyt/lyt_common.h>
#include <nw4r/lyt/lyt_pane.h>
#include <nw4r/lyt/lyt_types.h>
namespace nw4r {
namespace lyt {
namespace res {
// TODO: Idk where this is stored
struct InflationLRTB {
f32 l; // at 0x00
f32 r; // at 0x04
f32 t; // at 0x08
f32 b; // at 0x0C
};
struct Window : res::Pane {
InflationLRTB inflation; // at 0x4C
u8 frameNum; // at 0x5C
u8 padding1; // at 0x5D
u8 padding2; // at 0x5E
u8 padding3; // at 0x5F
u32 contentOffset; // at 0x60
u32 frameOffsetTableOffset; // at 0x64
};
} // namespace res
struct Content {
ut::Color vtxColors[4]; // at 0x00
detail::TexCoordAry texCoordAry; // at 0x10
};
struct Frame {
bool textureFlip; // at 0x00
Material *pMaterial; // at 0x04
};
struct WindowFramSize {
f32 l; // at 0x00
f32 r; // at 0x04
f32 t; // at 0x08
f32 b; // at 0x0C
};
class Window : public Pane {
public:
Window(const res::Window *, const ResBlockSet &ResBlockSet);
virtual ~Window();
NW4R_UT_RTTI_DECL(Window);
private:
res::InflationLRTB mContentInflation; // at 0x0D8
Content mContent; // at 0x0E8
Frame *mFrams; // at 0x100
u8 mFrameNum; // 0x104
};
} // namespace lyt
} // namespace nw4r
#endif
+14 -19
View File
@@ -3,30 +3,27 @@
#include <nw4r/types_nw4r.h>
// Declare type RTTI and accessor function
#define NW4R_UT_RTTI_DECL(T) \
static nw4r::ut::detail::RuntimeTypeInfo typeInfo; \
virtual const nw4r::ut::detail::RuntimeTypeInfo* GetRuntimeTypeInfo() \
const { \
return &typeInfo; \
#define NW4R_UT_RTTI_DECL(T) \
static nw4r::ut::detail::RuntimeTypeInfo typeInfo; \
virtual const nw4r::ut::detail::RuntimeTypeInfo *GetRuntimeTypeInfo() const { \
return &typeInfo; \
}
// Define type RTTI (base type)
#define NW4R_UT_RTTI_DEF_BASE(T) \
nw4r::ut::detail::RuntimeTypeInfo T::typeInfo(NULL)
#define NW4R_UT_RTTI_DEF_BASE(T) nw4r::ut::detail::RuntimeTypeInfo T::typeInfo(NULL)
// Define type RTTI (derived type)
#define NW4R_UT_RTTI_DEF_DERIVED(T, BASE) \
nw4r::ut::detail::RuntimeTypeInfo T::typeInfo(&BASE::typeInfo)
#define NW4R_UT_RTTI_DEF_DERIVED(T, BASE) nw4r::ut::detail::RuntimeTypeInfo T::typeInfo(&BASE::typeInfo)
namespace nw4r {
namespace ut {
namespace detail {
struct RuntimeTypeInfo {
RuntimeTypeInfo(const RuntimeTypeInfo* base) : mBase(base) {}
RuntimeTypeInfo(const RuntimeTypeInfo *base) : mBase(base) {}
bool IsDerivedFrom(const RuntimeTypeInfo* base) const {
for (const RuntimeTypeInfo* it = this; it != NULL; it = it->mBase) {
bool IsDerivedFrom(const RuntimeTypeInfo *base) const {
for (const RuntimeTypeInfo *it = this; it != NULL; it = it->mBase) {
if (it == base) {
return true;
}
@@ -35,24 +32,22 @@ struct RuntimeTypeInfo {
return false;
}
const RuntimeTypeInfo* mBase; // at 0x0
const RuntimeTypeInfo *mBase; // at 0x0
};
template <typename T>
inline const RuntimeTypeInfo* GetTypeInfoFromPtr_(T* ptr) {
inline const RuntimeTypeInfo *GetTypeInfoFromPtr_(T *ptr) {
return &ptr->typeInfo;
}
} // namespace detail
template <typename TDerived, typename TBase>
inline TDerived DynamicCast(TBase* ptr) {
inline TDerived DynamicCast(TBase *ptr) {
// Derived type info
const detail::RuntimeTypeInfo* derivedTypeInfo =
detail::GetTypeInfoFromPtr_(static_cast<TDerived>(NULL));
const detail::RuntimeTypeInfo *derivedTypeInfo = detail::GetTypeInfoFromPtr_(static_cast<TDerived>(NULL));
// Downcast if possible
if (ptr->GetRuntimeTypeInfo()->IsDerivedFrom(derivedTypeInfo)) {
if (ptr && ptr->GetRuntimeTypeInfo()->IsDerivedFrom(derivedTypeInfo)) {
return static_cast<TDerived>(ptr);
}
+37 -20
View File
@@ -9,20 +9,29 @@ namespace {
/**
* Value operations
*/
template <typename T> inline T Max(T t1, T t2) { return (t1 < t2) ? t2 : t1; }
template <typename T>
inline T Max(T t1, T t2) {
return (t1 < t2) ? t2 : t1;
}
template <typename T> inline T Min(T t1, T t2) { return (t1 > t2) ? t2 : t1; }
template <typename T>
inline T Min(T t1, T t2) {
return (t1 > t2) ? t2 : t1;
}
template <typename T> inline T Clamp(T value, T min, T max) {
template <typename T>
inline T Clamp(T value, T min, T max) {
return value > max ? max : (value < min ? min : value);
}
template <typename T> inline T Abs(T x) {
template <typename T>
inline T Abs(T x) {
// Static cast needed to break abs optimization during instruction selection
return x < 0 ? static_cast<T>(-x) : static_cast<T>(x);
}
template <> f32 inline Abs(register f32 x) {
template <>
f32 inline Abs(register f32 x) {
register f32 ax;
// clang-format off
@@ -37,54 +46,62 @@ template <> f32 inline Abs(register f32 x) {
/**
* Bit operations
*/
template <typename T> inline T BitExtract(T bits, int pos, int len) {
template <typename T>
inline T BitExtract(T bits, int pos, int len) {
T mask = (1 << len) - 1;
return (bits >> pos) & mask;
}
template <typename T> inline bool TestBit(T t, int bitIndexLSB) {
template <typename T>
inline bool TestBit(T t, int bitIndexLSB) {
return BitExtract<T>(t, sizeof(T), bitIndexLSB);
}
/**
* Pointer operations
*/
inline u32 GetIntPtr(const void* ptr) { return reinterpret_cast<u32>(ptr); }
template <typename T>
inline const void* AddOffsetToPtr(const void* ptr, T offset) {
return reinterpret_cast<const void*>(GetIntPtr(ptr) + offset);
inline u32 GetIntPtr(const void *ptr) {
return reinterpret_cast<u32>(ptr);
}
inline s32 GetOffsetFromPtr(const void* start, const void* end) {
template <typename T>
inline const void *AddOffsetToPtr(const void *ptr, T offset) {
return reinterpret_cast<const void *>(GetIntPtr(ptr) + offset);
}
inline s32 GetOffsetFromPtr(const void *start, const void *end) {
return static_cast<s32>(GetIntPtr(end) - GetIntPtr(start));
}
inline int ComparePtr(const void* p1, const void* p2) {
inline int ComparePtr(const void *p1, const void *p2) {
return static_cast<int>(GetIntPtr(p1) - GetIntPtr(p2));
}
/**
* Rounding
*/
template <typename T> inline T RoundUp(T t, unsigned int alignment) {
template <typename T>
inline T RoundUp(T t, unsigned int alignment) {
return (alignment + t - 1) & ~(alignment - 1);
}
template <typename T> inline void* RoundUp(T* t, unsigned int alignment) {
template <typename T>
inline void *RoundUp(T *t, unsigned int alignment) {
u32 value = reinterpret_cast<u32>(t);
u32 rounded = (alignment + value - 1) & ~(alignment - 1);
return reinterpret_cast<void*>(rounded);
return reinterpret_cast<void *>(rounded);
}
template <typename T> inline T RoundDown(T t, unsigned int alignment) {
template <typename T>
inline T RoundDown(T t, unsigned int alignment) {
return t & ~(alignment - 1);
}
template <typename T> inline void* RoundDown(T* t, unsigned int alignment) {
template <typename T>
inline void *RoundDown(T *t, unsigned int alignment) {
u32 value = reinterpret_cast<u32>(t);
u32 rounded = value & ~(alignment - 1);
return reinterpret_cast<void*>(rounded);
return reinterpret_cast<void *>(rounded);
}
} // namespace
+1 -2
View File
@@ -12,7 +12,6 @@ using namespace ut;
// EqualsResName__Q34nw4r3lyt6detailFPCcPCc
bool detail::EqualsResName(const char *name1, const char *name2) {
return strncmp(name1, name2, NW4R_RES_NAME_SIZE) == 0;
;
}
// EqualsMaterialName__Q34nw4r3lyt6detailFPCcPCc
@@ -22,7 +21,7 @@ bool detail::EqualsMaterialName(const char *name1, const char *name2) {
// TestFileHeader__Q34nw4r3lyt6detailFRCQ44nw4r3lyt3res16BinaryFileHeaderUl
bool detail::TestFileHeader(const res::BinaryFileHeader &fileHeader, u32 testSig) {
return ((testSig == fileHeader.magic) && (fileHeader.byteOrder == NW4R_BYTEORDER_BIG));
return ((testSig == detail::GetSignatureInt(fileHeader.signature)) && (fileHeader.byteOrder == NW4R_BYTEORDER_BIG));
}
namespace detail {
+4 -3
View File
@@ -10,7 +10,8 @@ Group::Group(const res::Group *pResGroup, Pane *pRootPane) : mLink(), mPaneListL
Init();
strncpy(this->mName, pResGroup->mName, NW4R_RES_NAME_SIZE);
this->mName[NW4R_RES_NAME_SIZE] = '\0';
const char *paneNameBase = (char *)(&pResGroup[1]);
const char *paneNameBase = detail::ConvertOffsetToPtr<char>(pResGroup, sizeof(res::Group));
for (int i = 0; i < pResGroup->paneNum; i++) {
Pane *pFindPane = pRootPane->FindPaneByName(paneNameBase + i * NW4R_RES_NAME_SIZE, true);
if (pFindPane) {
@@ -49,7 +50,7 @@ GroupContainer::~GroupContainer() {
while (it != this->mGroupList.GetEndIter()) {
ut::LinkList<Group, 4>::Iterator currIt = it++;
this->mGroupList.Erase(currIt);
if (!currIt->mbUserAllocated) {
if (!currIt->IsUserAllocated()) {
Layout::DeleteObj<Group>(&*currIt);
}
}
@@ -64,7 +65,7 @@ void GroupContainer::AppendGroup(Group *pGroup) {
Group *GroupContainer::FindGroupByName(const char *findName) {
for (ut::LinkList<Group, 4>::Iterator it = this->mGroupList.GetBeginIter(); it != this->mGroupList.GetEndIter();
it++) {
if (detail::EqualsResName(it->mName, findName)) {
if (detail::EqualsResName(it->GetName(), findName)) {
return &*it;
}
}
+244
View File
@@ -0,0 +1,244 @@
#include <nw4r/lyt/lyt_animation.h>
#include <nw4r/lyt/lyt_bounding.h>
#include <nw4r/lyt/lyt_group.h>
#include <nw4r/lyt/lyt_layout.h>
#include <nw4r/lyt/lyt_picture.h>
#include <nw4r/lyt/lyt_textBox.h>
#include <nw4r/lyt/lyt_window.h>
#include <nw4r/ut/ut_RuntimeTypeInfo.h>
#include <nw4r/ut/ut_TagProcessorBase.h>
namespace nw4r {
namespace lyt {
// mspAllocator__Q34nw4r3lyt6Layout
MEMAllocator *Layout::mspAllocator;
namespace {
// SetTagProcessorImpl__Q34nw4r3lyt24@unnamed@lyt_layout_cpp@FPQ34nw4r3lyt4PanePQ34nw4r2ut19TagProcessorBase<w>
void SetTagProcessorImpl(Pane *pPane, ut::TagProcessorBase<wchar_t> *pTagProcessor) {
TextBox *pTextBox = ut::DynamicCast<TextBox *>(pPane);
if (pTextBox) {
pTextBox->SetTagProcessor(pTagProcessor);
}
for (ut::LinkList<Pane, 4>::Iterator it = pPane->GetChildList()->GetBeginIter();
it != pPane->GetChildList()->GetEndIter(); ++it) {
SetTagProcessorImpl(&*it, pTagProcessor);
}
}
// IsIncludeAnimationGroupRef__Q34nw4r3lyt24@unnamed@lyt_layout_cpp@FPQ34nw4r3lyt14GroupContainerPCQ34nw4r3lyt17AnimationGroupRefUsbPQ34nw4r3lyt4Pane
// Doesnt match DWARF Vars, but matches
bool IsIncludeAnimationGroupRef(GroupContainer *pGroupContainer, const AnimationGroupRef *groupRefs, u16 bindGroupNum,
bool bDescendingBind, Pane *pTargetPane) {
for (u16 grpIdx = 0; grpIdx < bindGroupNum; grpIdx++) {
Group *pGroup = pGroupContainer->FindGroupByName(groupRefs[grpIdx].name);
for (ut::LinkList<detail::PaneLink, 0>::Iterator paneList = pGroup->GetPaneList()->GetBeginIter();
paneList != pGroup->GetPaneList()->GetEndIter(); paneList++) {
const Pane *t = paneList->mTarget;
if (t == pTargetPane) {
return true;
}
if (bDescendingBind) {
for (const Pane *pParentPane = pTargetPane->GetParent(); pParentPane != nullptr;
pParentPane = pParentPane->GetParent()) {
if (t == pParentPane) {
return true;
}
}
}
}
}
return false;
}
} // namespace
// __ct__Q34nw4r3lyt6LayoutFv
Layout::Layout() : mAnimTransList(), mpRootPane(nullptr), mpGroupContainer(nullptr) {}
// __dt__Q34nw4r3lyt6LayoutFv
Layout::~Layout() {
DeleteObj(mpGroupContainer);
if (mpRootPane && !mpRootPane->IsUserAllocated()) {
DeleteObj(mpRootPane);
}
ut::LinkList<AnimTransform, 4>::Iterator it = mAnimTransList.GetBeginIter();
while (it != mAnimTransList.GetEndIter()) {
ut::LinkList<AnimTransform, 4>::Iterator currIt = it++;
mAnimTransList.Erase(currIt);
DeleteObj(&*currIt);
}
}
// Build__Q34nw4r3lyt6LayoutFPCvPQ34nw4r3lyt16ResourceAccessor
bool Layout::Build(const void *lytResBuf, ResourceAccessor *pResAcsr) {
const res::BinaryFileHeader *pFileHead = (const res::BinaryFileHeader *)(lytResBuf);
if (!detail::TestFileHeader(*pFileHead, 'RLYT')) {
return false;
}
if (!detail::TestFileVersion(*pFileHead)) {
return false;
}
ResBlockSet resBlockSet = {nullptr, nullptr, nullptr, pResAcsr};
Pane *pParentPane = nullptr;
Pane *pLastPane = nullptr;
bool bReadRootGroup = false;
int groupNestLevel = 0;
const void *dataPtr = ((u8 *)lytResBuf + pFileHead->headerSize);
for (int i = 0; i < pFileHead->dataBlocks; i++) {
const res::DataBlockHeader *pDataBlockHead = (const res::DataBlockHeader *)dataPtr;
switch (pDataBlockHead->kind) {
case 'lyt1': // Main Layout
const res::Layout *pResLyt = ((const res::Layout *)dataPtr);
mLayoutSize = pResLyt->layoutSize;
break;
case 'txl1': // Texture List
resBlockSet.pTextureList = (const res::TextureList *)dataPtr;
break;
case 'fnl1': // Font List
resBlockSet.pFontList = (const res::FontList *)dataPtr;
break;
case 'mat1': // Material
resBlockSet.pMaterialList = (const res::MaterialList *)dataPtr;
break;
case 'wnd1': // Window
case 'pan1': // Pane
case 'pic1': // Picture
case 'txt1': // Text Box
case 'bnd1': // Boundary Pane
Pane *pPane = BuildPaneObj(pDataBlockHead->kind, dataPtr, resBlockSet);
if (pPane) {
if (mpRootPane == nullptr) {
mpRootPane = pPane;
}
if (pParentPane) {
pParentPane->AppendChild(pPane);
}
pLastPane = pPane;
}
break;
case 'usd1': // User Data
pLastPane->SetExtUserDataList((const res::ExtUserDataList *)dataPtr);
break;
case 'pas1': // PaneChildren Start
pParentPane = pLastPane;
break;
case 'pae1': // PaneChildren End
pLastPane = pParentPane;
pParentPane = pLastPane->GetParent();
break;
case 'grp1': // Group
if (!bReadRootGroup) {
bReadRootGroup = true;
mpGroupContainer = NewObj<GroupContainer>();
} else {
if (mpGroupContainer && groupNestLevel == 1) {
Group *pGroup = NewObj<Group>((const res::Group *)dataPtr, mpRootPane);
if (pGroup) {
mpGroupContainer->AppendGroup(pGroup);
}
}
}
break;
case 'grs1': // Group Children Start
groupNestLevel++;
break;
case 'gre1': // Group Children End
groupNestLevel--;
break;
default:
break;
}
dataPtr = ((u8 *)dataPtr + pDataBlockHead->size);
}
return true;
}
// CreateAnimTransform__Q34nw4r3lyt6LayoutFv
AnimTransform *Layout::CreateAnimTransform() {
return nullptr;
}
// CreateAnimTransform__Q34nw4r3lyt6LayoutFPCvPQ34nw4r3lyt16ResourceAccessor
AnimTransform *Layout::CreateAnimTransform(const void *animResBuf, ResourceAccessor *pResAcsr) {
return nullptr;
}
// CreateAnimTransform__Q34nw4r3lyt6LayoutFRCQ34nw4r3lyt12AnimResourcePQ34nw4r3lyt16ResourceAccessor
AnimTransform *Layout::CreateAnimTransform(const AnimResource &animRes, ResourceAccessor *pResAcsr) {
return nullptr;
}
// BindAnimation__Q34nw4r3lyt6LayoutFPQ34nw4r3lyt13AnimTransform
void Layout::BindAnimation(AnimTransform *pAnimTrans) {}
// UnbindAnimation__Q34nw4r3lyt6LayoutFPQ34nw4r3lyt13AnimTransform
void Layout::UnbindAnimation(AnimTransform *pAnimTrans) {}
// UnbindAllAnimation__Q34nw4r3lyt6LayoutFv
void Layout::UnbindAllAnimation() {}
// BindAnimationAuto__Q34nw4r3lyt6LayoutFRCQ34nw4r3lyt12AnimResourcePQ34nw4r3lyt16ResourceAccessor
bool Layout::BindAnimationAuto(const AnimResource &animRes, ResourceAccessor *pResAcsr) {
return IsIncludeAnimationGroupRef(nullptr, nullptr, 0, 0, nullptr);
}
// SetAnimationEnable__Q34nw4r3lyt6LayoutFPQ34nw4r3lyt13AnimTransformb
void Layout::SetAnimationEnable(AnimTransform *pAnimTrans, bool bEnable) {}
// CalculateMtx__Q34nw4r3lyt6LayoutFRCQ34nw4r3lyt8DrawInfo
void Layout::CalculateMtx(const DrawInfo &drawInfo) {}
// Draw__Q34nw4r3lyt6LayoutFRCQ34nw4r3lyt8DrawInfo
void Layout::Draw(const DrawInfo &drawInfo) {}
// Animate__Q34nw4r3lyt6LayoutFUl
void Layout::Animate(u32 option) {}
// GetLayoutRect__Q34nw4r3lyt6LayoutCFv
ut::Rect Layout::GetLayoutRect() const {}
// SetTagProcessor__Q34nw4r3lyt6LayoutFPQ34nw4r2ut19TagProcessorBase<w>
void Layout::SetTagProcessor(ut::TagProcessorBase<wchar_t> *pTagProcessor) {
SetTagProcessorImpl(this->mpRootPane, pTagProcessor);
}
// BuildPaneObj__Q34nw4r3lyt6LayoutFlPCvRCQ34nw4r3lyt11ResBlockSet
Pane *Layout::BuildPaneObj(s32 kind, const void *dataPtr, const ResBlockSet &resBlockSet) {
// Oddly enough the breaks are required here to not inline the function???
// Had them as left over from editing and somehow when removing them it just broke Build.
// Probably some analysis depth as 3 break statements do it
switch (kind) {
case 'pan1': {
const res::Pane *pResPane = (const res::Pane *)dataPtr;
return NewObj<Pane>(pResPane);
} break;
case 'pic1': {
const res::Picture *pResPic = (const res::Picture *)dataPtr;
return NewObj<Picture>(pResPic, resBlockSet);
} break;
case 'txt1': {
const res::TextBox *pBlock = (const res::TextBox *)dataPtr;
return NewObj<TextBox>(pBlock, resBlockSet);
} break;
case 'wnd1': {
const res::Window *pBlock = (const res::Window *)dataPtr;
return NewObj<Window>(pBlock, resBlockSet);
} break;
case 'bnd1': {
const res::Bounding *pResBounding = (const res::Bounding *)dataPtr;
return NewObj<Bounding>(pResBounding, resBlockSet);
} break;
default:
return nullptr;
}
}
} // namespace lyt
} // namespace nw4r
+10
View File
@@ -0,0 +1,10 @@
// SetupGX__Q34nw4r3lyt8MaterialFbUc
// BindAnimation__Q34nw4r3lyt8MaterialFPQ34nw4r3lyt13AnimTransform
// UnbindAnimation__Q34nw4r3lyt8MaterialFPQ34nw4r3lyt13AnimTransform
// UnbindAllAnimation__Q34nw4r3lyt8MaterialFv
// Animate__Q34nw4r3lyt8MaterialFv
// FindAnimationLink__Q34nw4r3lyt8MaterialFPQ34nw4r3lyt13AnimTransform
// FindAnimationLink__Q34nw4r3lyt8MaterialFRCQ34nw4r3lyt12AnimResource
// SetAnimationEnable__Q34nw4r3lyt8MaterialFPQ34nw4r3lyt13AnimTransformb
// SetAnimationEnable__Q34nw4r3lyt8MaterialFRCQ34nw4r3lyt12AnimResourceb
+29 -20
View File
@@ -8,12 +8,6 @@
#include <nw4r/ut/ut_list.h>
// ReverseYAxis__22@unnamed@lyt_pane_cpp@FPQ34nw4r4math5MTX34
void float_order() {
0.0f;
1.0f;
}
namespace nw4r {
namespace lyt {
@@ -29,6 +23,23 @@ PaneBase::~PaneBase() {}
NW4R_UT_RTTI_DEF_BASE(Pane);
// __ct__Q34nw4r3lyt4PaneFv
// Guess pulled from BBA/slight modified
Pane::Pane() : mChildList(), mAnimList(), mSize() {
this->mpParent = nullptr;
this->mpMaterial = nullptr;
this->mbUserAllocated = false;
this->mpExtUserDataList = nullptr;
this->mBasePosition = 4;
memset(this->mName, 0, PANE_NAME_SIZE + 1);
memset(this->mUserData, 0, PANE_USERDATA_SIZE + 1);
this->mTranslate = math::VEC3(0.0f, 0.0f, 0.0f);
this->mRotate = math::VEC3(0.0f, 0.0f, 0.0f);
this->mScale = math::VEC2(1.0f, 1.0f);
this->mSize = Size();
this->mAlpha = 0xFF;
this->mGlbAlpha = 0xFF;
SetVisible(true);
}
// __dt__Q34nw4r2ut38LinkList<Q34nw4r3lyt13AnimationLink,0>Fv
@@ -69,12 +80,12 @@ Pane::~Pane() {
ut::LinkList<Pane, 4>::Iterator currIt = it++;
mChildList.Erase(currIt);
if (!currIt->mbUserAllocated) {
Layout::DeleteObj<Pane>(&*currIt);
Layout::DeleteObj(&*currIt);
}
}
this->UnbindAnimationSelf(nullptr);
if (this->mpMaterial && !this->mpMaterial->mbUserAllocated) {
Layout::DeleteObj<Material>(this->mpMaterial);
if (this->mpMaterial && !this->mpMaterial->IsUserAllocated()) {
Layout::DeleteObj(this->mpMaterial);
}
}
@@ -189,7 +200,7 @@ Pane *Pane::FindPaneByName(const char *findName, bool bRecursive) {
// FindMaterialByName__Q34nw4r3lyt4PaneFPCcb
Material *Pane::FindMaterialByName(const char *findName, bool bRecursive) {
if (this->mpMaterial && detail::EqualsMaterialName(this->mpMaterial->mName, findName)) {
if (this->mpMaterial && detail::EqualsMaterialName(this->mpMaterial->GetName(), findName)) {
return this->mpMaterial;
}
if (bRecursive) {
@@ -501,34 +512,32 @@ u16 Pane::GetExtUserDataNum() const {
}
return 0;
}
ExtUserData *Pane::GetExtUserData() const {
res::ExtUserData *Pane::GetExtUserData() const {
if (this->mpExtUserDataList) {
return (ExtUserData *)(this->mpExtUserDataList + 1);
return detail::ConvertOffsetToPtr<res::ExtUserData>(this->mpExtUserDataList, sizeof(res::ExtUserDataList));
}
return nullptr;
}
ExtUserData *Pane::FindExtUserDataByName(const char *name) {
ExtUserData *pUserData = GetExtUserData();
res::ExtUserData *Pane::FindExtUserDataByName(const char *name) {
res::ExtUserData *pUserData = GetExtUserData();
if (!pUserData) {
return nullptr;
}
int i = 0;
for (int i = 0; i < this->mpExtUserDataList->num;) {
u32 offset = pUserData->stringOffs;
for (int i = 0; i < this->mpExtUserDataList->num; i++, pUserData++) {
u32 offset = pUserData->nameOffs;
const char *str = 0;
if (offset != 0) {
str = (const char *)(pUserData) + offset;
str = detail::ConvertOffsetToPtr<char>(pUserData, offset);
} else {
str = 0;
str = nullptr;
}
if (strcmp(name, str) == 0) {
return pUserData;
};
i++;
pUserData++;
}
return nullptr;
}