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