1 /*---------------------------------------------------------------------------*
2 Project: Horizon
3 File: gd_GasFog.h
4 Copyright (C)2011 Nintendo Co., Ltd. All rights reserved.
5 These coded instructions, statements, and computer programs contain
6 proprietary information of Nintendo of America Inc. and/or Nintendo
7 Company Ltd., and are protected by Federal copyright law. They may
8 not be disclosed to third parties or copied or duplicated in any form,
9 in whole or in part, without the prior written consent of Nintendo.
10 *---------------------------------------------------------------------------
11
12
13 */
14
15 #ifndef NN_GD_CTR_GD_GASFOG_H_
16 #define NN_GD_CTR_GD_GASFOG_H_
17
18 #include <nn/gd/CTR/gd_Types.h>
19 #include <nn/gd/CTR/gd_Result.h>
20 #include <nn/gd/CTR/gd_Utils.h>
21 #include <nn/dbg.h>
22
23 #if NN_GD_DOCUMENT_TYPE == ENGLISH
24 /* Please see man pages for details
25
26
27
28 */
29 #else
30 /* Please see man pages for details
31
32
33
34 */
35 #endif
36
37 namespace nn {
38 namespace gd {
39 namespace CTR {
40
41 /*********************************************************************************************************/
42 /********************************************** Internal data ********************************************/
43 class FogStage;
44 namespace internal
45 {
46
47 class FogStage;
48 class OutputStage;
49 class GasFogSettings
50 {
51 private:
52 // 0x0e0 (Fog/Gas mode, shading density, zFlip)
53 u32 m_ModeShadingZFlip;
54
55 // 0x0e1
56 u32 m_FogColor;
57
58 // 0x0e4
59 u32 m_GasAttenuation;
60
61 // 0x0e5
62 u32 m_GasMaxAcc;
63
64 // 0x120 - 0x122
65 u32 m_GasLightXY;
66 u32 m_GasLightZ;
67 u32 m_GasLightZ4ColorLut;
68
69 // 0x126
70 u32 m_GasDeltaZ;
71
72 // Mask for dirty attributes
73 u32 m_DirtyFieldMask;
74 u32 m_GasAutoAcc;
75
76 enum
77 {
78 MASK_FOG_GAS_MODE_UPDATED = 1 << 0,
79 MASK_FOG_COLOR_UPDATED = 1 << 1,
80 MASK_GAS_ATTENUATION_UPDATED = 1 << 2,
81 MASK_GAS_MAX_ACC_UPDATED = 1 << 3,
82 MASK_GAS_LIGHT_XY_UPDATED = 1 << 4,
83 MASK_GAS_LIGHT_Z_UPDATED = 1 << 5,
84 MASK_GAS_LIGHT_Z4_COLOR_LUT_UPDATED = 1 << 6,
85 MASK_GAS_DELTA_Z_UPDATED = 1 << 7,
86
87 MASK_RESERVED_MAX_U32 = 0xffffffffu
88 };
89
90 friend class nn::gd::CTR::FogStage;
91 friend class nn::gd::CTR::internal::FogStage;
92 friend class nn::gd::CTR::internal::OutputStage;
93 }; // GasFogSettings
94
95 #if NN_GD_DOCUMENT_TYPE == ENGLISH
96 /* Please see man pages for details */
97 #else
98 /* Please see man pages for details */
99 #endif
100 extern GasFogSettings g_gasFogSettings;
101 } // internal
102
103
104 /*********************************************************************************************************/
105 /************************************************* FogStage ************************************************/
106 #if NN_GD_DOCUMENT_TYPE == ENGLISH
107 /* Please see man pages for details
108
109
110
111
112
113
114 */
115 #else
116 /* Please see man pages for details
117
118
119
120
121
122
123 */
124 #endif
125 class FogStage
126 {
127 public:
128
129 #if NN_GD_DOCUMENT_TYPE == ENGLISH
130 /* Please see man pages for details */
131 #else
132 /* Please see man pages for details */
133 #endif
134 enum Mode
135 {
136 MODE_NONE = 0x0,
137 MODE_FOG = 0x5,
138 MODE_GAS = 0x7,
139
140 MODE_RESERVED_MAX_U32 = 0xffffffffu
141 };
142
143 #if NN_GD_DOCUMENT_TYPE == ENGLISH
144 /* Please see man pages for details */
145 #else
146 /* Please see man pages for details */
147 #endif
148 enum GasColorLookUpTableInput
149 {
150 GAS_COLOR_INPUT_DENSITY = 0,
151 GAS_COLOR_INPUT_LIGHT_FACTOR = 1,
152
153 GAS_COLOR_INPUT_RESERVED_MAX_U32 = 0xffffffffu
154 };
155
156 #if NN_GD_DOCUMENT_TYPE == ENGLISH
157 /* Please see man pages for details */
158 #else
159 /* Please see man pages for details */
160 #endif
161 enum GasShadingDensitySource
162 {
163 GAS_SHADING_DENSITY_SOURCE_PLAIN = 0,
164 GAS_SHADING_DENSITY_SOURCE_DEPTH = 1,
165
166 GAS_SHADING_DENSITY_RESERVED_MAX_U32 = 0xffffffffu
167 };
168
169 #if NN_GD_DOCUMENT_TYPE == ENGLISH
170 /* Please see man pages for details
171
172 */
173 #else
174 /* Please see man pages for details
175
176 */
177 #endif
178 static void SetGasFogMode(Mode mode);
179
180 #if NN_GD_DOCUMENT_TYPE == ENGLISH
181 /* Please see man pages for details
182
183 */
184 #else
185 /* Please see man pages for details
186
187 */
188 #endif
189 static void SetGasShadingDensity(GasShadingDensitySource shadingDensitySrc);
190
191 #if NN_GD_DOCUMENT_TYPE == ENGLISH
192 /* Please see man pages for details
193
194 */
195 #else
196 /* Please see man pages for details
197
198 */
199 #endif
200 static void SetFogZFlip(gdBool zFlip);
201
202 #if NN_GD_DOCUMENT_TYPE == ENGLISH
203 /* Please see man pages for details
204
205
206
207 */
208 #else
209 /* Please see man pages for details
210
211
212
213 */
214 #endif
215 static void SetFogColor(u8 R, u8 G, u8 B);
216
217 #if NN_GD_DOCUMENT_TYPE == ENGLISH
218 /* Please see man pages for details
219
220 */
221 #else
222 /* Please see man pages for details
223
224 */
225 #endif
226 static void SetGasAttenuation(f32 atte);
227
228 #if NN_GD_DOCUMENT_TYPE == ENGLISH
229 /* Please see man pages for details
230
231 */
232 #else
233 /* Please see man pages for details
234
235 */
236 #endif
237 static void SetGasAccumulationMax(f32 maxAcc);
238
239 #if NN_GD_DOCUMENT_TYPE == ENGLISH
240 /* Please see man pages for details
241
242 */
243 #else
244 /* Please see man pages for details
245
246 */
247 #endif
248 static void SetGasAutoAccumulation(gdBool autoAcc);
249
250 #if NN_GD_DOCUMENT_TYPE == ENGLISH
251 /* Please see man pages for details
252
253
254
255 */
256 #else
257 /* Please see man pages for details
258
259
260
261 */
262 #endif
263 static void SetGasLightXY(u8 lightMin, u8 lightMax, u8 lightAtt);
264
265 #if NN_GD_DOCUMENT_TYPE == ENGLISH
266 /* Please see man pages for details
267
268
269
270
271 */
272 #else
273 /* Please see man pages for details
274
275
276
277
278 */
279 #endif
280 static void SetGasLightZ(u8 scattMin, u8 scattMax, u8 scattAtt, u8 lz);
281
282 #if NN_GD_DOCUMENT_TYPE == ENGLISH
283 /* Please see man pages for details
284
285 */
286 #else
287 /* Please see man pages for details
288
289
290 */
291 #endif
292 static void SetGasLightColorLutInput(GasColorLookUpTableInput colorLutInput);
293
294 #if NN_GD_DOCUMENT_TYPE == ENGLISH
295 /* Please see man pages for details
296
297 */
298 #else
299 /* Please see man pages for details
300
301 */
302 #endif
303 static void SetGasDeltaZ(f32 deltaZ);
304
305 #if NN_GD_DOCUMENT_TYPE == ENGLISH
306 /* Please see man pages for details
307
308
309
310
311
312
313
314 */
315 #else
316 /* Please see man pages for details
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334 */
335 #endif
336 static nnResult UploadFogLookUpTableNative(u32 lutStartIndex, u32* data, u32 countData);
337
338 #if NN_GD_DOCUMENT_TYPE == ENGLISH
339 /* Please see man pages for details
340
341
342
343
344 */
345 #else
346 /* Please see man pages for details
347
348
349
350
351
352
353
354
355
356
357 */
358 #endif
359 static nnResult UploadFogLookUpTableFloat(u32 lutStartIndex, const f32* dataValue, const f32* dataDelta, u32 countData);
360
361 #if NN_GD_DOCUMENT_TYPE == ENGLISH
362 /* Please see man pages for details
363
364
365
366
367
368
369
370
371
372
373
374 */
375 #else
376 /* Please see man pages for details
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394 */
395 #endif
396 static nnResult UploadGasLookUpTableNative(u32 lutStartIndex, u32* data, u32 countData);
397
398 #if NN_GD_DOCUMENT_TYPE == ENGLISH
399 /* Please see man pages for details
400
401
402
403
404
405
406
407 */
408 #else
409 /* Please see man pages for details
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425 */
426 #endif
427 static nnResult UploadGasLookUpTableFloat(u32 lutStartIndex, f32* dataValue, f32* dataDelta, u32 countData);
428
429 #if NN_GD_DOCUMENT_TYPE == ENGLISH
430 /* Please see man pages for details
431 */
432 #else
433 /* Please see man pages for details
434 */
435 #endif
436 class Helper
437 {
438 public:
439
440 #if NN_GD_DOCUMENT_TYPE == ENGLISH
441 /* Please see man pages for details
442
443
444
445
446 */
447 #else
448 /* Please see man pages for details
449
450
451
452
453
454
455
456
457 */
458 #endif
459 static nnResult ConvertFogLookUpTableDataFloatToNative(const f32* dataValue, const f32* dataDelta, u32 countData, u32 *__restrict dest);
460
461 #if NN_GD_DOCUMENT_TYPE == ENGLISH
462 /* Please see man pages for details
463
464
465
466
467
468
469
470 */
471 #else
472 /* Please see man pages for details
473
474
475
476
477
478
479
480
481
482
483
484 */
485 #endif
486 static nnResult ConvertGasLookUpTableDataFloatToNative(const f32* dataValue, const f32* dataDelta, u32 countData, u32 *__restrict dest);
487 };
488
489 }; // class FogStage
490
491
492
493 /*-------------------------------------------------------------
494 FogStage inline functions implementation
495 ---------------------------------------------------------------*/
496
SetGasFogMode(Mode mode)497 NN_FORCE_INLINE void FogStage::SetGasFogMode(Mode mode)
498 {
499 internal::g_gasFogSettings.m_ModeShadingZFlip &= ~(0x7);
500 internal::g_gasFogSettings.m_ModeShadingZFlip |= (mode & 0x7);
501 internal::g_gasFogSettings.m_DirtyFieldMask |= internal::GasFogSettings::MASK_FOG_GAS_MODE_UPDATED;
502 }
503
SetGasShadingDensity(GasShadingDensitySource shadingDensitySrc)504 NN_FORCE_INLINE void FogStage::SetGasShadingDensity(GasShadingDensitySource shadingDensitySrc)
505 {
506 internal::g_gasFogSettings.m_ModeShadingZFlip &= ~(1 << 3);
507 if (shadingDensitySrc) internal::g_gasFogSettings.m_ModeShadingZFlip |= (1<<3);
508 internal::g_gasFogSettings.m_DirtyFieldMask |= internal::GasFogSettings::MASK_FOG_GAS_MODE_UPDATED;
509 }
510
SetFogZFlip(gdBool zFlip)511 NN_FORCE_INLINE void FogStage::SetFogZFlip(gdBool zFlip)
512 {
513 internal::g_gasFogSettings.m_ModeShadingZFlip &= ~(1 << 16);
514 if (zFlip) internal::g_gasFogSettings.m_ModeShadingZFlip |= (1 << 16);
515 internal::g_gasFogSettings.m_DirtyFieldMask |= internal::GasFogSettings::MASK_FOG_GAS_MODE_UPDATED;
516 }
517
SetFogColor(u8 R,u8 G,u8 B)518 NN_FORCE_INLINE void FogStage::SetFogColor(u8 R, u8 G, u8 B)
519 {
520 internal::g_gasFogSettings.m_FogColor = R | (G << 8) | (B << 16);
521 internal::g_gasFogSettings.m_DirtyFieldMask |= internal::GasFogSettings::MASK_FOG_COLOR_UPDATED;
522 }
523
SetGasAttenuation(f32 atte)524 NN_FORCE_INLINE void FogStage::SetGasAttenuation(f32 atte)
525 {
526 internal::g_gasFogSettings.m_GasAttenuation = Utils::Float32ToFloat16(atte);
527 internal::g_gasFogSettings.m_DirtyFieldMask |= internal::GasFogSettings::MASK_GAS_ATTENUATION_UPDATED;
528 }
529
SetGasAccumulationMax(f32 maxAcc)530 NN_FORCE_INLINE void FogStage::SetGasAccumulationMax(f32 maxAcc)
531 {
532 // Convert to f16
533 internal::g_gasFogSettings.m_GasMaxAcc = Utils::Float32ToFloat16(maxAcc);
534 internal::g_gasFogSettings.m_DirtyFieldMask |= internal::GasFogSettings::MASK_GAS_MAX_ACC_UPDATED;
535 }
536
SetGasAutoAccumulation(gdBool autoAcc)537 NN_FORCE_INLINE void FogStage::SetGasAutoAccumulation(gdBool autoAcc)
538 {
539 internal::g_gasFogSettings.m_GasAutoAcc = autoAcc;
540 //internal::g_gasFogSettings.m_DirtyFieldMask |= internal::GasFogSettings::MASK_GAS_AUTO_ACC_UPDATED;
541 }
542
SetGasLightXY(u8 lightMin,u8 lightMax,u8 lightAtt)543 NN_FORCE_INLINE void FogStage::SetGasLightXY(u8 lightMin, u8 lightMax, u8 lightAtt)
544 {
545 internal::g_gasFogSettings.m_GasLightXY = lightMin | (lightMax << 8) | (lightAtt << 16);
546 internal::g_gasFogSettings.m_DirtyFieldMask |= internal::GasFogSettings::MASK_GAS_LIGHT_XY_UPDATED;
547 }
548
SetGasLightZ(u8 scattMin,u8 scattMax,u8 scattAtt,u8 lz)549 NN_FORCE_INLINE void FogStage::SetGasLightZ(u8 scattMin, u8 scattMax, u8 scattAtt, u8 lz)
550 {
551 internal::g_gasFogSettings.m_GasLightZ = scattMin | (scattMax << 8) | (scattAtt << 16);
552 internal::g_gasFogSettings.m_GasLightZ4ColorLut &= ~(0xff);
553 internal::g_gasFogSettings.m_GasLightZ4ColorLut |= lz;
554 internal::g_gasFogSettings.m_DirtyFieldMask |= internal::GasFogSettings::MASK_GAS_LIGHT_Z_UPDATED | internal::GasFogSettings::MASK_GAS_LIGHT_Z4_COLOR_LUT_UPDATED;
555 }
556
SetGasLightColorLutInput(GasColorLookUpTableInput colorLutInput)557 NN_FORCE_INLINE void FogStage::SetGasLightColorLutInput(GasColorLookUpTableInput colorLutInput)
558 {
559 internal::g_gasFogSettings.m_GasLightZ4ColorLut &= ~(1 << 8);
560 if (colorLutInput) internal::g_gasFogSettings.m_GasLightZ4ColorLut |= (1<<8);
561 internal::g_gasFogSettings.m_DirtyFieldMask |= internal::GasFogSettings::MASK_GAS_LIGHT_Z4_COLOR_LUT_UPDATED;
562 }
563
SetGasDeltaZ(f32 deltaZ)564 NN_FORCE_INLINE void FogStage::SetGasDeltaZ(f32 deltaZ)
565 {
566 internal::g_gasFogSettings.m_GasDeltaZ = Utils::Float32ToUnsignedFix24Fraction8(deltaZ);
567 internal::g_gasFogSettings.m_DirtyFieldMask |= internal::GasFogSettings::MASK_GAS_DELTA_Z_UPDATED;
568 }
569
570 } // namespace CTR
571 } // namespace gd
572 } // namespace nn
573
574
575 #endif //NN_GD_CTR_GD_GASFOG_H_
576