NSMBW-Decomp
A decompilation of New Super Mario Bros. Wii
Loading...
Searching...
No Matches
g3d_scnmdl.h
1#ifndef NW4R_G3D_SCN_MDL_H
2#define NW4R_G3D_SCN_MDL_H
3
4#include <nw4r/types_nw4r.h>
5
6#include <nw4r/g3d/g3d_draw.h>
7#include <nw4r/g3d/g3d_scnmdlsmpl.h>
8#include <nw4r/g3d/res/g3d_resmat.h>
9
10namespace nw4r {
11namespace g3d {
12
13// Forward declarations
14class AnmObjShp;
15
16class ScnMdl : public ScnMdlSimple {
17public:
18 class CopiedMatAccess {
19 public:
20 CopiedMatAccess(ScnMdl* pScnMdl, size_t id);
21
22 ResTexObj GetResTexObj(bool markDirty);
23 ResTexSrt GetResTexSrt(bool markDirty);
24 ResMatChan GetResMatChan(bool markDirty);
25 ResGenMode GetResGenMode(bool markDirty);
26 ResMatMisc GetResMatMisc(bool markDirty);
27 ResMatPix GetResMatPix(bool markDirty);
28 ResMatTevColor GetResMatTevColor(bool markDirty);
29 ResTev GetResTev(bool markDirty);
30
31 ResTexSrt GetResTexSrtEx();
32
33 private:
34 ScnMdl* mpScnMdl; // at 0x0
35 ulong mMatID; // at 0x4
36 ResTexObj mTexObj; // at 0x8
37 ResTlutObj mTlutObj; // at 0xC
38 ResTexSrt mTexSrt; // at 0x10
39 ResMatChan mChan; // at 0x14
40 ResGenMode mGenMode; // at 0x18
41 ResMatMisc mMatMisc; // at 0x1C
42 ResMatPix mPix; // at 0x20
43 ResMatTevColor mTevColor; // at 0x24
44 ResMatIndMtxAndScale mIndMtxAndScale; // at 0x28
45 ResMatTexCoordGen mTexCoordGen; // at 0x2C
46 ResTev mTev; // at 0x30
47 };
48
49 class CopiedVisAccess {
50 public:
51 CopiedVisAccess(ScnMdl* pScnMdl, ulong id);
52
53 bool IsVisible() const;
54 bool SetVisibilityEx(bool visible);
55
56 private:
57 ScnMdl* mpScnMdl; // at 0x0
58 ulong mNodeID; // at 0x4
59 u8* mpVis; // at 0x8
60 };
61
62#define OPT(KEY, VALUE) OPTID_##KEY = (0x30000 | (VALUE))
63 enum ScnMdlOption {
64 OPT(NONE, 0),
65 OPT(VISBUFFER_REFRESH_NEEDED, 1),
66 };
67#undef OPT
68
69 enum BufferOption {
70 BUFFER_RESTEXOBJ = (1 << 0),
71 BUFFER_RESTLUTOBJ = (1 << 1),
72 BUFFER_RESTEXSRT = (1 << 2),
73 BUFFER_RESCHAN = (1 << 3),
74 BUFFER_RESGENMODE = (1 << 4),
75 BUFFER_RESMATMISC = (1 << 5),
76 BUFFER_RESANMVIS = (1 << 6),
77 BUFFER_RESMATPIX = (1 << 7),
78 BUFFER_RESTEVCOLOR = (1 << 8),
79 BUFFER_RESMATINDMTXSCALE = (1 << 9),
80 BUFFER_RESMATTEXCOORDGEN = (1 << 10),
81 BUFFER_RESTEV = (1 << 11),
82 BUFFER_RESVTXPOS = (1 << 12),
83 BUFFER_RESVTXNRM = (1 << 13),
84 BUFFER_RESVTXCLR = (1 << 14),
85
86 ANM_VIS = BUFFER_RESANMVIS,
87 ANM_TEXPAT = BUFFER_RESTEXOBJ | BUFFER_RESTLUTOBJ,
88 ANM_TEXSRT = BUFFER_RESTEXSRT | BUFFER_RESMATINDMTXSCALE,
89 ANM_MATCLR = BUFFER_RESCHAN | BUFFER_RESTEVCOLOR,
90 ANM_SHP = BUFFER_RESVTXPOS | BUFFER_RESVTXNRM | BUFFER_RESVTXCLR
91 };
92
93public:
94 static ScnMdl* Construct(MEMAllocator* pAllocator, size_t* pSize, ResMdl mdl,
95 size_t bufferOption, int numView);
96
97 ScnMdl(MEMAllocator* pAllocator, ResMdl mdl, math::MTX34* pWorldMtxArray,
98 ulong* pWorldMtxAttribArray, math::MTX34* pViewPosMtxArray,
99 math::MTX33* pViewNrmMtxArray, math::MTX34* pViewTexMtxArray,
100 int numView, int numViewMtx, DrawResMdlReplacement* pReplacement,
101 ulong* pMatBufferDirtyFlag);
102
103 virtual void G3dProc(ulong task, ulong param, void* pInfo); // at 0xC
104 virtual ~ScnMdl(); // at 0x10
105
106 virtual bool SetScnObjOption(ulong option, ulong value); // at 0x20
107 virtual bool GetScnObjOption(ulong option, ulong* pValue) const; // at 0x24
108
109 virtual bool SetAnmObj(AnmObj* pObj, AnmObjType type); // at 0x34
110 virtual bool RemoveAnmObj(AnmObj* pObj); // at 0x38
111 virtual AnmObj* RemoveAnmObj(AnmObjType type); // at 0x3C
112 virtual AnmObj* GetAnmObj(AnmObjType type); // at 0x40
113 virtual const AnmObj* GetAnmObj(AnmObjType type) const; // at 0x44
114
115 void InitBuffer();
116 void CleanMatBuffer(ulong idx, ulong option);
117 void CleanVisBuffer();
118
119 AnmObjShp* GetAnmObjShp() {
120 return mpAnmObjShp;
121 }
122
123 DrawResMdlReplacement& GetDrawResMdlReplacement() {
124 return mReplacement;
125 }
126
127protected:
128 void ScnMdl_G3DPROC_CALC_WORLD(ulong param, const math::MTX34* pParent);
129 void ScnMdl_G3DPROC_CALC_MAT(ulong param, void* pInfo);
130 void ScnMdl_G3DPROC_CALC_VTX(ulong param, void* pInfo);
131 void ScnMdl_G3DPROC_DRAW_OPA(ulong param, void* pInfo);
132 void ScnMdl_G3DPROC_DRAW_XLU(ulong param, void* pInfo);
133
134private:
135 enum VisBufferFlag {
136 VISBUFFER_DIRTY = (1 << 0),
137 VISBUFFER_NOT_REFRESH_NEEDED = (1 << 1),
138 };
139
140private:
141 bool IsVisBufferDirty() const {
142 return mFlagVisBuffer & VISBUFFER_DIRTY;
143 }
144 bool IsVisBufferRefreshNeeded() const {
145 return !(mFlagVisBuffer & VISBUFFER_NOT_REFRESH_NEEDED);
146 }
147 void VisBufferDirty() {
148 mFlagVisBuffer |= VISBUFFER_DIRTY;
149 }
150
151 bool IsMatBufferDirty(ulong idx, ulong option) const {
152 return option & mpMatBufferDirtyFlag[idx];
153 }
154 void MatBufferDirty(ulong idx, ulong option) {
155 mpMatBufferDirtyFlag[idx] |= option;
156 }
157
158private:
159 AnmObjShp* mpAnmObjShp; // at 0x138
160 ulong mFlagVisBuffer; // at 0x13C
161 ulong* mpMatBufferDirtyFlag; // at 0x140
162 DrawResMdlReplacement mReplacement; // at 0x144
163
164 NW4R_G3D_RTTI_DECL_DERIVED(ScnMdl, ScnMdlSimple);
165};
166
167} // namespace g3d
168} // namespace nw4r
169
170#endif
3D graphics drawing library.
Definition g3d_3dsmax.h:10