00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00041 #ifdef __cplusplus
00042 extern "C" {
00043 #endif
00044
00045 #ifndef _orx_H_
00046 #define _orx_H_
00047
00048 #define __orxEXTERN__
00049
00050
00051 #include "orxInclude.h"
00052 #include "orxKernel.h"
00053 #include "orxUtils.h"
00054
00055 #ifndef __orxPLUGIN__
00056
00057
00058
00059
00060
00063 static orxBOOL sbStopByEvent = orxFALSE;
00064
00065
00066
00067
00068
00069
00074 static orxSTATUS orxFASTCALL orx_DefaultEventHandler(const orxEVENT *_pstEvent)
00075 {
00076 orxSTATUS eResult = orxSTATUS_SUCCESS;
00077
00078
00079 orxASSERT(_pstEvent->eType == orxEVENT_TYPE_SYSTEM);
00080
00081
00082 switch(_pstEvent->eID)
00083 {
00084
00085 case orxSYSTEM_EVENT_CLOSE:
00086 {
00087
00088 sbStopByEvent = orxTRUE;
00089
00090 break;
00091 }
00092
00093 default:
00094 {
00095 break;
00096 }
00097 }
00098
00099
00100 return eResult;
00101 }
00102
00105 static void orxFASTCALL orx_MainSetup()
00106 {
00107
00108 orxModule_AddDependency(orxMODULE_ID_MAIN, orxMODULE_ID_PARAM);
00109 orxModule_AddDependency(orxMODULE_ID_MAIN, orxMODULE_ID_CLOCK);
00110 orxModule_AddDependency(orxMODULE_ID_MAIN, orxMODULE_ID_CONFIG);
00111 orxModule_AddDependency(orxMODULE_ID_MAIN, orxMODULE_ID_INPUT);
00112 orxModule_AddDependency(orxMODULE_ID_MAIN, orxMODULE_ID_EVENT);
00113 orxModule_AddDependency(orxMODULE_ID_MAIN, orxMODULE_ID_FILE);
00114 orxModule_AddDependency(orxMODULE_ID_MAIN, orxMODULE_ID_LOCALE);
00115 orxModule_AddDependency(orxMODULE_ID_MAIN, orxMODULE_ID_PLUGIN);
00116 orxModule_AddDependency(orxMODULE_ID_MAIN, orxMODULE_ID_OBJECT);
00117 orxModule_AddDependency(orxMODULE_ID_MAIN, orxMODULE_ID_PROFILER);
00118
00119 orxModule_AddOptionalDependency(orxMODULE_ID_MAIN, orxMODULE_ID_SCREENSHOT);
00120
00121 return;
00122 }
00123
00124 #ifdef __orxANDROID__
00125
00126 #include <jni.h>
00127 #include <android/log.h>
00128
00132 extern JNIEnv *mEnv;
00133 extern JavaVM *mVM;
00134 extern JNIEnv *globalEnv;
00135
00136
00137 #define main orxMain
00138
00139
00140 #endif
00141
00142 #ifdef __orxIPHONE__
00143
00144 #ifdef __orxOBJC__
00145
00146 #import <UIKit/UIKit.h>
00147
00150 @interface orxAppDelegate : NSObject <UIAccelerometerDelegate>
00151 {
00152 UIWindow *poWindow;
00153 orxView *poView;
00154 }
00155
00156 @property (nonatomic, retain) UIWindow *poWindow;
00157 @property (nonatomic, retain) UIView *poView;
00158
00159 - (void) MainLoop;
00160
00161 @end
00162
00163 extern orxSTATUS (orxFASTCALL *spfnRun)();
00164
00172 static orxINLINE void orx_Execute(orxU32 _u32NbParams, orxSTRING _azParams[], const orxMODULE_INIT_FUNCTION _pfnInit, const orxMODULE_RUN_FUNCTION _pfnRun, const orxMODULE_EXIT_FUNCTION _pfnExit)
00173 {
00174
00175 orxDEBUG_INIT();
00176
00177
00178 orxASSERT(_u32NbParams > 0);
00179 orxASSERT(_azParams != orxNULL);
00180 orxASSERT(_pfnRun != orxNULL);
00181
00182
00183 orxModule_Register(orxMODULE_ID_MAIN, orx_MainSetup, _pfnInit, _pfnExit);
00184
00185
00186 spfnRun = _pfnRun;
00187
00188
00189 orxModule_RegisterAll();
00190
00191
00192 orxModule_SetupAll();
00193
00194
00195 if(orxParam_SetArgs(_u32NbParams, _azParams) != orxSTATUS_FAILURE)
00196 {
00197 NSAutoreleasePool *poPool;
00198
00199
00200 poPool = [[NSAutoreleasePool alloc] init];
00201
00202
00203 UIApplicationMain(_u32NbParams, _azParams, nil, @"orxAppDelegate");
00204
00205
00206 [poPool release];
00207 }
00208
00209
00210 return;
00211 }
00212
00213 #endif
00214
00215 #else
00216
00217 #ifdef __orxANDROID_NATIVE__
00218
00219 #include <android/log.h>
00220 #include <android_native_app_glue.h>
00221 #include <android/sensor.h>
00222
00223
00224
00225 extern orxS32 s32Animating;
00226 extern struct android_app *pstApp;
00227 extern void (*ptonAppCmd)(struct android_app *app, int32_t cmd);
00228 extern int32_t (*ptonInputEvent)(struct android_app* app, AInputEvent* event);
00229 extern const ASensor *poAccelerometerSensor;
00230 extern ASensorEventQueue *poSensorEventQueue;
00231 void orxAndroid_AttachThread();
00232 void orxAndroid_DetachThread();
00233 void orxAndroid_GetMainArgs();
00234 void orxAndroid_ReleaseMainArgs();
00235
00236 extern orxS32 s32NbParams;
00237 extern orxSTRING *azParams;
00238
00239
00240 static orxINLINE void orx_AndroidExecute(struct android_app *_pstApp, const orxMODULE_INIT_FUNCTION _pfnInit, const orxMODULE_RUN_FUNCTION _pfnRun, const orxMODULE_EXIT_FUNCTION _pfnExit)
00241 {
00242
00243 orxASSERT(_pstApp != orxNULL);
00244 orxASSERT(_pfnRun != orxNULL);
00245
00246
00247 pstApp = _pstApp;
00248 pstApp->onAppCmd = ptonAppCmd;
00249 pstApp->onInputEvent = ptonInputEvent;
00250
00251
00252 app_dummy();
00253
00254
00255 orxDEBUG_INIT();
00256
00257
00258 orxAndroid_AttachThread();
00259 orxAndroid_GetMainArgs();
00260
00261
00262 orxModule_Register(orxMODULE_ID_MAIN, orx_MainSetup, _pfnInit, _pfnExit);
00263
00264
00265 orxModule_RegisterAll();
00266
00267
00268 orxModule_SetupAll();
00269
00270
00271 if(orxParam_SetArgs(s32NbParams, azParams) != orxSTATUS_FAILURE)
00272 {
00273
00274 if(orxModule_Init(orxMODULE_ID_MAIN) != orxSTATUS_FAILURE)
00275 {
00276
00277 orxEvent_AddHandler(orxEVENT_TYPE_SYSTEM, orx_DefaultEventHandler);
00278
00279
00280 if(orxParam_DisplayHelp() != orxSTATUS_FAILURE)
00281 {
00282 orxSTATUS eClockStatus, eMainStatus;
00283 orxSYSTEM_EVENT_PAYLOAD stPayload;
00284 orxBOOL bStop;
00285
00286
00287 for(bStop = orxFALSE, sbStopByEvent = orxFALSE;
00288 bStop == orxFALSE;
00289 bStop = ((sbStopByEvent != orxFALSE) || (eMainStatus == orxSTATUS_FAILURE) || (eClockStatus == orxSTATUS_FAILURE)) ? orxTRUE : orxFALSE)
00290 {
00291
00292 orxS32 s32Ident, s32Events;
00293 struct android_poll_source *pstSource;
00294
00295
00296 orxMemory_Zero(&stPayload, sizeof(orxSYSTEM_EVENT_PAYLOAD));
00297
00298
00299 while((s32Ident = ALooper_pollAll(((s32Animating != 0) || (pstApp->destroyRequested != 0)) ? 0 : -1, NULL, (int *)&s32Events, (void **)&pstSource)) >= 0)
00300 {
00301
00302 if(pstSource != NULL)
00303 {
00304
00305 pstSource->process(pstApp, pstSource);
00306 }
00307
00308
00309 if(s32Ident == LOOPER_ID_USER)
00310 {
00311
00312 if(poAccelerometerSensor != NULL)
00313 {
00314 orxSYSTEM_EVENT_PAYLOAD stAccelPayload;
00315 ASensorEvent oEvent;
00316
00317
00318 orxMemory_Zero(&stAccelPayload, sizeof(orxSYSTEM_EVENT_PAYLOAD));
00319
00320
00321 while(ASensorEventQueue_getEvents(poSensorEventQueue, &oEvent, 1) > 0)
00322 {
00323
00324 stAccelPayload.stAccelerometer.pAccelerometer = &oEvent;
00325 stAccelPayload.stAccelerometer.fX = (orxFLOAT)oEvent.acceleration.x;
00326 stAccelPayload.stAccelerometer.fY = (orxFLOAT)oEvent.acceleration.y;
00327 stAccelPayload.stAccelerometer.fZ = (orxFLOAT)oEvent.acceleration.z;
00328
00329
00330 orxEVENT_SEND(orxEVENT_TYPE_SYSTEM, orxSYSTEM_EVENT_ACCELERATE, orxNULL, orxNULL, &stAccelPayload);
00331 }
00332 }
00333 }
00334 }
00335
00336
00337 if((s32Animating != 0) || (pstApp->destroyRequested != 0))
00338 {
00339
00340 orxEVENT_SEND(orxEVENT_TYPE_SYSTEM, orxSYSTEM_EVENT_GAME_LOOP_START, orxNULL, orxNULL, &stPayload);
00341
00342
00343 eMainStatus = _pfnRun();
00344
00345
00346 eClockStatus = orxClock_Update();
00347
00348
00349 orxEVENT_SEND(orxEVENT_TYPE_SYSTEM, orxSYSTEM_EVENT_GAME_LOOP_STOP, orxNULL, orxNULL, &stPayload);
00350
00351
00352 stPayload.u32FrameCounter++;
00353 }
00354 }
00355 }
00356
00357
00358 orxEvent_RemoveHandler(orxEVENT_TYPE_SYSTEM, orx_DefaultEventHandler);
00359
00360
00361 orxModule_Exit(orxMODULE_ID_MAIN);
00362 }
00363
00364
00365 orxModule_ExitAll();
00366 }
00367
00368
00369 orxDEBUG_EXIT();
00370
00371 orxAndroid_ReleaseMainArgs();
00372 orxAndroid_DetachThread();
00373 }
00374
00375 #else
00376
00384 static orxINLINE void orx_Execute(orxU32 _u32NbParams, orxSTRING _azParams[], const orxMODULE_INIT_FUNCTION _pfnInit, const orxMODULE_RUN_FUNCTION _pfnRun, const orxMODULE_EXIT_FUNCTION _pfnExit)
00385 {
00386
00387 orxDEBUG_INIT();
00388
00389
00390 orxASSERT(_u32NbParams > 0);
00391 orxASSERT(_azParams != orxNULL);
00392 orxASSERT(_pfnRun != orxNULL);
00393
00394
00395 orxModule_Register(orxMODULE_ID_MAIN, orx_MainSetup, _pfnInit, _pfnExit);
00396
00397
00398 orxModule_RegisterAll();
00399
00400
00401 orxModule_SetupAll();
00402
00403
00404 if(orxParam_SetArgs(_u32NbParams, _azParams) != orxSTATUS_FAILURE)
00405 {
00406
00407 if(orxModule_Init(orxMODULE_ID_MAIN) != orxSTATUS_FAILURE)
00408 {
00409
00410 orxEvent_AddHandler(orxEVENT_TYPE_SYSTEM, orx_DefaultEventHandler);
00411
00412
00413 if(orxParam_DisplayHelp() != orxSTATUS_FAILURE)
00414 {
00415 orxSYSTEM_EVENT_PAYLOAD stPayload;
00416 orxSTATUS eClockStatus, eMainStatus;
00417 orxBOOL bStop;
00418
00419
00420 orxMemory_Zero(&stPayload, sizeof(orxSYSTEM_EVENT_PAYLOAD));
00421
00422
00423 for(bStop = orxFALSE, sbStopByEvent = orxFALSE;
00424 bStop == orxFALSE;
00425 bStop = ((sbStopByEvent != orxFALSE) || (eMainStatus == orxSTATUS_FAILURE) || (eClockStatus == orxSTATUS_FAILURE)) ? orxTRUE : orxFALSE)
00426 {
00427
00428 orxEVENT_SEND(orxEVENT_TYPE_SYSTEM, orxSYSTEM_EVENT_GAME_LOOP_START, orxNULL, orxNULL, &stPayload);
00429
00430
00431 eMainStatus = _pfnRun();
00432
00433
00434 eClockStatus = orxClock_Update();
00435
00436
00437 orxEVENT_SEND(orxEVENT_TYPE_SYSTEM, orxSYSTEM_EVENT_GAME_LOOP_STOP, orxNULL, orxNULL, &stPayload);
00438
00439
00440 stPayload.u32FrameCounter++;
00441 }
00442 }
00443
00444
00445 orxEvent_RemoveHandler(orxEVENT_TYPE_SYSTEM, orx_DefaultEventHandler);
00446
00447
00448 orxModule_Exit(orxMODULE_ID_MAIN);
00449 }
00450
00451
00452 orxModule_ExitAll();
00453 }
00454
00455
00456 orxDEBUG_EXIT();
00457 }
00458
00459 #ifdef __orxMSVC__
00460
00461 #define WIN32_LEAN_AND_MEAN
00462 #include <windows.h>
00463
00469 static orxINLINE void orx_WinExecute(const orxMODULE_INIT_FUNCTION _pfnInit, const orxMODULE_RUN_FUNCTION _pfnRun, const orxMODULE_EXIT_FUNCTION _pfnExit)
00470 {
00471 #define orxMAX_ARGS 256
00472
00473 int argc;
00474 char *argv[orxMAX_ARGS];
00475 char *pcToken, *pcNextToken, *pcFirstDelimiters;
00476 LPSTR lpFullCmdLine;
00477
00478
00479 lpFullCmdLine = GetCommandLineA();
00480
00481
00482 if(*orxString_SkipWhiteSpaces(lpFullCmdLine) == '"')
00483 {
00484
00485 pcFirstDelimiters = "\"";
00486 }
00487 else
00488 {
00489
00490 pcFirstDelimiters = " ";
00491 }
00492
00493
00494 for(argc = 0, pcNextToken = NULL, pcToken = strtok_s(lpFullCmdLine, pcFirstDelimiters, &pcNextToken);
00495 pcToken && (argc < orxMAX_ARGS);
00496 pcToken = strtok_s(NULL, " ", &pcNextToken))
00497 {
00498 argv[argc++] = pcToken;
00499 }
00500
00501
00502 orx_Execute(argc, argv, _pfnInit, _pfnRun, _pfnExit);
00503 }
00504
00505 #endif
00506
00507 #endif
00508
00509 #endif
00510
00511 #endif
00512
00513 #endif
00514
00515 #ifdef __cplusplus
00516 }
00517 #endif
00518