1 /*---------------------------------------------------------------------------*
2 Project: Channel jump demo
3 File: ChannelJump.c
4
5 Copyright (C) 2005-2006 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: ChannelJump.c,v $
14 Revision 1.5 2008/05/30 02:27:03 seiki_masashi
15 Rolled back changes to this file following an SDK rollback.
16
17 Revision 1.3 2007/08/01 09:36:29 kitase_hirotake
18 Changed TAB to SPACE.
19
20 Revision 1.2 2007/07/31 23:50:12 nishimoto_takashi
21 Revised slightly to avoid warnings.
22
23 Revision 1.1 2007/07/30 01:17:38 nishimoto_takashi
24 Initial check in.
25
26
27 $NoKeywords: $
28
29 *---------------------------------------------------------------------------*/
30
31
32 #include "ChannelJump.h"
33
34 /*-----------------------------------------------------------------------------
35 Values
36 -----------------------------------------------------------------------------*/
37 static MEMAllocator s_mem2Allocator ;
38 static MEMHeapHandle s_handle ;
39
40 /*-----------------------------------------------------------------------------
41 Functions
42 -----------------------------------------------------------------------------*/
43 /*******************************************************************************
44 Initialize memory (MEM2)
45 *******************************************************************************/
init_memory2(void)46 static void init_memory2( void )
47 {
48 void *lo = OSGetMEM2ArenaLo() ;
49 void *hi = OSGetMEM2ArenaHi() ;
50 s_handle = MEMCreateFrmHeap( lo, (u32)hi - (u32)lo ) ;
51 if ( s_handle == MEM_HEAP_INVALID_HANDLE )
52 {
53 OSHalt("MEM2 heap allocation error.\n") ;
54 }
55 else
56 {
57 OSSetMEM2ArenaLo(hi) ;
58 MEMInitAllocatorForFrmHeap( &s_mem2Allocator, s_handle, 32 ) ; // Buffer requires 32-byte alignment.
59 }
60 }
61
alloc32(u32 size)62 static void* alloc32( u32 size )
63 {
64 return MEMAllocFromAllocator( &s_mem2Allocator, size ) ;
65
66 }
67
free32(void * addr)68 static u8 free32( void *addr )
69 {
70 MEMFreeToAllocator( &s_mem2Allocator, addr ) ;
71 return 1 ;
72 }
73
74 /*******************************************************************************
75 Camera Setting
76 *******************************************************************************/
SetupCamera(void)77 static void SetupCamera( void )
78 {
79 Mtx44 proj_mtx;
80 MTXPerspective( proj_mtx, 45.f, 640.f / 480.f * 0.908f, 1.f, 100.f );
81 GXSetProjection( proj_mtx, GX_PERSPECTIVE );
82
83 MTXLookAt(View_Mtx, &(Vec){0.f, 3.f, 8.f}, &(Vec){0.f, 1.f, 0.f}, &(Vec){0.f, 0.f, 0.f});
84 }
85
86 /*******************************************************************************
87 Render scene.
88 DrawLines( void ) : Draw a grid pattern
89 DrawRectangles( void ) : Use textures
90 DrawBase( void ) : Use vertex color
91 *******************************************************************************/
92 static void DrawLines( void );
93 static void DrawRectangles( void );
94 static void DrawBase( void );
95
DrawScene(void)96 static void DrawScene( void )
97 {
98 Mtx mv;
99 MTXIdentity(mv);
100 MTXRotDeg(mv, 'y', Rot_Deg);
101
102 MTXConcat(View_Mtx, mv, mv);
103 GXLoadPosMtxImm(mv, GX_PNMTX0);
104
105 switch(Scene_No) {
106 case 0:
107 DrawLines();
108 break;
109 case 1:
110 DrawRectangles();
111 break;
112 case 2:
113 DrawBase();
114 break;
115 }
116 }
117
118 /*******************************************************************************
119 Set data ( set Scene_No as 8 bytes data)
120 *******************************************************************************/
SetAttachedData()121 static void SetAttachedData()
122 {
123 char data[5];
124
125 switch(Scene_No) {
126 case 1:
127 (void)strcpy(data, "SCN1");
128 break;
129 case 2:
130 (void)strcpy(data, "SCN2");
131 break;
132 default:
133 (void)strcpy(data, "SCN0");
134 break;
135 }
136
137 // Overwrite binary data in chjump.bin
138 (void) memcpy(Template_arc_begin + 0x00000060 + 0x00000020, data, 4);
139
140 OSReport("set data successfully.\n");
141 }
142
143 /*******************************************************************************
144 Send a test message. (Channel Jump and data)
145 *******************************************************************************/
PostMessage()146 static void PostMessage()
147 {
148 NWC24Err err;
149 NWC24MsgObj msgObj;
150 NWC24UserId testIdTo;
151
152 // Initializes the object, specifies Wii-to-Wii message.
153 err = NWC24InitMsgObj(&msgObj, NWC24_MSGTYPE_WII_MENU);
154 if ( err != NWC24_OK )
155 {
156 OSReport("NWC24InitMsgObj(): error %d\n", err);
157 return;
158 }
159
160 // To address (by user id)
161 err = NWC24GetMyUserId(&testIdTo);
162 if( err != NWC24_OK )
163 {
164 OSReport("NWC24GetMyUserId(): error %d\n", err);
165 return;
166 }
167
168 err = NWC24SetMsgToId(&msgObj, testIdTo);
169 if ( err != NWC24_OK )
170 {
171 OSReport("NWC24SetMsgToId(): error %d\n", err);
172 return;
173 }
174
175 // Subject
176 err = NWC24SetMsgSubject(&msgObj, MsgSubject, (u32)strlen(MsgSubject));
177 if ( err != NWC24_OK )
178 {
179 OSReport("NWC24SetMsgSubject(): error %d\n", err);
180 return;
181 }
182
183 // Message body (text)
184 err = NWC24SetMsgText(&msgObj, (const char*)MsgText, (u32)sizeof(MsgText) - 2,
185 NWC24_UTF_16BE, NWC24_ENC_BASE64);
186 if ( err != NWC24_OK )
187 {
188 OSReport("NWC24SetMsgText(): error %d\n", err);
189 return;
190 }
191
192 // Edit chjump.bin file.
193 SetAttachedData();
194
195 // Attach a NWC24CHJumpObj.
196 err = NWC24SetMsgAttached(&msgObj, (const char*)Template_arc_begin,
197 (u32)(Template_arc_end - Template_arc_begin), NWC24_APP_WII_MSGBOARD);
198 if ( err != NWC24_OK )
199 {
200 OSReport("NWC24SetMsgAttached(): error %d\n", err);
201 return;
202 }
203
204 // Set alternate name.
205 MsgAltName[9] = (wchar_t)(L'0' + Scene_No);
206
207 err = NWC24SetMsgAltName(&msgObj, (const u16*)MsgAltName, (u32)sizeof(MsgAltName) - 2);
208 if ( err != NWC24_OK )
209 {
210 OSReport("NWC24SetMsgAltName(): error %d\n", err);
211 return;
212 }
213
214 // Commit settings and post the message into the send box.
215 err = NWC24CommitMsg(&msgObj);
216 if ( err != NWC24_OK )
217 {
218 OSReport("NWC24CommitMsg: error %d\n", err);
219 return;
220 }
221
222 OSReport("Posted a test message successfully.\n");
223
224 return;
225 }
226
227 /*******************************************************************************
228 Main
229 *******************************************************************************/
main(int argc,char * argv[])230 void main(int argc, char * argv[])
231 {
232 NWC24Err err;
233 s32 tmp, count;
234 char* libWorkMem;
235
236 // Initialize (KPAD, NWC24)
237 DEMOInit(NULL);
238
239 init_memory2();
240 WPADRegisterAllocator( alloc32, free32 );
241 KPADInit();
242
243 VFInit();
244
245 libWorkMem = MEMAllocFromAllocator(&s_mem2Allocator, NWC24_WORK_MEM_SIZE);
246
247 if( NWC24_OK != ( err = NWC24OpenLib(libWorkMem)) )
248 {
249 OSReport("NWC24penLib() Error: %d\n", err);
250 OSHalt("Failed.\n");
251 }
252
253 count = 0;
254 Rot_Deg = 0;
255
256 // output
257 OSReport("*******************************************************\n");
258 OSReport("Start Channel Jump demo.\n");
259 OSReport("*******************************************************\n");
260
261 #ifdef _DEBUG
262 OSReport("This is a DEBUG build.\n");
263 OSReport("argc : %d\n", argc);
264 #else
265 OSReport("This is a NON-DEBUG/optimized build.\n");
266 #endif // _DEBUG
267
268 // texture
269 GXInitTexObj( &TextureD, (void*)Default_tex, 8, 8, GX_TF_RGB5A3, GX_CLAMP, GX_CLAMP, GX_FALSE);
270 GXInitTexObj( &Texture1, (void*)No1_tex, 16, 16, GX_TF_RGB5A3, GX_CLAMP, GX_CLAMP, GX_FALSE);
271 GXInitTexObj( &Texture2, (void*)No2_tex, 16, 16, GX_TF_RGB5A3, GX_CLAMP, GX_CLAMP, GX_FALSE);
272
273 GXInitTexObjLOD( &TextureD, GX_LINEAR, GX_LINEAR, 0.f, 0.f, 0.f, GX_FALSE, GX_FALSE, GX_ANISO_1);
274 GXInitTexObjLOD( &Texture1, GX_LINEAR, GX_LINEAR, 0.f, 0.f, 0.f, GX_FALSE, GX_FALSE, GX_ANISO_1);
275 GXInitTexObjLOD( &Texture2, GX_LINEAR, GX_LINEAR, 0.f, 0.f, 0.f, GX_FALSE, GX_FALSE, GX_ANISO_1);
276
277 OSReport("Texture loaded.\n");
278
279 if(argc > 1) { // Set Scene_No by the string sent from a message.
280 #ifdef _DEBUG
281 int i;
282 for(i=1; i < argc; i++)
283 {
284 OSReport("argv[%d]: %s\n", i, argv[i]);
285 }
286 #endif // _DEBUG
287 if(strcmp(argv[1], "SCN1") == 0) Scene_No = 1;
288 else if(strcmp(argv[1], "SCN2") == 0) Scene_No = 2;
289 else Scene_No = 0;
290 }
291 else {
292 Scene_No = 0;
293 }
294
295 // Draw
296 while(1)
297 {
298 DEMOBeforeRender();
299 SetupCamera();
300 DrawScene();
301 GXDrawDone();
302
303 // Text
304 DEMOInitCaption(DM_FT_OPQ, 320, 240);
305 DEMOPrintf(0, 0,0, "Demo Channnel - Scene %d", Scene_No);
306 DEMOPrintf(0,15,0, "HOME -> return to Menu");
307 DEMOPrintf(0,25,0, "+, -, RIGHT, LEFT -> change scene");
308 DEMOPrintf(0,35,0, "A -> post a message");
309
310 if( argc != 0)
311 DEMOPrintf(0,45,0, "ID: %s", argv[0]);
312
313 if( count > 0 ){
314 DEMOPrintf(0, 200, 0, "Posting......");
315 }
316 else if(Kpad_s[0][0].trig & KPAD_BUTTON_HOME ) {
317 DEMOPrintf(0, 210, 0, "Return to Menu...");
318 }
319
320 GXDrawDone();
321
322 DEMODoneRender();
323
324 // Input processing
325 if( count <= 0 ){
326 if( Kpad_s[0][0].trig & KPAD_BUTTON_HOME ) {
327 OSReport("Return to Menu.\n");
328 break;
329 }
330 else if(Kpad_s[0][0].trig & (KPAD_BUTTON_RIGHT | KPAD_BUTTON_PLUS)) {
331 Scene_No += 1;
332 if(Scene_No == 3) Scene_No = 0;
333 }
334 else if(Kpad_s[0][0].trig & (KPAD_BUTTON_LEFT | KPAD_BUTTON_MINUS)) {
335 if(Scene_No == 0) Scene_No = 3;
336 Scene_No -= 1;
337 }
338 else if( Kpad_s[0][0].trig & KPAD_BUTTON_A) {
339 OSReport("Posted a Message.\n");
340 PostMessage();
341 count = 60;
342 }
343 else if( Kpad_s[0][0].hold & KPAD_BUTTON_B ) {
344 if(Rot_Deg == 360) Rot_Deg= 0;
345 Rot_Deg += 1;
346 }
347 }
348 else
349 count--;
350
351 tmp = KPADRead( 0, &Kpad_s[0][0], KPAD_MAX_READ_BUFS);
352 }
353
354 if( NWC24_OK != (err = NWC24CloseLib()) )
355 {
356 OSReport("NWC24CloseLib() Error: %d\n", err);
357 OSHalt("Failed.\n");
358 }
359
360 MEMFreeToAllocator(&s_mem2Allocator, libWorkMem);
361
362 VFFinalize();
363
364 OSReport("Sample complete\n");
365 OSReturnToMenu();
366 }
367
368 /*******************************************************************************
369 Draw functions
370 *******************************************************************************/
DrawLines(void)371 static void DrawLines( void )
372 {
373 int i = -5;
374
375 GXClearVtxDesc();
376 GXSetVtxDesc(GX_VA_POS, GX_DIRECT);
377 GXSetVtxDesc(GX_VA_CLR0, GX_DIRECT);
378
379 GXSetVtxAttrFmt(GX_VTXFMT1, GX_VA_POS, GX_POS_XYZ, GX_F32, 0);
380 GXSetVtxAttrFmt(GX_VTXFMT1, GX_VA_CLR0, GX_CLR_RGB, GX_RGB8, 0);
381
382 GXSetNumChans(1);
383 GXSetChanCtrl(GX_COLOR0A0, GX_DISABLE, GX_SRC_REG, GX_SRC_VTX, GX_LIGHT_NULL, GX_DF_NONE, GX_AF_NONE);
384 GXSetChanCtrl(GX_COLOR1A1, GX_DISABLE, GX_SRC_REG, GX_SRC_VTX, GX_LIGHT_NULL, GX_DF_NONE, GX_AF_NONE);
385 GXSetNumTexGens(0);
386 GXSetNumTevStages(1);
387 GXSetTevOrder(GX_TEVSTAGE0, GX_TEXCOORD_NULL, GX_TEXMAP_NULL, GX_COLOR0A0);
388 GXSetTevOp(GX_TEVSTAGE0, GX_PASSCLR);
389
390 for(i=-5 ; i<6 ; i++) {
391 GXBegin(GX_LINESTRIP, GX_VTXFMT1, 3);
392 GXPosition3f32(1.0f * i, 0.0f, 8.0f);
393 GXColor3u8(0, 255, 0);
394 GXPosition3f32(1.0f * i, 0.0f, 0.0f);
395 GXColor3u8(255, 0, 0);
396 GXPosition3f32(1.0f * i, 0.0f, -8.0f);
397 GXColor3u8(0, 255, 255);
398 GXEnd();
399
400 GXBegin(GX_LINESTRIP, GX_VTXFMT1, 3);
401 GXPosition3f32(-5.5f, 0.0f, 7.7f - 1.4f * (i+5.f));
402 GXColor3u8(0, 0, 255);
403 GXPosition3f32( 0.0f, 0.0f, 7.7f - 1.4f * (i+5.f));
404 GXColor3u8(255, 255, 255);
405 GXPosition3f32( 5.5f, 0.0f, 7.7f - 1.4f * (i+5.f));
406 GXColor3u8(0, 255, 255);
407 GXEnd();
408 }
409 }
410
DrawBase(void)411 static void DrawBase( void )
412 {
413 GXClearVtxDesc();
414 GXSetVtxDesc(GX_VA_POS, GX_DIRECT);
415 GXSetVtxDesc(GX_VA_CLR0, GX_DIRECT);
416
417 GXSetVtxAttrFmt(GX_VTXFMT1, GX_VA_POS, GX_POS_XYZ, GX_F32, 0);
418 GXSetVtxAttrFmt(GX_VTXFMT1, GX_VA_CLR0, GX_CLR_RGB, GX_RGB8, 0);
419
420 GXSetNumChans(1);
421 GXSetChanCtrl(GX_COLOR0A0, GX_DISABLE, GX_SRC_REG, GX_SRC_VTX, GX_LIGHT_NULL, GX_DF_NONE, GX_AF_NONE);
422 GXSetChanCtrl(GX_COLOR1A1, GX_DISABLE, GX_SRC_REG, GX_SRC_VTX, GX_LIGHT_NULL, GX_DF_NONE, GX_AF_NONE);
423 GXSetNumTexGens(0);
424 GXSetNumTevStages(1);
425 GXSetTevOrder(GX_TEVSTAGE0, GX_TEXCOORD_NULL, GX_TEXMAP_NULL, GX_COLOR0A0);
426 GXSetTevOp(GX_TEVSTAGE0, GX_PASSCLR);
427
428 GXBegin(GX_QUADS, GX_VTXFMT1, 4);
429 GXPosition3f32(-3.0f, 0.0f, -5.0f);
430 GXColor3u8(0, 255, 0);
431 GXPosition3f32( 3.0f, 0.0f, -5.0f);
432 GXColor3u8(0, 255, 255);
433 GXPosition3f32( 3.0f, 0.0f, 3.0f);
434 GXColor3u8(0, 0, 255);
435 GXPosition3f32(-3.0f, 0.0f, 3.0f);
436 GXColor3u8(255, 0, 0);
437 GXEnd();
438 }
439
DrawRectangles(void)440 static void DrawRectangles( void )
441 {
442 GXClearVtxDesc();
443 GXSetVtxDesc(GX_VA_POS, GX_DIRECT);
444 GXSetVtxDesc(GX_VA_CLR0, GX_DIRECT);
445 GXSetVtxDesc(GX_VA_TEX0, GX_DIRECT);
446
447 GXSetVtxAttrFmt(GX_VTXFMT0, GX_VA_POS, GX_POS_XYZ, GX_F32, 0);
448 GXSetVtxAttrFmt(GX_VTXFMT0, GX_VA_CLR0, GX_CLR_RGB, GX_RGB8, 0);
449 GXSetVtxAttrFmt(GX_VTXFMT0, GX_VA_TEX0, GX_TEX_ST, GX_F32, 0);
450
451 GXSetNumChans(1);
452 GXSetChanCtrl(GX_COLOR0A0, GX_DISABLE, GX_SRC_REG, GX_SRC_VTX, GX_LIGHT_NULL, GX_DF_NONE, GX_AF_NONE);
453 GXSetChanCtrl(GX_COLOR1A1, GX_DISABLE, GX_SRC_REG, GX_SRC_VTX, GX_LIGHT_NULL, GX_DF_NONE, GX_AF_NONE);
454 GXSetNumTexGens(1);
455 GXSetTexCoordGen(GX_TEXCOORD0, GX_TG_MTX2x4, GX_TG_TEX0, GX_IDENTITY);
456
457 GXSetNumTevStages(1);
458 GXSetTevOrder(GX_TEVSTAGE0, GX_TEXCOORD0, GX_TEXMAP0, GX_COLOR0A0);
459 GXSetTevDirect( GX_TEVSTAGE0 );
460 GXSetTevSwapMode( GX_TEVSTAGE0, GX_TEV_SWAP0, GX_TEV_SWAP0 );
461 GXSetTevOp(GX_TEVSTAGE0, GX_REPLACE);
462
463 GXSetBlendMode(GX_BM_BLEND, GX_BL_SRCALPHA, GX_BL_INVSRCALPHA, GX_LO_NOOP);
464 GXSetZMode( GX_ENABLE, GX_LEQUAL, GX_ENABLE);
465
466 //
467 GXLoadTexObj( &TextureD, GX_TEXMAP0);
468 GXBegin(GX_QUADS, GX_VTXFMT0, 4);
469 GXPosition3f32(-0.5f, 0.0f, -2.5f);
470 GXColor3u8(255, 255, 255); GXTexCoord2f32(0.f, 0.f);
471 GXPosition3f32( 0.5f, 0.0f, -2.5f);
472 GXColor3u8(255, 255, 255); GXTexCoord2f32(1.f, 0.f);
473 GXPosition3f32( 0.5f, 0.0f, -1.5f);
474 GXColor3u8(255, 255, 255); GXTexCoord2f32(1.f, 1.f);
475 GXPosition3f32(-0.5f, 0.0f, -1.5f);
476 GXColor3u8(255, 255, 255); GXTexCoord2f32(0.f, 1.f);
477 GXEnd();
478
479 // 1
480 GXLoadTexObj( &Texture1, GX_TEXMAP0 );
481 GXBegin(GX_QUADS, GX_VTXFMT0, 4);
482 GXPosition3f32(-2.5f, 0.0f, -0.5f);
483 GXColor3u8(255, 255, 255); GXTexCoord2f32(1.f, 0.f);
484 GXPosition3f32(-1.5f, 0.0f, -0.5f);
485 GXColor3u8(255, 255, 255); GXTexCoord2f32(1.f, 1.f);
486 GXPosition3f32(-1.5f, 0.0f, 0.5f);
487 GXColor3u8(255, 255, 255); GXTexCoord2f32(0.f, 1.f);
488 GXPosition3f32(-2.5f, 0.0f, 0.5f);
489 GXColor3u8(255, 255, 255); GXTexCoord2f32(0.f, 0.f);
490 GXEnd();
491
492 // 2
493 GXLoadTexObj( &Texture2, GX_TEXMAP0 );
494 GXBegin(GX_QUADS, GX_VTXFMT0, 4);
495 GXPosition3f32( 1.5f, 0.0f, -0.5f);
496 GXColor3u8(255, 255, 255); GXTexCoord2f32(0.f, 1.f);
497 GXPosition3f32( 2.5f, 0.0f, -0.5f);
498 GXColor3u8(255, 255, 255); GXTexCoord2f32(0.f, 0.f);
499 GXPosition3f32( 2.5f, 0.0f, 0.5f);
500 GXColor3u8(255, 255, 255); GXTexCoord2f32(1.f, 0.f);
501 GXPosition3f32( 1.5f, 0.0f, 0.5f);
502 GXColor3u8(255, 255, 255); GXTexCoord2f32(1.f, 1.f);
503 GXEnd();
504 }
505