1 /*---------------------------------------------------------------------------*
2   Project:  Dolphin
3   File:     gd-indtex-create.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-create.c,v $
14   Revision 1.1  02/08/2006 11:19:43  mitu
15   1st version.
16 
17 
18     3     2003/03/05 14:29 Hirose
19     More updates.
20 
21     2     2003/02/28 17:42 Hirose
22     Updates.
23 
24     1     2003/02/21 12:12 Hirose
25     Initial ver.
26 
27   $NoKeywords: $
28  *---------------------------------------------------------------------------*/
29 /*---------------------------------------------------------------------------*
30    gd-indtex
31      Displaylist demo with indirect texture commands
32      [Displaylist creation function for both off-line/runtime]
33  *---------------------------------------------------------------------------*/
34 
35 
36 /*---------------------------------------------------------------------------*
37    Header files
38  *---------------------------------------------------------------------------*/
39 #include "gd-indtex.h"
40 
41 /*---------------------------------------------------------------------------*
42    Forward references
43  *---------------------------------------------------------------------------*/
44 
45 /*---------------------------------------------------------------------------*
46    Data
47  *---------------------------------------------------------------------------*/
48 
49 
50 /*---------------------------------------------------------------------------*
51    Functions
52  *---------------------------------------------------------------------------*/
53 /*---------------------------------------------------------------------------*
54     Name:           CreateEffectDL0
55 
56     Description:    Creates the display list used by the program.
57                     GD library is used for creating the display list.
58 
59     Arguments:      dlPtr : pointer to memory for the display list
60 
61     Returns:        actual size of the display list
62  *---------------------------------------------------------------------------*/
63 // Texcoord transform matrix data
64 static f32 EffDL0TgMtx[2][4] =
65 {
66     { (f32)(SCREEN_WD/FXTEX0_WD), 0.00F, 0.00F, 0.00F },
67     { 0.00F, (f32)(SCREEN_HT/FXTEX0_HT), 0.00F, 0.00F }
68 };
69 
70 // Indirect matrix data
71 static f32 EffDL0IndMtx[2][3] =
72 {
73     { 0.50F, 0.00F, 0.00F },
74     { 0.00F, 0.50F, 0.00F }
75 };
76 
77 /*---------------------------------------------------------------------------*/
CreateEffectDL0(void * dlPtr)78 u32 CreateEffectDL0 ( void* dlPtr )
79 {
80     GDLObj  dlObj;
81     u32     size;
82 
83     GDInitGDLObj(&dlObj, dlPtr, EFFECTDL_SIZE_MAX);
84     GDSetCurrent(&dlObj);
85 
86     // General mode (TexGens,Chans,TevStages,IndStages,CullMode)
87     GDSetGenMode2(2, 0, 1, 1, GX_CULL_BACK);
88 
89     // Texture coordinate
90     GDSetTexCoordGen(GX_TEXCOORD0, GX_TG_MTX2x4, GX_TG_TEX0, GX_FALSE, GX_PTIDENTITY);
91     GDSetTexCoordGen(GX_TEXCOORD1, GX_TG_MTX2x4, GX_TG_TEX0, GX_FALSE, GX_PTIDENTITY);
92     GDSetTexCoordScale(GX_TEXCOORD0, COPYTEX0_WD, COPYTEX0_HT);
93     GDSetTexCoordScale(GX_TEXCOORD1, FXTEX0_WD,  FXTEX0_HT);
94 
95     GDLoadTexMtxImm(EffDL0TgMtx, GX_TEXMTX0, GX_MTX2x4);
96     GDSetCurrentMtx(GX_PNMTX0, GX_IDENTITY, GX_TEXMTX0,  GX_IDENTITY, GX_IDENTITY,
97                                GX_IDENTITY, GX_IDENTITY, GX_IDENTITY, GX_IDENTITY);
98 
99     // Tev
100     GDSetTevOp(GX_TEVSTAGE0, GX_REPLACE);
101     GDSetTevOrder(GX_TEVSTAGE0,
102                   GX_TEXCOORD0,     GX_TEXMAP0,     GX_COLOR_NULL,  // STAGE0
103                   GX_TEXCOORD_NULL, GX_TEXMAP_NULL, GX_COLOR_NULL); // STAGE1
104 
105     // Indirect texture
106     GDSetIndTexOrder(GX_TEXCOORD1,     GX_TEXMAP1,      // STAGE0
107                      GX_TEXCOORD_NULL, GX_TEXMAP_NULL,  // STAGE1
108                      GX_TEXCOORD_NULL, GX_TEXMAP_NULL,  // STAGE2
109                      GX_TEXCOORD_NULL, GX_TEXMAP_NULL); // STAGE3
110     GDSetIndTexMtx(GX_ITM_0, EffDL0IndMtx, 1);
111     GDSetIndTexCoordScale(GX_INDTEXSTAGE0, GX_ITS_1, GX_ITS_1,  // STAGE0
112                                            GX_ITS_1, GX_ITS_1); // STAGE1
113     /*
114     GDSetTevIndirect(GX_TEVSTAGE0, GX_INDTEXSTAGE0, GX_ITF_8, GX_ITB_ST, GX_ITM_0,
115                      GX_ITW_OFF, GX_ITW_OFF, GX_FALSE, GX_FALSE, GX_ITBA_OFF);
116     */
117     GDSetTevIndWarp(GX_TEVSTAGE0, GX_INDTEXSTAGE0, GX_TRUE, GX_FALSE, GX_ITM_0);
118 
119     // close the DL (padding + flush)
120     GDPadCurr32();
121     GDFlushCurrToMem();
122 
123     // get actual DL size
124     size = GDGetCurrOffset();
125 
126     // release GD object
127     GDSetCurrent(NULL);
128 
129     return size;
130 }
131 
132 /*---------------------------------------------------------------------------*
133     Name:           CreateEffectDL1
134 
135     Description:    Creates the display list used by the program.
136                     GD library is used for creating the display list.
137 
138     Arguments:      dlPtr : pointer to memory for the display list
139 
140     Returns:        actual size of the display list
141  *---------------------------------------------------------------------------*/
142 
143 // Indirect matrix data
144 static f32 EffDL1IndMtx[2][3] =
145 {
146     { 0.00F, 0.00F, 0.00F },
147     { 0.00F, 0.00F, 0.50F }
148 };
149 
150 /*---------------------------------------------------------------------------*/
CreateEffectDL1(void * dlPtr)151 u32 CreateEffectDL1( void* dlPtr )
152 {
153     GDLObj  dlObj;
154     u32     size;
155 
156     GDInitGDLObj(&dlObj, dlPtr, EFFECTDL_SIZE_MAX);
157     GDSetCurrent(&dlObj);
158 
159     // General mode (TexGens,Chans,TevStages,IndStages,CullMode)
160     GDSetGenMode2(1, 0, 1, 1, GX_CULL_BACK);
161 
162     // Texture coordinate
163     GDSetTexCoordGen(GX_TEXCOORD0, GX_TG_MTX2x4, GX_TG_TEX0, GX_FALSE, GX_PTIDENTITY);
164     GDSetTexCoordScale(GX_TEXCOORD0, SCREEN_WD, SCREEN_HT);
165     GDSetCurrentMtx(GX_PNMTX0, GX_IDENTITY, GX_IDENTITY, GX_IDENTITY, GX_IDENTITY,
166                                GX_IDENTITY, GX_IDENTITY, GX_IDENTITY, GX_IDENTITY);
167 
168     // Tev
169     GDSetTevOp(GX_TEVSTAGE0, GX_REPLACE);
170     GDSetTevOrder(GX_TEVSTAGE0,
171                   GX_TEXCOORD0,     GX_TEXMAP2,     GX_COLOR_NULL,  // STAGE0
172                   GX_TEXCOORD_NULL, GX_TEXMAP_NULL, GX_COLOR_NULL); // STAGE1
173 
174     // Indirect texture
175     GDSetIndTexOrder(GX_TEXCOORD0,     GX_TEXMAP0,      // STAGE0
176                      GX_TEXCOORD_NULL, GX_TEXMAP_NULL,  // STAGE1
177                      GX_TEXCOORD_NULL, GX_TEXMAP_NULL,  // STAGE2
178                      GX_TEXCOORD_NULL, GX_TEXMAP_NULL); // STAGE3
179     GDSetIndTexCoordScale(GX_INDTEXSTAGE0, GX_ITS_16, GX_ITS_16,    // STAGE0
180                                            GX_ITS_1,  GX_ITS_1);    // STAGE1
181 
182     GDSetIndTexMtx(GX_ITM_1, EffDL1IndMtx, 5);
183     GDSetTevIndirect(GX_TEVSTAGE0, GX_INDTEXSTAGE0, GX_ITF_3, GX_ITB_NONE, GX_ITM_1,
184                      GX_ITW_16, GX_ITW_16, GX_FALSE, GX_FALSE, GX_ITBA_OFF);
185 
186     // close the DL (padding + flush)
187     GDPadCurr32();
188     GDFlushCurrToMem();
189 
190     // get actual DL size
191     size = GDGetCurrOffset();
192 
193     // release GD object
194     GDSetCurrent(NULL);
195 
196     return size;
197 }
198 
199 /*---------------------------------------------------------------------------*
200     Name:           CreateEffectDL2
201 
202     Description:    Creates the display list used by the program.
203                     GD library is used for creating the display list.
204 
205     Arguments:      dlPtr : pointer to memory for the display list
206 
207     Returns:        actual size of the display list
208  *---------------------------------------------------------------------------*/
209 // Texcoord transform matrix data
210 static f32 EffDL2TgMtx0[2][4] =
211 {
212     { 1.00F, 0.00F, 0.00F, 1.0F/(f32)SCREEN_WD },
213     { 0.00F, 1.00F, 0.00F, 1.0F/(f32)SCREEN_HT }
214 };
215 
216 // Indirect matrix data
217 static f32 EffDL2IndMtx0[2][3] =
218 {
219     { 0.00F, 0.00F, 0.00F },
220     { 0.50F, 0.00F, 0.00F }
221 };
222 
223 static f32 EffDL2IndMtx1[2][3] =
224 {
225     { 0.50F, 0.00F, 0.00F },
226     { 0.00F, 0.50F, 0.50F }
227 };
228 
229 static f32 EffDL2IndMtx2[2][3] =
230 {
231     { -0.50F,  0.00F,  0.00F },
232     {  0.00F, -0.50F, -0.50F }
233 };
234 
235 /*---------------------------------------------------------------------------*/
CreateEffectDL2(void * dlPtr)236 u32 CreateEffectDL2( void* dlPtr )
237 {
238     GDLObj  dlObj;
239     u32     size;
240 
241     GDInitGDLObj(&dlObj, dlPtr, EFFECTDL_SIZE_MAX);
242     GDSetCurrent(&dlObj);
243 
244     // General mode (TexGens,Chans,TevStages,IndStages,CullMode)
245     GDSetGenMode2(3, 0, 4, 2, GX_CULL_BACK);
246 
247     // Texture coordinate
248     GDSetTexCoordGen(GX_TEXCOORD0, GX_TG_MTX2x4, GX_TG_TEX0, GX_FALSE, GX_PTIDENTITY);
249     GDSetTexCoordGen(GX_TEXCOORD1, GX_TG_MTX2x4, GX_TG_TEX0, GX_FALSE, GX_PTIDENTITY);
250     GDSetTexCoordGen(GX_TEXCOORD2, GX_TG_MTX2x4, GX_TG_TEX0, GX_FALSE, GX_PTIDENTITY);
251     GDSetTexCoordScale(GX_TEXCOORD0, COPYTEX2_WD, COPYTEX2_HT);
252     GDSetTexCoordScale(GX_TEXCOORD1, COPYTEX2_WD, COPYTEX2_HT);
253     GDSetTexCoordScale(GX_TEXCOORD2, SCREEN_WD, SCREEN_HT);
254 
255     GDLoadTexMtxImm(EffDL2TgMtx0, GX_TEXMTX0, GX_MTX2x4);
256     GDSetCurrentMtx(GX_PNMTX0, GX_IDENTITY, GX_TEXMTX0,  GX_IDENTITY, GX_IDENTITY,
257                                GX_IDENTITY, GX_IDENTITY, GX_IDENTITY, GX_IDENTITY);
258 
259     // Tev
260     GDSetTevColorCalc(GX_TEVSTAGE0, GX_CC_ZERO, GX_CC_ZERO, GX_CC_ZERO, GX_CC_TEXC,
261                       GX_TEV_ADD, GX_TB_ZERO, GX_CS_SCALE_1, GX_ENABLE, GX_TEVREG2);
262     GDSetTevColorCalc(GX_TEVSTAGE1, GX_CC_C2, GX_CC_TEXC, GX_CC_ONE, GX_CC_ZERO,
263                       GX_TEV_COMP_GR16_GT, GX_TB_ZERO, GX_CS_SCALE_1, GX_ENABLE, GX_TEVREG1);
264     GDSetTevColorCalc(GX_TEVSTAGE2, GX_CC_ONE, GX_CC_C2, GX_CC_C1, GX_CC_ZERO,
265                       GX_TEV_ADD, GX_TB_ZERO, GX_CS_SCALE_1, GX_ENABLE, GX_TEVPREV);
266     GDSetTevColorCalc(GX_TEVSTAGE3, GX_CC_ZERO, GX_CC_CPREV, GX_CC_TEXC, GX_CC_ZERO,
267                       GX_TEV_ADD, GX_TB_ZERO, GX_CS_SCALE_1, GX_ENABLE, GX_TEVPREV);
268     GDSetTevOrder(GX_TEVSTAGE0,
269                   GX_TEXCOORD0, GX_TEXMAP0, GX_COLOR_NULL,                              // STAGE0
270                   GX_TEXCOORD2, GX_TEXMAP4, GX_COLOR_NULL);                             // STAGE1
271     GDSetTevOrder(GX_TEVSTAGE2,
272                   GX_TEXCOORD0, (GXTexMapID)(GX_TEXMAP3|GX_TEX_DISABLE), GX_COLOR_NULL, // STAGE2
273                   GX_TEXCOORD0, GX_TEXMAP3, GX_COLOR_NULL);                             // STAGE3
274 
275     // Indirect texture
276     GDSetIndTexOrder(GX_TEXCOORD0,     GX_TEXMAP0,      // STAGE0
277                      GX_TEXCOORD1,     GX_TEXMAP0,      // STAGE1
278                      GX_TEXCOORD_NULL, GX_TEXMAP_NULL,  // STAGE2
279                      GX_TEXCOORD_NULL, GX_TEXMAP_NULL); // STAGE3
280     GDSetIndTexCoordScale(GX_INDTEXSTAGE0, GX_ITS_1, GX_ITS_1,      // STAGE0
281                                            GX_ITS_1, GX_ITS_1);     // STAGE1
282     GDSetIndTexMtx(GX_ITM_0, EffDL2IndMtx0, 5);
283     GDSetIndTexMtx(GX_ITM_1, EffDL2IndMtx1, 2);
284     GDSetIndTexMtx(GX_ITM_2, EffDL2IndMtx2, 2);
285 
286     GDSetTevDirect(GX_TEVSTAGE0);
287     GDSetTevIndirect(GX_TEVSTAGE1, GX_INDTEXSTAGE0, GX_ITF_3, GX_ITB_NONE, GX_ITM_0,
288                      GX_ITW_16, GX_ITW_16, GX_FALSE, GX_FALSE, GX_ITBA_OFF);
289     GDSetTevIndirect(GX_TEVSTAGE2, GX_INDTEXSTAGE0, GX_ITF_3, GX_ITB_NONE, GX_ITM_1,
290                      GX_ITW_0, GX_ITW_0, GX_FALSE, GX_FALSE, GX_ITBA_OFF);
291     GDSetTevIndirect(GX_TEVSTAGE3, GX_INDTEXSTAGE1, GX_ITF_3, GX_ITB_NONE, GX_ITM_2,
292                      GX_ITW_0, GX_ITW_0, GX_TRUE,  GX_FALSE, GX_ITBA_OFF);
293 
294     // close the DL (padding + flush)
295     GDPadCurr32();
296     GDFlushCurrToMem();
297 
298     // get actual DL size
299     size = GDGetCurrOffset();
300 
301     // release GD object
302     GDSetCurrent(NULL);
303 
304     return size;
305 }
306 
307 /*---------------------------------------------------------------------------*
308     Name:           CreateEffectDL3
309 
310     Description:    Creates the display list used by the program.
311                     GD library is used for creating the display list.
312 
313     Arguments:      dlPtr : pointer to memory for the display list
314 
315     Returns:        actual size of the display list
316  *---------------------------------------------------------------------------*/
317 // Indirect matrix data
318 static f32 EffDL3IndMtx0[2][3] =
319 {
320     { 0.00F, -0.80F, -0.20F },
321     { 0.00F, -0.20F, -0.80F }
322 };
323 
324 static f32 EffDL3IndMtx1[2][3] =
325 {
326     { 0.00F,  0.60F,  0.15F },
327     { 0.00F,  0.15F,  0.60F }
328 };
329 
330 // Color data
331 static GXColor EffDL3RegColor = { 0x60, 0xFF, 0x40, 0xFF };
332 
333 /*---------------------------------------------------------------------------*/
CreateEffectDL3(void * dlPtr)334 u32 CreateEffectDL3( void* dlPtr )
335 {
336     GDLObj  dlObj;
337     u32     size;
338 
339     GDInitGDLObj(&dlObj, dlPtr, EFFECTDL_SIZE_MAX);
340     GDSetCurrent(&dlObj);
341 
342     // General mode (TexGens,Chans,TevStages,IndStages,CullMode)
343     GDSetGenMode2(1, 0, 2, 1, GX_CULL_BACK);
344 
345     // Texture coordinate
346     GDSetTexCoordGen(GX_TEXCOORD0, GX_TG_MTX2x4, GX_TG_TEX0, GX_FALSE, GX_PTIDENTITY);
347     GDSetTexCoordScale(GX_TEXCOORD0, SCREEN_WD, SCREEN_HT);
348     GDSetCurrentMtx(GX_PNMTX0, GX_IDENTITY, GX_IDENTITY, GX_IDENTITY, GX_IDENTITY,
349                                GX_IDENTITY, GX_IDENTITY, GX_IDENTITY, GX_IDENTITY);
350 
351     // Tev
352     GDSetTevColorCalc(GX_TEVSTAGE0, GX_CC_ZERO, GX_CC_C2, GX_CC_TEXC, GX_CC_ZERO,
353                       GX_TEV_ADD, GX_TB_ZERO, GX_CS_SCALE_1, GX_ENABLE, GX_TEVPREV);
354     GDSetTevColorCalc(GX_TEVSTAGE1, GX_CC_ZERO, GX_CC_TEXC, GX_CC_ONE, GX_CC_CPREV,
355                       GX_TEV_ADD, GX_TB_ZERO, GX_CS_SCALE_1, GX_ENABLE, GX_TEVPREV);
356     GDSetTevAlphaCalcAndSwap(GX_TEVSTAGE1,
357                              GX_CA_ZERO, GX_CA_ZERO, GX_CA_ZERO, GX_CA_RASA,
358                              GX_TEV_ADD, GX_TB_ZERO, GX_CS_SCALE_1, GX_ENABLE, GX_TEVPREV,
359                              GX_TEV_SWAP0, GX_TEV_SWAP0);
360     GDSetTevColor(GX_TEVREG2, EffDL3RegColor);
361     GDSetAlphaCompare(GX_GREATER, 0, GX_AOP_AND, GX_GREATER, 0);
362 
363     GDSetTevOrder(GX_TEVSTAGE0,
364                   GX_TEXCOORD0, GX_TEXMAP5, GX_COLOR_NULL,      // STAGE0
365                   GX_TEXCOORD0, GX_TEXMAP5, GX_ALPHA_BUMP);     // STAGE1
366 
367     // Indirect texture
368     GDSetIndTexOrder(GX_TEXCOORD0,     GX_TEXMAP0,      // STAGE0
369                      GX_TEXCOORD_NULL, GX_TEXMAP_NULL,  // STAGE1
370                      GX_TEXCOORD_NULL, GX_TEXMAP_NULL,  // STAGE2
371                      GX_TEXCOORD_NULL, GX_TEXMAP_NULL); // STAGE3
372     GDSetIndTexCoordScale(GX_INDTEXSTAGE0, GX_ITS_2, GX_ITS_2,      // STAGE0
373                                            GX_ITS_1, GX_ITS_1);     // STAGE1
374     GDSetIndTexMtx(GX_ITM_0, EffDL3IndMtx0, -4);
375     GDSetIndTexMtx(GX_ITM_1, EffDL3IndMtx1, -4);
376 
377     GDSetTevIndWarp(GX_TEVSTAGE0, GX_INDTEXSTAGE0, GX_FALSE, GX_FALSE, GX_ITM_0);
378     GDSetTevIndirect(GX_TEVSTAGE1, GX_INDTEXSTAGE0, GX_ITF_8, GX_ITB_NONE, GX_ITM_1,
379                      GX_ITW_OFF, GX_ITW_OFF, GX_FALSE, GX_FALSE, GX_ITBA_S);
380 
381     // close the DL (padding + flush)
382     GDPadCurr32();
383     GDFlushCurrToMem();
384 
385     // get actual DL size
386     size = GDGetCurrOffset();
387 
388     // release GD object
389     GDSetCurrent(NULL);
390 
391     return size;
392 }
393 
394 /*============================================================================*/
395