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