/** Computes an interpolated point on a cubic Bezier curve segment for a given parameter * @param[out] _pvRes Vector where to store result * @param[in] _pvPoint1 First point for this curve segment * @param[in] _pvPoint2 First control point for this curve segment * @param[in] _pvPoint3 Second control point for this curve segment * @param[in] _pvPoint4 Last point for this curve segment * @param[in] _fT Interpolation parameter in [0.0, 1.0] * @return Interpolated point on the cubic Bezier curve segment */ orxVECTOR *orxFASTCALL orxVector_Bezier(orxVECTOR *_pvRes, const orxVECTOR *_pvPoint1, const orxVECTOR *_pvPoint2, const orxVECTOR *_pvPoint3, const orxVECTOR *_pvPoint4, orxFLOAT _fT) { orxFLOAT fT2, fT3, f1MT, f1MT2, f1MT3, fW1, fW2, fW3, fW4; /* Checks */ orxASSERT(_pvRes != orxNULL); orxASSERT(_pvPoint1 != orxNULL); orxASSERT(_pvPoint2 != orxNULL); orxASSERT(_pvPoint3 != orxNULL); orxASSERT(_pvPoint4 != orxNULL); orxASSERT((_fT >= orxFLOAT_0) && (_fT <= orxFLOAT_1)); /* Computes weights */ fT2 = _fT * _fT; fT3 = fT2 * _fT; f1MT = orxFLOAT_1 - _fT; f1MT2 = f1MT * f1MT; f1MT3 = f1MT2 * f1MT; fW1 = f1MT3; fW2 = orx2F(3.0f) * f1MT2 * _fT; fW3 = orx2F(3.0f) * f1MT * fT2; fW4 = fT3; /* Gets intermediate results */ orxVector_Set(_pvRes, fW1 * _pvPoint1->fX + fW2 * _pvPoint2->fX + fW3 * _pvPoint3->fX + fW4 * _pvPoint4->fX, fW1 * _pvPoint1->fY + fW2 * _pvPoint2->fY + fW3 * _pvPoint3->fY + fW4 * _pvPoint4->fY, fW1 * _pvPoint1->fZ + fW2 * _pvPoint2->fZ + fW3 * _pvPoint3->fZ + fW4 * _pvPoint4->fZ); /* Done! */ return _pvRes; }
static orxSTATUS orxFASTCALL ProcessFontParams(orxU32 _u32ParamCount, const orxSTRING _azParams[]) { orxSTATUS eResult = orxSTATUS_FAILURE; // Has a valid font parameter? if(_u32ParamCount > 1) { // Inits FreeType if(!FT_Init_FreeType(&sstFontGen.pstFontLibrary)) { // Loads font's default face if(!FT_New_Face(sstFontGen.pstFontLibrary, _azParams[1], 0, &sstFontGen.pstFontFace)) { // Sets unicode map if(!FT_Select_Charmap(sstFontGen.pstFontFace, ft_encoding_unicode)) { // Updates character size sstFontGen.vCharacterSize.fX = sstFontGen.vCharacterSize.fY; // Updates character spacing sstFontGen.vCharacterSpacing.fX = orx2F(2.0f); sstFontGen.vCharacterSpacing.fY = orx2F(2.0f); // Stores scale sstFontGen.fFontScale = sstFontGen.vCharacterSize.fY / orxS2F(sstFontGen.pstFontFace->bbox.yMax - sstFontGen.pstFontFace->bbox.yMin); // Sets pixel's size eResult = FT_Set_Pixel_Sizes(sstFontGen.pstFontFace, (FT_UInt)orxF2U(sstFontGen.vCharacterSize.fX) - 2, (FT_UInt)orxF2U(sstFontGen.vCharacterSize.fY) - 2) ? orxSTATUS_FAILURE : orxSTATUS_SUCCESS; } } } // Success? if(eResult != orxSTATUS_FAILURE) { // Updates status orxFLAG_SET(sstFontGen.u32Flags, orxFONTGEN_KU32_STATIC_FLAG_FONT, orxFONTGEN_KU32_STATIC_FLAG_NONE); // Logs message orxFONTGEN_LOG(FONT, "Using font '%s'.", _azParams[1]); } else { // Logs message orxFONTGEN_LOG(FONT, "Couldn't load font '%s'.", _azParams[1]); } } else { // Logs message orxFONTGEN_LOG(FONT, "No font specified, aborting."); } // Done! return eResult; }
/** Gets a random orxS32 value * @param[in] _s32Min Minimum boundary * @param[in] _s32Max Maximum boundary * @return Random value */ orxS32 orxFASTCALL orxMath_GetRandomS32(orxS32 _s32Min, orxS32 _s32Max) { orxU32 u32Rand; /* Gets raw random number */ u32Rand = rand(); /* Done! */ return (u32Rand == RAND_MAX) ? _s32Max : (orxF2S((orx2F(u32Rand) * (orx2F(1.0f / RAND_MAX)) * (orxS2F(_s32Max) + 1 - orxS2F(_s32Min))) + orxS2F(_s32Min))); }
/** Computes an interpolated point on a Catmull-Rom curve segment for a given parameter * @param[out] _pvRes Vector where to store result * @param[in] _pvPoint1 First control point for this curve segment * @param[in] _pvPoint2 Second control point for this curve segment * @param[in] _pvPoint3 Third control point for this curve segment * @param[in] _pvPoint4 Fourth control point for this curve segment * @param[in] _fT Interpolation parameter in [0.0, 1.0] * @return Interpolated point on the Catmull-Rom curve segment */ orxVECTOR *orxFASTCALL orxVector_CatmullRom(orxVECTOR *_pvRes, const orxVECTOR *_pvPoint1, const orxVECTOR *_pvPoint2, const orxVECTOR *_pvPoint3, const orxVECTOR *_pvPoint4, orxFLOAT _fT) { orxFLOAT fT2, fT3, fW1, fW2, fW3, fW4; /* Checks */ orxASSERT(_pvRes != orxNULL); orxASSERT(_pvPoint1 != orxNULL); orxASSERT(_pvPoint2 != orxNULL); orxASSERT(_pvPoint3 != orxNULL); orxASSERT(_pvPoint4 != orxNULL); orxASSERT((_fT >= orxFLOAT_0) && (_fT <= orxFLOAT_1)); /* Computes weights */ fT2 = _fT * _fT; fT3 = fT2 * _fT; fW1 = orx2F(2.0f) * fT2 - fT3 - _fT; fW2 = orx2F(3.0f) * fT3 - orx2F(5.0f) * fT2 + orx2F(2.0f); fW3 = orx2F(4.0f) * fT2 - orx2F(3.0f) * fT3 + _fT; fW4 = fT3 - fT2; /* Gets intermediate results */ orxVector_Set(_pvRes, orx2F(0.5f) * (fW1 * _pvPoint1->fX + fW2 * _pvPoint2->fX + fW3 * _pvPoint3->fX + fW4 * _pvPoint4->fX), orx2F(0.5f) * (fW1 * _pvPoint1->fY + fW2 * _pvPoint2->fY + fW3 * _pvPoint3->fY + fW4 * _pvPoint4->fY), orx2F(0.5f) * (fW1 * _pvPoint1->fZ + fW2 * _pvPoint2->fZ + fW3 * _pvPoint3->fZ + fW4 * _pvPoint4->fZ)); /* Done! */ return _pvRes; }
static orxSTATUS orxFASTCALL Run() { orxSTATUS eResult = orxSTATUS_SUCCESS; orxVECTOR vMousePos, vGravity; /* Updates generator's status */ orxObject_Enable(spstGenerator, orxInput_IsActive("Spawn")); /* Gets mouse position in world space */ if(orxRender_GetWorldPosition(orxMouse_GetPosition(&vMousePos), orxNULL, &vMousePos)) { orxVECTOR vGeneratorPos; /* Gets generator position */ orxObject_GetPosition(spstGenerator, &vGeneratorPos); /* Keeps generator's Z coord */ vMousePos.fZ = vGeneratorPos.fZ; /* Updates generator's position */ orxObject_SetPosition(spstGenerator, &vMousePos); } /* Gets gravity vector from input */ orxVector_Set(&vGravity, orxInput_GetValue("GravityX"), -orxInput_GetValue("GravityY"), orxFLOAT_0); /* Significant enough? */ if(orxVector_GetSquareSize(&vGravity) > orx2F(0.5f)) { static orxVECTOR svSmoothedGravity = { orx2F(0.0f), orx2F(-1.0f), orx2F(0.0f) }; /* Gets smoothed gravity from new value (low-pass filter) */ orxVector_Lerp(&svSmoothedGravity, &svSmoothedGravity, &vGravity, orx2F(0.05f)); /* Updates camera rotation */ orxCamera_SetRotation(orxViewport_GetCamera(spstViewport), orxMATH_KF_PI_BY_2 + orxVector_FromCartesianToSpherical(&vGravity, &svSmoothedGravity)->fTheta); } // Is quit action active? if(orxInput_IsActive("Quit")) { // Logs orxLOG("Quit action triggered, exiting!"); // Sets return value to orxSTATUS_FAILURE, meaning we want to exit eResult = orxSTATUS_FAILURE; } return eResult; }
/** Gets graphic size * @param[in] _pstGraphic Concerned graphic * @param[out] _pvSize Object's size * @return orxVECTOR / orxNULL */ orxVECTOR *orxFASTCALL orxGraphic_GetSize(const orxGRAPHIC *_pstGraphic, orxVECTOR *_pvSize) { orxVECTOR *pvResult; /* Checks */ orxASSERT(sstGraphic.u32Flags & orxGRAPHIC_KU32_STATIC_FLAG_READY); orxSTRUCTURE_ASSERT(_pstGraphic); orxASSERT(_pvSize != orxNULL); /* Valid 2D or text data? */ if(orxStructure_TestFlags(_pstGraphic, orxGRAPHIC_KU32_FLAG_2D | orxGRAPHIC_KU32_FLAG_TEXT) != orxFALSE) { /* Gets its size */ orxVector_Set(_pvSize, _pstGraphic->fWidth, _pstGraphic->fHeight, orxFLOAT_0); /* Updates result */ pvResult = _pvSize; } else { /* No size */ orxVector_SetAll(_pvSize, orx2F(-1.0f)); /* Updates result */ pvResult = orxNULL; } /* Done! */ return pvResult; }
void orxFASTCALL orxMouse_GLFW_Exit() { /* Was initialized? */ if(sstMouse.u32Flags & orxMOUSE_KU32_STATIC_FLAG_READY) { orxCLOCK *pstClock; /* Gets core clock */ pstClock = orxClock_FindFirst(orx2F(-1.0f), orxCLOCK_TYPE_CORE); /* Unregisters update function */ orxClock_Unregister(pstClock, orxMouse_GLFW_Update); /* Unregisters clean function */ orxClock_Unregister(pstClock, orxMouse_GLFW_Clean); /* Removes event handler */ orxEvent_RemoveHandler(orxEVENT_TYPE_DISPLAY, orxMouse_GLFW_EventHandler); /* Cleans static controller */ orxMemory_Zero(&sstMouse, sizeof(orxMOUSE_STATIC)); } return; }
static orxSTATUS orxFASTCALL ProcessPaddingParams(orxU32 _u32ParamCount, const orxSTRING _azParams[]) { orxSTATUS eResult; // Has a valid size parameter? if(_u32ParamCount > 1) { orxFLOAT fPadding; // Gets it if((eResult = orxString_ToFloat(_azParams[1], &fPadding, orxNULL)) != orxSTATUS_FAILURE) { // Stores it sstFontGen.fPadding = orx2F(2.0f) * fPadding; // Logs message orxFONTGEN_LOG(PADDING, "Character padding set to '%g'.", fPadding); } else { // Logs message orxFONTGEN_LOG(PADDING, "Invalid character padding found in '%s', aborting.", _azParams[1]); } } else { // Updates result eResult = orxSTATUS_SUCCESS; } // Done! return eResult; }
/** Sets camera frustum (3D rectangle for 2D camera) * @param[in] _pstCamera Concerned camera * @param[in] _fWidth Width of frustum * @param[in] _fHeight Height of frustum * @param[in] _fNear Near distance of frustum * @param[in] _fFar Far distance of frustum * @return orxSTATUS_SUCCESS / orxSTATUS_FAILURE */ orxSTATUS orxFASTCALL orxCamera_SetFrustum(orxCAMERA *_pstCamera, orxFLOAT _fWidth, orxFLOAT _fHeight, orxFLOAT _fNear, orxFLOAT _fFar) { orxSTATUS eResult = orxSTATUS_SUCCESS; /* Checks */ orxASSERT(sstCamera.u32Flags & orxCAMERA_KU32_STATIC_FLAG_READY); orxSTRUCTURE_ASSERT(_pstCamera); orxASSERT(_fNear <= _fFar); /* Updates internal frustum */ orxVector_Set(&(_pstCamera->stFrustum.vTL), orx2F(-0.5f) * _fWidth, orx2F(-0.5f) * _fHeight, _fNear); orxVector_Set(&(_pstCamera->stFrustum.vBR), orx2F(0.5f) * _fWidth, orx2F(0.5f) * _fHeight, _fFar); /* Done! */ return eResult; }
// Touch extern "C" void JNICALL Java_org_orx_lib_OrxActivity_nativeOnTouch( JNIEnv* env, jobject thiz, jint touch_device_id_in, jint pointer_finger_id_in, jint action, jint x, jint y, jint p) { orxANDROID_TOUCH_EVENT stTouchEvent; stTouchEvent.u32ID = pointer_finger_id_in; stTouchEvent.u32Action = action; stTouchEvent.fX = orx2F(x); stTouchEvent.fY = orx2F(y); if(sstAndroid.pipeTouchEvent[1] != -1) { if (write(sstAndroid.pipeTouchEvent[1], &stTouchEvent, sizeof(stTouchEvent)) != sizeof(stTouchEvent)) { LOGE("Failure writing touch event: %s\n", strerror(errno)); } } }
/** Delay the program for given number of seconds * @param[in] _fSeconds Number of seconds to wait */ void orxFASTCALL orxSystem_Delay(orxFLOAT _fSeconds) { /* Checks */ orxASSERT((sstSystem.u32Flags & orxSYSTEM_KU32_STATIC_FLAG_READY) == orxSYSTEM_KU32_STATIC_FLAG_READY); orxASSERT(_fSeconds >= orxFLOAT_0); #ifdef __orxWINDOWS__ /* Sleeps */ Sleep(orxF2U(_fSeconds * orx2F(1000.0f))); #else /* __orxWINDOWS__ */ /* Sleeps */ usleep(orxF2U(_fSeconds * orx2F(1000000.0f))); #endif /* __orxWINDOWS__ */ /* Done! */ return; }
orxFLOAT orxFASTCALL orxJoystick_GLFW_GetAxisValue(orxJOYSTICK_AXIS _eAxis) { orxU32 u32ID; orxFLOAT fResult; /* Checks */ orxASSERT((sstJoystick.u32Flags & orxJOYSTICK_KU32_STATIC_FLAG_READY) == orxJOYSTICK_KU32_STATIC_FLAG_READY); orxASSERT(_eAxis < orxJOYSTICK_AXIS_NUMBER); /* Gets ID */ u32ID = (orxU32)_eAxis / orxJOYSTICK_AXIS_SINGLE_NUMBER; /* Is ID valid? */ if(u32ID <= (orxU32)GLFW_JOYSTICK_LAST) { /* Updates its info */ orxJoystick_GLFW_UpdateInfo(u32ID); /* Plugged? */ if(sstJoystick.astJoyInfoList[u32ID].bIsConnected != orxFALSE) { orxS32 s32Axis; /* Gets axis */ s32Axis = _eAxis % orxJOYSTICK_AXIS_SINGLE_NUMBER; /* Updates result */ fResult = orx2F(sstJoystick.astJoyInfoList[u32ID].afAxisInfoList[s32Axis]); } else { /* Logs message */ orxDEBUG_PRINT(orxDEBUG_LEVEL_JOYSTICK, "Requested joystick ID <%d> is not connected.", u32ID); /* Updates result */ fResult = orxFLOAT_0; } } else { /* Logs message */ orxDEBUG_PRINT(orxDEBUG_LEVEL_JOYSTICK, "Requested joystick ID <%d> is out of range.", u32ID); /* Updates result */ fResult = orxFLOAT_0; } /* Done! */ return fResult; }
void orxFASTCALL orxJoystick_GLFW_Exit() { /* Was initialized? */ if(sstJoystick.u32Flags & orxJOYSTICK_KU32_STATIC_FLAG_READY) { /* Unregisters update function */ orxClock_Unregister(orxClock_FindFirst(orx2F(-1.0f), orxCLOCK_TYPE_CORE), orxJoystick_GLFW_Update); /* Cleans static controller */ orxMemory_Zero(&sstJoystick, sizeof(orxJOYSTICK_STATIC)); } return; }
orxSTATUS orxFASTCALL orxJoystick_GLFW_Init() { orxSTATUS eResult = orxSTATUS_FAILURE; /* Was already initialized. */ if(!(sstJoystick.u32Flags & orxJOYSTICK_KU32_STATIC_FLAG_READY)) { /* Cleans static controller */ orxMemory_Zero(&sstJoystick, sizeof(orxJOYSTICK_STATIC)); /* Is GLFW window opened? */ if(glfwGetWindowParam(GLFW_OPENED) != GL_FALSE) { orxCLOCK *pstClock; /* Gets core clock */ pstClock = orxClock_FindFirst(orx2F(-1.0f), orxCLOCK_TYPE_CORE); /* Gets its info */ sstJoystick.pstClockInfo = orxClock_GetInfo(pstClock); /* Success? */ if(sstJoystick.pstClockInfo != orxNULL) { /* Registers event update function */ eResult = orxClock_Register(pstClock, orxJoystick_GLFW_Update, orxNULL, orxMODULE_ID_JOYSTICK, orxCLOCK_PRIORITY_HIGHER); /* Success? */ if(eResult != orxSTATUS_FAILURE) { /* Updates first joystick */ orxJoystick_GLFW_UpdateInfo(0); /* Updates status */ sstJoystick.u32Flags |= orxJOYSTICK_KU32_STATIC_FLAG_READY; /* Updates result */ eResult = orxSTATUS_SUCCESS; } } } } /* Done! */ return eResult; }
/** Removes a global timer function (ie. from the main core clock) * @param[in] _pfnCallback Concerned timer callback to remove * @param[in] _fDelay Delay between 2 calls of the timer to remove, -1.0f for removing all occurrences regardless of their respective delay * @param[in] _pContext Context of the timer to remove, orxNULL for removing all occurrences regardless of their context * @return orxSTATUS_SUCCESS / orxSTATUS_FAILURE */ orxSTATUS orxFASTCALL orxClock_RemoveGlobalTimer(const orxCLOCK_FUNCTION _pfnCallback, orxFLOAT _fDelay, void *_pContext) { orxCLOCK *pstClock; orxSTATUS eResult = orxSTATUS_FAILURE; /* Checks */ orxASSERT(sstClock.u32Flags & orxCLOCK_KU32_STATIC_FLAG_READY); orxASSERT(_pfnCallback != orxNULL); /* Gets core clock */ pstClock = orxClock_FindFirst(orx2F(-1.0f), orxCLOCK_TYPE_CORE); /* Found? */ if(pstClock != orxNULL) { /* Removes timer from it */ eResult = orxClock_RemoveTimer(pstClock, _pfnCallback, _fDelay, _pContext); } /* Done! */ return eResult; }
orxSTATUS orxFASTCALL orxDisplay_SDL_Init() { orxSTATUS eResult; /* Was not already initialized? */ if(!(sstDisplay.u32Flags & orxDISPLAY_KU32_STATIC_FLAG_READY)) { /* Cleans static controller */ orxMemory_Zero(&sstDisplay, sizeof(orxDISPLAY_STATIC)); /* Is SDL partly initialized? */ if(SDL_WasInit(SDL_INIT_EVERYTHING) != 0) { /* Inits the video subsystem */ eResult = (SDL_InitSubSystem(SDL_INIT_VIDEO) == 0) ? orxSTATUS_SUCCESS : orxSTATUS_FAILURE; } else { /* Inits SDL with video */ eResult = (SDL_Init(SDL_INIT_VIDEO) == 0) ? orxSTATUS_SUCCESS : orxSTATUS_FAILURE; } /* Valid? */ if(eResult != orxSTATUS_FAILURE) { #ifdef __orxGP2X__ /* Inits display using config values? */ sstDisplay.pstScreen = SDL_SetVideoMode(orxDISPLAY_KU32_SCREEN_WIDTH, orxDISPLAY_KU32_SCREEN_HEIGHT, orxDISPLAY_KU32_SCREEN_DEPTH, SDL_HWSURFACE | SDL_DOUBLEBUF | SDL_ANYFORMAT); /* Stores values */ sstDisplay.fScreenWidth = orxU2F(orxDISPLAY_KU32_SCREEN_WIDTH); sstDisplay.fScreenHeight = orxU2F(orxDISPLAY_KU32_SCREEN_HEIGHT); #else /* __orxGP2X__ */ { orxU32 u32ConfigWidth, u32ConfigHeight, u32ConfigDepth, u32Flags; /* Gets resolution from config */ orxConfig_PushSection(orxDISPLAY_KZ_CONFIG_SECTION); u32ConfigWidth = orxConfig_GetU32(orxDISPLAY_KZ_CONFIG_WIDTH); u32ConfigHeight = orxConfig_GetU32(orxDISPLAY_KZ_CONFIG_HEIGHT); u32ConfigDepth = orxConfig_GetU32(orxDISPLAY_KZ_CONFIG_DEPTH); /* Full screen? */ if(orxConfig_GetBool(orxDISPLAY_KZ_CONFIG_FULLSCREEN) != orxFALSE) { /* Updates flags */ u32Flags = SDL_FULLSCREEN | SDL_HWSURFACE | SDL_DOUBLEBUF | SDL_ANYFORMAT; } else { /* Updates flags */ u32Flags = SDL_HWSURFACE | SDL_DOUBLEBUF | SDL_ANYFORMAT; } /* Inits display using config values? */ if((sstDisplay.pstScreen = SDL_SetVideoMode(u32ConfigWidth, u32ConfigHeight, u32ConfigDepth, u32Flags)) == orxNULL) { /* Inits display using default parameters */ sstDisplay.pstScreen = SDL_SetVideoMode(orxDISPLAY_KU32_SCREEN_WIDTH, orxDISPLAY_KU32_SCREEN_HEIGHT, orxDISPLAY_KU32_SCREEN_DEPTH, SDL_HWSURFACE | SDL_DOUBLEBUF | SDL_ANYFORMAT); /* Stores values */ sstDisplay.fScreenWidth = orxU2F(orxDISPLAY_KU32_SCREEN_WIDTH); sstDisplay.fScreenHeight = orxU2F(orxDISPLAY_KU32_SCREEN_HEIGHT); } else { /* Stores values */ sstDisplay.fScreenWidth = orxU2F(u32ConfigWidth); sstDisplay.fScreenHeight = orxU2F(u32ConfigHeight); } /* Pops config section */ orxConfig_PopSection(); } #endif /* __orxGP2X__ */ /* Updates result ? */ eResult = (sstDisplay.pstScreen != NULL) ? orxSTATUS_SUCCESS : orxSTATUS_FAILURE; /* Valid? */ if(eResult != orxSTATUS_FAILURE) { orxCLOCK *pstClock; /* Gets clock */ pstClock = orxClock_FindFirst(orx2F(-1.0f), orxCLOCK_TYPE_CORE); /* Valid? */ if(pstClock != orxNULL) { /* Registers event update function */ eResult = orxClock_Register(pstClock, orxDisplay_SDL_EventUpdate, orxNULL, orxMODULE_ID_DISPLAY, orxCLOCK_PRIORITY_HIGHEST); } /* Decoration? */ if((orxConfig_HasValue(orxDISPLAY_KZ_CONFIG_DECORATION) == orxFALSE) || (orxConfig_GetBool(orxDISPLAY_KZ_CONFIG_DECORATION) != orxFALSE)) { /* Logs message */ orxLOG("This plugin can't remove window decorations."); } /* Has VSync value? */ if(orxConfig_HasValue(orxDISPLAY_KZ_CONFIG_VSYNC) != orxFALSE) { /* Logs message */ orxLOG("This plugin can't handle vsync."); } /* Updates its title */ SDL_WM_SetCaption(orxConfig_GetString(orxDISPLAY_KZ_CONFIG_TITLE), orxNULL); /* Sets module as ready */ sstDisplay.u32Flags = orxDISPLAY_KU32_STATIC_FLAG_READY; } } } /* Done! */ return eResult; }
/** Inits the bounce demo */ static orxSTATUS orxBounce_Init() { orxU32 i; orxSTATUS eResult; /* Loads config file and selects its section */ orxConfig_Load("Bounce.ini"); orxConfig_SelectSection("Bounce"); /* Loads input */ orxInput_Load(orxNULL); /* Creates ball spawner */ spoBallSpawner = orxSpawner_CreateFromConfig("BallSpawner"); /* Valid? */ if(spoBallSpawner != orxNULL) { orxOBJECT *pstParticleSource; orxCLOCK *pstClock; /* Creates particle source */ pstParticleSource = orxObject_CreateFromConfig("ParticleSource"); /* Valid? */ if(pstParticleSource != orxNULL) { /* Sets its parent */ orxObject_SetParent(pstParticleSource, spoBallSpawner); } /* Updates cursor */ orxMouse_ShowCursor(orxConfig_GetBool("ShowCursor")); /* Creates walls */ spstWalls = orxObject_CreateFromConfig("Walls"); /* Inits trail */ for(i = 0; i < TRAIL_POINT_NUMBER; i++) { orxMouse_GetPosition(&savTrailPointList[i]); } /* Creates all viewports */ for(i = 0; i < (orxU32)orxConfig_GetListCounter("ViewportList"); i++) { orxViewport_CreateFromConfig(orxConfig_GetListString("ViewportList", i)); } /* Gets rendering clock */ pstClock = orxClock_FindFirst(orx2F(-1.0f), orxCLOCK_TYPE_CORE); /* Registers callback */ eResult = orxClock_Register(pstClock, &orxBounce_Update, orxNULL, orxMODULE_ID_MAIN, orxCLOCK_PRIORITY_NORMAL); /* Registers update trail timer */ eResult = ((eResult != orxSTATUS_FAILURE) && (orxClock_Register(pstClock, &orxBounce_UpdateTrail, orxNULL, orxMODULE_ID_MAIN, orxCLOCK_PRIORITY_LOW) != orxSTATUS_FAILURE)) ? orxSTATUS_SUCCESS : orxSTATUS_FAILURE; /* Registers event handler */ eResult = ((eResult != orxSTATUS_FAILURE) && (orxEvent_AddHandler(orxEVENT_TYPE_PHYSICS, orxBounce_EventHandler) != orxSTATUS_FAILURE)) ? orxSTATUS_SUCCESS : orxSTATUS_FAILURE; eResult = ((eResult != orxSTATUS_FAILURE) && (orxEvent_AddHandler(orxEVENT_TYPE_INPUT, orxBounce_EventHandler) != orxSTATUS_FAILURE)) ? orxSTATUS_SUCCESS : orxSTATUS_FAILURE; eResult = ((eResult != orxSTATUS_FAILURE) && (orxEvent_AddHandler(orxEVENT_TYPE_SHADER, orxBounce_EventHandler) != orxSTATUS_FAILURE)) ? orxSTATUS_SUCCESS : orxSTATUS_FAILURE; eResult = ((eResult != orxSTATUS_FAILURE) && (orxEvent_AddHandler(orxEVENT_TYPE_SOUND, orxBounce_EventHandler) != orxSTATUS_FAILURE)) ? orxSTATUS_SUCCESS : orxSTATUS_FAILURE; eResult = ((eResult != orxSTATUS_FAILURE) && (orxEvent_AddHandler(orxEVENT_TYPE_DISPLAY, orxBounce_EventHandler) != orxSTATUS_FAILURE)) ? orxSTATUS_SUCCESS : orxSTATUS_FAILURE; eResult = ((eResult != orxSTATUS_FAILURE) && (orxEvent_AddHandler(orxEVENT_TYPE_TIMELINE, orxBounce_EventHandler) != orxSTATUS_FAILURE)) ? orxSTATUS_SUCCESS : orxSTATUS_FAILURE; eResult = ((eResult != orxSTATUS_FAILURE) && (orxEvent_AddHandler(orxEVENT_TYPE_RENDER, orxBounce_EventHandler) != orxSTATUS_FAILURE)) ? orxSTATUS_SUCCESS : orxSTATUS_FAILURE; } else { /* Failure */ eResult = orxSTATUS_FAILURE; } /* Done! */ return eResult; }
/** Inits the tutorial */ orxSTATUS orxFASTCALL Init() { orxCLOCK *pstClock; orxINPUT_TYPE eType; orxENUM eID; orxINPUT_MODE eMode; const orxSTRING zInputCameraLeft; const orxSTRING zInputCameraRight; const orxSTRING zInputCameraUp; const orxSTRING zInputCameraDown; const orxSTRING zInputCameraRotateLeft; const orxSTRING zInputCameraRotateRight; const orxSTRING zInputCameraZoomIn; const orxSTRING zInputCameraZoomOut; const orxSTRING zInputViewportLeft; const orxSTRING zInputViewportRight; const orxSTRING zInputViewportUp; const orxSTRING zInputViewportDown; const orxSTRING zInputViewportScaleUp; const orxSTRING zInputViewportScaleDown; /* Gets input binding names */ orxInput_GetBinding("CameraLeft", 0, &eType, &eID, &eMode); zInputCameraLeft = orxInput_GetBindingName(eType, eID, eMode); orxInput_GetBinding("CameraRight", 0, &eType, &eID, &eMode); zInputCameraRight = orxInput_GetBindingName(eType, eID, eMode); orxInput_GetBinding("CameraUp", 0, &eType, &eID, &eMode); zInputCameraUp = orxInput_GetBindingName(eType, eID, eMode); orxInput_GetBinding("CameraDown", 0, &eType, &eID, &eMode); zInputCameraDown = orxInput_GetBindingName(eType, eID, eMode); orxInput_GetBinding("CameraRotateLeft", 0, &eType, &eID, &eMode); zInputCameraRotateLeft = orxInput_GetBindingName(eType, eID, eMode); orxInput_GetBinding("CameraRotateRight", 0, &eType, &eID, &eMode); zInputCameraRotateRight = orxInput_GetBindingName(eType, eID, eMode); orxInput_GetBinding("CameraZoomIn", 0, &eType, &eID, &eMode); zInputCameraZoomIn = orxInput_GetBindingName(eType, eID, eMode); orxInput_GetBinding("CameraZoomOut", 0, &eType, &eID, &eMode); zInputCameraZoomOut = orxInput_GetBindingName(eType, eID, eMode); orxInput_GetBinding("ViewportLeft", 0, &eType, &eID, &eMode); zInputViewportLeft = orxInput_GetBindingName(eType, eID, eMode); orxInput_GetBinding("ViewportRight", 0, &eType, &eID, &eMode); zInputViewportRight = orxInput_GetBindingName(eType, eID, eMode); orxInput_GetBinding("ViewportUp", 0, &eType, &eID, &eMode); zInputViewportUp = orxInput_GetBindingName(eType, eID, eMode); orxInput_GetBinding("ViewportDown", 0, &eType, &eID, &eMode); zInputViewportDown = orxInput_GetBindingName(eType, eID, eMode); orxInput_GetBinding("ViewportScaleUp", 0, &eType, &eID, &eMode); zInputViewportScaleUp = orxInput_GetBindingName(eType, eID, eMode); orxInput_GetBinding("ViewportScaleDown", 0, &eType, &eID, &eMode); zInputViewportScaleDown = orxInput_GetBindingName(eType, eID, eMode); /* Displays a small hint in console */ orxLOG("\n* Worskpaces 1 & 4 display camera 1 content" "\n* Workspace 2 displays camera 2 (by default it's twice as close as the other cameras)" "\n* Workspace 3 displays camera 3" "\n- Soldier will be positioned (in the world) so as to be always displayed under the mouse" "\n- '%s', '%s', '%s' & '%s' control camera 1 positioning" "\n- '%s' & '%s' control camera 1 rotation" "\n- '%s' & '%s' control camera 1 zoom" "\n- '%s', '%s', '%s' & '%s' control viewport 1 positioning" "\n- '%s' & '%s' control viewport 1 size", zInputCameraUp, zInputCameraLeft, zInputCameraDown, zInputCameraRight, zInputCameraRotateLeft, zInputCameraRotateRight, zInputCameraZoomIn, zInputCameraZoomOut, zInputViewportUp, zInputViewportLeft, zInputViewportDown, zInputViewportRight, zInputViewportScaleUp, zInputViewportScaleDown); /* Creates all viewports */ orxViewport_CreateFromConfig("Viewport4"); orxViewport_CreateFromConfig("Viewport3"); orxViewport_CreateFromConfig("Viewport2"); pstViewport = orxViewport_CreateFromConfig("Viewport1"); /* Creates objects */ orxObject_CreateFromConfig("Box"); pstSoldier = orxObject_CreateFromConfig("Soldier"); /* Gets the main clock */ pstClock = orxClock_FindFirst(orx2F(-1.0f), orxCLOCK_TYPE_CORE); /* Registers our update callback */ orxClock_Register(pstClock, Update, orxNULL, orxMODULE_ID_MAIN, orxCLOCK_PRIORITY_NORMAL); /* Done! */ return orxSTATUS_SUCCESS; }
/** Update callback */ void orxFASTCALL Update(const orxCLOCK_INFO *_pstClockInfo, void *_pstContext) { orxVECTOR vPos, vSoldierPos; orxCAMERA *pstCamera; orxFLOAT fWidth, fHeight, fX, fY; /* *** CAMERA CONTROLS *** */ /* Gets first viewport camera */ pstCamera = orxViewport_GetCamera(pstViewport); /* Camera rotate left? */ if(orxInput_IsActive("CameraRotateLeft")) { /* Rotates camera CCW */ orxCamera_SetRotation(pstCamera, orxCamera_GetRotation(pstCamera) + orx2F(-4.0f) * _pstClockInfo->fDT); } /* Camera rotate right? */ if(orxInput_IsActive("CameraRotateRight")) { /* Rotates camera CW */ orxCamera_SetRotation(pstCamera, orxCamera_GetRotation(pstCamera) + orx2F(4.0f) * _pstClockInfo->fDT); } /* Camera zoom in? */ if(orxInput_IsActive("CameraZoomIn")) { /* Camera zoom in */ orxCamera_SetZoom(pstCamera, orxCamera_GetZoom(pstCamera) * orx2F(1.02f)); } /* Camera zoom out? */ if(orxInput_IsActive("CameraZoomOut")) { /* Camera zoom out */ orxCamera_SetZoom(pstCamera, orxCamera_GetZoom(pstCamera) * orx2F(0.98f)); } /* Gets camera position */ orxCamera_GetPosition(pstCamera, &vPos); /* Camera right? */ if(orxInput_IsActive("CameraRight")) { /* Updates position */ vPos.fX += orx2F(500) * _pstClockInfo->fDT; } /* Camera left? */ if(orxInput_IsActive("CameraLeft")) { /* Updates position */ vPos.fX -= orx2F(500) * _pstClockInfo->fDT; } /* Camera down? */ if(orxInput_IsActive("CameraDown")) { /* Updates position */ vPos.fY += orx2F(500) * _pstClockInfo->fDT; } /* Camera up? */ if(orxInput_IsActive("CameraUp")) { /* Updates position */ vPos.fY -= orx2F(500) * _pstClockInfo->fDT; } /* Updates camera position */ orxCamera_SetPosition(pstCamera, &vPos); /* *** VIEWPORT CONTROLS *** */ /* Gets viewport size */ orxViewport_GetRelativeSize(pstViewport, &fWidth, &fHeight); /* Viewport scale up? */ if(orxInput_IsActive("ViewportScaleUp")) { /* Scales viewport up */ fWidth *= orx2F(1.02f); fHeight*= orx2F(1.02f); } /* Viewport scale down? */ if(orxInput_IsActive("ViewportScaleDown")) { /* Scales viewport down */ fWidth *= orx2F(0.98f); fHeight*= orx2F(0.98f); } /* Updates viewport size */ orxViewport_SetRelativeSize(pstViewport, fWidth, fHeight); /* Gets viewport position */ orxViewport_GetPosition(pstViewport, &fX, &fY); /* Viewport right? */ if(orxInput_IsActive("ViewportRight")) { /* Updates position */ fX += orx2F(500) * _pstClockInfo->fDT; } /* Viewport left? */ if(orxInput_IsActive("ViewportLeft")) { /* Updates position */ fX -= orx2F(500) * _pstClockInfo->fDT; } /* Viewport down? */ if(orxInput_IsActive("ViewportDown")) { /* Updates position */ fY += orx2F(500) * _pstClockInfo->fDT; } /* Viewport up? */ if(orxInput_IsActive("ViewportUp")) { /* Updates position */ fY -= orx2F(500) * _pstClockInfo->fDT; } /* Updates viewport position */ orxViewport_SetPosition(pstViewport, fX, fY); /* *** SOLDIER MOVE UPDATE *** */ /* Gets mouse world position? */ orxRender_GetWorldPosition(orxMouse_GetPosition(&vPos), orxNULL, &vPos); /* Gets object current position */ orxObject_GetWorldPosition(pstSoldier, &vSoldierPos); /* Keeps Z value */ vPos.fZ = vSoldierPos.fZ; /* Moves the soldier under the cursor */ orxObject_SetPosition(pstSoldier, &vPos); }
* License along with this library; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA */ /** * @file orxVector.c * @date 27/04/2005 * @author [email protected] * */ #include "math/orxVector.h" /* *** Vector constants *** */ const orxVECTOR orxVECTOR_X = {{orx2F(1.0f)}, {orx2F(0.0f)}, {orx2F(0.0f)}}; const orxVECTOR orxVECTOR_Y = {{orx2F(0.0f)}, {orx2F(1.0f)}, {orx2F(0.0f)}}; const orxVECTOR orxVECTOR_Z = {{orx2F(0.0f)}, {orx2F(0.0f)}, {orx2F(1.0f)}}; const orxVECTOR orxVECTOR_0 = {{orx2F(0.0f)}, {orx2F(0.0f)}, {orx2F(0.0f)}}; const orxVECTOR orxVECTOR_1 = {{orx2F(1.0f)}, {orx2F(1.0f)}, {orx2F(1.0f)}}; const orxVECTOR orxVECTOR_RED = {{orx2F(1.0f)}, {orx2F(0.0f)}, {orx2F(0.0f)}}; const orxVECTOR orxVECTOR_GREEN = {{orx2F(0.0f)}, {orx2F(1.0f)}, {orx2F(0.0f)}}; const orxVECTOR orxVECTOR_BLUE = {{orx2F(0.0f)}, {orx2F(0.0f)}, {orx2F(1.0f)}}; const orxVECTOR orxVECTOR_BLACK = {{orx2F(0.0f)}, {orx2F(0.0f)}, {orx2F(0.0f)}}; const orxVECTOR orxVECTOR_WHITE = {{orx2F(1.0f)}, {orx2F(1.0f)}, {orx2F(1.0f)}};
fW4 = fT3 - fT2; /* Gets intermediate results */ orxVector_Set(_pvRes, orx2F(0.5f) * (fW1 * _pvPoint1->fX + fW2 * _pvPoint2->fX + fW3 * _pvPoint3->fX + fW4 * _pvPoint4->fX), orx2F(0.5f) * (fW1 * _pvPoint1->fY + fW2 * _pvPoint2->fY + fW3 * _pvPoint3->fY + fW4 * _pvPoint4->fY), orx2F(0.5f) * (fW1 * _pvPoint1->fZ + fW2 * _pvPoint2->fZ + fW3 * _pvPoint3->fZ + fW4 * _pvPoint4->fZ)); /* Done! */ return _pvRes; } /* *** Vector constants *** */ const orxVECTOR orxVECTOR_X = {{orx2F(1.0f)}, {orx2F(0.0f)}, {orx2F(0.0f)}}; const orxVECTOR orxVECTOR_Y = {{orx2F(0.0f)}, {orx2F(1.0f)}, {orx2F(0.0f)}}; const orxVECTOR orxVECTOR_Z = {{orx2F(0.0f)}, {orx2F(0.0f)}, {orx2F(1.0f)}}; const orxVECTOR orxVECTOR_0 = {{orx2F(0.0f)}, {orx2F(0.0f)}, {orx2F(0.0f)}}; const orxVECTOR orxVECTOR_1 = {{orx2F(1.0f)}, {orx2F(1.0f)}, {orx2F(1.0f)}}; const orxVECTOR orxVECTOR_RED = {{orx2F(1.0f)}, {orx2F(0.0f)}, {orx2F(0.0f)}}; const orxVECTOR orxVECTOR_GREEN = {{orx2F(0.0f)}, {orx2F(1.0f)}, {orx2F(0.0f)}}; const orxVECTOR orxVECTOR_BLUE = {{orx2F(0.0f)}, {orx2F(0.0f)}, {orx2F(1.0f)}}; const orxVECTOR orxVECTOR_YELLOW = {{orx2F(1.0f)}, {orx2F(1.0f)}, {orx2F(0.0f)}}; const orxVECTOR orxVECTOR_CYAN = {{orx2F(0.0f)}, {orx2F(1.0f)}, {orx2F(1.0f)}}; const orxVECTOR orxVECTOR_MAGENTA = {{orx2F(1.0f)}, {orx2F(0.0f)}, {orx2F(1.0f)}}; const orxVECTOR orxVECTOR_BLACK = {{orx2F(0.0f)}, {orx2F(0.0f)}, {orx2F(0.0f)}};
/** Gets a random orxFLOAT value * @param[in] _fMin Minimum boundary * @param[in] _fMax Maximum boundary * @return Random value */ orxFLOAT orxFASTCALL orxMath_GetRandomFloat(orxFLOAT _fMin, orxFLOAT _fMax) { return((orx2F(rand()) * (orx2F(1.0f / RAND_MAX)) * (_fMax - _fMin)) + _fMin); }
orxFLOAT orxFASTCALL orxJoystick_Android_GetAxisValue(orxJOYSTICK_AXIS _eAxis) { orxU32 u32ID; orxFLOAT fResult; /* Checks */ orxASSERT((sstJoystick.u32Flags & orxJOYSTICK_KU32_STATIC_FLAG_READY) == orxJOYSTICK_KU32_STATIC_FLAG_READY); orxASSERT(_eAxis < orxJOYSTICK_AXIS_NUMBER); if(!sstJoystick.bUseJoystick) { /* Depending on axis */ switch (_eAxis) { case orxJOYSTICK_AXIS_X_1: case orxJOYSTICK_AXIS_X_2: case orxJOYSTICK_AXIS_X_3: case orxJOYSTICK_AXIS_X_4: { /* Updates result */ fResult = sstJoystick.vAcceleration.fX; break; } case orxJOYSTICK_AXIS_Y_1: case orxJOYSTICK_AXIS_Y_2: case orxJOYSTICK_AXIS_Y_3: case orxJOYSTICK_AXIS_Y_4: { /* Updates result */ fResult = sstJoystick.vAcceleration.fY; break; } case orxJOYSTICK_AXIS_Z_1: case orxJOYSTICK_AXIS_Z_2: case orxJOYSTICK_AXIS_Z_3: case orxJOYSTICK_AXIS_Z_4: { /* Updates result */ fResult = sstJoystick.vAcceleration.fZ; break; } default: { /* Not available */ orxDEBUG_PRINT(orxDEBUG_LEVEL_JOYSTICK, "<%s> is not available on this platform!", orxJoystick_GetAxisName(_eAxis)); fResult = orxFLOAT_0; break; } } } else { /* Gets ID */ u32ID = (orxU32)_eAxis / orxJOYSTICK_AXIS_SINGLE_NUMBER; /* Is ID valid? */ if(u32ID <= (orxU32)orxANDROID_LAST_JOYSTICK) { /* Plugged? */ if(sstJoystick.au32DeviceIds[u32ID] != 0) { orxS32 s32Axis; /* Gets axis */ s32Axis = _eAxis % orxJOYSTICK_AXIS_SINGLE_NUMBER; /* Updates result */ fResult = orx2F(sstJoystick.astJoyInfoList[u32ID].afAxisInfoList[s32Axis]); } else { /* Logs message */ orxDEBUG_PRINT(orxDEBUG_LEVEL_JOYSTICK, "Requested joystick ID <%d> is not connected.", u32ID); /* Updates result */ fResult = orxFLOAT_0; } } else { /* Logs message */ orxDEBUG_PRINT(orxDEBUG_LEVEL_JOYSTICK, "Requested joystick ID <%d> is out of range.", u32ID); /* Updates result */ fResult = orxFLOAT_0; } } /* Done! */ return fResult; }
orxSTATUS orxFASTCALL orxMouse_GLFW_Init() { orxSTATUS eResult = orxSTATUS_FAILURE; /* Was already initialized. */ if(!(sstMouse.u32Flags & orxMOUSE_KU32_STATIC_FLAG_READY)) { /* Cleans static controller */ orxMemory_Zero(&sstMouse, sizeof(orxMOUSE_STATIC)); /* Is GLFW window opened? */ if(glfwGetWindowParam(GLFW_OPENED) != GL_FALSE) { orxCLOCK *pstClock; /* Gets core clock */ pstClock = orxClock_FindFirst(orx2F(-1.0f), orxCLOCK_TYPE_CORE); /* Valid? */ if(pstClock != orxNULL) { /* Registers update function */ eResult = orxClock_Register(pstClock, orxMouse_GLFW_Update, orxNULL, orxMODULE_ID_MOUSE, orxCLOCK_PRIORITY_HIGHER); /* Success? */ if(eResult != orxSTATUS_FAILURE) { /* Registers clean function */ eResult = orxClock_Register(pstClock, orxMouse_GLFW_Clean, orxNULL, orxMODULE_ID_MOUSE, orxCLOCK_PRIORITY_LOWER); } else { /* Unregisters update function */ orxClock_Unregister(pstClock, orxMouse_GLFW_Update); } } /* Success? */ if(eResult != orxSTATUS_FAILURE) { /* Updates status */ sstMouse.u32Flags |= orxMOUSE_KU32_STATIC_FLAG_READY; /* Adds event handler */ orxEvent_AddHandler(orxEVENT_TYPE_DISPLAY, orxMouse_GLFW_EventHandler); /* Registers mouse position callback */ glfwSetMousePosCallback(orxMouse_GLFW_MousePositionCallback); /* Registers mouse wheel callback */ glfwSetMouseWheelCallback(orxMouse_GLFW_MouseWheelCallback); /* Pushes config section */ orxConfig_PushSection(orxMOUSE_KZ_CONFIG_SECTION); /* Has show cursor value? */ if(orxConfig_HasValue(orxMOUSE_KZ_CONFIG_SHOW_CURSOR) != orxFALSE) { /* Updates cursor status */ orxMouse_GLFW_ShowCursor(orxConfig_GetBool(orxMOUSE_KZ_CONFIG_SHOW_CURSOR)); } /* Pops config section */ orxConfig_PopSection(); } } } /* Done! */ return eResult; }
* @author [email protected] * * Bounce demo * */ #include "orxPluginAPI.h" #define TRAIL_POINT_NUMBER 80 static orxU32 su32VideoModeIndex = 0; static orxBOOL sbShaderEnabled = orxFALSE; static orxSPAWNER *spoBallSpawner = orxNULL; static orxOBJECT *spstWalls = orxNULL; static orxFLOAT sfShaderPhase = orx2F(0.0f); static orxFLOAT sfShaderAmplitude = orx2F(0.0f); static orxFLOAT sfShaderFrequency = orx2F(1.0f); static orxVECTOR svColor = {0}; static orxFLOAT sfColorTime = orx2F(0.0f); static orxFLOAT sfTrailTimer = orx2F(0.0f); static orxBOOL sbRecord = orxFALSE; static orxU32 su32TrailIndex = 0; static orxVECTOR savTrailPointList[TRAIL_POINT_NUMBER] = {0}; static orxVECTOR savTrailSpeedList[TRAIL_POINT_NUMBER] = {0}; /** Applies current selected video mode */ static void orxBounce_ApplyCurrentVideoMode() { orxDISPLAY_VIDEO_MODE stVideoMode;
/** Update callback */ static void orxFASTCALL orxBounce_Update(const orxCLOCK_INFO *_pstClockInfo, void *_pstContext) { orxVECTOR vMousePos; /* Profiles */ orxPROFILER_PUSH_MARKER("Bounce_Update"); if((sbRecord == orxFALSE) && (orxInput_IsActive("Record") != orxFALSE)) { /* Starts recording with default settings */ orxSound_StartRecording("orxSoundRecording.wav", orxFALSE, 0, 0); /* Updates status */ sbRecord = orxTRUE; } if(orxInput_IsActive("ToggleTrail") && (orxInput_HasNewStatus("ToggleTrail"))) { /* Toggles trail rendering */ orxConfig_PushSection("Bounce"); orxConfig_SetBool("DisplayTrail", !orxConfig_GetBool("DisplayTrail")); orxConfig_PopSection(); } if(orxInput_IsActive("ToggleProfiler") && orxInput_HasNewStatus("ToggleProfiler")) { /* Toggles profiler rendering */ orxConfig_PushSection(orxRENDER_KZ_CONFIG_SECTION); orxConfig_SetBool(orxRENDER_KZ_CONFIG_SHOW_PROFILER, !orxConfig_GetBool(orxRENDER_KZ_CONFIG_SHOW_PROFILER)); orxConfig_PopSection(); } if(orxInput_IsActive("PreviousResolution") && orxInput_HasNewStatus("PreviousResolution")) { /* Updates video mode index */ su32VideoModeIndex = (su32VideoModeIndex == 0) ? orxDisplay_GetVideoModeCounter() - 1 : su32VideoModeIndex - 1; /* Applies it */ orxBounce_ApplyCurrentVideoMode(); } else if(orxInput_IsActive("NextResolution") && orxInput_HasNewStatus("NextResolution")) { /* Updates video mode index */ su32VideoModeIndex = (su32VideoModeIndex >= orxDisplay_GetVideoModeCounter() - 1) ? 0 : su32VideoModeIndex + 1; /* Applies it */ orxBounce_ApplyCurrentVideoMode(); } if(orxInput_IsActive("ToggleFullScreen") && orxInput_HasNewStatus("ToggleFullScreen")) { /* Toggles full screen display */ orxDisplay_SetFullScreen(!orxDisplay_IsFullScreen()); } /* Pushes config section */ orxConfig_PushSection("Bounce"); /* Updates shader values */ sfShaderPhase += orxConfig_GetFloat("ShaderPhaseSpeed") * _pstClockInfo->fDT; sfShaderFrequency = orxConfig_GetFloat("ShaderMaxFrequency") * orxMath_Sin(orxConfig_GetFloat("ShaderFrequencySpeed") * _pstClockInfo->fTime); sfShaderAmplitude = orxConfig_GetFloat("ShaderMaxAmplitude") * orxMath_Sin(orxConfig_GetFloat("ShaderAmplitudeSpeed") * _pstClockInfo->fTime); /* Updates color time */ sfColorTime -= _pstClockInfo->fDT; /* Should update color */ if(sfColorTime <= orxFLOAT_0) { orxConfig_PushSection("BounceShader"); orxConfig_GetVector("color", &svColor); orxConfig_PopSection(); sfColorTime += orx2F(3.0f); } /* Gets mouse world position */ orxRender_GetWorldPosition(&vMousePos, orxNULL, orxMouse_GetPosition(&vMousePos)); /* Updates position */ vMousePos.fZ += orx2F(0.5f); /* Has ball spawner? */ if(spoBallSpawner != orxNULL) { /* Updates its position */ orxSpawner_SetPosition(spoBallSpawner, &vMousePos); } /* Spawning */ if(orxInput_IsActive("Spawn")) { /* Spawns one ball */ orxSpawner_Spawn(spoBallSpawner, 1); } /* Picking? */ else if(orxInput_IsActive("Pick")) { orxOBJECT *pstObject; /* Updates mouse position */ vMousePos.fZ -= orx2F(0.1f); /* Picks object under mouse */ pstObject = orxObject_Pick(&vMousePos, orxU32_UNDEFINED); /* Found? */ if(pstObject) { /* Adds FX */ orxObject_AddUniqueFX(pstObject, "Pick"); } } /* Pops config section */ orxConfig_PopSection(); /* Toggle shader? */ if(orxInput_IsActive("ToggleShader") && (orxInput_HasNewStatus("ToggleShader"))) { /* Toggles shader status */ sbShaderEnabled = !sbShaderEnabled; } /* Profiles */ orxPROFILER_POP_MARKER(); }
/** Sets relative graphic pivot * @param[in] _pstGraphic Concerned graphic * @param[in] _u32AlignFlags Alignment flags * @return orxSTATUS_SUCCESS / orxSTATUS_FAILURE */ orxSTATUS orxFASTCALL orxGraphic_SetRelativePivot(orxGRAPHIC *_pstGraphic, orxU32 _u32AlignFlags) { orxVECTOR vSize; orxSTATUS eResult; /* Checks */ orxASSERT(sstGraphic.u32Flags & orxGRAPHIC_KU32_STATIC_FLAG_READY); orxSTRUCTURE_ASSERT(_pstGraphic); orxASSERT((_u32AlignFlags & orxGRAPHIC_KU32_MASK_ALIGN) == _u32AlignFlags); orxASSERT(_pstGraphic->fWidth >= orxFLOAT_0); orxASSERT(_pstGraphic->fHeight >= orxFLOAT_0); /* Valid size? */ if(orxGraphic_GetSize(_pstGraphic, &vSize) != orxNULL) { orxFLOAT fHeight, fWidth; /* Gets graphic size */ fWidth = vSize.fX; fHeight = vSize.fY; /* Pivot left? */ if(orxFLAG_TEST(_u32AlignFlags, orxGRAPHIC_KU32_FLAG_ALIGN_LEFT)) { /* Updates x position */ _pstGraphic->vPivot.fX = orxFLOAT_0; } /* Align right? */ else if(orxFLAG_TEST(_u32AlignFlags, orxGRAPHIC_KU32_FLAG_ALIGN_RIGHT)) { /* Updates x position */ _pstGraphic->vPivot.fX = fWidth; } /* Align center */ else { /* Updates x position */ _pstGraphic->vPivot.fX = orx2F(0.5f) * fWidth; } /* Align top? */ if(orxFLAG_TEST(_u32AlignFlags, orxGRAPHIC_KU32_FLAG_ALIGN_TOP)) { /* Updates y position */ _pstGraphic->vPivot.fY = orxFLOAT_0; } /* Align bottom? */ else if(orxFLAG_TEST(_u32AlignFlags, orxGRAPHIC_KU32_FLAG_ALIGN_BOTTOM)) { /* Updates y position */ _pstGraphic->vPivot.fY = fHeight; } /* Align center */ else { /* Updates y position */ _pstGraphic->vPivot.fY = orx2F(0.5f) * fHeight; } /* Truncate? */ if(orxFLAG_TEST(_u32AlignFlags, orxGRAPHIC_KU32_FLAG_ALIGN_TRUNCATE)) { /* Updates position */ orxVector_Floor(&(_pstGraphic->vPivot), &(_pstGraphic->vPivot)); } /* Round? */ else if(orxFLAG_TEST(_u32AlignFlags, orxGRAPHIC_KU32_FLAG_ALIGN_ROUND)) { /* Updates position */ orxVector_Round(&(_pstGraphic->vPivot), &(_pstGraphic->vPivot)); } /* Updates status */ orxStructure_SetFlags(_pstGraphic, _u32AlignFlags | orxGRAPHIC_KU32_FLAG_HAS_PIVOT | orxGRAPHIC_KU32_FLAG_RELATIVE_PIVOT, orxGRAPHIC_KU32_MASK_ALIGN); /* Updates result */ eResult = orxSTATUS_SUCCESS; } else { /* Logs message */ orxDEBUG_PRINT(orxDEBUG_LEVEL_DISPLAY, "Invalid size retrieved from graphic."); /* Updates result */ eResult = orxSTATUS_FAILURE; } /* Done! */ return eResult; }
/** Updates the clock system * @return orxSTATUS_SUCCESS / orxSTATUS_FAILURE */ orxSTATUS orxFASTCALL orxClock_Update() { orxDOUBLE dNewTime; orxFLOAT fDT, fDelay; orxCLOCK *pstClock; orxSTATUS eResult = orxSTATUS_SUCCESS; /* Checks */ orxASSERT(sstClock.u32Flags & orxCLOCK_KU32_STATIC_FLAG_READY); /* Not already locked? */ if(!(sstClock.u32Flags & orxCLOCK_KU32_STATIC_FLAG_UPDATE_LOCK)) { /* Lock clocks */ sstClock.u32Flags |= orxCLOCK_KU32_STATIC_FLAG_UPDATE_LOCK; /* Gets new time */ dNewTime = orxSystem_GetTime(); /* Computes natural DT */ fDT = (orxFLOAT)(dNewTime - sstClock.dTime); /* Gets modified DT */ fDT = orxClock_ComputeDT(fDT, orxNULL); /* Updates time */ sstClock.dTime = dNewTime; /* Inits delay */ fDelay = sstClock.fMainClockTickSize; /* For all clocks */ for(pstClock = orxCLOCK(orxStructure_GetFirst(orxSTRUCTURE_ID_CLOCK)); pstClock != orxNULL; pstClock = orxCLOCK(orxStructure_GetNext(pstClock))) { /* Locks it */ orxStructure_SetFlags(pstClock, orxCLOCK_KU32_FLAG_UPDATE_LOCK, orxCLOCK_KU32_FLAG_NONE); /* Is clock not paused? */ if(orxClock_IsPaused(pstClock) == orxFALSE) { orxFLOAT fClockDelay; /* Updates clock real time & partial DT */ pstClock->fPartialDT += fDT; /* New tick happens? */ if(pstClock->fPartialDT >= pstClock->stClockInfo.fTickSize) { orxFLOAT fClockDT; orxCLOCK_TIMER_STORAGE *pstTimerStorage; orxCLOCK_FUNCTION_STORAGE *pstFunctionStorage; /* Gets clock modified DT */ fClockDT = orxClock_ComputeDT(pstClock->fPartialDT, &(pstClock->stClockInfo)); /* Updates clock DT */ pstClock->stClockInfo.fDT = fClockDT; /* Updates clock time */ pstClock->stClockInfo.fTime += fClockDT; /* For all timers */ for(pstTimerStorage = (orxCLOCK_TIMER_STORAGE *)orxLinkList_GetFirst(&(pstClock->stTimerList)); pstTimerStorage != orxNULL;) { /* Should call it? */ if((pstTimerStorage->fTimeStamp <= pstClock->stClockInfo.fTime) && (pstTimerStorage->s32Repetition != 0)) { /* Calls it */ pstTimerStorage->pfnCallback(&(pstClock->stClockInfo), pstTimerStorage->pContext); /* Updates its time stamp */ pstTimerStorage->fTimeStamp = pstClock->stClockInfo.fTime + pstTimerStorage->fDelay; /* Should update counter */ if(pstTimerStorage->s32Repetition > 0) { /* Updates it */ pstTimerStorage->s32Repetition--; } } /* Should delete it */ if(pstTimerStorage->s32Repetition == 0) { orxCLOCK_TIMER_STORAGE *pstDelete; /* Gets timer to delete */ pstDelete = pstTimerStorage; /* Gets the next timer */ pstTimerStorage = (orxCLOCK_TIMER_STORAGE *)orxLinkList_GetNext(&(pstTimerStorage->stNode)); /* Removes current timer */ orxLinkList_Remove(&(pstDelete->stNode)); /* Deletes it */ orxBank_Free(sstClock.pstTimerBank, pstDelete); } else { /* Gets the next timer */ pstTimerStorage = (orxCLOCK_TIMER_STORAGE *)orxLinkList_GetNext(&(pstTimerStorage->stNode)); } } /* For all registered callbacks */ for(pstFunctionStorage = (orxCLOCK_FUNCTION_STORAGE *)orxLinkList_GetFirst(&(pstClock->stFunctionList)); pstFunctionStorage != orxNULL; pstFunctionStorage = (orxCLOCK_FUNCTION_STORAGE *)orxLinkList_GetNext(&(pstFunctionStorage->stNode))) { /* Calls it */ pstFunctionStorage->pfnCallback(&(pstClock->stClockInfo), pstFunctionStorage->pContext); } /* Updates partial DT */ pstClock->fPartialDT = orxFLOAT_0; } /* Gets clock's delay */ fClockDelay = pstClock->stClockInfo.fTickSize - pstClock->fPartialDT; /* Smaller than previous clocks' delay? */ if(fClockDelay < fDelay) { /* Stores it */ fDelay = fClockDelay; } } /* Unlocks it */ orxStructure_SetFlags(pstClock, orxCLOCK_KU32_FLAG_NONE, orxCLOCK_KU32_FLAG_UPDATE_LOCK); } /* Unlocks clocks */ sstClock.u32Flags &= ~orxCLOCK_KU32_STATIC_FLAG_UPDATE_LOCK; /* Gets real remaining delay */ fDelay = fDelay + orxCLOCK_KF_DELAY_ADJUSTMENT - orx2F(orxSystem_GetTime() - sstClock.dTime); /* Should delay? */ if(fDelay > orxFLOAT_0) { /* Waits for next time slice */ orxSystem_Delay(fDelay); } } /* Done! */ return eResult; }
/* *** Directory separators *** */ const orxCHAR orxCHAR_DIRECTORY_SEPARATOR_WINDOWS = '\\'; const orxCHAR orxCHAR_DIRECTORY_SEPARATOR_LINUX = '/'; const orxSTRING orxSTRING_DIRECTORY_SEPARATOR_WINDOWS = "\\"; const orxSTRING orxSTRING_DIRECTORY_SEPARATOR_LINUX = "/"; #ifdef __orxWINDOWS__ const orxCHAR orxCHAR_DIRECTORY_SEPARATOR = '\\'; const orxSTRING orxSTRING_DIRECTORY_SEPARATOR = "\\"; #else /* __orxWINDOWS__ */ /* Linux / Mac / GP2X / Wii */ #if defined(__orxLINUX__) || defined(__orxMAC__) || defined(__orxGP2X__) || defined(__orxWII__) || defined(__orxIPHONE__) const orxCHAR orxCHAR_DIRECTORY_SEPARATOR = '/'; const orxSTRING orxSTRING_DIRECTORY_SEPARATOR = "/"; #endif /* __orxLINUX__ || __orxMAC__ || __orxGP2X__ || __orxWII__ || __orxIPHONE__ */ #endif /* __orxWINDOWS__ */ /* *** Float constants *** */ const orxFLOAT orxFLOAT_0 = orx2F(0.0f); const orxFLOAT orxFLOAT_1 = orx2F(1.0f);
/** Displays trail */ static void orxBounce_DisplayTrail(const orxBITMAP *_pstBitmap) { #define STORE_VERTEX(INDEX, X, Y, U, V, RGBA) astVertexList[INDEX].fX = X; astVertexList[INDEX].fY = Y; astVertexList[INDEX].fU = U; astVertexList[INDEX].fV = V; astVertexList[INDEX].stRGBA = RGBA; orxDISPLAY_VERTEX astVertexList[TRAIL_POINT_NUMBER * 2]; orxVECTOR vOffset; orxU32 i; /* For all points */ for(i = 0; i < TRAIL_POINT_NUMBER; i++) { orxVECTOR vVertex1, vVertex2; orxU32 u32Index, u32NextIndex; /* Gets barrel indices */ u32Index = (i + su32TrailIndex) % TRAIL_POINT_NUMBER; u32NextIndex = (i + 1 + su32TrailIndex) % TRAIL_POINT_NUMBER; /* Not at the end? */ if(i < TRAIL_POINT_NUMBER - 1) { /* Gets offset vector */ orxVector_Mulf(&vOffset, orxVector_Normalize(&vOffset, orxVector_2DRotate(&vOffset, orxVector_Sub(&vOffset, &savTrailPointList[u32NextIndex], &savTrailPointList[u32Index]), orxMATH_KF_PI_BY_2)), orx2F(40.0f) / orxMath_Pow(orxS2F(i), orx2F(0.6f))); } /* Computes vertices positions */ orxVector_Add(&vVertex1, &savTrailPointList[u32Index], &vOffset); orxVector_Sub(&vVertex2, &savTrailPointList[u32Index], &vOffset); /* Stores vertices */ STORE_VERTEX(i * 2, vVertex1.fX, vVertex1.fY, orxFLOAT_0, orxU2F(i) / orxU2F(TRAIL_POINT_NUMBER - 1), orx2RGBA(0xFF, 0xFF, 0xFF, 0xFF * i / (TRAIL_POINT_NUMBER + 50))); STORE_VERTEX(i * 2 + 1, vVertex2.fX, vVertex2.fY, orxFLOAT_1, orxU2F(i) / orxU2F(TRAIL_POINT_NUMBER - 1), orx2RGBA(0xFF, 0xFF, 0xFF, 0xFF * i / (TRAIL_POINT_NUMBER + 50))); } /* Draws trail */ orxDisplay_DrawMesh(_pstBitmap, orxDISPLAY_SMOOTHING_ON, orxDISPLAY_BLEND_MODE_ALPHA, TRAIL_POINT_NUMBER * 2, astVertexList); }