39class ScnObj :
public G3dObj {
43 FOREACHRESULT_CONTINUE,
48 typedef ForEachResult (*ForEachFunc)(ScnObj* pParent,
void* pInfo);
50 enum ScnObjMtxType { MTX_LOCAL, MTX_WORLD, MTX_VIEW, MTX_TYPE_MAX };
52 enum ScnObjBoundingVolumeType {
53 BOUNDINGVOLUME_AABB_LOCAL,
54 BOUNDINGVOLUME_AABB_WORLD,
58#define OPT(KEY, VALUE) OPTID_##KEY = (0x00000 | (VALUE))
61 OPT(DISABLE_GATHER_SCNOBJ, 1),
62 OPT(DISABLE_CALC_WORLD, 2),
63 OPT(DISABLE_CALC_MAT, 3),
64 OPT(DISABLE_CALC_VTX, 4),
65 OPT(DISABLE_CALC_VIEW, 5),
66 OPT(DISABLE_DRAW_OPA, 6),
67 OPT(DISABLE_DRAW_XLU, 7),
68 OPT(DISABLE_UPDATEFRAME, 8),
69 OPT(ENABLE_CULLING, 9),
74 CALLBACK_TIMING_A = (1 << 0),
75 CALLBACK_TIMING_B = (1 << 1),
76 CALLBACK_TIMING_C = (1 << 2),
77 CALLBACK_TIMING_ALL = (CALLBACK_TIMING_A | CALLBACK_TIMING_B | CALLBACK_TIMING_C)
81 EXECOP_CALC_WORLD = (1 << 0),
82 EXECOP_CALC_MAT = (1 << 1),
83 EXECOP_CALC_VIEW = (1 << 2),
84 EXECOP_DRAW_OPA = (1 << 4),
85 EXECOP_DRAW_XLU = (1 << 5)
91 virtual void G3dProc(ulong task, ulong param,
void* pInfo) = 0;
94 virtual ForEachResult ForEach(ForEachFunc pFunc,
void* pInfo,
97 virtual bool SetScnObjOption(ulong option, ulong value);
98 virtual bool GetScnObjOption(ulong option, ulong* pValue)
const;
100 virtual f32 GetValueForSortOpa()
const;
101 virtual f32 GetValueForSortXlu()
const;
103 virtual void CalcWorldMtx(
const math::MTX34* pParent,
108 bool SetMtx(ScnObjMtxType type,
const math::MTX34* pMtx);
109 bool GetMtx(ScnObjMtxType type,
math::MTX34* pMtx)
const;
110 const math::MTX34* GetMtxPtr(ScnObjMtxType type)
const {
111 return &mMtxArray[type];
114 void SetPriorityDrawOpa(
int prio);
115 int GetPriorityDrawOpa()
const {
116 return mPriorityDrawOpa;
119 void SetPriorityDrawXlu(
int prio);
120 int GetPriorityDrawXlu()
const {
121 return mPriorityDrawXlu;
124 void EnableScnObjCallbackTiming(Timing timing);
125 void EnableScnObjCallbackExecOp(ExecOp op);
127 bool SetBoundingVolume(ScnObjBoundingVolumeType type,
129 bool GetBoundingVolume(ScnObjBoundingVolumeType type,
132 bool SetBoundingVolume(
const math::AABB* pAABB) {
133 return SetBoundingVolume(BOUNDINGVOLUME_AABB_LOCAL, pAABB);
138 SCNOBJFLAG_DISABLE_CALC_WORLD = (1 << 0),
139 SCNOBJFLAG_DISABLE_CALC_MAT = (1 << 1),
140 SCNOBJFLAG_DISABLE_CALC_VTX = (1 << 2),
141 SCNOBJFLAG_DISABLE_CALC_VIEW = (1 << 3),
142 SCNOBJFLAG_DISABLE_GATHER_SCNOBJ = (1 << 4),
143 SCNOBJFLAG_DISABLE_DRAW_OPA = (1 << 5),
144 SCNOBJFLAG_DISABLE_DRAW_XLU = (1 << 6),
145 SCNOBJFLAG_DISABLE_UPDATEFRAME = (1 << 7),
146 SCNOBJFLAG_IGNORE_ANMCHR_TRANS = (1 << 8),
148 SCNOBJFLAG_ENABLE_CULLING = (1 << 28),
149 SCNOBJFLAG_NOT_GATHER_DRAW_OPA = (1 << 29),
150 SCNOBJFLAG_NOT_GATHER_DRAW_XLU = (1 << 30),
151 SCNOBJFLAG_MTX_LOCAL_IDENTITY = (1 << 31),
153 SCNOBJFLAG_DISABLE_DRAW =
154 SCNOBJFLAG_DISABLE_DRAW_OPA | SCNOBJFLAG_DISABLE_DRAW_XLU
158 void SetScnObjFlag(ScnObjFlag flag, ulong on) {
160 mScnObjFlags |= flag;
162 mScnObjFlags &= ~flag;
165 ulong TestScnObjFlag(ScnObjFlag flag)
const {
166 return (mScnObjFlags & flag) != 0;
169 bool IsG3dProcDisabled(ulong task)
const {
170 if (task < __G3DPROC_OPTIONAL_END && ((1 << task - 1) & mScnObjFlags)) {
181 inline void CheckCallback_CALC_MAT(Timing timing, ulong param,
void* pInfo);
182 inline void CheckCallback_CALC_WORLD(Timing timing, ulong param,
void* pInfo);
183 inline void CheckCallback_DRAW_OPA(Timing timing, ulong param,
void* pInfo);
184 inline void CheckCallback_DRAW_XLU(Timing timing, ulong param,
void* pInfo);
198 u8 mCallbackDeleteOption;
199 u16 mCallbackExecOpMask;
201 NW4R_G3D_RTTI_DECL_DERIVED(ScnObj, G3dObj);
315class ScnLeaf :
public ScnObj {
323#define OPT(KEY, VALUE) OPTID_##KEY = (0x10000 | (VALUE))
326 OPT(DISABLE_DRAW_ALL, 1),
332 : ScnObj(pAllocator), mScale(1.0f, 1.0f, 1.0f) {}
334 virtual void G3dProc(ulong task, ulong param,
void* pInfo) = 0;
335 virtual ~ScnLeaf() {}
337 virtual ForEachResult ForEach(ForEachFunc pFunc,
void* pInfo,
340 virtual bool SetScnObjOption(ulong option, ulong value);
341 virtual bool GetScnObjOption(ulong option, ulong* pValue)
const;
343 virtual void CalcWorldMtx(
const math::MTX34* pParent,
346 ScaleProperty GetScaleProperty()
const;
348 void SetScale(
float x,
float y,
float z) {
359 void DefG3dProcScnLeaf(ulong task, ulong param,
void* pInfo);
364 NW4R_G3D_RTTI_DECL_DERIVED(ScnLeaf, ScnObj);
372class ScnGroup :
public ScnObj {
374 ScnGroup(
MEMAllocator* pAllocator, ScnObj** ppObj, ulong capacity);
376 virtual void G3dProc(ulong task, ulong param,
void* pInfo);
379 virtual ForEachResult ForEach(ForEachFunc pFunc,
void* pInfo,
382 virtual bool Insert(ulong idx, ScnObj* pObj);
383 virtual ScnObj* Remove(ulong idx);
384 virtual bool Remove(ScnObj* pObj);
387 return mpScnObjArray;
390 return mpScnObjArray + mNumScnObj;
393 ScnObj* operator[](ulong idx) {
394 return mpScnObjArray[idx];
401 return mNumScnObj == 0;
404 bool PushBack(ScnObj* pObj) {
405 return Insert(mNumScnObj, pObj);
409 return Remove(Size() - 1);
422 void DefG3dProcScnGroup(ulong task, ulong param,
void* pInfo);
425 void ScnGroup_G3DPROC_GATHER_SCNOBJ(ulong param,
IScnObjGather* pCollection);
426 void ScnGroup_G3DPROC_CALC_WORLD(ulong param,
const math::MTX34* pParent);
427 void ScnGroup_G3DPROC_CALC_MAT(ulong param,
void* pInfo);
428 void ScnGroup_G3DPROC_CALC_VIEW(ulong param,
const math::MTX34* pCamera);
431 ScnObj** mpScnObjArray;
435 NW4R_G3D_RTTI_DECL_DERIVED(ScnGroup, ScnObj);