1 /*---------------------------------------------------------------------------*
2   Project:  Dolphin/Revolution gx demo
3   File:     lit-multi.c
4 
5   Copyright 1998-2006 Nintendo.  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    lit-multi
15      Multiple lights in one RGB channel and light mask test
16  *---------------------------------------------------------------------------*/
17 
18 /*---------------------------------------------------------------------------*
19    Header files
20  *---------------------------------------------------------------------------*/
21 #include <demo.h>
22 #include <math.h>
23 
24 /*---------------------------------------------------------------------------*
25    Macro definitions
26  *---------------------------------------------------------------------------*/
27 #define PI              3.14159265358979323846F
28 #define NUM_LIGHTS      8
29 #define NUM_MATERIALS   4
30 
31 #define MODE_ANIMATION  1
32 #define MODE_MODELCTRL  2
33 
34 /*---------------------------------------------------------------------------*
35   Structure Definitions
36  *---------------------------------------------------------------------------*/
37 // for camera
38 typedef struct
39 {
40     Vec    location;
41     Vec    up;
42     Vec    target;
43     f32    left;
44     f32    top;
45     f32    znear;
46     f32    zfar;
47 } CameraConfig;
48 
49 typedef struct
50 {
51     CameraConfig  cfg;
52     Mtx           view;
53     Mtx44         proj;
54 } MyCameraObj;
55 
56 // for lighting
57 typedef struct
58 {
59     GXLightObj  lobj;
60     s32         theta;
61     s32         phi;
62     s32         v_theta;
63     u32         color;
64     u32         enable;
65 } MyLightObj;
66 
67 // for entire scene control
68 typedef struct
69 {
70     MyCameraObj cam;
71     MyLightObj  lightCtrl[NUM_LIGHTS];
72     u32         materialType;
73     u32         modelType;
74     Mtx         modelCtrl;
75     u32         current;
76     u32         mode;
77 } MySceneCtrlObj;
78 
79 /*---------------------------------------------------------------------------*
80    Forward references
81  *---------------------------------------------------------------------------*/
82 void        main            ( void );
83 static void DrawInit        ( MySceneCtrlObj* sc );
84 static void DrawTick        ( MySceneCtrlObj* sc );
85 static void AnimTick        ( MySceneCtrlObj* sc );
86 static void DrawModel       ( u32 model );
87 static void DrawAxes        ( void );
88 static void DrawLightMark   ( u8 ci, u8 type );
89 static void SetCamera       ( MyCameraObj* cam );
90 static void SetLight        ( MySceneCtrlObj* sc );
91 static void DisableLight    ( void );
92 static void PrintIntro      ( void );
93 static void StatusMessage   ( MySceneCtrlObj* sc );
94 
95 /*---------------------------------------------------------------------------*
96    Lighting Parameters
97  *---------------------------------------------------------------------------*/
98 #define MAT_OFFSET     (NUM_LIGHTS * 2)
99 #define NUM_COLORS     (MAT_OFFSET + NUM_MATERIALS + 1)
100 #define REG_AMBIENT    MyColors[NUM_COLORS-1]
101 
102 static GXColor MyColors[] ATTRIBUTE_ALIGN(32) =
103 {
104     // for lights
105     {0x90, 0x90, 0x90, 0xff},  // grey
106     {0xb0, 0x00, 0x00, 0xff},  // red
107     {0x00, 0xb0, 0x00, 0xff},  // green
108     {0x00, 0x00, 0xb0, 0xff},  // blue
109     {0x90, 0x90, 0x00, 0xff},  // yellow
110     {0x00, 0x90, 0x90, 0xff},  // cyan
111     {0x90, 0x00, 0x90, 0xff},  // magenta
112     {0xa0, 0x50, 0x00, 0xff},  // orange
113 
114     {0x10, 0x10, 0x10, 0xff},  // dark grey
115     {0x20, 0x00, 0x00, 0xff},  // dark red
116     {0x00, 0x20, 0x00, 0xff},  // dark green
117     {0x00, 0x00, 0x20, 0xff},  // dark blue
118     {0x10, 0x10, 0x00, 0xff},  // dark yellow
119     {0x00, 0x10, 0x10, 0xff},  // dark cyan
120     {0x10, 0x00, 0x10, 0xff},  // dark magenta
121     {0x20, 0x10, 0x00, 0xff},  // dark orange
122 
123     // for material
124     {0xf0, 0xf0, 0xf0, 0xff},  // material(white)
125     {0xf0, 0xf0, 0x60, 0xff},  // material(light-yellow)
126     {0x60, 0xf0, 0xf0, 0xff},  // material(light-cyan)
127     {0xf0, 0x60, 0xf0, 0xff},  // material(light-magenta)
128 
129     // for ambient
130     {0x10, 0x10, 0x10, 0x00}   // ambient(almost black)
131 };
132 
133 static s16 DefaultLightPos[NUM_LIGHTS][3] =
134 {
135     // theta, phi, v_theta
136     {   0,  60,  1   },
137     {   0, -60,  358 },
138     { 300,   0,  2   },
139     {  60,   0,  359 },
140     {  30, -30,  1   },
141     { 330, -30,  358 },
142     {  30,  30,  2   },
143     { 330,  30,  359 }
144 };
145 
146 static char* CtrlMsg[NUM_LIGHTS+1] =
147 {
148     "White Light",
149     "Red Light",
150     "Green Light",
151     "Blue Light",
152     "Yellow Light",
153     "Cyan Light",
154     "Magenta Light",
155     "Orange Light",
156     "Model"
157 };
158 
159 static char* MatName[NUM_MATERIALS] =
160 {
161     "White",
162     "Light Yellow",
163     "Light Cyan",
164     "Light Magenta"
165 };
166 
167 static GXLightID LightIDTable[NUM_LIGHTS] =
168 {
169     GX_LIGHT0,
170     GX_LIGHT1,
171     GX_LIGHT2,
172     GX_LIGHT3,
173     GX_LIGHT4,
174     GX_LIGHT5,
175     GX_LIGHT6,
176     GX_LIGHT7
177 };
178 
179 /*---------------------------------------------------------------------------*
180    Model Data
181  *---------------------------------------------------------------------------*/
182 #define SPHERE      0
183 #define CYLINDER    1
184 #define TORUS       2
185 #define ICOSA       3
186 #define DODECA      4
187 #define OCTA        5
188 #define CUBE        6
189 
190 #define MODELS      7
191 
192 
193 static f32 ModelVertices[][3] ATTRIBUTE_ALIGN(32) =
194 {
195     {   0.0F,   0.0F,   0.0F },
196     {   0.0F,   0.0F, 495.0F },
197     {   0.0F,   0.0F, 505.0F },
198     {   0.0F,   5.0F, 500.0F },
199     {   5.0F,   0.0F, 500.0F },
200     {   0.0F,  -5.0F, 500.0F },
201     {  -5.0F,   0.0F, 500.0F },
202     {   0.0F,   0.0F, 475.0F },
203     {   0.0F,   0.0F, 525.0F },
204     {   0.0F,  25.0F, 500.0F },
205     {  25.0F,   0.0F, 500.0F },
206     {   0.0F, -25.0F, 500.0F },
207     { -25.0F,   0.0F, 500.0F },
208 };
209 
210 // For light direction mark
211 #define NUM_LM_EDGES  13
212 static u8 LightMarkEdge0[NUM_LM_EDGES*2] =
213 {
214     0, 1, 1, 3, 1, 4, 1, 5, 1, 6, 2, 3, 2, 4,
215     2, 5, 2, 6, 3, 4, 4, 5, 5, 6, 6, 3
216 };
217 
218 static u8 LightMarkEdge1[NUM_LM_EDGES*2] =
219 {
220     0, 7, 7, 9, 7, 10, 7, 11, 7, 12, 8, 9, 8, 10,
221     8, 11, 8, 12, 9, 10, 10, 11, 11, 12, 12, 9
222 };
223 
224 /*---------------------------------------------------------------------------*
225    Camera configuration
226  *---------------------------------------------------------------------------*/
227 static CameraConfig DefaultCamera =
228 {
229     { 0.0F, 0.0F, 900.0F }, // location
230     { 0.0F, 1.0F,   0.0F }, // up
231     { 0.0F, 0.0F,   0.0F }, // target
232     -160.0F, // left
233     120.0F,  // top
234     200.0F,  // near
235     2000.0F  // far
236 };
237 
238 /*---------------------------------------------------------------------------*
239    Global variables
240  *---------------------------------------------------------------------------*/
241 static MySceneCtrlObj  SceneCtrl;    // scene control parameters
242 
243 /*---------------------------------------------------------------------------*
244    Application main loop
245  *---------------------------------------------------------------------------*/
main(void)246 void main( void )
247 {
248     DEMOInit(NULL);    // Init the OS, game pad, graphics and video.
249 
250     DrawInit(&SceneCtrl);       // Initialize vertex formats, scene and etc.
251 
252     PrintIntro();  // Print demo directions
253 
254     while(!(DEMOPadGetButton(0) & PAD_BUTTON_MENU))
255     {
256         DEMOBeforeRender();
257         DrawTick(&SceneCtrl);    // Draw the model.
258         DEMODoneRender();
259         DEMOPadRead();           // Update pad status.
260         AnimTick(&SceneCtrl);    // Update animation.
261     }
262 
263     OSHalt("End of demo");
264 }
265 
266 
267 /*---------------------------------------------------------------------------*
268    Functions
269  *---------------------------------------------------------------------------*/
270 /*---------------------------------------------------------------------------*
271     Name:           DrawInit
272 
273     Description:    Initializes the vertex attribute format, and sets
274                     the array pointers and strides for the indexed data.
275                     This function also sets up default scene parameters.
276 
277     Arguments:      sc : pointer to the structure of scene control parameters
278 
279     Returns:        none
280  *---------------------------------------------------------------------------*/
DrawInit(MySceneCtrlObj * sc)281 static void DrawInit( MySceneCtrlObj* sc )
282 {
283     u32 i;
284 
285     // set up a vertex attribute
286     GXSetVtxAttrFmt(GX_VTXFMT0, GX_VA_POS, GX_POS_XYZ, GX_F32, 0);
287     GXSetVtxAttrFmt(GX_VTXFMT0, GX_VA_NRM, GX_NRM_XYZ, GX_F32, 0);
288     GXSetVtxAttrFmt(GX_VTXFMT0, GX_VA_CLR0, GX_CLR_RGBA, GX_RGBA8, 0);
289 
290     // set up array for indexed color access
291     GXSetArray(GX_VA_CLR0, MyColors, 4*sizeof(u8));
292     // set up array for indexed position
293     GXSetArray(GX_VA_POS, ModelVertices, 3*sizeof(f32));
294 
295 
296     // Default scene parameter settings
297 
298     // camera
299     sc->cam.cfg = DefaultCamera;
300     SetCamera(&sc->cam);   // never changes in this test
301 
302     // set up light parameters
303     for ( i = 0 ; i < NUM_LIGHTS ; ++i )
304     {
305         sc->lightCtrl[i].theta   = DefaultLightPos[i][0];
306         sc->lightCtrl[i].phi     = DefaultLightPos[i][1];
307         sc->lightCtrl[i].v_theta = DefaultLightPos[i][2];
308         sc->lightCtrl[i].color   = i;
309         sc->lightCtrl[i].enable  = TRUE;
310     }
311 
312     // model type, material type and current control number
313     sc->modelType    = 0;
314     sc->materialType = 0;
315     sc->current      = 0;
316     sc->mode         = MODE_ANIMATION;
317 
318     // initialize model rotation control matrix
319     MTXScale(sc->modelCtrl, 250.0F, 250.0F, 250.0F);
320 }
321 
322 /*---------------------------------------------------------------------------*
323     Name:           DrawTick
324 
325     Description:    Draws the model by using given scene parameters
326 
327     Arguments:      sc : pointer to the structure of scene control parameters
328 
329     Returns:        none
330  *---------------------------------------------------------------------------*/
DrawTick(MySceneCtrlObj * sc)331 static void DrawTick( MySceneCtrlObj* sc )
332 {
333     Mtx  mr;  // Rotate matrix.
334     Mtx  mv;  // Modelview matrix.
335     Mtx  mvi; // Modelview matrix.
336     u32  i;
337     u8   t, ci;
338 
339     // Render mode = one color / no texture
340     GXSetNumTexGens(0);
341     GXSetTevOp(GX_TEVSTAGE0, GX_PASSCLR);
342     GXSetTevOrder(GX_TEVSTAGE0, GX_TEXCOORD_NULL, GX_TEXMAP_NULL, GX_COLOR0A0);
343 
344     // Disable lighting
345     DisableLight();
346 
347     // Draw light direction marks
348     for ( i = 0 ; i < NUM_LIGHTS ; ++i )
349     {
350         MTXRotDeg(mr, 'y', sc->lightCtrl[i].theta);
351         MTXConcat(sc->cam.view, mr, mv);
352         MTXRotDeg(mr, 'x', - sc->lightCtrl[i].phi);
353         MTXConcat(mv, mr, mv);
354         GXLoadPosMtxImm(mv, GX_PNMTX0);
355 
356         ci = (u8)(sc->lightCtrl[i].enable ? i : i + NUM_LIGHTS);
357         t  = (u8)(( sc->current == i ) ? 1 : 0);
358         DrawLightMark(ci, t);
359     }
360 
361     // Modelview matrix for the model.
362     MTXConcat(sc->cam.view, sc->modelCtrl, mv);
363     GXLoadPosMtxImm(mv, GX_PNMTX0);
364     MTXInverse(mv, mvi);
365     MTXTranspose(mvi, mv);
366     GXLoadNrmMtxImm(mv, GX_PNMTX0);
367 
368     // Axes are drawn if the model control mode is selected.
369     if ( sc->mode & MODE_MODELCTRL )
370     {
371         DrawAxes();
372     }
373 
374     // Set lighting parameters and draw a model
375     SetLight(sc);
376     DrawModel(sc->modelType);
377 
378 }
379 
380 /*---------------------------------------------------------------------------*
381     Name:           AnimTick
382 
383     Description:    Changes scene parameters according to the pad status.
384 
385     Arguments:      sc : pointer to the structure of scene control parameters
386 
387     Returns:        none
388  *---------------------------------------------------------------------------*/
AnimTick(MySceneCtrlObj * sc)389 static void AnimTick( MySceneCtrlObj* sc )
390 {
391     u16  down;
392     Mtx  mrx, mry;
393     s32  sx, sy;
394     u32  i;
395     u32  cur = sc->current;
396 
397     // PAD
398     down = DEMOPadGetButtonDown(0);
399 
400     // Light Animation
401     if ( sc->mode & MODE_ANIMATION )
402     {
403         for ( i = 0 ; i < NUM_LIGHTS ; ++i )
404         {
405             sc->lightCtrl[i].theta += sc->lightCtrl[i].v_theta;
406             sc->lightCtrl[i].theta %= 360;
407         }
408     }
409 
410     // Animation ON/OFF
411     if ( down & PAD_BUTTON_X )
412     {
413         sc->mode ^= MODE_ANIMATION;
414     }
415 
416 
417     // Model Rotation Control
418     sx =   DEMOPadGetSubStickX(0) / 24;
419     sy = - DEMOPadGetSubStickY(0) / 24;
420     if ( sx == 0 && sy == 0 )
421     {
422         sc->mode &= ~MODE_MODELCTRL;
423     }
424     else
425     {
426         sc->mode |= MODE_MODELCTRL;
427     }
428     MTXRotDeg(mry, 'x', sy);
429     MTXRotDeg(mrx, 'y', sx);
430     MTXConcat(mry, sc->modelCtrl, sc->modelCtrl);
431     MTXConcat(mrx, sc->modelCtrl, sc->modelCtrl);
432 
433 
434     // Light Position Control
435     sc->lightCtrl[cur].theta += ( DEMOPadGetStickX(0) / 24 );
436     sc->lightCtrl[cur].theta = sc->lightCtrl[cur].theta % 360;
437 
438     sc->lightCtrl[cur].phi += ( DEMOPadGetStickY(0) / 24 );
439     if ( sc->lightCtrl[cur].phi < -90 )
440         sc->lightCtrl[cur].phi = -90;
441     if ( sc->lightCtrl[cur].phi > 90 )
442         sc->lightCtrl[cur].phi = 90;
443 
444 
445     // Model Select
446     if ( down & PAD_BUTTON_B )
447     {
448         sc->modelType = ( sc->modelType + 1 ) % MODELS;
449     }
450 
451     // Light Enable / Disable
452     if ( down & PAD_BUTTON_A )
453     {
454         if ( cur < NUM_LIGHTS )
455         {
456             sc->lightCtrl[cur].enable = !sc->lightCtrl[cur].enable;
457             StatusMessage(sc);
458         }
459     }
460 
461     // Material Select
462     if ( down & PAD_BUTTON_Y )
463     {
464          sc->materialType = ( sc->materialType + 1 ) % NUM_MATERIALS;
465          OSReport("Material: %s\n", MatName[sc->materialType]);
466     }
467 
468     // Light Select
469     if ( down & PAD_TRIGGER_R )
470     {
471         sc->current = ( sc->current + 1 ) % NUM_LIGHTS;
472         StatusMessage(sc);
473     }
474     if ( down & PAD_TRIGGER_L )
475     {
476         sc->current = ( sc->current + NUM_LIGHTS - 1 ) % NUM_LIGHTS;
477         StatusMessage(sc);
478     }
479 
480 }
481 
482 /*---------------------------------------------------------------------------*
483     Name:           DrawModel
484 
485     Description:    Draws the specified model
486 
487     Arguments:      model : specifies which model is to be displayed
488 
489     Returns:        none
490  *---------------------------------------------------------------------------*/
DrawModel(u32 model)491 static void DrawModel( u32 model )
492 {
493     // sets up vertex descriptors
494     GXClearVtxDesc();
495     GXSetVtxDesc(GX_VA_POS, GX_DIRECT);
496     GXSetVtxDesc(GX_VA_NRM, GX_DIRECT);
497 
498     switch(model)
499     {
500         case CYLINDER :
501             GXDrawCylinder(64);
502             break;
503         case TORUS :
504             GXDrawTorus(0.375F, 12, 16);
505             break;
506         case SPHERE :
507             GXDrawSphere(12, 24);
508             break;
509         case CUBE :
510             GXDrawCube();
511             break;
512         case OCTA :
513             GXDrawOctahedron();
514             break;
515         case ICOSA :
516             GXDrawIcosahedron();
517             break;
518         case DODECA :
519             GXDrawDodeca();
520             break;
521     }
522 }
523 
524 /*---------------------------------------------------------------------------*
525     Name:           DrawAxes
526 
527     Description:    Draws xyz-axes which shows model's direction
528 
529     Arguments:      none
530 
531     Returns:        none
532  *---------------------------------------------------------------------------*/
DrawAxes(void)533 static void DrawAxes( void )
534 {
535     // sets up vertex descriptors
536     GXClearVtxDesc();
537     GXSetVtxDesc(GX_VA_POS, GX_DIRECT);
538     GXSetVtxDesc(GX_VA_CLR0, GX_DIRECT);
539 
540     GXBegin(GX_LINES, GX_VTXFMT0, 6);
541         GXPosition3f32(0.0F, 0.0F, -1000.0F);
542         GXColor4u8(96, 96, 96, 255);
543         GXPosition3f32(0.0F, 0.0F, 1000.0F);
544         GXColor4u8(96, 96, 96, 255);
545 
546         GXPosition3f32(0.0F, -1000.0F, 0.0F);
547         GXColor4u8(96, 96, 96, 255);
548         GXPosition3f32(0.0F, 1000.0F, 0.0F);
549         GXColor4u8(96, 96, 96, 255);
550 
551         GXPosition3f32(-1000.0F, 0.0F, 0.0F);
552         GXColor4u8(96, 96, 96, 255);
553         GXPosition3f32(1000.0F, 0.0F, 0.0F);
554         GXColor4u8(96, 96, 96, 255);
555     GXEnd();
556 }
557 
558 /*---------------------------------------------------------------------------*
559     Name:           DrawLightMark
560 
561     Description:    Draws a mark which shows position of the light.
562 
563     Arguments:      ci   : color index
564                     type : type ( 0 or 1 )
565 
566     Returns:        none
567  *---------------------------------------------------------------------------*/
DrawLightMark(u8 ci,u8 type)568 static void DrawLightMark( u8 ci, u8 type )
569 {
570     u32  i;
571     u8*  edgeTbl;
572 
573     // sets up vertex descriptors
574     GXClearVtxDesc();
575     GXSetVtxDesc(GX_VA_POS, GX_INDEX8);
576     GXSetVtxDesc(GX_VA_CLR0, GX_INDEX8);
577 
578     if ( type == 0 )
579     {
580         edgeTbl = LightMarkEdge0;
581     }
582     else
583     {
584         edgeTbl = LightMarkEdge1;
585     }
586 
587     GXBegin(GX_LINES, GX_VTXFMT0, NUM_LM_EDGES * 2);
588         for ( i = 0 ; i < NUM_LM_EDGES * 2 ; ++i )
589         {
590             GXPosition1x8(edgeTbl[i]);
591             GXColor1x8(ci);
592         }
593     GXEnd();
594 }
595 
596 /*---------------------------------------------------------------------------*
597     Name:           SetCamera
598 
599     Description:    sets view matrix and loads projection matrix into hardware
600 
601     Arguments:      cam : pointer to the MyCameraObj structure
602 
603     Returns:        none
604  *---------------------------------------------------------------------------*/
SetCamera(MyCameraObj * cam)605 static void SetCamera( MyCameraObj* cam )
606 {
607     MTXLookAt(
608         cam->view,
609         &cam->cfg.location,
610         &cam->cfg.up,
611         &cam->cfg.target );
612 
613     MTXFrustum(
614         cam->proj,
615         cam->cfg.top,
616         - (cam->cfg.top),
617         cam->cfg.left,
618         - (cam->cfg.left),
619         cam->cfg.znear,
620         cam->cfg.zfar );
621     GXSetProjection(cam->proj, GX_PERSPECTIVE);
622 }
623 
624 /*---------------------------------------------------------------------------*
625     Name:           SetLight
626 
627     Description:    Sets up light & channel parameters
628 
629     Arguments:      sc : pointer to the structure of scene control parameters
630 
631     Returns:        none
632  *---------------------------------------------------------------------------*/
SetLight(MySceneCtrlObj * sc)633 void SetLight( MySceneCtrlObj* sc )
634 {
635     GXLightID  id;
636     f32        theta, phi;
637     Vec        lpos;
638     u32        i;
639     u32        lmask = 0;
640 
641 
642     for ( i = 0 ; i < NUM_LIGHTS ; ++i )
643     {
644         // Light Position
645         theta  = (f32)sc->lightCtrl[i].theta * PI / 180.0F;
646         phi    = (f32)sc->lightCtrl[i].phi   * PI / 180.0F;
647         lpos.x = 500.0F * cosf(phi) * sinf(theta);
648         lpos.y = 500.0F * sinf(phi);
649         lpos.z = 500.0F * cosf(phi) * cosf(theta);
650 
651         // Convert light position into view space
652         MTXMultVec(sc->cam.view, &lpos, &lpos);
653 
654         GXInitLightPos(&sc->lightCtrl[i].lobj, lpos.x, lpos.y, lpos.z);
655         GXInitLightColor(
656             &sc->lightCtrl[i].lobj,
657             MyColors[sc->lightCtrl[i].color] );
658 
659         // Load light object into hardware
660         id = LightIDTable[i];
661         GXLoadLightObjImm(&sc->lightCtrl[i].lobj, id);
662 
663         // Light mask control
664         lmask |= sc->lightCtrl[i].enable ? id : 0;
665     }
666 
667     // light channel setting
668     GXSetNumChans(1);
669     GXSetChanCtrl(
670         GX_COLOR0,
671         GX_ENABLE,     // enable channel
672         GX_SRC_REG,    // amb source
673         GX_SRC_REG,    // mat source
674         lmask,         // light mask
675         GX_DF_CLAMP,   // diffuse function
676         GX_AF_NONE);
677     GXSetChanCtrl(
678         GX_ALPHA0,
679         GX_DISABLE,    // disable channel
680         GX_SRC_REG,    // amb source
681         GX_SRC_REG,    // mat source
682         GX_LIGHT_NULL, // light mask
683         GX_DF_NONE,    // diffuse function
684         GX_AF_NONE);
685     // set up ambient color
686     GXSetChanAmbColor(GX_COLOR0A0, REG_AMBIENT);
687     // set up material color
688     GXSetChanMatColor(GX_COLOR0A0, MyColors[sc->materialType + MAT_OFFSET]);
689 }
690 
691 /*---------------------------------------------------------------------------*
692     Name:           DisableLight
693 
694     Description:    Disables lighting
695 
696     Arguments:      none
697 
698     Returns:        none
699  *---------------------------------------------------------------------------*/
DisableLight(void)700 static void DisableLight( void )
701 {
702     GXSetNumChans(1);
703     GXSetChanCtrl(
704         GX_COLOR0A0,
705         GX_DISABLE,    // disable channel
706         GX_SRC_VTX,    // amb source
707         GX_SRC_VTX,    // mat source
708         GX_LIGHT_NULL, // light mask
709         GX_DF_NONE,    // diffuse function
710         GX_AF_NONE );
711 }
712 
713 /*---------------------------------------------------------------------------*
714     Name:           PrintIntro
715 
716     Description:    Prints the directions on how to use this demo.
717 
718     Arguments:      none
719 
720     Returns:        none
721  *---------------------------------------------------------------------------*/
PrintIntro(void)722 static void PrintIntro( void )
723 {
724     OSReport("\n\n");
725     OSReport("************************************************\n");
726     OSReport("lit-multi: multiple lights in one RGB channel\n");
727     OSReport("************************************************\n");
728     OSReport("to quit hit the start button\n");
729     OSReport("\n");
730     OSReport("Main Stick   : Move selected light\n");
731     OSReport("Sub  Stick   : Rotate the model\n");
732     OSReport("A Button     : Enable/Disable selected Light\n");
733     OSReport("L/R Triggers : Select a light\n");
734     OSReport("X Button     : Stop/Start light animation\n");
735     OSReport("Y Button     : Change the material type\n");
736     OSReport("B Button     : Change the Model\n");
737     OSReport("************************************************\n");
738     OSReport("\n\n");
739 }
740 
741 /*---------------------------------------------------------------------------*
742     Name:           StatusMessage
743 
744     Description:    Prints current status.
745 
746     Arguments:      sc : pointer to the structure of scene control parameters
747 
748     Returns:        none
749  *---------------------------------------------------------------------------*/
StatusMessage(MySceneCtrlObj * sc)750 static void StatusMessage( MySceneCtrlObj* sc )
751 {
752     OSReport("%s ", CtrlMsg[sc->current]);
753 
754     if ( sc->current < NUM_LIGHTS )
755     {
756         if ( sc->lightCtrl[sc->current].enable )
757             OSReport("(Enabled)");
758         else
759             OSReport("(Disabled)");
760     }
761     OSReport("\n");
762 }
763 
764 /*============================================================================*/
765