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