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