summaryrefslogtreecommitdiff
path: root/include/nw4r/g3d/g3d_scnroot.h
blob: 2e7d72fd43bff570c80acfd5869b366a04afdc27 (plain)
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