NSMBW-Decomp
A decompilation of New Super Mario Bros. Wii
Loading...
Searching...
No Matches
g3d_light.h
1#ifndef NW4R_G3D_LIGHT_H
2#define NW4R_G3D_LIGHT_H
3#include <nw4r/types_nw4r.h>
4
5#include <nw4r/g3d/g3d_state.h>
6#include <nw4r/g3d/res/g3d_rescommon.h>
7
8#include <revolution/GX.h>
9
10namespace nw4r {
11namespace g3d {
12
13/******************************************************************************
14 *
15 * LightObj
16 *
17 ******************************************************************************/
18class LightObj {
19public:
20 LightObj() : mFlag(0) {}
21 ~LightObj() {}
22
23 LightObj& operator=(const LightObj& rOther);
24
25 operator GXLightObj*() {
26 return &mObj;
27 }
28 operator const GXLightObj*() const {
29 return &mObj;
30 }
31
32 void Clear();
33
34 void InitLightColor(GXColor color);
35 void InitLightPos(f32 x, f32 y, f32 z);
36 void InitLightDir(f32 nx, f32 ny, f32 nz);
37 void InitSpecularDir(f32 nx, f32 ny, f32 nz);
38 void InitLightSpot(f32 cutoff, GXSpotFn spotFn);
39 void InitLightAttnA(f32 aa, f32 ab, f32 ac);
40 void InitLightDistAttn(f32 distance, f32 brightness,
41 GXDistAttnFn distAttnFn);
42 void InitLightAttnK(f32 ka, f32 kb, f32 kc);
43 void InitLightShininess(f32 shininess);
44
45 void GetLightPos(math::VEC3* pPos) const;
46 void GetLightDir(math::VEC3* pDir) const;
47
48 void ApplyViewMtx(const math::MTX34& rCamera);
49
50 void Enable() {
51 mFlag |= FLAG_ENABLE_LIGHT;
52 }
53 void Disable() {
54 mFlag &= ~FLAG_ENABLE_LIGHT;
55 }
56
57 bool IsEnable() const {
58 return (mFlag & FLAG_ENABLE_LIGHT) ? true : false;
59 }
60
61 bool IsSpotLight() const {
62 return (mFlag & FLAG_SPOT) ? true : false;
63 }
64 bool IsSpecularLight() const {
65 return (mFlag & FLAG_SPECULAR) ? true : false;
66 }
67 bool IsSpecularDir() const {
68 return (mFlag & FLAG_SPECULAR_DIR) ? true : false;
69 }
70
71 bool IsColorEnable() const {
72 return !(mFlag & FLAG_DISABLE_COLOR);
73 }
74 void DisableColor() {
75 mFlag |= FLAG_DISABLE_COLOR;
76 }
77
78 bool IsAlphaEnable() const {
79 return !(mFlag & FLAG_DISABLE_ALPHA);
80 }
81 void DisableAlpha() {
82 mFlag |= FLAG_DISABLE_ALPHA;
83 }
84
85 bool IsDiffuseLight() const {
86 return !IsSpotLight() && !IsSpecularLight();
87 }
88
89private:
90 enum LightObjFlag {
91 FLAG_SPOT = (1 << 0),
92 FLAG_SPECULAR = (1 << 1),
93 FLAG_ENABLE_LIGHT = (1 << 2),
94 FLAG_SPECULAR_DIR = (1 << 3),
95 FLAG_DISABLE_COLOR = (1 << 4),
96 FLAG_DISABLE_ALPHA = (1 << 5)
97 };
98
99private:
100 ulong mFlag; // at 0x0
101 GXLightObj mObj; // at 0x4
102};
103
104/******************************************************************************
105 *
106 * LightSet
107 *
108 ******************************************************************************/
110 static const int IDX_INVALID_LIGHT = -1;
111
112 s8 idxLight[G3DState::NUM_LIGHT_IN_LIGHT_SET]; // at 0x0
113 s8 idxAmbLight; // at 0x8
114 u8 PADDING_0x9[0xC - 0X9]; // at 0x9
115};
116
117class LightSet {
118public:
119 LightSet(LightSetting* pSetting, LightSetData* pData)
120 : mpSetting(pSetting), mpLightSetData(pData) {}
121 ~LightSet() {}
122
123 bool IsValid() const {
124 return mpSetting != NULL && mpLightSetData != NULL;
125 }
126
127 bool SelectLightObj(ulong lightIdx, int lightObjIdx);
128 bool SelectAmbLightObj(int lightObjIdx);
129
130private:
131 LightSetting* mpSetting; // at 0x0
132 LightSetData* mpLightSetData; // at 0x4
133};
134
135/******************************************************************************
136 *
137 * LightSetting
138 *
139 ******************************************************************************/
141 u8 r, g, b, a;
142};
143
144class LightSetting {
145public:
146 LightSetting(LightObj* pLightObjArray, AmbLightObj* pAmbLightObjArray,
147 ulong numLight, LightSetData* pLightSetDataArray,
148 ulong numLightSet);
149 ~LightSetting() {}
150
151 bool Import(const LightSetting& rSetting);
152 void ApplyViewMtx(const math::MTX34& rCamera, ulong numLight);
153
154 ulong GetNumLightObj() const {
155 return mNumLight;
156 }
157 ulong GetNumLightSet() const {
158 return mNumLightSet;
159 }
160
161 LightObj* GetLightObjArray() const {
162 return mpLightObjArray;
163 }
164 AmbLightObj* GetAmbLightObjArray() const {
165 return mpAmbLightObjArray;
166 }
167
168 LightSet GetLightSet(int idx) {
169 if (idx < mNumLightSet && idx >= 0) {
170 return LightSet(this, &mpLightSetDataArray[idx]);
171 }
172
173 return LightSet(this, NULL);
174 }
175
176private:
177 u16 mNumLight; // at 0x0
178 u16 mNumLightSet; // at 0x2
179 LightObj* mpLightObjArray; // at 0x4
180 AmbLightObj* mpAmbLightObjArray; // at 0x8
181 LightSetData* mpLightSetDataArray; // at 0xC
182};
183
184} // namespace g3d
185} // namespace nw4r
186
187#endif
3D graphics drawing library.
Definition g3d_3dsmax.h:10