1 /*---------------------------------------------------------------------------*
2   Project:  Dolphin
3   File:     gd-indtex-gc.c
4 
5   Copyright 2003 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   $Log: gd-indtex-gc.c,v $
14   Revision 1.4  2007/05/24 05:23:30  yasuh-to
15   Fixed description.
16 
17   Revision 1.3  2006/02/20 04:13:09  mitu
18   changed include path from dolphin/ to revolution/.
19 
20   Revision 1.2  2006/02/13 02:49:31  hirose
21   A fix for TLUT data allocation problem.
22 
23   Revision 1.1  2006/02/08 11:19:43  mitu
24   1st version.
25 
26 
27     3     03/03/05 14:29 Hirose
28     More updates.
29 
30     2     03/02/28 17:42 Hirose
31     Updates.
32 
33     1     03/02/21 12:12 Hirose
34     Initial ver.
35 
36   $NoKeywords: $
37  *---------------------------------------------------------------------------*/
38 /*---------------------------------------------------------------------------*
39    gd-indtex
40      Displaylist demo with indirect texture commands
41      [Main source code for GAMECUBE executable]
42  *---------------------------------------------------------------------------*/
43 
44 
45 /*---------------------------------------------------------------------------*
46    Header files
47  *---------------------------------------------------------------------------*/
48 #include <demo.h>
49 #include <math.h>
50 #include <revolution/gd.h>
51 
52 #include "gd-indtex.h"
53 
54 /*---------------------------------------------------------------------------*
55    Macro definitions
56  *---------------------------------------------------------------------------*/
57 #define PI          3.14159265F
58 #define MAX_Z       0x00ffffff // max value of Z buffer
59 
60 #define NUM_CUBES       4
61 #define NUM_TORI        3
62 #define NUM_SPHERES     1
63 #define NUM_GOBJS       (NUM_CUBES+NUM_TORI+NUM_SPHERES)
64 #define BOUNDARY        400
65 
66 #define Clamp(val,min,max) \
67     ((val) = (((val) < (min)) ? (min) : ((val) > (max)) ? (max) : (val)))
68 
69 /*---------------------------------------------------------------------------*
70    Structure definitions
71  *---------------------------------------------------------------------------*/
72 // for Effect/Display List Manager
73 typedef struct
74 {
75     u16     baseViewWd;
76     u16     baseViewHt;
77     u16     copyTexWd;
78     u16     copyTexHt;
79     void*   dlPtr;
80     u32     dlSize;
81 } EffectManager;
82 
83 // for camera
84 typedef struct
85 {
86     Vec    location;
87     Vec    up;
88     Vec    target;
89     f32    left;
90     f32    top;
91     f32    znear;
92     f32    zfar;
93 } CameraConfig;
94 
95 typedef struct
96 {
97     CameraConfig  cfg;
98     Mtx           view;
99     Mtx44         proj;
100 } MyCameraObj;
101 
102 // for cube objects
103 typedef struct
104 {
105     Vec         pos;
106     Vec         vel;
107     Vec         axis;
108     f32         deg;
109 } MyCubeObj;
110 
111 // for entire scene control
112 typedef struct
113 {
114     MyCameraObj cam;
115     MyCubeObj   cube[NUM_CUBES];
116     s32         torusAngle[3];
117     u32         effectNo;
118 } MySceneCtrlObj;
119 
120 /*---------------------------------------------------------------------------*
121    Forward references
122  *---------------------------------------------------------------------------*/
123 void        main                ( void );
124 static void DrawInit            ( MySceneCtrlObj* sc );
125 static void DrawTick            ( MySceneCtrlObj* sc );
126 static void AnimTick            ( MySceneCtrlObj* sc );
127 static void DrawModels          ( MySceneCtrlObj* sc );
128 static void DrawFullScrQuad     ( void );
129 static void CopyTextureFromFB   ( EffectManager* em );
130 static void SetTextures         ( EffectManager* em );
131 static void SetCamera           ( MyCameraObj* cam );
132 static void SetScreenSpaceMode  ( void );
133 static void SetLight            ( void );
134 static void PrepareDL           ( void );
135 static void PrintIntro          ( void );
136 
137 /*---------------------------------------------------------------------------*
138   Model and texture data
139  *---------------------------------------------------------------------------*/
140 // Texture Data
141 u16 EffectTex0TLUT[];
142 u32 EffectTexture0[];
143 u8  EffectTexture1[];
144 u32 EffectTexture2A[];
145 u32 EffectTexture2B[];
146 u32 EffectTexture3[];
147 
148 
149 // for cube models
150 #define REG_AMBIENT  ColorArray[NUM_GOBJS]
151 #define LIGHT_COLOR  ColorArray[NUM_GOBJS+1]
152 #define BG_COLOR     ColorArray[NUM_GOBJS+2]
153 
154 static GXColor ColorArray[NUM_GOBJS+3] ATTRIBUTE_ALIGN(32) =
155 {
156     { 0x60, 0x60, 0xFF, 0xFF },     // CUBES
157     { 0x40, 0xC0, 0x80, 0xE0 },
158     { 0xE0, 0xA0, 0x80, 0xC0 },
159     { 0xFF, 0x60, 0xC0, 0xA0 },
160     { 0xFF, 0xA0, 0xFF, 0x80 },     // TORUS
161     { 0xA0, 0xFF, 0xFF, 0x60 },
162     { 0xFF, 0xFF, 0xA0, 0x40 },
163     { 0xE0, 0xE0, 0xE0, 0x20 },     // SPHERE
164     { 0x40, 0x40, 0x40, 0xFF },     // AMBIENT
165     { 0xFF, 0xFF, 0xFF, 0x00 },     // LIGHT
166     { 0x00, 0x00, 0x00, 0x00 }      // BACKGROUND
167 };
168 
169 static Vec CubeIniData[NUM_CUBES*3] =
170 {
171     // Position          Velocity                 Rotation axis
172     { -300, -150,  30 }, {  5.0F,  2.5F,  5.0F }, {  0.0F,  1.0F,  1.0F },
173     {  300, -150,  30 }, {  5.0F, -7.5F, -2.5F }, {  0.5F,  0.0F, -1.0F },
174     { -200,  250,   0 }, {  2.5F, -2.5F, -7.5F }, { -0.5F, -1.0F,  0.0F },
175     {  200,  250,   0 }, { -5.0F, -5.0F, -5.0F }, {  1.0F,  1.0F,  1.0F },
176 };
177 
178 // Effect Information
179 static EffectManager Effects[NUM_EFFECTS] =
180 {
181     { BASEVIEW0_WD, BASEVIEW0_HT, COPYTEX0_WD, COPYTEX0_HT, 0, 0 },
182     { BASEVIEW1_WD, BASEVIEW1_HT, COPYTEX1_WD, COPYTEX1_HT, 0, 0 },
183     { BASEVIEW2_WD, BASEVIEW2_HT, COPYTEX2_WD, COPYTEX2_HT, 0, 0 },
184     { BASEVIEW3_WD, BASEVIEW3_HT, COPYTEX3_WD, COPYTEX3_HT, 0, 0 },
185 };
186 
187 /*---------------------------------------------------------------------------*
188    Camera configuration
189  *---------------------------------------------------------------------------*/
190 static CameraConfig DefaultCamera =
191 {
192     {   0.0F, 0.0F, 800.0F }, // location
193     {   0.0F, 1.0F, 0.0F }, // up
194     {   0.0F, 0.0F, 0.0F }, // target
195     -160.0F,  // left
196      120.0F,  // top
197      200.0F,  // near
198     2000.0F   // far
199 };
200 
201 /*---------------------------------------------------------------------------*
202    Global variables
203  *---------------------------------------------------------------------------*/
204 static MySceneCtrlObj   SceneCtrl;                // scene control parameters
205 static u8*              TexBuffer;
206 
207 /*---------------------------------------------------------------------------*
208    Application main loop
209  *---------------------------------------------------------------------------*/
main(void)210 void main ( void )
211 {
212     DEMOInit(&GXNtsc480IntDf);  // Init the OS, game pad, graphics and video.
213 
214     DrawInit(&SceneCtrl); // Initialize vertex formats, array pointers
215                           // and default scene settings.
216 
217     PrintIntro();    // Print demo directions
218 
219     while(!(DEMOPadGetButton(0) & PAD_BUTTON_MENU))
220     {
221         DEMOBeforeRender();
222         DrawTick(&SceneCtrl);    // Draw the model.
223         DEMODoneRender();
224         DEMOPadRead();           // Read controller
225         AnimTick(&SceneCtrl);    // Do animation
226     }
227 
228     OSHalt("End of test");
229 }
230 
231 /*---------------------------------------------------------------------------*
232    Functions
233  *---------------------------------------------------------------------------*/
234 /*---------------------------------------------------------------------------*
235     Name:           DrawInit
236 
237     Description:    Initializes the vertex attribute format and sets up
238                     the array pointer for the indexed data.
239                     This function also initializes scene control parameters.
240 
241     Arguments:      sc : pointer to the structure of scene control parameters
242 
243     Returns:        none
244  *---------------------------------------------------------------------------*/
DrawInit(MySceneCtrlObj * sc)245 static void DrawInit( MySceneCtrlObj* sc )
246 {
247     u32             i;
248 
249     // Texture Buffer
250     TexBuffer = (u8*)OSAlloc(GXGetTexBufferSize(SCREEN_WD, SCREEN_HT, GX_TF_RGB5A3, GX_FALSE, 0));
251 
252     // Vertex Attribute
253     GXSetVtxAttrFmt(GX_VTXFMT0, GX_VA_POS, GX_POS_XYZ, GX_S16, 0);
254     GXSetVtxAttrFmt(GX_VTXFMT0, GX_VA_TEX0, GX_TEX_ST, GX_S16, 8);
255     GXSetVtxAttrFmt(GX_VTXFMT0, GX_VA_CLR0, GX_CLR_RGBA, GX_RGBA8, 0);
256 
257     GXSetVtxAttrFmt(GX_VTXFMT1, GX_VA_POS, GX_POS_XYZ, GX_S16, 0);
258     GXSetVtxAttrFmt(GX_VTXFMT1, GX_VA_TEX0, GX_TEX_ST, GX_S16, 8);
259     GXSetVtxAttrFmt(GX_VTXFMT1, GX_VA_CLR0, GX_CLR_RGBA, GX_RGBA8, 0);
260 
261     // Array Pointers and Strides
262     GXSetArray(GX_VA_CLR0, ColorArray, 4 * sizeof(u8));
263 
264     // Disable auto texcoord scale because they are set by display lists.
265     GXSetTexCoordScaleManually(GX_TEXCOORD0, GX_TRUE, 0, 0);
266     GXSetTexCoordScaleManually(GX_TEXCOORD1, GX_TRUE, 0, 0);
267     GXSetTexCoordScaleManually(GX_TEXCOORD2, GX_TRUE, 0, 0);
268 
269     // Pixel format and background color
270     GXSetPixelFmt(GX_PF_RGBA6_Z24, GX_ZC_LINEAR);
271     GXSetCopyClear(BG_COLOR, MAX_Z);
272     GXSetBlendMode(GX_BM_NONE, GX_BL_ONE, GX_BL_ZERO, GX_LO_SET);
273 
274     // Prepare effect display lists
275     PrepareDL();
276 
277 
278     // Default scene control parameter settings
279 
280     sc->effectNo = 0;
281 
282     // camera
283     sc->cam.cfg   = DefaultCamera;
284 
285     // cube objects
286     for ( i = 0 ; i < NUM_CUBES ; ++i )
287     {
288         sc->cube[i].pos  = CubeIniData[i*3];
289         sc->cube[i].vel  = CubeIniData[i*3+1];
290         sc->cube[i].axis = CubeIniData[i*3+2];
291         sc->cube[i].deg  = 0.0F;
292     }
293 
294     for ( i = 0 ; i < NUM_TORI ; ++i )
295     {
296         sc->torusAngle[i] = 0;
297     }
298 }
299 
300 /*---------------------------------------------------------------------------*
301     Name:           DrawTick
302 
303     Description:    Draw the model by using given scene parameters
304 
305     Arguments:      sc : pointer to the structure of scene control parameters
306 
307     Returns:        none
308  *---------------------------------------------------------------------------*/
DrawTick(MySceneCtrlObj * sc)309 static void DrawTick( MySceneCtrlObj* sc )
310 {
311     EffectManager* ef = &Effects[sc->effectNo];
312 
313     // Set up camera / viewport for the 1st pass.
314     SetCamera(&sc->cam);
315     GXSetViewport(0.0F, 0.0F, ef->baseViewWd, ef->baseViewHt, 0.0F, 1.0F);
316     GXSetScissor(0, 0, ef->baseViewWd, ef->baseViewHt);
317 
318     // Default matrix
319     GXSetCurrentMtx(GX_PNMTX0);
320 
321     // Draw models
322     DrawModels(sc);
323 
324     // Make sure every cubes are drawn
325     GXDrawDone();
326 
327     // Copyout
328     CopyTextureFromFB(ef);
329 
330     // Set up camera / viewport for the 2nd pass.
331     SetScreenSpaceMode();
332     GXSetViewport(0.0F, 0.0F, SCREEN_WD, SCREEN_HT, 0.0F, 1.0F);
333     GXSetScissor(0, 0, SCREEN_WD, SCREEN_HT);
334 
335     // Draw effect by using a GD display list.
336     SetTextures(ef);
337     GXCallDisplayList(ef->dlPtr, ef->dlSize);
338 
339     DrawFullScrQuad();
340 }
341 
342 /*---------------------------------------------------------------------------*
343     Name:           AnimTick
344 
345     Description:    Changes scene parameters according to the pad status.
346 
347     Arguments:      sc  : pointer to the structure of scene control parameters
348 
349     Returns:        none
350  *---------------------------------------------------------------------------*/
351 #define VelReflect(cmp) \
352     if ( sc->cube[i].pos.cmp < - BOUNDARY )                 \
353         sc->cube[i].vel.cmp = fabsf(sc->cube[i].vel.cmp);   \
354     if ( sc->cube[i].pos.cmp > BOUNDARY )                   \
355         sc->cube[i].vel.cmp = - fabsf(sc->cube[i].vel.cmp);
356 
AnimTick(MySceneCtrlObj * sc)357 static void AnimTick( MySceneCtrlObj* sc )
358 {
359     u32  i;
360 
361     // Effect mode
362     if ( DEMOPadGetButtonDown(0) & PAD_BUTTON_B )
363     {
364         sc->effectNo = ( sc->effectNo + 1 ) % NUM_EFFECTS;
365     }
366 
367     if ( DEMOPadGetButtonDown(0) & PAD_BUTTON_X )
368     {
369         sc->effectNo = ( sc->effectNo + NUM_EFFECTS - 1 ) % NUM_EFFECTS;
370     }
371 
372     if ( !(DEMOPadGetButton(0) & PAD_BUTTON_A) )
373     {
374         // Animate cubes
375         for ( i = 0 ; i < NUM_CUBES ; ++i )
376         {
377             // rotation
378             sc->cube[i].deg += 5;
379             if ( sc->cube[i].deg > 720 )
380             {
381                 sc->cube[i].deg -= 720;
382             }
383 
384             // position
385             VECAdd(&sc->cube[i].pos, &sc->cube[i].vel, &sc->cube[i].pos);
386 
387             // velocity
388             VelReflect(x);
389             VelReflect(y);
390             VelReflect(z);
391         }
392 
393         // Animate tori
394         for ( i = 0 ; i < NUM_TORI ; ++i )
395         {
396             sc->torusAngle[i] += (i+1);
397             if ( sc->torusAngle[i] > 360 )
398             {
399                 sc->torusAngle[i] -= 360;
400             }
401         }
402     }
403 }
404 
405 /*---------------------------------------------------------------------------*
406     Name:           DrawModels
407 
408     Description:    Draw models
409 
410     Arguments:      sc  : pointer to the structure of scene control parameters
411 
412     Returns:        none
413  *---------------------------------------------------------------------------*/
DrawModels(MySceneCtrlObj * sc)414 static void DrawModels( MySceneCtrlObj* sc )
415 {
416     u32     i;
417     Mtx     mt, mr, ms, mv, mvi;
418 
419     // enable lighting
420     SetLight();
421 
422     GXSetNumChans(1);
423     GXSetNumTexGens(0);
424     GXSetTevOrder(GX_TEVSTAGE0, GX_TEXCOORD_NULL, GX_TEXMAP_NULL, GX_COLOR0A0);
425     GXSetTevOp(GX_TEVSTAGE0, GX_PASSCLR);
426     GXSetAlphaCompare(GX_ALWAYS, 0, GX_AOP_OR, GX_ALWAYS, 0);
427     GXSetTevDirect(GX_TEVSTAGE0);
428     GXSetTevDirect(GX_TEVSTAGE1);
429     GXSetTevDirect(GX_TEVSTAGE2);
430     GXSetTevDirect(GX_TEVSTAGE3);
431     GXSetNumTevStages(1);
432     GXSetNumIndStages(0);
433 
434     MTXScale(ms, 100.0F, 100.0F, 100.0F);
435     MTXConcat(sc->cam.view, ms, mv);
436     MTXInvXpose(mv, mvi);
437     GXLoadPosMtxImm(mv, GX_PNMTX0);
438     GXLoadNrmMtxImm(mvi, GX_PNMTX0);
439     GXSetChanMatColor(GX_COLOR0A0, ColorArray[NUM_CUBES+NUM_TORI]);
440     GXDrawSphere1(2);
441 
442     MTXScale(ms, 220.0F, 220.0F, 220.0F);
443     MTXRotDeg(mr, 'Y', (s32)(sc->torusAngle[0]/2));
444     MTXConcat(ms, mr, ms);
445     MTXConcat(sc->cam.view, ms, mv);
446     MTXInvXpose(mv, mvi);
447     GXLoadPosMtxImm(mv, GX_PNMTX0);
448     GXLoadNrmMtxImm(mvi, GX_PNMTX0);
449     GXSetChanMatColor(GX_COLOR0A0, ColorArray[NUM_CUBES]);
450     GXDrawTorus(0.24F, 8, 16);
451 
452     MTXScale(ms, 330.0F, 330.0F, 330.0F);
453     MTXRotDeg(mr, 'X', (s32)(sc->torusAngle[1]/2));
454     MTXConcat(ms, mr, ms);
455     MTXConcat(sc->cam.view, ms, mv);
456     MTXInvXpose(mv, mvi);
457     GXLoadPosMtxImm(mv, GX_PNMTX0);
458     GXLoadNrmMtxImm(mvi, GX_PNMTX0);
459     GXSetChanMatColor(GX_COLOR0A0, ColorArray[NUM_CUBES+1]);
460     GXDrawTorus(0.15F, 8, 24);
461 
462     MTXScale(ms, 440.0F, 440.0F, 440.0F);
463     MTXRotDeg(mr, 'Y', (s32)(-sc->torusAngle[2]/2));
464     MTXConcat(ms, mr, ms);
465     MTXConcat(sc->cam.view, ms, mv);
466     MTXInvXpose(mv, mvi);
467     GXLoadPosMtxImm(mv, GX_PNMTX0);
468     GXLoadNrmMtxImm(mvi, GX_PNMTX0);
469     GXSetChanMatColor(GX_COLOR0A0, ColorArray[NUM_CUBES+2]);
470     GXDrawTorus(0.10F, 8, 24);
471 
472     for ( i = 0 ; i < NUM_CUBES ; ++i )
473     {
474         MTXTrans(mt, sc->cube[i].pos.x, sc->cube[i].pos.y, sc->cube[i].pos.z);
475         MTXConcat(sc->cam.view, mt, mv);
476         MTXScale(ms, 100.0F, 100.0F, 100.0F);
477         MTXConcat(mv, ms, mv);
478         MTXRotAxisDeg(mr, &sc->cube[i].axis, sc->cube[i].deg);
479         MTXConcat(mv, mr, mv);
480         GXLoadPosMtxImm(mv, GX_PNMTX0);
481         MTXInverse(mv, mvi);
482         MTXTranspose(mvi, mv);
483         GXLoadNrmMtxImm(mv, GX_PNMTX0);
484 
485         GXSetChanMatColor(GX_COLOR0A0, ColorArray[i]);
486 
487         GXDrawCube();
488     }
489 }
490 
491 /*---------------------------------------------------------------------------*
492     Name:           DrawFullScrQuad
493 
494     Description:    Draw a full-screen sized quad
495 
496     Arguments:      none
497 
498     Returns:        none
499  *---------------------------------------------------------------------------*/
DrawFullScrQuad(void)500 static void DrawFullScrQuad( void )
501 {
502     // Vertex descriptor
503     GXClearVtxDesc();
504     GXSetVtxDesc(GX_VA_POS, GX_DIRECT);
505     GXSetVtxDesc(GX_VA_TEX0, GX_DIRECT);
506 
507     // Draw a large quad
508     GXBegin(GX_QUADS, GX_VTXFMT1, 4);
509         GXPosition3s16(        0,         0, 0);
510         GXTexCoord2s16(0x0000, 0x0000);
511         GXPosition3s16(SCREEN_WD,         0, 0);
512         GXTexCoord2s16(0x0100, 0x0000);
513         GXPosition3s16(SCREEN_WD, SCREEN_HT, 0);
514         GXTexCoord2s16(0x0100, 0x0100);
515         GXPosition3s16(        0, SCREEN_HT, 0);
516         GXTexCoord2s16(0x0000, 0x0100);
517     GXEnd();
518 }
519 
520 /*---------------------------------------------------------------------------*
521     Name:           CopyTextureFromFB
522 
523     Description:    Copies texture from the frame buffer image
524 
525     Arguments:      em : a pointer to EffectManager structure
526 
527     Returns:        none
528  *---------------------------------------------------------------------------*/
CopyTextureFromFB(EffectManager * em)529 static void CopyTextureFromFB( EffectManager* em )
530 {
531     GXBool  filterMode;
532 
533     if ( em->baseViewWd == em->copyTexWd &&
534          em->baseViewHt == em->copyTexHt )
535     {
536         filterMode = GX_FALSE;
537     }
538     else
539     {
540         ASSERT( (em->baseViewWd == em->copyTexWd * 2) &&
541                 (em->baseViewHt == em->copyTexHt * 2) );
542 
543         filterMode = GX_TRUE;
544     }
545 
546     // Copy image
547     GXSetTexCopySrc(0, 0, em->baseViewWd, em->baseViewHt);
548     GXSetTexCopyDst(em->copyTexWd, em->copyTexHt, GX_TF_RGB5A3, filterMode);
549     GXCopyTex(TexBuffer, GX_TRUE);
550 }
551 
552 /*---------------------------------------------------------------------------*
553     Name:           SetTextures
554 
555     Description:    Set up textures
556 
557     Arguments:      em : a pointer to EffectManager structure
558 
559     Returns:        none
560  *---------------------------------------------------------------------------*/
SetTextures(EffectManager * em)561 static void SetTextures( EffectManager* em )
562 {
563     GXTexObj    txb, tx0, tx1, tx2a, tx2b, tx3;
564     GXTlutObj   tl0;
565 
566     // Base texture (copied from the EFB.)
567     GXInitTexObj(&txb, TexBuffer, em->copyTexWd, em->copyTexHt,
568                  GX_TF_RGB5A3, GX_CLAMP, GX_CLAMP, GX_FALSE);
569     GXInitTexObjFilter(&txb, GX_NEAR, GX_NEAR);
570     GXLoadTexObj(&txb, GX_TEXMAP0);
571 
572     // Effect texture 0
573     GXInitTlutObj(&tl0, EffectTex0TLUT, FXTEX0_TL_FMT, FXTEX0_TL_N);
574     GXLoadTlut(&tl0, GX_TLUT0);
575     GXInitTexObjCI(&tx0, EffectTexture0, FXTEX0_WD, FXTEX0_HT,
576                    FXTEX0_FMT, GX_REPEAT, GX_REPEAT, GX_FALSE, GX_TLUT0);
577     GXInitTexObjFilter(&tx0, GX_NEAR, GX_NEAR);
578     GXLoadTexObj(&tx0, GX_TEXMAP1);
579 
580     // Effect texture 1
581     GXInitTexObj(&tx1, EffectTexture1, FXTEX1_WD, FXTEX1_HT,
582                  FXTEX1_FMT, GX_CLAMP, GX_CLAMP, GX_FALSE);
583     GXInitTexObjFilter(&tx1, GX_NEAR, GX_NEAR);
584     GXLoadTexObj(&tx1, GX_TEXMAP2);
585 
586     // Effect texture 2-A
587     GXInitTexObj(&tx2a, EffectTexture2A, FXTEX2A_WD, FXTEX2A_HT,
588                  FXTEX2A_FMT, GX_MIRROR, GX_MIRROR, GX_FALSE);
589     GXInitTexObjFilter(&tx2a, GX_NEAR, GX_NEAR);
590     GXLoadTexObj(&tx2a, GX_TEXMAP3);
591 
592     // Effect texture 2-B
593     GXInitTexObj(&tx2b, EffectTexture2B, FXTEX2B_WD, FXTEX2B_HT,
594                  FXTEX2B_FMT, GX_REPEAT, GX_REPEAT, GX_FALSE);
595     GXInitTexObjFilter(&tx2b, GX_NEAR, GX_NEAR);
596     GXLoadTexObj(&tx2b, GX_TEXMAP4);
597 
598     // Effect texture 3
599     GXInitTexObj(&tx3, EffectTexture3, FXTEX3_WD, FXTEX3_HT,
600                  FXTEX3_FMT, GX_REPEAT, GX_REPEAT, GX_FALSE);
601     GXInitTexObjFilter(&tx3, GX_LINEAR, GX_LINEAR);
602     GXLoadTexObj(&tx3, GX_TEXMAP5);
603 }
604 
605 /*---------------------------------------------------------------------------*
606     Name:           SetCamera
607 
608     Description:    set view matrix and load projection matrix into hardware
609 
610     Arguments:      cam : pointer to the MyCameraObj structure
611 
612     Returns:        none
613  *---------------------------------------------------------------------------*/
SetCamera(MyCameraObj * cam)614 static void SetCamera( MyCameraObj* cam )
615 {
616     MTXLookAt(
617         cam->view,
618         &cam->cfg.location,
619         &cam->cfg.up,
620         &cam->cfg.target );
621 
622     MTXFrustum(
623         cam->proj,
624         cam->cfg.top,
625         - (cam->cfg.top),
626         cam->cfg.left,
627         - (cam->cfg.left),
628         cam->cfg.znear,
629         cam->cfg.zfar );
630     GXSetProjection(cam->proj, GX_PERSPECTIVE);
631 }
632 
633 /*---------------------------------------------------------------------------*
634     Name:           SetScreenSpaceMode
635 
636     Description:    set projection matrix up to screen coordinate system
637 
638     Arguments:      none
639 
640     Returns:        none
641  *---------------------------------------------------------------------------*/
SetScreenSpaceMode(void)642 static void SetScreenSpaceMode( void )
643 {
644     Mtx44  proj;
645     Mtx    mv;
646 
647     MTXOrtho( proj, 0.0F, SCREEN_HT, 0.0F, SCREEN_WD, 0.0F, - MAX_Z );
648     GXSetProjection( proj, GX_ORTHOGRAPHIC );
649     MTXIdentity(mv);
650     GXLoadPosMtxImm(mv, GX_PNMTX0);
651 }
652 
653 /*---------------------------------------------------------------------------*
654     Name:           SetLight
655 
656     Description:    Sets light objects and color channels
657 
658     Arguments:      none
659 
660     Returns:        none
661  *---------------------------------------------------------------------------*/
SetLight(void)662 static void SetLight( void )
663 {
664     GXLightObj  lobj;
665 
666     // set up light position and color
667     GXInitLightPos(&lobj, 0.0F, 5000.0F, 10000.0F); // almost parallel
668     GXInitLightColor(&lobj, LIGHT_COLOR);
669     GXLoadLightObjImm(&lobj, GX_LIGHT0);
670 
671     // channel setting
672     GXSetChanCtrl(
673         GX_COLOR0A0,
674         GX_ENABLE,        // enable channel
675         GX_SRC_REG,       // amb source
676         GX_SRC_REG,       // mat source
677         GX_LIGHT0,        // light mask
678         GX_DF_CLAMP,      // diffuse function
679         GX_AF_NONE);      // attenuation function
680     // channel ambient
681     GXSetChanAmbColor(GX_COLOR0A0, REG_AMBIENT);
682 }
683 
684 /*---------------------------------------------------------------------------*
685     Name:           PrepareDL
686 
687     Description:    [create mode] Allocate memory for display list and call
688                     the function CreateModelDL to create the display list.
689                     [load mode] Load GDL file from the disc.
690 
691     Arguments:      none
692 
693     Returns:        none
694  *---------------------------------------------------------------------------*/
PrepareDL(void)695 static void PrepareDL ( void )
696 {
697 #ifdef  LOAD_DL_FROM_FILE
698     //---------------------------------------------------------
699     // File mode : Read pre-generated GDL file from file
700     //---------------------------------------------------------
701     s32         err;
702     GDGList*    dlArray;
703     GDGList*    plArray;
704     u32         nDls, nPls;
705     u32         i;
706 
707     err = GDReadDLFile("gddemo/gdIndTex.gdl", &nDls, &nPls, &dlArray, &plArray);
708 
709     ASSERTMSG( err == 0, "GD file read error.\n" );
710 
711     // Check number of lists.
712     ASSERTMSG( ( nDls == NUM_DLS && nPls == NUM_PLS ),
713                "This data doesn't match requirement of this demo.\n" );
714 
715     // Obtain effect display lists.
716     for ( i = 0 ; i < NUM_DLS ; ++i )
717     {
718         Effects[i].dlPtr  = dlArray[i].ptr;
719         Effects[i].dlSize = dlArray[i].byteLength;
720         // No patch list in this demo.
721     }
722 
723 #else
724     //---------------------------------------------------------
725     // Create mode : Create display list in this application
726     //---------------------------------------------------------
727     u32  i;
728 
729     // Allocate memory for DLs.
730     for ( i = 0 ; i < NUM_EFFECTS ; ++i )
731     {
732         Effects[i].dlPtr = OSAlloc(EFFECTDL_SIZE_MAX);
733         ASSERTMSG(Effects[i].dlPtr, "Memory allocation failed.\n");
734     }
735 
736     Effects[0].dlSize = CreateEffectDL0(Effects[0].dlPtr);
737     OSReport("DL0 Size = %d\n", Effects[0].dlSize);
738 
739     Effects[1].dlSize = CreateEffectDL1(Effects[1].dlPtr);
740     OSReport("DL1 Size = %d\n", Effects[1].dlSize);
741 
742     Effects[2].dlSize = CreateEffectDL2(Effects[2].dlPtr);
743     OSReport("DL2 Size = %d\n", Effects[2].dlSize);
744 
745     Effects[3].dlSize = CreateEffectDL3(Effects[3].dlPtr);
746     OSReport("DL3 Size = %d\n", Effects[3].dlSize);
747 
748 #endif
749 }
750 
751 /*---------------------------------------------------------------------------*
752     Name:           PrintIntro
753 
754     Description:    Prints the directions on how to use this demo.
755 
756     Arguments:      none
757 
758     Returns:        none
759  *---------------------------------------------------------------------------*/
PrintIntro(void)760 static void PrintIntro( void )
761 {
762     OSReport("\n\n");
763     OSReport("********************************\n");
764     OSReport("   GD Indirect Texture demo\n");
765     OSReport("********************************\n");
766     OSReport("START  : Quit.\n");
767     OSReport("A      : Pause while pressed.\n");
768     OSReport("B/X    : Change effect mode.\n");
769     OSReport("********************************\n");
770 }
771 
772 /*============================================================================*/
773 
774 /*---------------------------------------------------------------------------*
775     Texture Data
776  *---------------------------------------------------------------------------*/
777 // Effect Texture 0 (CI TEXTURE + TLUT)
778 u16 EffectTex0TLUT[FXTEX0_TL_N] ATTRIBUTE_ALIGN(32) =
779 {
780     0x8080, 0x807F, 0x8081,
781     0x8180, 0x817F, 0x8181,
782     0x8080, 0x8080
783 };
784 
785 u32 EffectTexture0[] ATTRIBUTE_ALIGN(32) =
786 {
787     // Line 0-7
788     0x00001111,
789     0x00000111,
790     0x00000001,
791     0x00000000,
792     0x00000000,
793     0x00000000,
794     0x00000000,
795     0x00000000,
796 
797     0x11113333,
798     0x11133333,
799     0x13333333,
800     0x33333333,
801     0x33333333,
802     0x33333333,
803     0x33333333,
804     0x33333333,
805 
806     // Line 8-15
807     0x00000000,
808     0x00000000,
809     0x00000000,
810     0x00000000,
811     0x00000000,
812     0x00000002,
813     0x00000222,
814     0x00002222,
815 
816     0x33333333,
817     0x33333333,
818     0x33333333,
819     0x33333333,
820     0x33333333,
821     0x23333333,
822     0x22233333,
823     0x22223333,
824 
825     // Line 16-23
826     0x11110000,
827     0x11100000,
828     0x10000000,
829     0x00000000,
830     0x00000000,
831     0x00000000,
832     0x00000000,
833     0x00000000,
834 
835     0x00004444,
836     0x00000444,
837     0x00000004,
838     0x00000000,
839     0x00000000,
840     0x00000000,
841     0x00000000,
842     0x00000000,
843 
844     // Line 24-31
845     0x00000000,
846     0x00000000,
847     0x00000000,
848     0x00000000,
849     0x00000000,
850     0x20000000,
851     0x22200000,
852     0x22220000,
853 
854     0x00000000,
855     0x00000000,
856     0x00000000,
857     0x00000000,
858     0x00000000,
859     0x00000005,
860     0x00000555,
861     0x00005555,
862 };
863 
864 u8 EffectTexture1[] ATTRIBUTE_ALIGN(32) =
865 {
866     // intensity level 0
867     0x00, 0x00, 0x00, 0x00,
868     0x00, 0x00, 0x00, 0x00,
869     0x00, 0x00, 0x00, 0x00,
870     0x00, 0x00, 0x00, 0x00,
871     0x00, 0x00, 0x00, 0x00,
872     0x00, 0x00, 0x00, 0x00,
873     0x00, 0x00, 0x00, 0x00,
874     0x00, 0x00, 0x00, 0x00,
875 
876     0x00, 0x00, 0x00, 0x00,
877     0x00, 0x00, 0x00, 0x00,
878     0x00, 0x00, 0x00, 0x00,
879     0x00, 0x00, 0x00, 0x00,
880     0x00, 0x00, 0x00, 0x00,
881     0x00, 0x00, 0x00, 0x00,
882     0x00, 0x00, 0x00, 0x00,
883     0x00, 0x00, 0x00, 0x00,
884 
885     0x00, 0x00, 0x00, 0x00,
886     0x00, 0x00, 0x00, 0x00,
887     0x00, 0x00, 0x00, 0x00,
888     0x00, 0x00, 0x00, 0x00,
889     0x00, 0x00, 0x00, 0x00,
890     0x00, 0x00, 0x00, 0x00,
891     0x00, 0x00, 0x00, 0x00,
892     0x00, 0x00, 0x00, 0x00,
893 
894     0x00, 0x00, 0x00, 0x00,
895     0x00, 0x00, 0x00, 0x00,
896     0x00, 0x00, 0x00, 0x00,
897     0x00, 0x00, 0x00, 0x00,
898     0x00, 0x00, 0x00, 0x00,
899     0x00, 0x00, 0x00, 0x00,
900     0x00, 0x00, 0x00, 0x00,
901     0x00, 0x00, 0x00, 0x00,
902 
903     // intensity level 1
904     0x00, 0x00, 0x00, 0x00,
905     0x00, 0x00, 0xFF, 0xFF,
906     0x00, 0x00, 0x00, 0x0F,
907     0x00, 0x00, 0x00, 0x0F,
908     0x00, 0x00, 0x00, 0x0F,
909     0x00, 0x00, 0x00, 0x0F,
910     0x00, 0x00, 0x00, 0x0F,
911     0x00, 0x00, 0x00, 0x0F,
912 
913     0x00, 0x00, 0x00, 0x00,
914     0xFF, 0xF0, 0x00, 0x00,
915     0x00, 0x00, 0x00, 0x00,
916     0x00, 0x00, 0x00, 0x00,
917     0x00, 0x00, 0x00, 0x00,
918     0x00, 0x00, 0x00, 0x00,
919     0x00, 0x00, 0x00, 0x00,
920     0x00, 0x00, 0x00, 0x00,
921 
922     0x00, 0x00, 0x00, 0x0F,
923     0x00, 0x00, 0x00, 0x0F,
924     0x00, 0x00, 0x00, 0x0F,
925     0x00, 0x00, 0x00, 0x0F,
926     0x00, 0x00, 0x00, 0x0F,
927     0x00, 0x00, 0x00, 0x0F,
928     0x00, 0x00, 0xFF, 0xFF,
929     0x00, 0x00, 0x00, 0x00,
930 
931     0x00, 0x00, 0x00, 0x00,
932     0x00, 0x00, 0x00, 0x00,
933     0x00, 0x00, 0x00, 0x00,
934     0x00, 0x00, 0x00, 0x00,
935     0x00, 0x00, 0x00, 0x00,
936     0x00, 0x00, 0x00, 0x00,
937     0xFF, 0xF0, 0x00, 0x00,
938     0x00, 0x00, 0x00, 0x00,
939 
940     // intensity level 2
941     0x00, 0x00, 0x00, 0x00,
942     0x00, 0x00, 0xFF, 0xFF,
943     0x00, 0x0F, 0x00, 0x00,
944     0x00, 0xF0, 0x00, 0x00,
945     0x0F, 0x00, 0x00, 0x00,
946     0x0F, 0x00, 0x00, 0x00,
947     0x0F, 0x00, 0x00, 0x00,
948     0x0F, 0x00, 0x00, 0x00,
949 
950     0x00, 0x00, 0x00, 0x00,
951     0xFF, 0xFF, 0x00, 0x00,
952     0x00, 0x00, 0xF0, 0x00,
953     0x00, 0x00, 0x0F, 0x00,
954     0x00, 0x00, 0x00, 0xF0,
955     0x00, 0x00, 0x00, 0xF0,
956     0x00, 0x00, 0x00, 0xF0,
957     0x00, 0x00, 0x00, 0xF0,
958 
959     0x0F, 0x00, 0x00, 0x00,
960     0x0F, 0x00, 0x00, 0x00,
961     0x0F, 0x00, 0x00, 0x00,
962     0x0F, 0x00, 0x00, 0x00,
963     0x00, 0xF0, 0x00, 0x00,
964     0x00, 0x0F, 0x00, 0x00,
965     0x00, 0x00, 0xFF, 0xFF,
966     0x00, 0x00, 0x00, 0x00,
967 
968     0x00, 0x00, 0x00, 0xF0,
969     0x00, 0x00, 0x00, 0xF0,
970     0x00, 0x00, 0x00, 0xF0,
971     0x00, 0x00, 0x00, 0xF0,
972     0x00, 0x00, 0x0F, 0x00,
973     0x00, 0x00, 0xF0, 0x00,
974     0xFF, 0xFF, 0x00, 0x00,
975     0x00, 0x00, 0x00, 0x00,
976 
977     // intensity level 3
978     0x00, 0x00, 0x00, 0x00,
979     0x0F, 0xFF, 0xFF, 0xFF,
980     0x0F, 0xF0, 0x00, 0x0F,
981     0x00, 0x00, 0x00, 0x0F,
982     0x00, 0x00, 0x00, 0x0F,
983     0x00, 0x00, 0x00, 0x0F,
984     0x00, 0x00, 0x00, 0x0F,
985     0x00, 0x00, 0x00, 0x0F,
986 
987     0x00, 0x00, 0x00, 0x00,
988     0xFF, 0xFF, 0xFF, 0xF0,
989     0xF0, 0x00, 0x0F, 0xF0,
990     0xF0, 0x00, 0x00, 0x00,
991     0xF0, 0x00, 0x00, 0x00,
992     0xF0, 0x00, 0x00, 0x00,
993     0xF0, 0x00, 0x00, 0x00,
994     0xF0, 0x00, 0x00, 0x00,
995 
996     0x00, 0x00, 0x00, 0x0F,
997     0x00, 0x00, 0x00, 0x0F,
998     0x00, 0x00, 0x00, 0x0F,
999     0x00, 0x00, 0x00, 0x0F,
1000     0x00, 0x00, 0x00, 0x0F,
1001     0x00, 0x00, 0x00, 0x0F,
1002     0x00, 0x00, 0x00, 0x0F,
1003     0x00, 0x00, 0x00, 0x00,
1004 
1005     0xF0, 0x00, 0x00, 0x00,
1006     0xF0, 0x00, 0x00, 0x00,
1007     0xF0, 0x00, 0x00, 0x00,
1008     0xF0, 0x00, 0x00, 0x00,
1009     0xF0, 0x00, 0x00, 0x00,
1010     0xF0, 0x00, 0x00, 0x00,
1011     0xF0, 0x00, 0x00, 0x00,
1012     0x00, 0x00, 0x00, 0x00,
1013 
1014     // intensity level 4
1015     0x00, 0x00, 0x00, 0x00,
1016     0x0F, 0xFF, 0xFF, 0xFF,
1017     0x00, 0xFF, 0x00, 0x0F,
1018     0x00, 0xFF, 0x00, 0x00,
1019     0x00, 0xFF, 0x00, 0x00,
1020     0x00, 0xFF, 0x00, 0x00,
1021     0x00, 0xFF, 0x00, 0x00,
1022     0x00, 0xFF, 0x00, 0x00,
1023 
1024     0x00, 0x00, 0x00, 0x00,
1025     0x00, 0x00, 0x00, 0x00,
1026     0xFF, 0xF0, 0x00, 0x00,
1027     0x00, 0xFF, 0xF0, 0x00,
1028     0x00, 0x00, 0xFF, 0x00,
1029     0x00, 0x00, 0xFF, 0x00,
1030     0x00, 0x00, 0xFF, 0x00,
1031     0x00, 0x00, 0xFF, 0x00,
1032 
1033     0x00, 0xFF, 0x00, 0x00,
1034     0x00, 0xFF, 0x00, 0x00,
1035     0x00, 0xFF, 0x00, 0x00,
1036     0x00, 0xFF, 0x00, 0x00,
1037     0x00, 0xFF, 0x00, 0x00,
1038     0x00, 0xFF, 0x00, 0x0F,
1039     0x0F, 0xFF, 0xFF, 0xFF,
1040     0x00, 0x00, 0x00, 0x00,
1041 
1042     0x00, 0x00, 0xFF, 0x00,
1043     0x00, 0x00, 0xFF, 0x00,
1044     0x00, 0x00, 0xFF, 0x00,
1045     0x00, 0x00, 0xFF, 0x00,
1046     0x00, 0xFF, 0xF0, 0x00,
1047     0xFF, 0xF0, 0x00, 0x00,
1048     0x00, 0x00, 0x00, 0x00,
1049     0x00, 0x00, 0x00, 0x00,
1050 
1051     // intensity level 5
1052     0x00, 0x00, 0x00, 0x00,
1053     0x0F, 0xFF, 0xFF, 0xFF,
1054     0x0F, 0xFF, 0xFF, 0xFF,
1055     0x0F, 0xF0, 0x00, 0x00,
1056     0x0F, 0xF0, 0x00, 0x00,
1057     0x0F, 0xF0, 0x00, 0x00,
1058     0x0F, 0xF0, 0x00, 0x00,
1059     0x0F, 0xFF, 0xFF, 0xFF,
1060 
1061     0x00, 0x00, 0x00, 0x00,
1062     0xFF, 0xFF, 0xFF, 0xF0,
1063     0xFF, 0xFF, 0xFF, 0xF0,
1064     0x00, 0x00, 0x00, 0x00,
1065     0x00, 0x00, 0x00, 0x00,
1066     0x00, 0x00, 0x00, 0x00,
1067     0x00, 0x00, 0x00, 0x00,
1068     0xFF, 0xFF, 0xFF, 0x00,
1069 
1070     0x0F, 0xFF, 0xFF, 0xFF,
1071     0x0F, 0xF0, 0x00, 0x00,
1072     0x0F, 0xF0, 0x00, 0x00,
1073     0x0F, 0xF0, 0x00, 0x00,
1074     0x0F, 0xF0, 0x00, 0x00,
1075     0x0F, 0xFF, 0xFF, 0xFF,
1076     0x0F, 0xFF, 0xFF, 0xFF,
1077     0x00, 0x00, 0x00, 0x00,
1078 
1079     0xFF, 0xFF, 0xFF, 0x00,
1080     0x00, 0x00, 0x00, 0x00,
1081     0x00, 0x00, 0x00, 0x00,
1082     0x00, 0x00, 0x00, 0x00,
1083     0x00, 0x00, 0x00, 0x00,
1084     0xFF, 0xFF, 0xFF, 0xF0,
1085     0xFF, 0xFF, 0xFF, 0xF0,
1086     0x00, 0x00, 0x00, 0x00,
1087 
1088     // intensity level 6
1089     0x00, 0x00, 0x00, 0x00,
1090     0x00, 0x00, 0x00, 0x00,
1091     0x00, 0x00, 0x00, 0x0F,
1092     0x00, 0x00, 0x00, 0x0F,
1093     0x00, 0x00, 0x00, 0x0F,
1094     0x00, 0x00, 0x00, 0xFF,
1095     0x0F, 0xFF, 0xFF, 0xFF,
1096     0x00, 0xFF, 0xFF, 0xFF,
1097 
1098     0x00, 0x00, 0x00, 0x00,
1099     0x00, 0x00, 0x00, 0x00,
1100     0xF0, 0x00, 0x00, 0x00,
1101     0xF0, 0x00, 0x00, 0x00,
1102     0xF0, 0x00, 0x00, 0x00,
1103     0xFF, 0x00, 0x00, 0x00,
1104     0xFF, 0xFF, 0xFF, 0xF0,
1105     0xFF, 0xFF, 0xFF, 0x00,
1106 
1107     0x00, 0x0F, 0xFF, 0xFF,
1108     0x00, 0x00, 0x00, 0xFF,
1109     0x00, 0x00, 0x0F, 0xFF,
1110     0x00, 0x00, 0xFF, 0xFF,
1111     0x00, 0x0F, 0xFF, 0xF0,
1112     0x00, 0x0F, 0xF0, 0x00,
1113     0x00, 0xFF, 0x00, 0x00,
1114     0x00, 0x00, 0x00, 0x00,
1115 
1116     0xFF, 0xFF, 0xF0, 0x00,
1117     0xFF, 0x00, 0x00, 0x00,
1118     0xFF, 0xF0, 0x00, 0x00,
1119     0xFF, 0xFF, 0x00, 0x00,
1120     0x0F, 0xFF, 0xF0, 0x00,
1121     0x00, 0x0F, 0xF0, 0x00,
1122     0x00, 0x00, 0xFF, 0x00,
1123     0x00, 0x00, 0x00, 0x00,
1124 
1125     // intensity level 7
1126     0x00, 0x00, 0x00, 0x00,
1127     0x0F, 0xFF, 0xFF, 0x00,
1128     0x0F, 0xFF, 0xFF, 0x00,
1129     0x0F, 0xFF, 0xFF, 0xF0,
1130     0x0F, 0xFF, 0xFF, 0xF0,
1131     0x0F, 0xFF, 0xFF, 0xFF,
1132     0x0F, 0xFF, 0xF0, 0xFF,
1133     0x0F, 0xFF, 0xF0, 0xFF,
1134 
1135     0x00, 0x00, 0x00, 0x00,
1136     0x00, 0x0F, 0xFF, 0xF0,
1137     0x00, 0x0F, 0xFF, 0xF0,
1138     0x00, 0x0F, 0xFF, 0xF0,
1139     0x00, 0x0F, 0xFF, 0xF0,
1140     0xF0, 0x0F, 0xFF, 0xF0,
1141     0xF0, 0x0F, 0xFF, 0xF0,
1142     0xF0, 0x0F, 0xFF, 0xF0,
1143 
1144     0x0F, 0xFF, 0xF0, 0x0F,
1145     0x0F, 0xFF, 0xF0, 0x0F,
1146     0x0F, 0xFF, 0xF0, 0x0F,
1147     0x0F, 0xFF, 0xF0, 0x00,
1148     0x0F, 0xFF, 0xF0, 0x00,
1149     0x0F, 0xFF, 0xF0, 0x00,
1150     0x0F, 0xFF, 0xF0, 0x00,
1151     0x00, 0x00, 0x00, 0x00,
1152 
1153     0xFF, 0x0F, 0xFF, 0xF0,
1154     0xFF, 0x0F, 0xFF, 0xF0,
1155     0xFF, 0xFF, 0xFF, 0xF0,
1156     0x0F, 0xFF, 0xFF, 0xF0,
1157     0x0F, 0xFF, 0xFF, 0xF0,
1158     0x00, 0xFF, 0xFF, 0xF0,
1159     0x00, 0xFF, 0xFF, 0xF0,
1160     0x00, 0x00, 0x00, 0x00,
1161 
1162 };
1163 
1164 u32 EffectTexture2A[] ATTRIBUTE_ALIGN(32) =
1165 {
1166     0xF0000000,
1167     0xF0000000,
1168     0xF0000000,
1169     0xF0000000,
1170     0xE0000000,
1171     0x80000000,
1172     0x80000000,
1173     0x80000000,
1174 
1175     0x60000000,
1176     0x50000000,
1177     0x40000000,
1178     0x30000000,
1179     0x20000000,
1180     0x10000000,
1181     0x00000000,
1182     0x00000000
1183 };
1184 
1185 u32 EffectTexture2B[] ATTRIBUTE_ALIGN(32) =
1186 {
1187     // Tile pattern 0
1188     0x9AACCEFF,
1189     0x89AACCEF,
1190     0x889AACCE,
1191     0x7889AACC,
1192     0x77889AAC,
1193     0x677889AA,
1194     0x1677889A,
1195     0x11677889,
1196 
1197     0x9AACCEFF,
1198     0x89AACCEF,
1199     0x889AACCE,
1200     0x7889AACC,
1201     0x77889AAC,
1202     0x677889AA,
1203     0x1677889A,
1204     0x11677889,
1205 
1206     0x9AACCEFF,
1207     0x89AACCEF,
1208     0x889AACCE,
1209     0x7889AACC,
1210     0x77889AAC,
1211     0x677889AA,
1212     0x1677889A,
1213     0x11677889,
1214 
1215     0x9AACCEFF,
1216     0x89AACCEF,
1217     0x889AACCE,
1218     0x7889AACC,
1219     0x77889AAC,
1220     0x677889AA,
1221     0x1677889A,
1222     0x11677889,
1223 
1224     // Tile pattern 1
1225     0xFFFF268A,
1226     0xFFF468AF,
1227     0xFF268AFF,
1228     0xF468AFFF,
1229     0xF268AFFF,
1230     0xF468AFFF,
1231     0xF268AFFF,
1232     0xF468AFFF,
1233 
1234     0xFFFF1579,
1235     0xFFF3579F,
1236     0xFF1579FF,
1237     0xF3579FFF,
1238     0xF1579FFF,
1239     0xF3579FFF,
1240     0xF1579FFF,
1241     0xF3579FFF,
1242 
1243     0xFF268AFF,
1244     0xFFF468AF,
1245     0xFFFF268A,
1246     0xAFFFF468,
1247     0xAFFFF268,
1248     0xAFFFF468,
1249     0xAFFFF268,
1250     0xAFFFF468,
1251 
1252     0xFF1579FF,
1253     0xFFF3579F,
1254     0xFFFF1579,
1255     0x9FFFF357,
1256     0x9FFFF157,
1257     0x9FFFF357,
1258     0x9FFFF157,
1259     0x9FFFF357,
1260 
1261     // Tile pattern 2
1262     0xFFFFFFFF,
1263     0xFFFFFFFF,
1264     0xEEEEEEEE,
1265     0x88888888,
1266     0xFFFFFFFF,
1267     0xFFFFFFFF,
1268     0xCCCCCCCC,
1269     0x11111111,
1270 
1271     0xFFFFFFFF,
1272     0xFFFFFFFF,
1273     0xEEEEEEEE,
1274     0x88888888,
1275     0xFFFFFFFF,
1276     0xFFFFFFFF,
1277     0xCCCCCCCC,
1278     0x11111111,
1279 
1280     0xFFFFFFFF,
1281     0xFFFFFFFF,
1282     0xEEEEEEEE,
1283     0x88888888,
1284     0xFFFFFFFF,
1285     0xFFFFFFFF,
1286     0xCCCCCCCC,
1287     0x33333333,
1288 
1289     0xFFFFFFFF,
1290     0xFFFFFFFF,
1291     0xEEEEEEEE,
1292     0x88888888,
1293     0xFFFFFFFF,
1294     0xFFFFFFFF,
1295     0xCCCCCCCC,
1296     0x33333333,
1297 
1298     // Tile pattern 3
1299     0xFFFFFFFF,
1300     0xFFFFFFFF,
1301     0xFFFFFFFF,
1302     0xFFFFFFFF,
1303     0xFFFFFFFF,
1304     0xFFFFFFFF,
1305     0xFFFFFFFF,
1306     0xFFFFFFFF,
1307 
1308     0xFEDBDEFF,
1309     0xECA8ACEF,
1310     0xDA555ADF,
1311     0xB85158BF,
1312     0xDA555ADF,
1313     0xECA8ACEF,
1314     0xFEDBDEFF,
1315     0xFFFFFFFF,
1316 
1317     0xFEDBDEFF,
1318     0xECA8ACEF,
1319     0xDA555ADF,
1320     0xB85158BF,
1321     0xDA555ADF,
1322     0xECA8ACEF,
1323     0xFEDBDEFF,
1324     0xFFFFFFFF,
1325 
1326     0xFFFFFFFF,
1327     0xFFFFFFFF,
1328     0xFFFFFFFF,
1329     0xFFFFFFFF,
1330     0xFFFFFFFF,
1331     0xFFFFFFFF,
1332     0xFFFFFFFF,
1333     0xFFFFFFFF,
1334 
1335 };
1336 
1337 u32 EffectTexture3[] ATTRIBUTE_ALIGN(32) =
1338 {
1339     0x8C8C8C8C,
1340     0xC0000000,
1341     0x80000000,
1342     0xC0000000,
1343     0x80000000,
1344     0xC0000000,
1345     0x80000000,
1346     0xC0000000,
1347 
1348     0x8C8C8C8C,
1349     0x00000000,
1350     0x00000000,
1351     0x00000000,
1352     0x00000000,
1353     0x00000000,
1354     0x00000000,
1355     0x00000000,
1356 
1357     0x80000000,
1358     0xC0000000,
1359     0x80000000,
1360     0xC0000000,
1361     0x80000000,
1362     0xC0000000,
1363     0x80000000,
1364     0xC0000000,
1365 
1366     0x00000000,
1367     0x00000000,
1368     0x00000000,
1369     0x00000000,
1370     0x00000000,
1371     0x00000000,
1372     0x00000000,
1373     0x00000000,
1374 };
1375 
1376 /*============================================================================*/
1377 
1378 
1379