1 /*---------------------------------------------------------------------------*
2   Project:  Horizon
3   File:     gr_FragmentLight.h
4 
5   Copyright (C)2009-2012 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   $Rev: 47511 $
14  *---------------------------------------------------------------------------*/
15 
16 #ifndef NN_GR_FRAGMENT_LIGHT_H_
17 #define NN_GR_FRAGMENT_LIGHT_H_
18 
19 #include <nn/gr/CTR/gr_Utility.h>
20 #include <nn/gr/CTR/gr_LookUpTable.h>
21 
22 namespace nn
23 {
24     namespace gr
25     {
26         namespace CTR
27         {
28 
29             /* Please see man pages for details
30 
31              */
32             class FragmentLight
33             {
34             public :
35                 /* Please see man pages for details
36 
37                  */
38                 class Source
39                 {
40                 public :
41 
42                     /* Please see man pages for details
43 
44 
45 
46                     */
47                     u8 id;
48 
49                     /* Please see man pages for details
50 
51 
52                     */
53                     bool isEnableTwoSideDiffuse;
54 
55                     /* Please see man pages for details
56 
57 
58                     */
59                     bool isEnableGeomFactor0;
60 
61                     /* Please see man pages for details
62 
63 
64                     */
65                     bool isEnableGeomFactor1;
66 
67                     /* Please see man pages for details
68 
69 
70 
71                     */
72                     u8 diffuseR;
73 
74                     /* Please see man pages for details
75 
76 
77 
78 
79                     */
80                     u8 diffuseG;
81 
82                     /* Please see man pages for details
83 
84 
85 
86 
87                     */
88                     u8 diffuseB;
89 
90                     /* Please see man pages for details
91 
92 
93 
94 
95                     */
96                     u8 ambientR;
97 
98                     /* Please see man pages for details
99 
100 
101 
102                     */
103                     u8 ambientG;
104 
105                     /* Please see man pages for details
106 
107 
108 
109                     */
110                     u8 ambientB;
111 
112                     /* Please see man pages for details
113 
114 
115 
116                     */
117                     u8 specular0R;
118 
119                     /* Please see man pages for details
120 
121 
122 
123                     */
124                     u8 specular0G;
125 
126                     /* Please see man pages for details
127 
128 
129 
130                     */
131                     u8 specular0B;
132 
133                     /* Please see man pages for details
134 
135 
136 
137 
138                     */
139                     u8 specular1R;
140 
141                     /* Please see man pages for details
142 
143 
144 
145 
146                     */
147                     u8 specular1G;
148 
149                     /* Please see man pages for details
150 
151 
152 
153 
154                     */
155                     u8 specular1B;
156 
157                 protected :
158                     /* Please see man pages for details
159 
160 
161                     */
162                     bit32  posXY;
163 
164                     /* Please see man pages for details
165 
166 
167                      */
168                     bit32  posZ;
169 
170                     /* Please see man pages for details
171 
172 
173                      */
174                     u8   isInfinity;
175                     NN_PADDING3;
176 
177                     /* Please see man pages for details
178 
179 
180                      */
181                     bit32 distAttnBias;
182 
183                     /* Please see man pages for details
184 
185 
186                      */
187                     bit32 distAttnScale;
188 
189                     /* Please see man pages for details
190 
191 
192                      */
193                     bit32 spotDirectionXY;
194 
195                     /* Please see man pages for details
196 
197 
198                      */
199                     bit32 spotDirectionZ;
200 
201 
202                 public :
203 
204                     /* Please see man pages for details
205 
206 
207 
208 
209 */
SetPosition(const nn::math::VEC3 & position,const bool is_infinity)210                     void SetPosition( const nn::math::VEC3& position, const bool is_infinity )
211                     {
212                         posXY = PICA_CMD_DATA_FRAG_LIGHT_POSITION_XY( Float32ToFloat16( position.x ),
213                                                                       Float32ToFloat16( position.y ) );
214                         posZ  = PICA_CMD_DATA_FRAG_LIGHT_POSITION_Z(  Float32ToFloat16( position.z ) );
215                         isInfinity = is_infinity ? 1 : 0;
216                     }
217 
218                     /* Please see man pages for details
219 
220 
221 
222 
223 
224 
225 */
SetPosition(const f32 position_x,const f32 position_y,const f32 position_z,const bool is_infinity)226                     void SetPosition( const f32 position_x, const f32 position_y, const f32 position_z, const bool is_infinity )
227                     {
228                         posXY = PICA_CMD_DATA_FRAG_LIGHT_POSITION_XY( Float32ToFloat16( position_x ),
229                                                                       Float32ToFloat16( position_y ) );
230                         posZ  = PICA_CMD_DATA_FRAG_LIGHT_POSITION_Z(  Float32ToFloat16( position_z ) );
231                         isInfinity = is_infinity ? 1 : 0;
232                     }
233 
234 
235                     /* Please see man pages for details
236 
237 
238 
239 */
SetSpotDirection(const nn::math::VEC3 & spot_direction)240                     void SetSpotDirection( const nn::math::VEC3& spot_direction )
241                     {
242                         spotDirectionXY = PICA_CMD_DATA_FRAG_LIGHT_SPOT_XY( Float32ToFix13Fraction11( -spot_direction.x ),
243                                                                             Float32ToFix13Fraction11( -spot_direction.y ) );
244                         spotDirectionZ  = PICA_CMD_DATA_FRAG_LIGHT_SPOT_Z(  Float32ToFix13Fraction11( -spot_direction.z ) );
245                     }
246 
247 
248                     /* Please see man pages for details
249 
250 
251 
252 
253 
254                      */
SetSpotDirection(const f32 & spot_direction_x,const f32 & spot_direction_y,const f32 & spot_direction_z)255                     void SetSpotDirection( const f32& spot_direction_x, const f32& spot_direction_y, const f32& spot_direction_z )
256                     {
257                         spotDirectionXY = PICA_CMD_DATA_FRAG_LIGHT_SPOT_XY( Float32ToFix13Fraction11( - spot_direction_x ),
258                                                                             Float32ToFix13Fraction11( - spot_direction_y ) );
259                         spotDirectionZ  = PICA_CMD_DATA_FRAG_LIGHT_SPOT_Z(  Float32ToFix13Fraction11( - spot_direction_z ) );
260                     }
261 
262 
263                     /* Please see man pages for details
264 
265 
266 
267 
268                      */
SetDistAttnScaleBias(const f32 scale,const f32 bias)269                     void SetDistAttnScaleBias( const f32 scale, const f32 bias )
270                     {
271                         distAttnScale = Float32ToFloat20( scale );
272                         distAttnBias  = Float32ToFloat20( bias );
273                     };
274 
275                     /* Please see man pages for details
276 
277 
278 
279 
280                      */
SetDistAttnStartEnd(const f32 start,const f32 end)281                     void SetDistAttnStartEnd( const f32 start, const f32 end )
282                     {
283                         f32 r = 1.f / ( end - start );
284                         SetDistAttnScaleBias( r, -start * r );
285                     };
286 
287                 public :
288                     /* Please see man pages for details
289 
290 
291 
292 
293                      */
294                     bit32* MakeAllCommand( bit32* command ) const;
295 
296                     /* Please see man pages for details
297 
298 
299 
300 
301 
302                      */
303                     bit32* MakeCommand( bit32* command ) const;
304 
305                     /* Please see man pages for details
306 
307 
308 
309 
310                      */
311                     bit32* MakeColorCommand( bit32* command ) const;
312 
313                     /* Please see man pages for details
314 
315 
316 
317 
318                      */
319                     bit32* MakeGeometryCommand( bit32* command ) const;
320 
321                 public :
322                     /* Please see man pages for details
323 
324                     */
325                     explicit Source();
326                 };
327 
328             public :
329                 //
330                 static const u32 LIGHT_SOURCE_MAX = 8;
331 
332                 /* Please see man pages for details
333 
334 
335 
336                 */
337                 // The value of dmp_FragmentMaterial.emission+dmp_FragmentMaterial.ambient×dmp_FragmentLighting.ambient [0.f, 1.f] is mapped to [0, 255] and set.
338                 //
339                 u8 globalAmbientR;
340 
341 
342                 /* Please see man pages for details
343 
344 
345 
346                  */
347                  // The value of dmp_FragmentMaterial.emission+dmp_FragmentMaterial.ambient×dmp_FragmentLighting.ambient [0.f, 1.f] is mapped to [0, 255] and set.
348                  //
349                 u8 globalAmbientG;
350 
351 
352                 /* Please see man pages for details
353 
354 
355 
356                  */
357                  // The value of dmp_FragmentMaterial.emission+dmp_FragmentMaterial.ambient×dmp_FragmentLighting.ambient [0.f, 1.f] is mapped to [0, 255] and set.
358                  //
359                 u8 globalAmbientB;
360                 NN_PADDING1;
361 
362 
363                 /* Please see man pages for details
364 
365 
366                 */
367                 Source source[ LIGHT_SOURCE_MAX ];
368 
369                 /* Please see man pages for details
370 
371 
372 
373                 */
374                 bool isEnable[ LIGHT_SOURCE_MAX ];
375 
376                 /* Please see man pages for details
377 
378 
379 
380                 */
381                 bool isEnableSpot[ LIGHT_SOURCE_MAX ];
382 
383                 /* Please see man pages for details
384 
385 
386 
387                 */
388                 bool isEnableDistAttn[ LIGHT_SOURCE_MAX ];
389 
390                 /* Please see man pages for details
391 
392 
393 
394                 */
395                 bool isShadowed[ LIGHT_SOURCE_MAX ];
396 
397                 /* Please see man pages for details
398 
399 
400                 */
401                 /*
402                  PICA_DATA_FRAG_LIGHT_ENV_LAYER_CONFIG0
403                  PICA_DATA_FRAG_LIGHT_ENV_LAYER_CONFIG1
404                  PICA_DATA_FRAG_LIGHT_ENV_LAYER_CONFIG2
405                  PICA_DATA_FRAG_LIGHT_ENV_LAYER_CONFIG3
406                  PICA_DATA_FRAG_LIGHT_ENV_LAYER_CONFIG4
407                  PICA_DATA_FRAG_LIGHT_ENV_LAYER_CONFIG5
408                  PICA_DATA_FRAG_LIGHT_ENV_LAYER_CONFIG6
409                  PICA_DATA_FRAG_LIGHT_ENV_LAYER_CONFIG7
410                  Set one of the above.
411                  */
412                 PicaDataFragLightEnvLayerConfig layerConfig;
413 
414                 /* Please see man pages for details
415 
416 
417                 */
418                 /*
419                  PICA_DATA_FRAG_LIGHT_ENV_NO_FRESNEL
420                  PICA_DATA_FRAG_LIGHT_ENV_PRI_ALPHA_FRESNEL
421                  PICA_DATA_FRAG_LIGHT_ENV_SEC_ALPHA_FRESNEL
422                  PICA_DATA_FRAG_LIGHT_ENV_PRI_SEC_ALPHA_FRESNEL
423                  Specify one of the above.
424                  */
425                 PicaDataFragLightEnvFresnel  fresnelSelector;
426 
427                 /* Please see man pages for details
428 
429 
430                 */
431                 /*
432                  PICA_DATA_FRAG_LIGHT_TEXTURE0
433                  PICA_DATA_FRAG_LIGHT_TEXTURE1
434                  PICA_DATA_FRAG_LIGHT_TEXTURE2
435                  PICA_DATA_FRAG_LIGHT_TEXTURE3
436                  Set one of the above.
437                  */
438                 PicaDataFragLightEnvTexture     shadowSelector;
439 
440                 /* Please see man pages for details
441 
442 
443                 */
444                 /*
445                  PICA_DATA_FRAG_LIGHT_ENV_BUMP_NOT_USED_DMP
446                  PICA_DATA_FRAG_LIGHT_ENV_BUMP_AS_BUMP_DMP
447                  PICA_DATA_FRAG_LIGHT_ENV_BUMP_AS_TANG_DMP
448                  Set one of the above.
449                  */
450                 PicaDataFragLightEnvBump        bumpMode;
451 
452                 /* Please see man pages for details
453 
454 
455                 */
456                 /*
457                  PICA_DATA_FRAG_LIGHT_TEXTURE0
458                  PICA_DATA_FRAG_LIGHT_TEXTURE1
459                  PICA_DATA_FRAG_LIGHT_TEXTURE2
460                  PICA_DATA_FRAG_LIGHT_TEXTURE3
461                  Set one of the above.
462                  */
463                 PicaDataFragLightEnvTexture     bumpSelector;
464 
465                 /* Please see man pages for details
466 
467 
468                 */
469                 bool                         isEnableShadowPrimary;
470 
471                 /* Please see man pages for details
472 
473 
474                 */
475                 bool                         isEnableShadowSecondary;
476 
477                 /* Please see man pages for details
478 
479 
480                 */
481                 bool                         isEnableShadowAlpha;
482 
483                 /* Please see man pages for details
484 
485 
486                 */
487                 bool                         isInvertShadow;
488 
489                 /* Please see man pages for details
490 
491 
492                 */
493                 bool                         isEnableBumpRenorm;
494 
495                 /* Please see man pages for details
496 
497 
498                 */
499                 bool                         isEnableClampHighLights;
500 
501                 /* Please see man pages for details
502 
503 
504 
505                 */
506                 /*
507                  * If this flag is set to "true",
508                  * if layer config is set to use D0, lookup table values are applied to the "distribution 0" term.
509                  * If layer config is not set to use D0, 1 is used.
510                  * If this flag is set to "false", 0 is used, regardless of the layer config settings.
511                  * The default value is "false".
512                  */
513                 bool                         isEnableLutD0;
514 
515                 /* Please see man pages for details
516 
517 
518 
519                 */
520                 /*
521                  * If this flag is set to "true",
522                  *If layer config is set to use D1, lookup table values are applied to the "distribution 1" term.
523                  * if layer config is not set to use D1, 1 is used.
524                  * If this flag is set to "false", 0 is used, regardless of the layer config settings.
525                  * The default value is "false".
526                  */
527                 bool                         isEnableLutD1;
528 
529                 /* Please see man pages for details
530 
531 
532 
533                 */
534                 /*
535                  * If this flag is set to "true",
536                  *if layer config is set to use RR, RG, and RB, then lookup table values are applied to the respective "reflection" terms.
537                  * if layer config is not set to use RR, RG, and RB, then 1 is used.
538                  * If this flag is set to "false", 0 is used, regardless of the layer config settings.
539                  * The default value is "true".
540                  */
541 
542                 bool                         isEnableLutRefl;
543                 NN_PADDING2;
544 
545 
546 
547                 /* Please see man pages for details
548 
549                 */
550                 class LutConfig
551                 {
552                 public :
553                     /* Please see man pages for details
554 
555 
556                     */
557                     /*
558                      Any of the following values can be set.
559                      PICA_DATA_FRAG_LIGHT_ENV_NH_DMP
560                      PICA_DATA_FRAG_LIGHT_ENV_VH_DMP
561                      PICA_DATA_FRAG_LIGHT_ENV_NV_DMP
562                      PICA_DATA_FRAG_LIGHT_ENV_LN_DMP
563                      PICA_DATA_FRAG_LIGHT_ENV_SP_DMP
564                      PICA_DATA_FRAG_LIGHT_ENV_CP_DMP
565 
566                      */
567                     PicaDataFragLightEnvLutInput input;
568 
569                     /* Please see man pages for details
570 
571 
572                     */
573                     /*
574                      * Set to "true" to set the lookup table argument range to [0, 1]. Set to "false" to set the range to [-1, 1].
575                      */
576                     bool isAbs;
577 
578                     /* Please see man pages for details
579 
580 
581                      */
582                     PicaDataFragLightEnvLutScale scale;
583 
584                     NN_PADDING1;
585 
586                     /* Please see man pages for details
587 
588                     */
589                     explicit LutConfig();
590                 };
591 
592                 /* Please see man pages for details
593 
594 
595                 */
596                 LutConfig lutConfigD0;
597 
598                 /* Please see man pages for details
599 
600 
601                 */
602                 LutConfig lutConfigD1;
603 
604                 /* Please see man pages for details
605 
606 
607                 */
608                 LutConfig lutConfigSP;
609 
610                 /* Please see man pages for details
611 
612 
613                 */
614                 LutConfig lutConfigFR;
615 
616                 /* Please see man pages for details
617 
618 
619                 */
620                 LutConfig lutConfigRB;
621 
622                 /* Please see man pages for details
623 
624 
625                 */
626                 LutConfig lutConfigRG;
627 
628                 /* Please see man pages for details
629 
630 
631                 */
632                 LutConfig lutConfigRR;
633 
634             public :
635                 /* Please see man pages for details
636 
637                 */
638                 FragmentLight();
639 
640                 /* Please see man pages for details
641 
642 
643 
644 
645 
646                  */
647                 bit32* MakeLightSourceCommand( bit32* command ) const;
648 
649                 /* Please see man pages for details
650 
651 
652 
653 
654 
655 */
656                 bit32* MakeLutConfigCommand( bit32* command ) const;
657 
658                 /* Please see man pages for details
659 
660 
661 
662 
663 
664 
665 */
666                 bit32* MakeLightEnvCommand( bit32* command, bool isAddDummyCommand = true ) const;
667 
668                 /* Please see man pages for details
669 
670 
671 
672 
673 
674 
675                  */
676                 bit32* MakeAllCommand( bit32* command, bool isAddDummyCommand = true ) const;
677 
678                 /* Please see man pages for details
679 
680 
681 
682 
683 
684 
685                  */
686                 static bit32* MakeDisableCommand( bit32* command, bool isAddDummyCommand = true );
687             };
688 
689         } // namespace CTR
690     } // namespace gr
691 } // namespace nn
692 
693 #endif // NN_GR_FRAGMENT_LIGHT_H_
694