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