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
|