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