summaryrefslogtreecommitdiff
path: root/src/nw4r/g3d/g3d_scnproc.cpp
blob: 8e371949826c1af100a597a6d8445fdc460c5c69 (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
#include "nw4r/g3d.h" // IWYU pragma: export

namespace nw4r {
namespace g3d {

NW4R_G3D_RTTI_DEF(ScnProc);

ScnProc *
ScnProc::Construct(MEMAllocator *pAllocator, u32 *pSize, DrawProc pProc, bool opa, bool xlu, u32 userDataSize) {
    ScnProc *pScnProc = NULL;
    u32 scnProcSize = sizeof(ScnProc);

    userDataSize = align4(userDataSize);
    u32 userDataOfs = align4(scnProcSize);

    u32 size = align4(userDataOfs + userDataSize);
    if (pSize != NULL) {
        *pSize = size;
    }

    if (pAllocator != NULL) {
        u8 *pBuffer = reinterpret_cast<u8 *>(Alloc(pAllocator, size));

        if (pBuffer != NULL) {
            void *pUserData = userDataSize != 0 ? pBuffer + userDataOfs : NULL;

            pScnProc = new (pBuffer) ScnProc(pAllocator, pProc, pUserData, opa, xlu);
        }
    }

    return pScnProc;
}

void ScnProc::G3dProc(u32 task, u32 param, void *pInfo) {
    if (IsG3dProcDisabled(task)) {
        return;
    }

    switch (task) {
        case G3DPROC_GATHER_SCNOBJ: {
            IScnObjGather *pCollection = static_cast<IScnObjGather *>(pInfo);
            pCollection->Add(
                this, (mFlag & SCNPROCFLAG_DRAW_OPA) ? true : false, (mFlag & SCNPROCFLAG_DRAW_XLU) ? true : false
            );
            break;
        }

        case G3DPROC_DRAW_OPA: {
            if (mpDrawProc != NULL) {
                G3DState::Invalidate();
                mpDrawProc(this, true);
            }
            break;
        }

        case G3DPROC_DRAW_XLU: {
            if (mpDrawProc != NULL) {
                G3DState::Invalidate();
                mpDrawProc(this, false);
            }
            break;
        }

        default: {
            DefG3dProcScnLeaf(task, param, pInfo);
        }
    }
}

} // namespace g3d
} // namespace nw4r