1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
|
#ifndef NW4R_G3D_SCN_ROOT_H
#define NW4R_G3D_SCN_ROOT_H
#include <nw4r/types_nw4r.h>
#include "nw4r/g3d/g3d_camera.h"
#include "nw4r/g3d/g3d_fog.h"
#include "nw4r/g3d/g3d_light.h"
#include "nw4r/g3d/g3d_scnobj.h"
#include "nw4r/g3d/g3d_state.h"
namespace nw4r {
namespace g3d {
// Forward declarations
class AnmScn;
/******************************************************************************
*
* ScnRoot
*
******************************************************************************/
class ScnRoot : public ScnGroup {
public:
enum ScnRootFlag {
SCNROOTFLAG_FORCE_RESMDLDRAWMODE = (1 << 0)
};
public:
static ScnRoot *
Construct(MEMAllocator *pAllocator, u32 *pSize, u32 maxChildren, u32 maxScnObj, u32 numLightObj, u32 numLightSet);
static ScnRoot *Construct(MEMAllocator *pAllocator, u32 *pSize, u32 maxChildren, u32 maxScnObj) {
return Construct(pAllocator, pSize, maxChildren, maxScnObj, G3DState::NUM_LIGHT, G3DState::NUM_LIGHT_SET);
}
ScnRoot(
MEMAllocator *pAllocator, IScnObjGather *pGather, ScnObj **ppChildrenBuf, u32 maxChildren, u32 numLight,
u32 numLightSet, LightObj *pLightObjBuf, AmbLightObj *pAmbObjBuf, LightSetData *pLightSetBuf
);
virtual void G3dProc(u32 task, u32 param, void *pInfo); // at 0xC
virtual ~ScnRoot(); // at 0x10
Camera GetCamera(int idx);
Camera GetCurrentCamera();
void SetCurrentCamera(int idx);
Fog GetFog(int idx);
LightSet GetLightSet(int idx);
void UpdateFrame();
void SetGlbSettings();
void CalcAnmScn();
void CalcWorld();
void CalcMaterial();
void CalcVtx();
void CalcView();
void GatherDrawScnObj();
void ZSort();
void DrawOpa();
void DrawXlu();
u32 TestScnRootFlag(ScnRootFlag flag) const {
return (mScnRootFlags & flag) != 0;
}
void SetScnRootFlag(ScnRootFlag flag, u32 on) {
if (on) {
mScnRootFlags |= flag;
} else {
mScnRootFlags &= ~flag;
}
}
int GetCurrentCameraID() const {
return mCurrentCameraID;
}
LightSetting &GetLightSetting() {
return mLightSetting;
}
private:
IScnObjGather *mpCollection; // at 0xE8
ResMdlDrawMode mDrawMode; // at 0xEC
u32 mScnRootFlags; // at 0xF0
u8 mCurrentCameraID; // at 0xF4
u8 PADDING_0xF5; // at 0xF5
u8 PADDING_0xF6; // at 0xF6
u8 PADDING_0xF7; // at 0xF7
CameraData mCamera[G3DState::NUM_CAMERA]; // at 0xF8
FogData mFog[G3DState::NUM_FOG]; // at 0x2278
LightSetting mLightSetting; // at 0x2878
AnmScn *mpAnmScn; // at 0x2888
NW4R_G3D_RTTI_DECL_DERIVED(ScnRoot, ScnGroup);
};
/******************************************************************************
*
* ScnObjGather
*
******************************************************************************/
class ScnObjGather : public IScnObjGather {
public:
ScnObjGather(ScnObj **ppBufOpa, ScnObj **ppBufXlu, u32 capacity);
virtual ~ScnObjGather() {} // at 0x8
virtual CullingStatus Add(ScnObj *pObj, bool opa, bool xlu); // at 0xC
virtual void Clear() {
mNumScnObjOpa = mNumScnObjXlu = 0;
} // at 0x10
virtual void ZSort(); // at 0x14
virtual void Sort(); // at 0x18
virtual void Sort(LessThanFunc pOpaFunc,
LessThanFunc pXluFunc); // at 0x1C
virtual void DrawOpa(ResMdlDrawMode *pForceMode); // at 0x20
virtual void DrawXlu(ResMdlDrawMode *pForceMode); // at 0x24
virtual CheckStatus CheckScnObj(ScnObj *); // at 0x28
protected:
ScnObj **mpArrayOpa; // at 0x4
ScnObj **mpArrayXlu; // at 0x8
u32 mSizeScnObj; // at 0xC
u32 mNumScnObjOpa; // at 0x10
u32 mNumScnObjXlu; // at 0x14
};
} // namespace g3d
} // namespace nw4r
#endif
|