1 /*---------------------------------------------------------------------------*
2   Project:  Horizon
3   File:     gd_Lighting.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_LIGHTING_H_
16 #define NN_GD_CTR_GD_LIGHTING_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 
22 #include <nn/gd/CTR/gd_Texture.h>
23 
24 #include <nn/gx/CTR/gx_MacroFragment.h>
25 
26 #if NN_GD_DOCUMENT_TYPE == ENGLISH
27 /* Please see man pages for details
28 
29 */
30 #else
31 /* Please see man pages for details
32 
33 */
34 #endif
35 
36 namespace nn {
37 namespace gd {
38 namespace CTR {
39 
40 namespace internal{ class LightingStage; }
41 
42 /*********************************************************************************************************/
43 /********************************************** Internal data ********************************************/
44 class Light;
45 class LightingStage;
46 class CombinerStage;
47 namespace internal
48 {
49 
50 class LightingStage;
51 class CombinerStage;
52 class LightingStageSettings
53 {
54 private:
55     u32 m_GlobalAmbient;            //1c0
56     u32 m_MiscReg1c3;               //1c3
57     u32 m_MiscReg1c4;               //1c4
58     u32 m_RegLutAbsSettings;        //1d0
59     u32 m_RegLutInputValues;        //1d1
60     u32 m_RegLutOutputScale;        //1d2
61 
62     u32 m_FragmentLightingEnabled;
63     u32 m_DirtyFieldMask;
64     u32 m_BumpMode;
65     u32 m_BumpSelectorTexture;
66     u32 m_ShadowSelectorTexture;
67     s32 m_LayerConfiguration;
68     u32 m_TextureUnitControl_LightEnv;
69 
70     enum
71     {
72         MASK_FRAGMENT_LIGHTING_UPDATED = 1 << 0,
73         MASK_LIGHT_ENABLED_UPDATED = 1 << 1,
74         MASK_REG_01C3_UPDATED = 1 << 2,
75         MASK_REG_01C4_UPDATED = 1 << 3,
76         MASK_REG_LUT_ABS_SETTINGS_UPDATED = 1 << 4,
77         MASK_REG_LUT_INPUT_VALUES_UPDATED = 1 << 5,
78         MASK_REG_LUT_OUTPUT_SCALING_UPDATED = 1 << 6,
79         MASK_UPDATE_LIGHTENV_TEXTURE_UNIT_CONTROL = 1 << 7
80     };
81 
82 friend class nn::gd::CTR::Light;
83 friend class nn::gd::CTR::LightingStage;
84 friend class nn::gd::CTR::internal::LightingStage;
85 friend class nn::gd::CTR::CombinerStage;
86 friend class nn::gd::CTR::internal::CombinerStage;
87 friend class nn::gd::CTR::internal::TextureStage;
88 };  // LightingStageSettings
89 
90 #if NN_GD_DOCUMENT_TYPE == ENGLISH
91 /* Please see man pages for details */
92 #else
93 /* Please see man pages for details */
94 #endif
95 extern LightingStageSettings g_lightingStageSettings;
96 }  // internal
97 
98 /*********************************************************************************************************/
99 /************************************************* Light *************************************************/
100 
101 #if NN_GD_DOCUMENT_TYPE == ENGLISH
102 /* Please see man pages for details
103 
104 
105 
106 
107 
108 
109 */
110 #else
111 /* Please see man pages for details
112 
113 
114 
115 
116 
117 
118 */
119 #endif
120 class Light
121 {
122 private:
123     u32 m_MiscellanousFields;
124     u32 m_LightId;
125     u32 m_LightEnabled;
126 
127 public:
128     Light();
~Light()129     ~Light(){};
130 
131     #if NN_GD_DOCUMENT_TYPE == ENGLISH
132     /* Please see man pages for details */
133     #else
134     /* Please see man pages for details */
135     #endif
136     enum SourceType
137     {
138         SOURCE_TYPE_PUNCTUAL = 0,
139         SOURCE_TYPE_DIRECTIONAL = 1,
140 
141         SOURCE_TYPE_RESERVED_MAX_U32 = 0xffffffffu
142     };
143 
144     #if NN_GD_DOCUMENT_TYPE == ENGLISH
145     /* Please see man pages for details */
146     #else
147     /* Please see man pages for details */
148     #endif
149     enum LightLookUpTableUploadId
150     {
151         LOOKUP_TABLE_UPLOAD_SP = 8,
152         LOOKUP_TABLE_UPLOAD_DA = 16,
153 
154         LOOKUP_TABLE_RESERVED_MAX_U32 = 0xffffffffu
155     };
156 
157     #if NN_GD_DOCUMENT_TYPE == ENGLISH
158     /* Please see man pages for details
159 
160     */
161     #else
162     /* Please see man pages for details
163 
164     */
165     #endif
166     void EnableLight(gdBool value);
167 
168     #if NN_GD_DOCUMENT_TYPE == ENGLISH
169     /* Please see man pages for details
170 
171 
172 
173     */
174     #else
175     /* Please see man pages for details
176 
177 
178 
179     */
180     #endif
181     void SetColorAmbient(u8 R, u8 G, u8 B);
182 
183     #if NN_GD_DOCUMENT_TYPE == ENGLISH
184     /* Please see man pages for details
185 
186 
187 
188     */
189     #else
190     /* Please see man pages for details
191 
192 
193 
194     */
195     #endif
196     void SetColorDiffuse(u8 R, u8 G, u8 B);
197 
198     #if NN_GD_DOCUMENT_TYPE == ENGLISH
199     /* Please see man pages for details
200 
201 
202 
203     */
204     #else
205     /* Please see man pages for details
206 
207 
208 
209     */
210     #endif
211     void SetColorSpecular0(u8 R, u8 G, u8 B);
212 
213     #if NN_GD_DOCUMENT_TYPE == ENGLISH
214     /* Please see man pages for details
215 
216 
217 
218     */
219     #else
220     /* Please see man pages for details
221 
222 
223 
224     */
225     #endif
226     void SetColorSpecular1(u8 R, u8 G, u8 B);
227 
228     #if NN_GD_DOCUMENT_TYPE == ENGLISH
229     /* Please see man pages for details
230 
231 
232 
233 
234 
235 
236 
237 
238 
239 
240 
241 
242 
243 
244 
245 */
246     #else
247     /* Please see man pages for details
248 
249 
250 
251 
252 
253 
254 
255 
256 
257 
258 
259 
260 
261 
262 
263     */
264     #endif
265     void SetPosition(f32 X, f32 Y, f32 Z);
266 
267     #if NN_GD_DOCUMENT_TYPE == ENGLISH
268     /* Please see man pages for details
269 
270 
271 
272 
273 
274 
275 
276 
277 
278 
279 
280 
281 
282 
283 */
284     #else
285    /* Please see man pages for details
286 
287 
288 
289 
290 
291 
292 
293 
294 
295 
296 
297 
298 
299 
300 
301     */
302     #endif
303     void SetDirection(f32 X, f32 Y, f32 Z);
304 
305     #if NN_GD_DOCUMENT_TYPE == ENGLISH
306     /* Please see man pages for details
307 
308 
309 
310     */
311     #else
312     /* Please see man pages for details
313 
314 
315 
316     */
317     #endif
318     void SetSpotDirection(f32 X, f32 Y, f32 Z);
319 
320      #if NN_GD_DOCUMENT_TYPE == ENGLISH
321     /* Please see man pages for details
322 
323     */
324     #else
325     /* Please see man pages for details
326 
327     */
328     #endif
329     void SetLightType(SourceType sourceType);
330 
331     #if NN_GD_DOCUMENT_TYPE == ENGLISH
332     /* Please see man pages for details
333 
334 
335     */
336     #else
337     /* Please see man pages for details
338 
339 
340     */
341     #endif
342     void SetDistanceAttenuationScaleBias(f32 attenuationScale, f32 attenuationBias);
343 
344     #if NN_GD_DOCUMENT_TYPE == ENGLISH
345     /* Please see man pages for details
346 
347     */
348     #else
349     /* Please see man pages for details
350 
351     */
352     #endif
353     void EnableTwoSideDiffuse(gdBool value);
354 
355     #if NN_GD_DOCUMENT_TYPE == ENGLISH
356     /* Please see man pages for details
357 
358     */
359     #else
360     /* Please see man pages for details
361 
362     */
363     #endif
364     void EnableGeomFactor0(gdBool value);
365 
366     #if NN_GD_DOCUMENT_TYPE == ENGLISH
367     /* Please see man pages for details
368 
369     */
370     #else
371    /* Please see man pages for details
372 
373     */
374     #endif
375     void EnableGeomFactor1(gdBool value);
376 
377     #if NN_GD_DOCUMENT_TYPE == ENGLISH
378     /* Please see man pages for details
379 
380     */
381     #else
382     /* Please see man pages for details
383 
384     */
385     #endif
386     void EnableSpotLight(gdBool value);
387 
388     #if NN_GD_DOCUMENT_TYPE == ENGLISH
389     /* Please see man pages for details
390 
391     */
392     #else
393     /* Please see man pages for details
394 
395     */
396     #endif
397     void EnableDistanceAttenuation(gdBool value);
398 
399     #if NN_GD_DOCUMENT_TYPE == ENGLISH
400     /* Please see man pages for details
401 
402 
403     */
404     #else
405     /* Please see man pages for details
406 
407 
408     */
409     #endif
410     void EnableShadowed(gdBool value);
411 
412     #if NN_GD_DOCUMENT_TYPE == ENGLISH
413     /* Please see man pages for details
414 
415 
416 
417 
418 
419     */
420     #else
421     /* Please see man pages for details
422 
423 
424 
425 
426 
427 
428 
429 
430 
431 
432 
433 
434 */
435     #endif
436     nnResult UploadLookUpTableFloat(LightLookUpTableUploadId lightLutID, u32 lutStartIndex, const f32* valueData, const f32* deltaData, u32 dataCount);
437 
438     #if NN_GD_DOCUMENT_TYPE == ENGLISH
439     /* Please see man pages for details
440 
441 
442 
443 
444     */
445     #else
446     /* Please see man pages for details
447 
448 
449 
450 
451 
452 
453 
454 
455 
456 
457 */
458     #endif
459 
460     nnResult UploadLookUpTableNative(LightLookUpTableUploadId lightLutID, u32 lutStartIndex, const u32* data, u32 dataCount);
461 
462 friend class nn::gd::CTR::internal::LightingStage;
463 };  // Light
464 
465 /*********************************************************************************************************/
466 /*********************************************** LightingStage ************************************************/
467 
468 #if NN_GD_DOCUMENT_TYPE == ENGLISH
469 /* Please see man pages for details
470 
471 
472 
473 
474 
475 
476 */
477 #else
478 /* Please see man pages for details
479 
480 
481 
482 
483 
484 
485 */
486 #endif
487 class LightingStage
488 {
489 public:
490 
491     #if NN_GD_DOCUMENT_TYPE == ENGLISH
492     /* Please see man pages for details */
493     #else
494     /* Please see man pages for details */
495     #endif
496     static const u32 COUNT_LIGHTS = 8;
497 
498     #if NN_GD_DOCUMENT_TYPE == ENGLISH
499     /* Please see man pages for details */
500     #else
501     /* Please see man pages for details */
502     #endif
503     static Light light[COUNT_LIGHTS];
504 
505     #if NN_GD_DOCUMENT_TYPE == ENGLISH
506     /* Please see man pages for details */
507     #else
508     /* Please see man pages for details */
509     #endif
510     enum LayerConfiguration
511     {
512         LAYER_CONFIGURATION_0 = 0,
513         LAYER_CONFIGURATION_1 = 1,
514         LAYER_CONFIGURATION_2 = 2,
515         LAYER_CONFIGURATION_3 = 3,
516         LAYER_CONFIGURATION_4 = 4,
517         LAYER_CONFIGURATION_5 = 5,
518         LAYER_CONFIGURATION_6 = 6,
519         LAYER_CONFIGURATION_7 = 8,
520 
521         LAYER_CONFIGURATION_RESERVED_MAX_U32 = 0xffffffffu
522     };
523 
524     #if NN_GD_DOCUMENT_TYPE == ENGLISH
525     /* Please see man pages for details */
526     #else
527     /* Please see man pages for details */
528     #endif
529     enum FresnelSelectorType
530     {
531         FRESNEL_SELECTOR_TYPE_NO_FRESNEL                        = 0,
532         FRESNEL_SELECTOR_TYPE_PRIMARY_ALPHA_FRESNEL             = 1,
533         FRESNEL_SELECTOR_TYPE_SECONDARY_ALPHA_FRESNEL           = 2,
534         FRESNEL_SELECTOR_TYPE_PRIMARY_SECONDARY_ALPHA_FRESNEL   = 3,
535 
536         FRESNEL_SELECTOR_TYPE_RESERVED_MAX_U32 = 0xffffffffu
537     };
538 
539     #if NN_GD_DOCUMENT_TYPE == ENGLISH
540     /* Please see man pages for details */
541     #else
542     /* Please see man pages for details */
543     #endif
544     enum BumpMode
545     {
546         BUMPMODE_NOT_USED   = 0,
547         BUMPMODE_AS_BUMP    = 1,
548         BUMPMODE_AS_TANG    = 2,
549 
550         BUMPMODE_RESERVED_MAX_U32 = 0xffffffffu
551     } ;
552 
553     #if NN_GD_DOCUMENT_TYPE == ENGLISH
554     /* Please see man pages for details */
555     #else
556     /* Please see man pages for details */
557     #endif
558     enum LookUpTableUploadId
559     {
560         LOOKUP_TABLE_UPLOAD_ID_D0 = 0,
561         LOOKUP_TABLE_UPLOAD_ID_D1 = 1,
562         LOOKUP_TABLE_UPLOAD_ID_FR = 3,
563         LOOKUP_TABLE_UPLOAD_ID_RB = 4,
564         LOOKUP_TABLE_UPLOAD_ID_RG = 5,
565         LOOKUP_TABLE_UPLOAD_ID_RR = 6,
566 
567         LOOKUP_TABLE_UPLOAD_RESERVED_MAX_U32 = 0xffffffffu
568     };
569 
570     #if NN_GD_DOCUMENT_TYPE == ENGLISH
571     /* Please see man pages for details */
572     #else
573     /* Please see man pages for details */
574     #endif
575     enum LookUpTableId
576     {
577         LOOKUP_TABLE_ID_D0 = 0,
578         LOOKUP_TABLE_ID_D1 = 1,
579         LOOKUP_TABLE_ID_SP = 2,
580         LOOKUP_TABLE_ID_FR = 3,
581         LOOKUP_TABLE_ID_RB = 4,
582         LOOKUP_TABLE_ID_RG = 5,
583         LOOKUP_TABLE_ID_RR = 6,
584 
585         LOOKUP_TABLE_ID_RESERVED_MAX_U32 = 0xffffffffu
586     };
587 
588     #if NN_GD_DOCUMENT_TYPE == ENGLISH
589     /* Please see man pages for details */
590     #else
591     /* Please see man pages for details */
592     #endif
593     enum LookUpTableInputValue
594     {
595         INPUT_VALUE_NH = 0,
596         INPUT_VALUE_VH = 1,
597         INPUT_VALUE_NV = 2,
598         INPUT_VALUE_LN = 3,
599         INPUT_VALUE_SP = 4,
600         INPUT_VALUE_CP = 5,
601 
602         INPUT_VALUE_RESERVED_MAX_U32 = 0xffffffffu
603     };
604 
605     #if NN_GD_DOCUMENT_TYPE == ENGLISH
606     /* Please see man pages for details */
607     #else
608     /* Please see man pages for details */
609     enum LookUpTableOutputScaleValue
610     #endif
611     {
612         OUTPUT_SCALE_VALUE_1 = 0,
613         OUTPUT_SCALE_VALUE_2 = 1,
614         OUTPUT_SCALE_VALUE_4 = 2,
615         OUTPUT_SCALE_VALUE_8 = 3,
616         OUTPUT_SCALE_VALUE_0_25 = 6,
617         OUTPUT_SCALE_VALUE_0_5 = 7,
618 
619         OUTPUT_SCALE_VALUE_RESERVED_MAX_U32 = 0xffffffffu
620     };
621 
622     #if NN_GD_DOCUMENT_TYPE == ENGLISH
623     /* Please see man pages for details
624 
625 
626 
627     */
628     #else
629     /* Please see man pages for details
630 
631 
632 
633     */
634     #endif
635     static void SetGlobalColorAmbient(u8 R, u8 G, u8 B);
636 
637     #if NN_GD_DOCUMENT_TYPE == ENGLISH
638     /* Please see man pages for details
639 
640     */
641     #else
642     /* Please see man pages for details
643 
644     */
645     #endif
646     static void SetShadowPrimary(gdBool value);
647 
648     #if NN_GD_DOCUMENT_TYPE == ENGLISH
649     /* Please see man pages for details
650 
651     */
652     #else
653     /* Please see man pages for details
654 
655     */
656     #endif
657     static void SetShadowSecondary(gdBool value);
658 
659     #if NN_GD_DOCUMENT_TYPE == ENGLISH
660     /* Please see man pages for details
661 
662     */
663     #else
664     /* Please see man pages for details
665 
666     */
667     #endif
668     static void SetInvertShadow(gdBool value);
669 
670     #if NN_GD_DOCUMENT_TYPE == ENGLISH
671     /* Please see man pages for details
672 
673     */
674     #else
675     /* Please see man pages for details
676 
677     */
678     #endif
679     static void SetShadowAlpha(gdBool value);
680 
681     #if NN_GD_DOCUMENT_TYPE == ENGLISH
682     /* Please see man pages for details
683 
684     */
685     #else
686     /* Please see man pages for details
687 
688     */
689     #endif
690     static void EnableLookUpTableD0(gdBool value);
691 
692     #if NN_GD_DOCUMENT_TYPE == ENGLISH
693     /* Please see man pages for details
694 
695     */
696     #else
697     /* Please see man pages for details
698 
699     */
700     #endif
701     static void EnableLookUpTableD1(gdBool value);
702 
703     #if NN_GD_DOCUMENT_TYPE == ENGLISH
704     /* Please see man pages for details
705 
706     */
707     #else
708     /* Please see man pages for details
709 
710     */
711     #endif
712     static void EnableLookUpTableReflection(gdBool value);
713 
714     #if NN_GD_DOCUMENT_TYPE == ENGLISH
715     /* Please see man pages for details
716 
717     */
718     #else
719     /* Please see man pages for details
720 
721     */
722     #endif
723     static void SetLayerConfiguration(LayerConfiguration layerConfiguration);
724 
725     #if NN_GD_DOCUMENT_TYPE == ENGLISH
726     /* Please see man pages for details
727 
728     */
729     #else
730     /* Please see man pages for details
731 
732     */
733     #endif
734     static void SetFresnelSelector(FresnelSelectorType fresnelSelectorType);
735 
736     #if NN_GD_DOCUMENT_TYPE == ENGLISH
737     /* Please see man pages for details
738 
739     */
740     #else
741     /* Please see man pages for details
742 
743     */
744     #endif
745     static void SetShadowSelectorTexture(TextureStage::TextureUnitId textureUnit);
746 
747     #if NN_GD_DOCUMENT_TYPE == ENGLISH
748     /* Please see man pages for details
749 
750     */
751     #else
752     /* Please see man pages for details
753 
754     */
755     #endif
756     static void SetBumpSelectorTexture(TextureStage::TextureUnitId textureUnit);
757 
758     #if NN_GD_DOCUMENT_TYPE == ENGLISH
759     /* Please see man pages for details
760 
761 
762     */
763     #else
764     /* Please see man pages for details
765 
766 
767     */
768     #endif
769     static void SetBumpMode(BumpMode bumpMode, gdBool bumpRenorm);
770 
771     #if NN_GD_DOCUMENT_TYPE == ENGLISH
772     /* Please see man pages for details
773 
774     */
775     #else
776     /* Please see man pages for details
777 
778     */
779     #endif
780     static void SetClampHightlight(gdBool value);
781 
782     #if NN_GD_DOCUMENT_TYPE == ENGLISH
783     /* Please see man pages for details
784 
785 
786     */
787     #else
788     /* Please see man pages for details
789 
790 
791     */
792     #endif
793     static void SetLookUpTableAbsInput(LookUpTableId lutId, gdBool value);
794 
795     #if NN_GD_DOCUMENT_TYPE == ENGLISH
796     /* Please see man pages for details
797 
798 
799     */
800     #else
801     /* Please see man pages for details
802 
803 
804     */
805     #endif
806     static void SetLookUpTableInputValue(LookUpTableId lutId, LookUpTableInputValue lutInputValue);
807 
808     #if NN_GD_DOCUMENT_TYPE == ENGLISH
809     /* Please see man pages for details
810 
811 
812     */
813     #else
814     /* Please see man pages for details
815 
816 
817     */
818     #endif
819     static void SetLookUpTableOutputScaling(LookUpTableId lutId, LookUpTableOutputScaleValue outputScalingValue);
820 
821     #if NN_GD_DOCUMENT_TYPE == ENGLISH
822     /* Please see man pages for details
823     */
824     #else
825     /* Please see man pages for details
826     */
827     #endif
828     class Helper
829     {
830     public:
831         #if NN_GD_DOCUMENT_TYPE == ENGLISH
832         /* Please see man pages for details
833 
834 
835 
836 
837 
838 
839         */
840         #else
841         /* Please see man pages for details
842 
843 
844 
845 
846 
847 
848 
849 
850 
851 
852 */
853         #endif
854         static nnResult ConvertLookUpTableDataFloatToNative(const f32* valueData, const f32* deltaData, u32 dataCount, u32* __restrict destination);
855     };
856 
857     #if NN_GD_DOCUMENT_TYPE == ENGLISH
858     /* Please see man pages for details
859 
860 
861 
862 
863 
864 
865 
866     */
867     #else
868     /* Please see man pages for details
869 
870 
871 
872 
873 
874 
875 
876 
877 
878 
879 
880 
881 
882 */
883     #endif
884     static nnResult UploadLookUpTableFloat(LightingStage::LookUpTableUploadId lutID, u32 lutStartIndex, const f32* valueData, const f32* deltaData, u32 dataCount);
885 
886     #if NN_GD_DOCUMENT_TYPE == ENGLISH
887     /* Please see man pages for details
888 
889 
890 
891 
892     */
893     #else
894     /* Please see man pages for details
895 
896 
897 
898 
899 
900 
901 
902 
903 
904 
905 */
906     #endif
907     static nnResult UploadLookUpTableNative(LightingStage::LookUpTableUploadId lutID, u32 lutStartIndex, const u32* data, u32 dataCount);
908 
909 };  // LightingStage
910 
911 
912 /**************************************************************************************************************/
913 /********************************** LightingStage inline functions implementation *****************************/
914 
SetShadowPrimary(gdBool value)915 NN_FORCE_INLINE void LightingStage::SetShadowPrimary(gdBool value)
916 {
917     //shadowPrimary: 0x1c3, bit [16:16]
918     internal::g_lightingStageSettings.m_MiscReg1c3 &= ~(1 << 16);
919     if(value) internal::g_lightingStageSettings.m_MiscReg1c3 |= 1 << 16;
920 
921     // common: 0x1c3, bit [0:0]
922     internal::g_lightingStageSettings.m_MiscReg1c3 &= ~(1);
923     if (internal::g_lightingStageSettings.m_MiscReg1c3 & (1<<16 | 1<<17 | 1<<19)) internal::g_lightingStageSettings.m_MiscReg1c3 |= 1;
924 
925     internal::g_lightingStageSettings.m_DirtyFieldMask |= internal::LightingStageSettings::MASK_REG_01C3_UPDATED
926         | internal::LightingStageSettings::MASK_UPDATE_LIGHTENV_TEXTURE_UNIT_CONTROL;
927 }
928 
SetShadowSecondary(gdBool value)929 NN_FORCE_INLINE void LightingStage::SetShadowSecondary(gdBool value)
930 {
931     //shadowSecondary: 0x1c3, bit [17:17]
932     internal::g_lightingStageSettings.m_MiscReg1c3 &= ~(1 << 17);
933     if(value) internal::g_lightingStageSettings.m_MiscReg1c3 |= (1 << 17);
934 
935     // common: 0x1c3, bit [0:0]
936     internal::g_lightingStageSettings.m_MiscReg1c3 &= ~(1);
937     if (internal::g_lightingStageSettings.m_MiscReg1c3 & (1<<16 | 1<<17 | 1<<19)) internal::g_lightingStageSettings.m_MiscReg1c3 |= 1;
938 
939     internal::g_lightingStageSettings.m_DirtyFieldMask |= internal::LightingStageSettings::MASK_REG_01C3_UPDATED
940         | internal::LightingStageSettings::MASK_UPDATE_LIGHTENV_TEXTURE_UNIT_CONTROL;
941 }
942 
SetShadowSelectorTexture(TextureStage::TextureUnitId textureUnit)943 NN_FORCE_INLINE void LightingStage::SetShadowSelectorTexture(TextureStage::TextureUnitId textureUnit)
944 {
945     //shadowSelector 0x1c3, bits [25:24]
946     internal::g_lightingStageSettings.m_ShadowSelectorTexture = textureUnit & 0x3;
947     internal::g_lightingStageSettings.m_MiscReg1c3 &= ~(0x3 << 24);
948     internal::g_lightingStageSettings.m_MiscReg1c3 |= (internal::g_lightingStageSettings.m_ShadowSelectorTexture << 24);
949 
950     internal::g_lightingStageSettings.m_DirtyFieldMask |= internal::LightingStageSettings::MASK_REG_01C3_UPDATED
951         | internal::LightingStageSettings::MASK_UPDATE_LIGHTENV_TEXTURE_UNIT_CONTROL;
952 }
953 
SetInvertShadow(gdBool value)954 NN_FORCE_INLINE void LightingStage::SetInvertShadow(gdBool value)
955 {
956     //invertShadow: 0x1c3, bit [18:18]
957     internal::g_lightingStageSettings.m_MiscReg1c3 &= ~(1 << 18);
958     if(value) internal::g_lightingStageSettings.m_MiscReg1c3 |= (1 << 18);
959     internal::g_lightingStageSettings.m_DirtyFieldMask |= internal::LightingStageSettings::MASK_REG_01C3_UPDATED;
960 }
961 
SetShadowAlpha(gdBool value)962 NN_FORCE_INLINE void LightingStage::SetShadowAlpha(gdBool value)
963 {
964     //shadowAlpha: 0x1c3, bit [19:19]
965     internal::g_lightingStageSettings.m_MiscReg1c3 &= ~(1 << 19);
966     if(value) internal::g_lightingStageSettings.m_MiscReg1c3 |= (1 << 19);
967 
968     // common: 0x1c3, bit [0:0]
969     internal::g_lightingStageSettings.m_MiscReg1c3 &= ~(1);
970     if (internal::g_lightingStageSettings.m_MiscReg1c3 & (1<<16 | 1<<17 | 1<<19)) internal::g_lightingStageSettings.m_MiscReg1c3 |= 1;
971 
972     internal::g_lightingStageSettings.m_DirtyFieldMask |= internal::LightingStageSettings::MASK_REG_01C3_UPDATED;
973 }
974 
EnableLookUpTableD0(gdBool value)975 NN_FORCE_INLINE void LightingStage::EnableLookUpTableD0(gdBool value)
976 {
977     //lutEnabledD0: 0x1c4, bit [16:16]
978 
979     //g_gdFLLightingGlobalSettings.lutEnabledD0 = !value;
980     //m_MiscReg1c4 = (m_MiscReg1c4 & ~(1 << 16)) | ((~value) << 16);
981 
982     //m_MiscReg1c4= (m_MiscReg1c4 & ~(1 << 16)) | ((~value) << 16);
983 
984     //m_MiscReg1c4= (m_MiscReg1c4 & ~(1 << 16)) | ~(value << 16);
985 
986     internal::g_lightingStageSettings.m_MiscReg1c4 &= ~(1 << 16);
987     if(!value) internal::g_lightingStageSettings.m_MiscReg1c4 |= (1 << 16);
988     internal::g_lightingStageSettings.m_DirtyFieldMask |= internal::LightingStageSettings::MASK_REG_01C4_UPDATED;
989 }
990 
EnableLookUpTableD1(gdBool value)991 NN_FORCE_INLINE void LightingStage::EnableLookUpTableD1(gdBool value)
992 {
993     //lutEnabledD1: 0x1c4, bit [17:17]
994     internal::g_lightingStageSettings.m_MiscReg1c4 &= ~(1 << 17);
995     if(!value) internal::g_lightingStageSettings.m_MiscReg1c4 |= (1 << 17);
996     internal::g_lightingStageSettings.m_DirtyFieldMask |= internal::LightingStageSettings::MASK_REG_01C4_UPDATED;
997 }
998 
EnableLookUpTableReflection(gdBool value)999 NN_FORCE_INLINE void LightingStage::EnableLookUpTableReflection(gdBool value)
1000 {
1001     //lutEnabledRefl: 0x1c4, bits [22:20]
1002     internal::g_lightingStageSettings.m_MiscReg1c4 &= ~(7 << 20);
1003     if(!value) internal::g_lightingStageSettings.m_MiscReg1c4 |= (7 << 20);
1004     internal::g_lightingStageSettings.m_DirtyFieldMask |= internal::LightingStageSettings::MASK_REG_01C4_UPDATED;
1005 }
1006 
SetLayerConfiguration(LayerConfiguration layerConfiguration)1007 NN_FORCE_INLINE void LightingStage::SetLayerConfiguration(LayerConfiguration layerConfiguration)
1008 {
1009     //layerConfiguration: 0x1c3, bits [7:4]
1010     internal::g_lightingStageSettings.m_LayerConfiguration = layerConfiguration & 0xf;
1011     if (internal::g_lightingStageSettings.m_FragmentLightingEnabled)
1012     {
1013         internal::g_lightingStageSettings.m_MiscReg1c3 &= ~(0xf << 4);
1014         internal::g_lightingStageSettings.m_MiscReg1c3 |= (internal::g_lightingStageSettings.m_LayerConfiguration << 4);
1015         internal::g_lightingStageSettings.m_DirtyFieldMask |= internal::LightingStageSettings::MASK_REG_01C3_UPDATED;
1016     }
1017 }
1018 
SetFresnelSelector(FresnelSelectorType fresnelSelectorType)1019 NN_FORCE_INLINE void LightingStage::SetFresnelSelector(FresnelSelectorType fresnelSelectorType)
1020 {
1021     u32 fresnelValue = fresnelSelectorType & 0x3;
1022 
1023     //fresnelSelectorType: 0x1c3, bits [3:2]
1024     internal::g_lightingStageSettings.m_MiscReg1c3 &= ~(0x3 << 2);
1025     internal::g_lightingStageSettings.m_MiscReg1c3 |= (fresnelValue << 2);
1026 
1027     //fresnelSelectorType: 0x1c4, bits [19:19]
1028     internal::g_lightingStageSettings.m_MiscReg1c4 &= ~(1 << 19);
1029     if(fresnelValue == FRESNEL_SELECTOR_TYPE_NO_FRESNEL) internal::g_lightingStageSettings.m_MiscReg1c4 |= (1 << 19);
1030 
1031     internal::g_lightingStageSettings.m_DirtyFieldMask |= internal::LightingStageSettings::MASK_REG_01C3_UPDATED | internal::LightingStageSettings::MASK_REG_01C4_UPDATED;
1032 }
1033 
SetBumpSelectorTexture(TextureStage::TextureUnitId textureUnit)1034 NN_FORCE_INLINE void LightingStage::SetBumpSelectorTexture(TextureStage::TextureUnitId textureUnit)
1035 {
1036     //bumpSelector 0x1c3, bits [23:22]
1037     internal::g_lightingStageSettings.m_BumpSelectorTexture = textureUnit & 0x3;
1038     internal::g_lightingStageSettings.m_MiscReg1c3 &= ~(0x3 << 22);
1039     internal::g_lightingStageSettings.m_MiscReg1c3 |= (internal::g_lightingStageSettings.m_BumpSelectorTexture << 22);
1040 
1041     internal::g_lightingStageSettings.m_DirtyFieldMask |= internal::LightingStageSettings::MASK_REG_01C3_UPDATED
1042         | internal::LightingStageSettings::MASK_UPDATE_LIGHTENV_TEXTURE_UNIT_CONTROL;
1043 }
1044 
SetBumpMode(BumpMode bumpMode,gdBool bumpRenorm)1045 NN_FORCE_INLINE void LightingStage::SetBumpMode(BumpMode bumpMode, gdBool bumpRenorm)
1046 {
1047     //bumpMode 0x1c3, bits [29:28]
1048     //bumpRenorm 0x1c3, bit [30:30]
1049     internal::g_lightingStageSettings.m_BumpMode = bumpMode & 0x3;
1050     internal::g_lightingStageSettings.m_MiscReg1c3 &= ~(7 << 28);
1051     if (bumpRenorm || internal::g_lightingStageSettings.m_BumpMode == BUMPMODE_NOT_USED) internal::g_lightingStageSettings.m_MiscReg1c3 |= internal::g_lightingStageSettings.m_BumpMode << 28;
1052     else internal::g_lightingStageSettings.m_MiscReg1c3 |= ((1 << 30) | (internal::g_lightingStageSettings.m_BumpMode << 28));
1053     internal::g_lightingStageSettings.m_DirtyFieldMask |= internal::LightingStageSettings::MASK_REG_01C3_UPDATED
1054         | internal::LightingStageSettings::MASK_UPDATE_LIGHTENV_TEXTURE_UNIT_CONTROL;
1055 }
1056 
SetClampHightlight(gdBool value)1057 NN_FORCE_INLINE void LightingStage::SetClampHightlight(gdBool value)
1058 {
1059     //clampHighlights 0x1c3, bit [27:27]
1060     internal::g_lightingStageSettings.m_MiscReg1c3 &= ~(1 << 27);
1061     if(value) internal::g_lightingStageSettings.m_MiscReg1c3 |= 1 << 27;
1062     internal::g_lightingStageSettings.m_DirtyFieldMask |= internal::LightingStageSettings::MASK_REG_01C3_UPDATED;
1063 }
1064 
SetLookUpTableAbsInput(LookUpTableId lutId,gdBool value)1065 NN_FORCE_INLINE void LightingStage::SetLookUpTableAbsInput(LookUpTableId lutId, gdBool value)
1066 {
1067     u32 bit = 1 << (lutId*4 + 1);
1068     internal::g_lightingStageSettings.m_RegLutAbsSettings &= ~bit;
1069     if(!value) internal::g_lightingStageSettings.m_RegLutAbsSettings |= bit;
1070 
1071     internal::g_lightingStageSettings.m_DirtyFieldMask |= internal::LightingStageSettings::MASK_REG_LUT_ABS_SETTINGS_UPDATED;
1072 }
1073 
SetLookUpTableInputValue(LookUpTableId lutId,LookUpTableInputValue lutInputValue)1074 NN_FORCE_INLINE void LightingStage::SetLookUpTableInputValue(LookUpTableId lutId, LookUpTableInputValue lutInputValue)
1075 {
1076     u32 lutInputV = lutInputValue & 0x7;
1077     internal::g_lightingStageSettings.m_RegLutInputValues &= ~(0x7 << (lutId<<2));
1078     internal::g_lightingStageSettings.m_RegLutInputValues |= lutInputV << (lutId<<2);
1079 
1080     internal::g_lightingStageSettings.m_DirtyFieldMask |= internal::LightingStageSettings::MASK_REG_LUT_INPUT_VALUES_UPDATED;
1081 }
1082 
SetLookUpTableOutputScaling(LookUpTableId lutId,LookUpTableOutputScaleValue outputScalingValue)1083 NN_FORCE_INLINE void LightingStage::SetLookUpTableOutputScaling(LookUpTableId lutId, LookUpTableOutputScaleValue outputScalingValue)
1084 {
1085     u32 outputScalingV = outputScalingValue & 0x7;
1086     internal::g_lightingStageSettings.m_RegLutOutputScale &= ~(0x7 << (lutId<<2));
1087     internal::g_lightingStageSettings.m_RegLutOutputScale |= outputScalingV << (lutId<<2);
1088 
1089     internal::g_lightingStageSettings.m_DirtyFieldMask |= internal::LightingStageSettings::MASK_REG_LUT_OUTPUT_SCALING_UPDATED;
1090 }
1091 
1092 
1093 /*********************************************************************************************************/
1094 /************************************ Light inline functions implementation ******************************/
1095 
EnableLight(gdBool value)1096 NN_FORCE_INLINE void Light::EnableLight(gdBool value)
1097 {
1098     if (m_LightEnabled == value) return;
1099     m_LightEnabled = value;
1100     internal::g_lightingStageSettings.m_DirtyFieldMask |= internal::LightingStageSettings::MASK_LIGHT_ENABLED_UPDATED;
1101 }
1102 
1103 
EnableSpotLight(gdBool value)1104 NN_FORCE_INLINE void Light::EnableSpotLight(gdBool value)
1105 {
1106     //lightsSpotEnabled: 0x1c4, bit [ 8+id : 8+id ]
1107     if (value) internal::g_lightingStageSettings.m_MiscReg1c4 &= ~(1 << (8 + m_LightId));
1108     else internal::g_lightingStageSettings.m_MiscReg1c4 |= 1 << (8 + m_LightId);
1109     internal::g_lightingStageSettings.m_DirtyFieldMask |= internal::LightingStageSettings::MASK_REG_01C4_UPDATED;
1110 }
1111 
EnableDistanceAttenuation(gdBool value)1112 NN_FORCE_INLINE void Light::EnableDistanceAttenuation(gdBool value)
1113 {
1114     //AttDistEnabled: 0x1c4, bit [ 24+id : 24+id ]
1115     if (value) internal::g_lightingStageSettings.m_MiscReg1c4 &= ~(1 << (24 + m_LightId));
1116     else internal::g_lightingStageSettings.m_MiscReg1c4 |= 1 << (24 + m_LightId);
1117     internal::g_lightingStageSettings.m_DirtyFieldMask |= internal::LightingStageSettings::MASK_REG_01C4_UPDATED;
1118 }
1119 
EnableShadowed(gdBool value)1120 NN_FORCE_INLINE void Light::EnableShadowed(gdBool value)
1121 {
1122     //lightsShadowEnabled: 0x1c4, bit [ id : id ]
1123     if (value) internal::g_lightingStageSettings.m_MiscReg1c4 &= ~(1 << m_LightId);
1124     else internal::g_lightingStageSettings.m_MiscReg1c4 |= 1 << m_LightId;
1125     internal::g_lightingStageSettings.m_DirtyFieldMask |= internal::LightingStageSettings::MASK_REG_01C4_UPDATED;
1126 }
1127 
1128 }  // namespace CTR
1129 }  // namespace gd
1130 }  // namespace nn
1131 
1132 
1133 #endif //NN_GD_CTR_GD_LIGHTING_H_
1134