1 /*---------------------------------------------------------------------------*
2 Project: TwlSDK - GX - demos - UnitTours/CurrentMtx
3 File: main.c
4
5 Copyright 2003-2008 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 $Date:: 2008-09-18#$
14 $Rev: 8573 $
15 $Author: okubata_ryoma $
16 *---------------------------------------------------------------------------*/
17 //---------------------------------------------------------------------------
18 // A sample to get current matrix.
19 //
20 // One cube is displayed.
21 // And you can see matrix data on time.
22 //
23 // HOWTO:
24 // 1. Call "G3X_GetClipMtx" to get current clip matrix.
25 // 2. Call "G3X_GetVectorMtx" to get current vector matrix.
26 //
27 // OPERATION:
28 // 1. Push A button to see current clip matrix data on debug window.
29 // 2. Push B button to see current vector matrix data on debug window.
30 //
31 //---------------------------------------------------------------------------
32 #ifdef SDK_TWL
33 #include <twl.h>
34 #else
35 #include <nitro.h>
36 #endif
37 #include "DEMO.h"
38 #include "tex_32768.h"
39
40 //---------------------------------------------------------------------------
41 // Cube model data
42 //---------------------------------------------------------------------------
43 // Vertex data
44 static s16 s_Vertex[3 * 8] = {
45 FX16_ONE, FX16_ONE, FX16_ONE,
46 FX16_ONE, FX16_ONE, -FX16_ONE,
47 FX16_ONE, -FX16_ONE, FX16_ONE,
48 FX16_ONE, -FX16_ONE, -FX16_ONE,
49 -FX16_ONE, FX16_ONE, FX16_ONE,
50 -FX16_ONE, FX16_ONE, -FX16_ONE,
51 -FX16_ONE, -FX16_ONE, FX16_ONE,
52 -FX16_ONE, -FX16_ONE, -FX16_ONE
53 };
54 // Normal data
55 static VecFx10 s_Normal[6] = {
56 GX_VECFX10(0, 0, FX32_ONE - 1),
57 GX_VECFX10(0, FX32_ONE - 1, 0),
58 GX_VECFX10(FX32_ONE - 1, 0, 0),
59 GX_VECFX10(0, 0, -FX32_ONE + 1),
60 GX_VECFX10(0, -FX32_ONE + 1, 0),
61 GX_VECFX10(-FX32_ONE + 1, 0, 0)
62 };
63 // Texture coordinate data
64 static GXSt s_TextureCoord[] = {
65 GX_ST(0, 0),
66 GX_ST(0, 64 * FX32_ONE),
67 GX_ST(64 * FX32_ONE, 0),
68 GX_ST(64 * FX32_ONE, 64 * FX32_ONE)
69 };
70
71 //---------------------------------------------------------------------------
72 // Set vertex coordinate.
73 // input:
74 // idx: ID of vertex data
75 //---------------------------------------------------------------------------
Vertex(int idx)76 inline void Vertex(int idx)
77 {
78 G3_Vtx(s_Vertex[idx * 3], s_Vertex[idx * 3 + 1], s_Vertex[idx * 3 + 2]);
79 }
80
81 //---------------------------------------------------------------------------
82 // Set normal setting.
83 // input:
84 // idx: ID of normal data
85 //---------------------------------------------------------------------------
Normal(int idx)86 inline void Normal(int idx)
87 {
88 G3_Direct1(G3OP_NORMAL, s_Normal[idx]);
89 }
90
91 //---------------------------------------------------------------------------
92 // Set texture coordinate.
93 // input:
94 // idx: ID of texture data
95 //---------------------------------------------------------------------------
TextureCoord(int idx)96 inline void TextureCoord(int idx)
97 {
98 G3_Direct1(G3OP_TEXCOORD, s_TextureCoord[idx]);
99 }
100
101 //---------------------------------------------------------------------------
102 // Draw a cube and set texture.
103 //---------------------------------------------------------------------------
DrawCube(void)104 static void DrawCube(void)
105 {
106 G3_Begin(GX_BEGIN_QUADS); // start to set vertex.(use square polygon)
107 {
108 TextureCoord(1);
109 Normal(0);
110 Vertex(2);
111 TextureCoord(0);
112 Normal(0);
113 Vertex(0);
114 TextureCoord(2);
115 Normal(0);
116 Vertex(4);
117 TextureCoord(3);
118 Normal(0);
119 Vertex(6);
120
121 TextureCoord(1);
122 Normal(3);
123 Vertex(7);
124 TextureCoord(0);
125 Normal(3);
126 Vertex(5);
127 TextureCoord(2);
128 Normal(3);
129 Vertex(1);
130 TextureCoord(3);
131 Normal(3);
132 Vertex(3);
133
134 TextureCoord(1);
135 Normal(5);
136 Vertex(6);
137 TextureCoord(0);
138 Normal(5);
139 Vertex(4);
140 TextureCoord(2);
141 Normal(5);
142 Vertex(5);
143 TextureCoord(3);
144 Normal(5);
145 Vertex(7);
146
147 TextureCoord(1);
148 Normal(2);
149 Vertex(3);
150 TextureCoord(0);
151 Normal(2);
152 Vertex(1);
153 TextureCoord(2);
154 Normal(2);
155 Vertex(0);
156 TextureCoord(3);
157 Normal(2);
158 Vertex(2);
159
160 TextureCoord(1);
161 Normal(1);
162 Vertex(5);
163 TextureCoord(0);
164 Normal(1);
165 Vertex(4);
166 TextureCoord(2);
167 Normal(1);
168 Vertex(0);
169 TextureCoord(3);
170 Normal(1);
171 Vertex(1);
172
173 TextureCoord(1);
174 Normal(4);
175 Vertex(6);
176 TextureCoord(0);
177 Normal(4);
178 Vertex(7);
179 TextureCoord(2);
180 Normal(4);
181 Vertex(3);
182 TextureCoord(3);
183 Normal(4);
184 Vertex(2);
185 }
186 G3_End(); // end
187 }
188
189 //---------------------------------------------------------------------------
190 // VBlank interrupt function:
191 //
192 // Interrupt handlers are registered on the interrupt table by OS_SetIRQFunction.
193 // OS_EnableIrqMask selects IRQ interrupts to enable, and
194 // OS_EnableIrq enables IRQ interrupts.
195 // Notice that you have to call 'OS_SetIrqCheckFlag' to check a VBlank interrupt.
196 //---------------------------------------------------------------------------
VBlankIntr(void)197 void VBlankIntr(void)
198 {
199 // Set flag which checks VBlank interrupt.
200 OS_SetIrqCheckFlag(OS_IE_V_BLANK);
201 }
202
203 //---------------------------------------------------------------------------
204 // main
205 //---------------------------------------------------------------------------
206 #ifdef SDK_CW_WA_CONSTPOOLS
207 #pragma optimization_level 1
208 #endif
209 #ifdef SDK_TWL
TwlMain(void)210 void TwlMain(void)
211 #else
212 void NitroMain(void)
213 #endif
214 {
215 unsigned int count = 0;
216 u32 myTexAddr = 0x00000; // Address of texture image slot
217 u16 Rotate = 0;
218
219 // Initialize
220 DEMOInitCommon();
221 DEMOInitVRAM();
222 DEMOInitDisplay3D();
223
224 // Load texture image into texture image slot.
225 GX_BeginLoadTex();
226 {
227 GX_LoadTex((void *)&tex_32768_64x64[0], // Src address
228 myTexAddr, // Destination address
229 8192); // Size to load
230 }
231 GX_EndLoadTex();
232
233 DEMOStartDisplay();
234
235 // main loop
236 while (1)
237 {
238 G3X_Reset();
239 Rotate += 256;
240
241 // Read input
242 DEMOReadKey();
243 #ifdef SDK_AUTOTEST // code for auto test
244 {
245 const EXTKeys keys[8] =
246 { {0, 40}, {PAD_BUTTON_A, 1}, {0, 40}, {PAD_BUTTON_B, 1}, {0, 0} };
247 EXT_AutoKeys(keys, &gKeyWork.press, &gKeyWork.trigger);
248 }
249 #endif
250
251 // get current clip matrix
252 if (DEMO_IS_TRIG(PAD_BUTTON_A))
253 {
254 MtxFx44 m;
255 s32 result;
256 while (1)
257 {
258 //---------------------------------------------------------------------------
259 // get current clip matrix
260 result = G3X_GetClipMtx(&m);
261 //---------------------------------------------------------------------------
262 if (!result)
263 {
264 OS_Printf("mssg%d:Current Clip Matrix\n", count++);
265 OS_Printf("mssg%d:%d, %d, %d, %d\n", count++, m._00, m._01, m._02, m._03);
266 OS_Printf("mssg%d:%d, %d, %d, %d\n", count++, m._10, m._11, m._12, m._13);
267 OS_Printf("mssg%d:%d, %d, %d, %d\n", count++, m._20, m._21, m._22, m._23);
268 OS_Printf("mssg%d:%d, %d, %d, %d\n\n", count++, m._30, m._31, m._32, m._33);
269
270 #ifdef SDK_AUTOTEST
271 EXT_CompPrint("5321, 0, 0, 0", "%d, %d, %d, %d", m._00, m._01, m._02, m._03);
272 EXT_CompPrint("0, 7094, 0, 0", "%d, %d, %d, %d", m._10, m._11, m._12, m._13);
273 EXT_CompPrint("0, 0, -4117, -4096", "%d, %d, %d, %d", m._20, m._21, m._22,
274 m._23);
275 EXT_CompPrint("0, 0, -8213, 0", "%d, %d, %d, %d", m._30, m._31, m._32, m._33);
276 #endif
277 break;
278 }
279 }
280 }
281 // get current vector matrix
282 if (DEMO_IS_TRIG(PAD_BUTTON_B))
283 {
284 MtxFx33 m;
285 s32 result;
286
287 while (1)
288 {
289 //---------------------------------------------------------------------------
290 // get current vector matrix
291 result = G3X_GetVectorMtx(&m);
292 //---------------------------------------------------------------------------
293 if (!result)
294 {
295 OS_Printf("mssg%d:Current Vector Matrix\n", count++);
296 OS_Printf("mssg%d:%d, %d, %d\n", count++, m._00, m._01, m._02);
297 OS_Printf("mssg%d:%d, %d, %d\n", count++, m._10, m._11, m._12);
298 OS_Printf("mssg%d:%d, %d, %d\n\n", count++, m._20, m._21, m._22);
299
300 #ifdef SDK_AUTOTEST
301 EXT_CompPrint("4096, 0, 0", "%d, %d, %d", m._00, m._01, m._02);
302 EXT_CompPrint("0, 4096, 0", "%d, %d, %d", m._10, m._11, m._12);
303 EXT_CompPrint("0, 0, 4096", "%d, %d, %d", m._20, m._21, m._22);
304 #endif
305 break;
306 }
307 }
308 }
309
310 // Camera setting
311 {
312 VecFx32 Eye = { 0, 0, FX32_ONE }; // Sight position
313 VecFx32 at = { 0, 0, 0 }; // Viewpoint
314 VecFx32 vUp = { 0, FX32_ONE, 0 }; // Up
315 G3_LookAt(&Eye, &vUp, &at, NULL); // Sight setting
316 }
317
318 // Light setting
319 G3_LightVector(GX_LIGHTID_0, 0, -FX32_ONE + 1, 0);
320 G3_LightColor(GX_LIGHTID_0, GX_RGB(31, 31, 31));
321
322 // Matrix setting
323 G3_MtxMode(GX_MTXMODE_TEXTURE);
324 G3_Identity();
325 G3_MtxMode(GX_MTXMODE_POSITION_VECTOR);
326 G3_PushMtx();
327
328 // Rotate and translate cube
329 {
330 fx16 s = FX_SinIdx(Rotate);
331 fx16 c = FX_CosIdx(Rotate);
332
333 G3_Translate(0, 0, -5 * FX32_ONE);
334
335 G3_RotX(s, c);
336 G3_RotY(s, c);
337 G3_RotZ(s, c);
338 }
339
340 // Draw setting
341 G3_MaterialColorDiffAmb(GX_RGB(31, 31, 31), // Diffuse
342 GX_RGB(16, 16, 16), // Ambient
343 TRUE); // Color
344 G3_MaterialColorSpecEmi(GX_RGB(16, 16, 16), // Specular
345 GX_RGB(0, 0, 0), // Emission
346 FALSE); // Shininess
347 G3_TexImageParam(GX_TEXFMT_DIRECT, // Texture format
348 GX_TEXGEN_TEXCOORD, // Texture generation
349 GX_TEXSIZE_S64, // Texture width
350 GX_TEXSIZE_T64, // Texture height
351 GX_TEXREPEAT_NONE, // Texture repeat
352 GX_TEXFLIP_NONE, // Texture flip
353 GX_TEXPLTTCOLOR0_USE, // Palette color
354 myTexAddr); // Texture address
355 G3_PolygonAttr(GX_LIGHTMASK_0, // Light
356 GX_POLYGONMODE_MODULATE, // Polygon mode
357 GX_CULL_NONE, // Culling
358 0, // Polygon ID
359 31, // Alpha
360 GX_POLYGON_ATTR_MISC_NONE); // Misc
361
362 // Draw cube
363 DrawCube();
364
365 G3_PopMtx(1);
366
367 // swapping the polygon list RAM, the vertex RAM, etc.
368 G3_SwapBuffers(GX_SORTMODE_AUTO, GX_BUFFERMODE_W);
369
370 // Wait VBlank
371 OS_WaitVBlankIntr();
372
373 #ifdef SDK_AUTOTEST // code for auto test
374 GX_SetBankForLCDC(GX_VRAM_LCDC_C);
375 EXT_TestSetVRAMForScreenShot(GX_VRAM_LCDC_C);
376 EXT_TestScreenShot(100, 0x8C9F5E42);
377 EXT_TestTickCounter();
378 #endif //SDK_AUTOTEST
379 }
380 }
381