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