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