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