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