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