1 /*---------------------------------------------------------------------------*
2 Project: Dolphin/Revolution gx demo
3 File: tev-one-op.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 tev-one-op
15 one stage test with various color inputs and operations
16 *---------------------------------------------------------------------------*/
17
18
19 /*---------------------------------------------------------------------------*
20 Header files
21 *---------------------------------------------------------------------------*/
22 #include <demo.h>
23 #include <math.h>
24
25 /*---------------------------------------------------------------------------*
26 Macro definitions
27 *---------------------------------------------------------------------------*/
28 #define MAX_Z 0x00FFFFFF
29
30 #define TEX_WIDTH 64
31 #define TEX_HEIGHT 64
32
33 #define PI 3.14159265F
34
35 #define NUM_TEVCLRARGS 16
36 #define NUM_TEVOPS 2
37 #define NUM_TEVBIASES 3
38 #define NUM_TEVSCALES 4
39 #define NUM_TEVCLRINS 4
40 #define NUM_TEVREGS 4
41 #define NUM_PARAMETERS (NUM_TEVCLRINS+3)
42
43 #define NUM_PANELTEX (NUM_TEVOPS+NUM_TEVBIASES+NUM_TEVSCALES+1)
44 #define NUM_SAMPLETEX 3
45 #define NUM_TEXTURES (NUM_PANELTEX+NUM_SAMPLETEX)
46
47 #define TEX_FORMULA 0
48 #define TEX_OPS 1
49 #define TEX_BIASES (TEX_OPS+NUM_TEVOPS)
50 #define TEX_SCALES (TEX_BIASES+NUM_TEVBIASES)
51
52 #define NUM_LINES 22
53
54 #define DuplicateAlpha(dst, src) \
55 ((dst).r = (dst).g = (dst).b = (dst).a = (src).a)
56
57 // for display location
58 #define ALI_COL(x) (x * 80 + 48)
59
60 /*---------------------------------------------------------------------------*
61 Structure definitions
62 *---------------------------------------------------------------------------*/
63 // for input arg display mode
64 typedef struct
65 {
66 GXTevColorArg arg;
67 GXTevMode mode;
68 u8 ciOffset;
69 u8 ciStep;
70 } MyColorArgDispObj;
71
72 // for tev state storage
73 typedef struct
74 {
75 GXTexObj panelTex[NUM_PANELTEX];
76 u32 param[NUM_PARAMETERS];
77 GXColor regColor[NUM_TEVREGS];
78 } MyTevStateObj;
79
80 // for entire scene control
81 typedef struct
82 {
83 u32 cur;
84 GXTexObj sampleTex[NUM_SAMPLETEX];
85 u32 currentTex;
86 GXColor vtxColor[4];
87 MyTevStateObj tevState;
88 u32 count;
89 u16 screenWd;
90 u16 screenHt;
91 } MySceneCtrlObj;
92
93 /*---------------------------------------------------------------------------*
94 Forward references
95 *---------------------------------------------------------------------------*/
96 void main ( void );
97 static void DrawInit ( MySceneCtrlObj* sc );
98 static void DrawTick ( MySceneCtrlObj* sc );
99 static void AnimTick ( MySceneCtrlObj* sc );
100 static void DrawColorInputs ( MyTevStateObj* ts );
101 static void DrawMisc ( MyTevStateObj* ts );
102 static void DrawCaption ( MySceneCtrlObj* sc );
103 static void DrawLines ( void );
104 static void DrawQuad ( u8 c_offset, u8 c_step );
105 static void DrawResult ( GXTexObj* tx );
106 static void SetTev ( MyTevStateObj* ts );
107 static void PrintIntro ( void );
108
109 /*---------------------------------------------------------------------------*
110 Model Data
111 *---------------------------------------------------------------------------*/
112 static s16 ModelVertices[8+NUM_LINES*4] ATTRIBUTE_ALIGN(32) =
113 {
114 // Used for drawing quads
115 0, 0, 64, 0,
116 64, 64, 0, 64,
117
118 // Used for drawing lines
119 80, 112, 80, 170,
120 80, 170, 120, 170,
121 120, 170, 120, 176,
122
123 160, 112, 160, 170,
124 160, 170, 288, 170,
125 184, 170, 184, 176,
126 288, 170, 288, 176,
127
128 240, 112, 240, 160,
129 240, 160, 200, 160,
130 200, 160, 200, 176,
131
132 320, 112, 320, 176,
133
134 400, 112, 400, 140,
135 400, 140, 150, 140,
136 150, 140, 150, 176,
137
138 480, 112, 480, 146,
139 480, 146, 380, 146,
140 380, 146, 380, 176,
141
142 560, 112, 560, 152,
143 560, 152, 448, 152,
144 448, 152, 448, 176,
145
146 480, 208, 528, 208,
147 528, 208, 520, 200
148 };
149
150 static s8 QuadTexCoords[2*4] ATTRIBUTE_ALIGN(32) =
151 {
152 0, 0,
153 1, 0,
154 1, 1,
155 0, 1
156 };
157
158 /*---------------------------------------------------------------------------*
159 Color table
160 *---------------------------------------------------------------------------*/
161 #define COLOR_VTX 0
162 #define COLOR_VTXA 4
163 #define COLOR_REG 8
164 #define COLOR_REGA 12
165 #define COLOR_ONE 16
166 #define COLOR_HALF 17
167 #define COLOR_QUARTER 18
168 #define COLOR_ZERO 19
169 #define COLOR_RED 20
170 #define COLOR_GREEN 21
171 #define COLOR_BLUE 22
172 #define COLOR_BG 23
173
174 static GXColor ColorArray[] ATTRIBUTE_ALIGN(32) =
175 {
176 { 0x80, 0xFF, 0x80, 0x00 }, // Vertex colors (modified dynamically)
177 { 0xFF, 0x80, 0x00, 0x80 },
178 { 0x80, 0x00, 0x80, 0xFF },
179 { 0x00, 0x80, 0xFF, 0x80 },
180 { 0x00, 0x00, 0x00, 0x00 }, // Vertex alphas (modified dynamically)
181 { 0x00, 0x00, 0x00, 0x00 },
182 { 0x00, 0x00, 0x00, 0x00 },
183 { 0x00, 0x00, 0x00, 0x00 },
184 { 0xFF, 0x00, 0x00, 0x20 }, // Register colors (modified dynamically)
185 { 0x00, 0xFF, 0x00, 0x60 },
186 { 0x00, 0x00, 0xFF, 0xC0 },
187 { 0x00, 0x00, 0x00, 0x00 },
188 { 0x00, 0x00, 0x00, 0x00 }, // Register alphas (modified dynamically)
189 { 0x00, 0x00, 0x00, 0x00 },
190 { 0x00, 0x00, 0x00, 0x00 },
191 { 0xFF, 0xFF, 0xFF, 0xFF },
192 { 0xFF, 0xFF, 0xFF, 0xFF }, // One
193 { 0x80, 0x80, 0x80, 0x80 }, // Half
194 { 0x40, 0x40, 0x40, 0x40 }, // Quarter
195 { 0x00, 0x00, 0x00, 0x00 }, // Zero
196 { 0xFF, 0x00, 0x00, 0x00 }, // Red
197 { 0x00, 0xFF, 0x00, 0x00 }, // Green
198 { 0x00, 0x00, 0xFF, 0x00 }, // Blue
199 { 0x00, 0x00, 0x40, 0x00 } // BG
200 };
201
202 /*---------------------------------------------------------------------------*
203 Other data tables
204 *---------------------------------------------------------------------------*/
205 // The table used to display each component
206 static MyColorArgDispObj ColorArgDispTbl[NUM_TEVCLRARGS] =
207 {
208 // Argument, Display mode, ci offset, ci step
209 { GX_CC_C0, GX_PASSCLR, COLOR_REG, 0 },
210 { GX_CC_C1, GX_PASSCLR, COLOR_REG+1, 0 },
211 { GX_CC_C2, GX_PASSCLR, COLOR_REG+2, 0 },
212 { GX_CC_CPREV, GX_PASSCLR, COLOR_REG+3, 0 },
213 { GX_CC_A0, GX_PASSCLR, COLOR_REGA, 0 },
214 { GX_CC_A1, GX_PASSCLR, COLOR_REGA+1, 0 },
215 { GX_CC_A2, GX_PASSCLR, COLOR_REGA+2, 0 },
216 { GX_CC_APREV, GX_PASSCLR, COLOR_REGA+3, 0 },
217 { GX_CC_TEXC, GX_REPLACE, COLOR_ZERO, 0 },
218 { GX_CC_TEXA, GX_DECAL, COLOR_ZERO, 0 },
219 { GX_CC_RASC, GX_PASSCLR, COLOR_VTX, 1 },
220 { GX_CC_RASA, GX_PASSCLR, COLOR_VTXA, 1 },
221 { GX_CC_ONE, GX_PASSCLR, COLOR_ONE, 0 },
222 { GX_CC_HALF, GX_PASSCLR, COLOR_HALF, 0 },
223 { GX_CC_QUARTER, GX_PASSCLR, COLOR_QUARTER, 0 },
224 { GX_CC_ZERO, GX_PASSCLR, COLOR_ZERO, 0 }
225 };
226
227 static GXTevOp OpArgTbl[NUM_TEVOPS] =
228 {
229 GX_TEV_ADD, GX_TEV_SUB
230 };
231
232 static GXTevBias BiasArgTbl[NUM_TEVBIASES] =
233 {
234 GX_TB_ZERO, GX_TB_ADDHALF, GX_TB_SUBHALF
235 };
236
237 static GXTevScale ScaleArgTbl[NUM_TEVSCALES] =
238 {
239 GX_CS_SCALE_1, GX_CS_SCALE_2, GX_CS_SCALE_4, GX_CS_DIVIDE_2
240 };
241
242 static u32 ParameterMax[NUM_PARAMETERS] =
243 {
244 NUM_TEVCLRARGS, // Arg.D
245 NUM_TEVCLRARGS, // Arg.C
246 NUM_TEVCLRARGS, // Arg.B
247 NUM_TEVCLRARGS, // Arg.A
248 NUM_TEVOPS, // Operation
249 NUM_TEVBIASES, // Bias
250 NUM_TEVSCALES // Scale
251 };
252
253 /*---------------------------------------------------------------------------*
254 String data for messages
255 *---------------------------------------------------------------------------*/
256 static char* ArgNameStr[NUM_PARAMETERS+1] =
257 {
258 "Arg.D", "Arg.C", "Arg.B", "Arg.A",
259 "Op.", "Bias", "Scale", "Result"
260 };
261
262 static char* ColorArgStr[NUM_TEVCLRARGS] =
263 {
264 "C0", "C1", "C2", "CPREV",
265 "A0", "A1", "A2", "APREV",
266 "TEXC", "TEXA", "RASC", "RASA",
267 "ONE", "HALF", "QUARTER", "ZERO"
268 };
269
270 static char* OpArgStr[NUM_TEVOPS] =
271 {
272 "ADD", "SUB"
273 };
274
275 static char* BiasArgStr[NUM_TEVBIASES] =
276 {
277 "ZERO", "ADDHALF", "SUBHALF"
278 };
279
280 static char* ScaleArgStr[NUM_TEVSCALES] =
281 {
282 "SCALE_1", "SCALE_2", "SCALE_4", "DIVIDE_2"
283 };
284
285 /*---------------------------------------------------------------------------*
286 Global variables
287 *---------------------------------------------------------------------------*/
288 static MySceneCtrlObj SceneCtrl; // scene control parameters
289 static TPLPalettePtr MyTplObj = NULL; // texture palette
290
291 /*---------------------------------------------------------------------------*
292 Application main loop
293 *---------------------------------------------------------------------------*/
main(void)294 void main ( void )
295 {
296 DEMOInit(NULL); // Init the OS, game pad, graphics and video.
297
298 DrawInit(&SceneCtrl); // Initialize vertex formats, array pointers
299 // and default scene settings.
300
301 PrintIntro(); // Print demo directions
302
303 while(!(DEMOPadGetButton(0) & PAD_BUTTON_MENU))
304 {
305 DEMOBeforeRender();
306 DrawTick(&SceneCtrl); // Draw the model.
307 DEMODoneRender();
308 DEMOPadRead(); // Read controller
309 AnimTick(&SceneCtrl); // Do animation
310 }
311
312 OSHalt("End of demo");
313 }
314
315 /*---------------------------------------------------------------------------*
316 Functions
317 *---------------------------------------------------------------------------*/
318 /*---------------------------------------------------------------------------*
319 Name: DrawInit
320
321 Description: Initializes the vertex attribute format and sets up
322 the array pointer for the indexed data.
323 This function also initializes scene control parameters.
324
325 Arguments: sc : pointer to the structure of scene control parameters
326
327 Returns: none
328 *---------------------------------------------------------------------------*/
DrawInit(MySceneCtrlObj * sc)329 static void DrawInit( MySceneCtrlObj* sc )
330 {
331 TPLDescriptorPtr tdp;
332 GXRenderModeObj* rmode;
333 u32 i;
334 GXTexObj* tobj;
335
336 // Vertex Attribute (VTXFMT0 is used by DEMOPuts library)
337 GXSetVtxAttrFmt(GX_VTXFMT1, GX_VA_POS, GX_POS_XY, GX_S16, 0);
338 GXSetVtxAttrFmt(GX_VTXFMT1, GX_VA_CLR0, GX_CLR_RGBA, GX_RGBA8, 0);
339 GXSetVtxAttrFmt(GX_VTXFMT1, GX_VA_TEX0, GX_TEX_ST, GX_S8, 0);
340
341 // Array pointers
342 GXSetArray(GX_VA_POS, ModelVertices, 2 * sizeof(s16));
343 GXSetArray(GX_VA_TEX0, QuadTexCoords, 2 * sizeof(s8));
344 GXSetArray(GX_VA_CLR0, ColorArray, sizeof(GXColor));
345
346 // Get Screen Information defined in DEMOInit()
347 // This test is supposing height=480 (or near.)
348 rmode = DEMOGetRenderModeObj();
349 sc->screenWd = rmode->fbWidth; // Screen Width
350 sc->screenHt = rmode->efbHeight; // Screen Height
351
352 // Background color
353 GXSetCopyClear(ColorArray[COLOR_BG], MAX_Z);
354
355 // Load TPL file and initialize texture objects
356 TPLGetPalette(&MyTplObj, "gxTests/tev-00.tpl");
357 for ( i = 0 ; i < NUM_TEXTURES ; ++i )
358 {
359 tdp = TPLGet(MyTplObj, i);
360
361 if ( i < NUM_PANELTEX )
362 {
363 // Used as Tev status panel
364 tobj = &sc->tevState.panelTex[i];
365 }
366 else
367 {
368 // Used as sample input texture
369 tobj = &sc->sampleTex[i - NUM_PANELTEX];
370 }
371
372 GXInitTexObj(
373 tobj,
374 tdp->textureHeader->data,
375 tdp->textureHeader->width,
376 tdp->textureHeader->height,
377 (GXTexFmt)tdp->textureHeader->format,
378 tdp->textureHeader->wrapS, // s
379 tdp->textureHeader->wrapT, // t
380 GX_FALSE ); // Mipmap
381
382 GXInitTexObjLOD(
383 tobj,
384 tdp->textureHeader->minFilter,
385 tdp->textureHeader->magFilter,
386 tdp->textureHeader->minLOD,
387 tdp->textureHeader->maxLOD,
388 tdp->textureHeader->LODBias,
389 GX_FALSE,
390 tdp->textureHeader->edgeLODEnable,
391 GX_ANISO_1 );
392 }
393
394
395 // Default scene control parameter settings
396
397 // tev status
398 for ( i = 0 ; i < NUM_TEVCLRINS ; ++i )
399 {
400 sc->tevState.param[i] = 0;
401 }
402
403 // initial tev register color
404 for ( i = 0 ; i < NUM_TEVREGS ; ++i )
405 {
406 sc->tevState.regColor[i] = ColorArray[COLOR_REG+i];
407 }
408
409 // initial vertex color (used for singleframe)
410 for ( i = 0 ; i < 4 ; ++i )
411 {
412 sc->vtxColor[i] = ColorArray[COLOR_VTX+i];
413 }
414
415 // current texture number
416 sc->currentTex = 0;
417
418 // a counter for vertex color animation
419 sc->count = 0;
420
421 // cursor
422 sc->cur = 0;
423 }
424
425 /*---------------------------------------------------------------------------*
426 Name: DrawTick
427
428 Description: Draw the model by using given scene parameters
429
430 Arguments: sc : pointer to the structure of scene control parameters
431
432 Returns: none
433 *---------------------------------------------------------------------------*/
DrawTick(MySceneCtrlObj * sc)434 static void DrawTick( MySceneCtrlObj* sc )
435 {
436 u32 i;
437
438 // set projection to match screen space coordinate system
439 DEMOSetupScrnSpc(sc->screenWd, sc->screenHt, 100.0F);
440
441 // set up Z mode (which actually doesn't matter)
442 GXSetZMode(GX_ENABLE, GX_LEQUAL, GX_ENABLE);
443
444 // reflect the newest color data
445 GXInvalidateVtxCache();
446 for ( i = 0 ; i < NUM_TEVREGS ; ++i )
447 {
448 ColorArray[COLOR_REG+i] = sc->tevState.regColor[i];
449 DuplicateAlpha(ColorArray[COLOR_REGA+i], sc->tevState.regColor[i]);
450 }
451 for ( i = 0 ; i < 4 ; ++i )
452 {
453 ColorArray[COLOR_VTX+i] = sc->vtxColor[i];
454 DuplicateAlpha(ColorArray[COLOR_VTXA+i], sc->vtxColor[i]);
455 }
456
457 // set up Tev rendering mode
458 GXSetNumTevStages(1);
459 GXSetNumChans(1);
460 GXSetNumTexGens(1);
461 GXSetTevOrder(GX_TEVSTAGE0, GX_TEXCOORD0, GX_TEXMAP0, GX_COLOR0A0);
462 GXSetTexCoordGen(GX_TEXCOORD0, GX_TG_MTX2x4, GX_TG_TEX0, GX_IDENTITY);
463
464 // Draw quads that show color-inputs
465 GXLoadTexObj(&sc->sampleTex[sc->currentTex], GX_TEXMAP0);
466 DrawColorInputs(&sc->tevState);
467
468 // Draw a result quad
469 SetTev(&sc->tevState);
470 DrawResult(&sc->sampleTex[sc->currentTex]);
471
472 // Draw miscellaneous status
473 DrawMisc(&sc->tevState);
474
475 // Connection lines
476 DrawLines();
477
478 // Captions
479 DrawCaption(sc);
480 }
481
482 /*---------------------------------------------------------------------------*
483 Name: AnimTick
484
485 Description: Changes scene parameters according to the pad status.
486
487 Arguments: sc : pointer to the structure of scene control parameters
488
489 Returns: none
490 *---------------------------------------------------------------------------*/
AnimTick(MySceneCtrlObj * sc)491 static void AnimTick( MySceneCtrlObj* sc )
492 {
493 u32 i, max;
494 f32 theta;
495
496 u16 down = DEMOPadGetButtonDown(0);
497 u16 stick = DEMOPadGetDirsNew(0);
498
499 // vertex color animation
500 sc->count = ( sc->count + 4 ) % 360;
501 for ( i = 0 ; i < 4 ; ++i )
502 {
503 theta = ( sc->count + i * 90 ) * PI / 180.0F;
504 sc->vtxColor[i].r = (u8)( sinf(theta) * 127.0F + 128.0F);
505 sc->vtxColor[i].g = (u8)( cosf(theta) * 127.0F + 128.0F);
506 sc->vtxColor[i].b = (u8)(-sinf(theta) * 127.0F + 128.0F);
507 sc->vtxColor[i].a = (u8)(-cosf(theta) * 127.0F + 128.0F);
508 }
509
510 // move cursor
511 if ( ( down & PAD_BUTTON_RIGHT ) || ( stick & DEMO_STICK_RIGHT ) )
512 {
513 sc->cur += 1;
514 }
515 if ( ( down & PAD_BUTTON_LEFT ) || ( stick & DEMO_STICK_LEFT ) )
516 {
517 sc->cur += NUM_PARAMETERS - 1;
518 }
519 sc->cur %= NUM_PARAMETERS;
520
521 // change parameter
522 max = ParameterMax[sc->cur];
523 if ( down & PAD_BUTTON_X )
524 {
525 sc->tevState.param[sc->cur] += 1;
526 }
527 if ( down & PAD_BUTTON_Y )
528 {
529 sc->tevState.param[sc->cur] += max - 1;
530 }
531 sc->tevState.param[sc->cur] %= max;
532
533
534 // change texture/register color
535 if ( down & PAD_TRIGGER_R )
536 {
537 i = sc->tevState.param[sc->cur];
538
539 // change texture
540 if ( i == 8 || i == 9 || i >= 16 )
541 {
542 ++(sc->currentTex);
543 sc->currentTex %= NUM_SAMPLETEX;
544 }
545 // change register value (color)
546 if ( i >= 0 && i <= 3 )
547 {
548 sc->tevState.regColor[i].b ^= 0xFF;
549 if ( sc->tevState.regColor[i].b == 0 )
550 {
551 sc->tevState.regColor[i].g ^= 0xFF;
552 if ( sc->tevState.regColor[i].g == 0 )
553 {
554 sc->tevState.regColor[i].r ^= 0xFF;
555 }
556 }
557 }
558 // change register value (alpha)
559 if ( i >= 4 && i <= 7 )
560 {
561 sc->tevState.regColor[i%4].a += 0x20;
562 }
563 }
564
565 // make sure cache-main memory coherency
566 DCStoreRange(&ColorArray[0], 16 * sizeof(GXColor));
567 }
568
569 /*---------------------------------------------------------------------------*
570 Name: DrawColorInputs
571
572 Description: Draw quads that show color input source arguments
573
574 Arguments: ts : pointer to a tev state structure
575
576 Returns: none
577 *---------------------------------------------------------------------------*/
DrawColorInputs(MyTevStateObj * ts)578 static void DrawColorInputs( MyTevStateObj* ts )
579 {
580 Mtx mt;
581 u32 i, j;
582 u8 offset, step;
583
584 for ( i = 0 ; i < NUM_TEVCLRINS ; ++i )
585 {
586 // modelview matrix
587 MTXTrans(mt, (f32)ALI_COL(i), 48.0F, 0.0F);
588 GXLoadPosMtxImm(mt, GX_PNMTX0);
589
590 j = ts->param[i];
591 offset = ColorArgDispTbl[j].ciOffset;
592 step = ColorArgDispTbl[j].ciStep;
593 GXSetTevOp(GX_TEVSTAGE0, ColorArgDispTbl[j].mode);
594
595 DrawQuad(offset, step);
596 }
597 }
598
599 /*---------------------------------------------------------------------------*
600 Name: DrawMisc
601
602 Description: Draw miscellaneous status panels
603
604 Arguments: ts : pointer to a tev state structure
605
606 Returns: none
607 *---------------------------------------------------------------------------*/
DrawMisc(MyTevStateObj * ts)608 static void DrawMisc( MyTevStateObj* ts )
609 {
610 Mtx mt, ms;
611
612 // Use only texture
613 GXSetTevOp(GX_TEVSTAGE0, GX_REPLACE);
614
615 // Tev formula panel
616 MTXScale(ms, 6.0F, 1.0F, 1.0F);
617 MTXTrans(mt, ALI_COL(0)+48, 176, 0.0F);
618 MTXConcat(mt, ms, mt);
619 GXLoadPosMtxImm(mt, GX_PNMTX0);
620 GXLoadTexObj(&ts->panelTex[TEX_FORMULA], GX_TEXMAP0);
621 DrawQuad(COLOR_ZERO, 0);
622
623 // Operation panel
624 MTXTrans(mt, ALI_COL(4), 48.0F, 0.0F);
625 GXLoadPosMtxImm(mt, GX_PNMTX0);
626 GXLoadTexObj(&ts->panelTex[TEX_OPS + ts->param[4]], GX_TEXMAP0);
627 DrawQuad(COLOR_ZERO, 0);
628
629 // Bias panel
630 MTXTrans(mt, ALI_COL(5), 48.0F, 0.0F);
631 GXLoadPosMtxImm(mt, GX_PNMTX0);
632 GXLoadTexObj(&ts->panelTex[TEX_BIASES + ts->param[5]], GX_TEXMAP0);
633 DrawQuad(COLOR_ZERO, 0);
634
635 // Scale panel
636 MTXTrans(mt, ALI_COL(6), 48.0F, 0.0F);
637 GXLoadPosMtxImm(mt, GX_PNMTX0);
638 GXLoadTexObj(&ts->panelTex[TEX_SCALES + ts->param[6]], GX_TEXMAP0);
639 DrawQuad(COLOR_ZERO, 0);
640
641 }
642
643 /*---------------------------------------------------------------------------*
644 Name: DrawCaption
645
646 Description: Draw captions
647
648 Arguments: sc : pointer to the structure of scene control parameters
649
650 Returns: none
651 *---------------------------------------------------------------------------*/
DrawCaption(MySceneCtrlObj * sc)652 static void DrawCaption( MySceneCtrlObj* sc )
653 {
654 u32 i, j;
655 char* str;
656
657 DEMOInitCaption(DM_FT_OPQ, sc->screenWd, sc->screenHt);
658
659 // Argument names
660 for ( i = 0 ; i < NUM_PARAMETERS ; ++i )
661 {
662 DEMOPuts((s16)ALI_COL(i), 32, 0, ArgNameStr[i]);
663 }
664 DEMOPuts(ALI_COL(6), 160, 0, ArgNameStr[NUM_PARAMETERS]); // Result
665
666 // Tev stage color input arguments
667 for ( i = 0 ; i < NUM_PARAMETERS ; ++i )
668 {
669 j = sc->tevState.param[i];
670
671 if ( i < NUM_TEVCLRINS )
672 str = ColorArgStr[j];
673 else if ( i == NUM_TEVCLRINS )
674 str = OpArgStr[j];
675 else if ( i == NUM_TEVCLRINS + 1 )
676 str = BiasArgStr[j];
677 else if ( i == NUM_TEVCLRINS + 2 )
678 str = ScaleArgStr[j];
679
680 DEMOPuts((s16)(i*80+48), 120, 0, str);
681 }
682
683 // Cursor
684 DEMOPrintf((s16)(ALI_COL(sc->cur)-8), 32, 0, "%c", 0x7F);
685 }
686
687 /*---------------------------------------------------------------------------*
688 Name: DrawLines
689
690 Description: Draw connection lines
691
692 Arguments: none
693
694 Returns: none
695 *---------------------------------------------------------------------------*/
DrawLines(void)696 static void DrawLines( void )
697 {
698 u32 i;
699 Mtx mt;
700
701 // use only vertex color
702 GXSetNumTexGens(0);
703 GXSetTevOrder(GX_TEVSTAGE0, GX_TEXCOORD_NULL, GX_TEXMAP_NULL, GX_COLOR0A0);
704 GXSetTevOp(GX_TEVSTAGE0, GX_PASSCLR);
705
706 // reset modelview matrix
707 MTXIdentity(mt);
708 GXLoadPosMtxImm(mt, GX_PNMTX0);
709
710 // set vertex descriptor
711 GXClearVtxDesc();
712 GXSetVtxDesc(GX_VA_POS, GX_INDEX8);
713 GXSetVtxDesc(GX_VA_CLR0, GX_INDEX8);
714
715 // draw the quad
716 GXBegin(GX_LINES, GX_VTXFMT1, NUM_LINES*2);
717 for ( i = 0 ; i < NUM_LINES*2 ; ++i )
718 {
719 GXPosition1x8((u8)(i+4));
720 GXColor1x8(COLOR_ONE);
721 }
722 GXEnd();
723 }
724
725 /*---------------------------------------------------------------------------*
726 Name: DrawQuad
727
728 Description: Draw a textured & colored Quad. Color index lookup
729 values for each vertex can be specified by arguments.
730
731 Arguments: c_offset : offset value added to color index
732 c_step : step value added to color index per vertex
733
734 Returns: none
735 *---------------------------------------------------------------------------*/
DrawQuad(u8 c_offset,u8 c_step)736 static void DrawQuad( u8 c_offset, u8 c_step )
737 {
738 u8 i, ci;
739
740 ci = c_offset;
741
742 // set vertex descriptor
743 GXClearVtxDesc();
744 GXSetVtxDesc(GX_VA_POS, GX_INDEX8);
745 GXSetVtxDesc(GX_VA_CLR0, GX_INDEX8);
746 GXSetVtxDesc(GX_VA_TEX0, GX_INDEX8);
747
748 // draw the quad
749 GXBegin(GX_QUADS, GX_VTXFMT1, 4);
750 for ( i = 0 ; i < 4 ; ++i )
751 {
752 GXPosition1x8(i);
753 GXColor1x8(ci);
754 GXTexCoord1x8(i);
755
756 ci += c_step;
757 }
758 GXEnd();
759 }
760
761 /*---------------------------------------------------------------------------*
762 Name: DrawResult
763
764 Description: Draw a quad which shows color combination result
765
766 Arguments: tx : pointer to a texture object to be used
767
768 Returns: none
769 *---------------------------------------------------------------------------*/
DrawResult(GXTexObj * tx)770 static void DrawResult( GXTexObj* tx )
771 {
772 Mtx mt;
773
774 // Modelview matrix
775 MTXTrans(mt, ALI_COL(6), 176.0F, 0.0F);
776 GXLoadPosMtxImm(mt, GX_PNMTX0);
777
778 // Draw a quad by using actual vertex color
779 GXLoadTexObj(tx, GX_TEXMAP0);
780 DrawQuad(COLOR_VTX, 1);
781 }
782
783 /*---------------------------------------------------------------------------*
784 Name: SetTev
785
786 Description: Set up TEV color operation.
787
788 Arguments: ts : pointer to a tev state structure
789
790 Returns: none
791 *---------------------------------------------------------------------------*/
SetTev(MyTevStateObj * ts)792 static void SetTev( MyTevStateObj* ts )
793 {
794 // Detailed Tev settings
795 GXSetNumTevStages(1);
796 GXSetTevColor(GX_TEVREG0, ts->regColor[0]);
797 GXSetTevColor(GX_TEVREG1, ts->regColor[1]);
798 GXSetTevColor(GX_TEVREG2, ts->regColor[2]);
799 GXSetTevColor(GX_TEVPREV, ts->regColor[3]);
800
801 GXSetTevColorIn(
802 GX_TEVSTAGE0,
803 ColorArgDispTbl[ts->param[3]].arg, // a
804 ColorArgDispTbl[ts->param[2]].arg, // b
805 ColorArgDispTbl[ts->param[1]].arg, // c
806 ColorArgDispTbl[ts->param[0]].arg ); // d
807
808 GXSetTevColorOp(
809 GX_TEVSTAGE0,
810 OpArgTbl[ts->param[4]], // Op (Add/Sub)
811 BiasArgTbl[ts->param[5]], // Bias
812 ScaleArgTbl[ts->param[6]], // Scale
813 GX_TRUE, // Clamp
814 GX_TEVPREV ); // Output
815
816 // GXSetTevAlphaIn();
817 // GXSetTevAlphaOp();
818 }
819
820 /*---------------------------------------------------------------------------*
821 Name: PrintIntro
822
823 Description: Prints the directions on how to use this demo.
824
825 Arguments: none
826
827 Returns: none
828 *---------------------------------------------------------------------------*/
PrintIntro(void)829 static void PrintIntro( void )
830 {
831 OSReport("\n\n");
832 OSReport("************************************************\n");
833 OSReport("tev-one-op: one stage test with various inputs\n");
834 OSReport("************************************************\n");
835 OSReport("to quit hit the start button\n");
836 OSReport("\n");
837 OSReport("Stick/D-PAD : move the cursor\n");
838 OSReport("X/Y buttons : change parameters\n");
839 OSReport("R trigger : change texture (if selected)\n");
840 OSReport(" : change reg. color (if selected)\n");
841 OSReport("************************************************\n\n");
842 }
843
844 /*============================================================================*/
845