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