/** Sets graphic pivot * @param[in] _pstGraphic Concerned graphic * @param[in] _pvPivot Pivot to set * @return orxSTATUS_SUCCESS / orxSTATUS_FAILURE */ orxSTATUS orxFASTCALL orxGraphic_SetPivot(orxGRAPHIC *_pstGraphic, const orxVECTOR *_pvPivot) { orxSTATUS eResult = orxSTATUS_SUCCESS; /* Checks */ orxASSERT(sstGraphic.u32Flags & orxGRAPHIC_KU32_STATIC_FLAG_READY); orxSTRUCTURE_ASSERT(_pstGraphic); /* Valid pivot? */ if(_pvPivot != orxNULL) { /* Stores it */ orxVector_Copy(&(_pstGraphic->vPivot), _pvPivot); /* Updates status */ orxStructure_SetFlags(_pstGraphic, orxGRAPHIC_KU32_FLAG_HAS_PIVOT, orxGRAPHIC_KU32_FLAG_RELATIVE_PIVOT); } else { /* Stores it */ orxVector_Copy(&(_pstGraphic->vPivot), &orxVECTOR_0); /* Updates status */ orxStructure_SetFlags(_pstGraphic, orxGRAPHIC_KU32_FLAG_NONE, orxGRAPHIC_KU32_FLAG_HAS_PIVOT | orxGRAPHIC_KU32_FLAG_RELATIVE_PIVOT); } /* Done! */ return eResult; }
/** Sets graphic blend mode * @param[in] _pstGraphic Concerned graphic * @param[in] _eBlendMode Blend mode (alpha, multiply, add or none) * @return orxSTATUS_SUCCESS / orxSTATUS_FAILURE */ orxSTATUS orxFASTCALL orxGraphic_SetBlendMode(orxGRAPHIC *_pstGraphic, orxDISPLAY_BLEND_MODE _eBlendMode) { orxSTATUS eResult = orxSTATUS_SUCCESS; /* Checks */ orxASSERT(sstGraphic.u32Flags & orxGRAPHIC_KU32_STATIC_FLAG_READY); orxSTRUCTURE_ASSERT(_pstGraphic); /* Depending on blend mode */ switch(_eBlendMode) { case orxDISPLAY_BLEND_MODE_ALPHA: { /* Updates status */ orxStructure_SetFlags(_pstGraphic, orxGRAPHIC_KU32_FLAG_BLEND_MODE_ALPHA, orxGRAPHIC_KU32_MASK_BLEND_MODE_ALL); break; } case orxDISPLAY_BLEND_MODE_MULTIPLY: { /* Updates status */ orxStructure_SetFlags(_pstGraphic, orxGRAPHIC_KU32_FLAG_BLEND_MODE_MULTIPLY, orxGRAPHIC_KU32_MASK_BLEND_MODE_ALL); break; } case orxDISPLAY_BLEND_MODE_ADD: { /* Updates status */ orxStructure_SetFlags(_pstGraphic, orxGRAPHIC_KU32_FLAG_BLEND_MODE_ADD, orxGRAPHIC_KU32_MASK_BLEND_MODE_ALL); break; } case orxDISPLAY_BLEND_MODE_PREMUL: { /* Updates status */ orxStructure_SetFlags(_pstGraphic, orxGRAPHIC_KU32_FLAG_BLEND_MODE_PREMUL, orxGRAPHIC_KU32_MASK_BLEND_MODE_ALL); break; } default: { /* Updates status */ orxStructure_SetFlags(_pstGraphic, orxGRAPHIC_KU32_FLAG_BLEND_MODE_NONE, orxGRAPHIC_KU32_MASK_BLEND_MODE_ALL); /* Updates result */ eResult = orxSTATUS_FAILURE; break; } } /* Done! */ return eResult; }
/** Creates an empty graphic * @return Created orxGRAPHIC / orxNULL */ orxGRAPHIC *orxFASTCALL orxGraphic_Create() { orxGRAPHIC *pstGraphic; /* Checks */ orxASSERT(sstGraphic.u32Flags & orxGRAPHIC_KU32_STATIC_FLAG_READY); /* Creates graphic */ pstGraphic = orxGRAPHIC(orxStructure_Create(orxSTRUCTURE_ID_GRAPHIC)); /* Valid? */ if(pstGraphic != orxNULL) { /* Inits flags */ orxStructure_SetFlags(pstGraphic, orxGRAPHIC_KU32_FLAG_NONE, orxGRAPHIC_KU32_MASK_ALL); /* Clears its color */ orxGraphic_ClearColor(pstGraphic); /* Sets its repeat value to default */ orxGraphic_SetRepeat(pstGraphic, orxFLOAT_1, orxFLOAT_1); /* Increases counter */ orxStructure_IncreaseCounter(pstGraphic); } /* Done! */ return pstGraphic; }
/** Creates an empty text * @return orxTEXT / orxNULL */ orxTEXT *orxFASTCALL orxText_Create() { orxTEXT *pstResult; /* Checks */ orxASSERT(sstText.u32Flags & orxTEXT_KU32_STATIC_FLAG_READY); /* Creates text */ pstResult = orxTEXT(orxStructure_Create(orxSTRUCTURE_ID_TEXT)); /* Created? */ if(pstResult != orxNULL) { /* Inits it */ pstResult->zString = orxNULL; pstResult->pstFont = orxNULL; /* Inits flags */ orxStructure_SetFlags(pstResult, orxTEXT_KU32_FLAG_NONE, orxTEXT_KU32_MASK_ALL); /* Increases counter */ orxStructure_IncreaseCounter(pstResult); } else { /* Logs message */ orxDEBUG_PRINT(orxDEBUG_LEVEL_DISPLAY, "Failed to create structure for text."); } /* Done! */ return pstResult; }
/** Creates an empty TimeLine * @return Created orxTIMELINE / orxNULL */ orxTIMELINE *orxFASTCALL orxTimeLine_Create() { orxTIMELINE *pstResult; /* Checks */ orxASSERT(sstTimeLine.u32Flags & orxTIMELINE_KU32_STATIC_FLAG_READY); /* Creates TimeLine */ pstResult = orxTIMELINE(orxStructure_Create(orxSTRUCTURE_ID_TIMELINE)); /* Created? */ if(pstResult != orxNULL) { /* Inits flags */ orxStructure_SetFlags(pstResult, orxTIMELINE_KU32_FLAG_ENABLED, orxTIMELINE_KU32_MASK_ALL); /* Increases counter */ orxStructure_IncreaseCounter(pstResult); } else { /* Logs message */ orxDEBUG_PRINT(orxDEBUG_LEVEL_OBJECT, "Failed to create TimeLine structure."); } /* Done! */ return pstResult; }
/** Creates an empty SoundPointer * @return Created orxSOUNDPOINTER / orxNULL */ orxSOUNDPOINTER *orxFASTCALL orxSoundPointer_Create() { orxSOUNDPOINTER *pstResult; /* Checks */ orxASSERT(sstSoundPointer.u32Flags & orxSOUNDPOINTER_KU32_STATIC_FLAG_READY); /* Creates SoundPointer */ pstResult = orxSOUNDPOINTER(orxStructure_Create(orxSTRUCTURE_ID_SOUNDPOINTER)); /* Created? */ if(pstResult != orxNULL) { /* Clears last added sound index */ pstResult->u32LastAddedIndex = orxU32_UNDEFINED; /* Inits flags */ orxStructure_SetFlags(pstResult, orxSOUNDPOINTER_KU32_FLAG_ENABLED, orxSOUNDPOINTER_KU32_MASK_ALL); /* Increases counter */ orxStructure_IncreaseCounter(pstResult); } else { /* Logs message */ orxDEBUG_PRINT(orxDEBUG_LEVEL_SOUND, "Failed to create Sound Pointer structure."); } /* Done! */ return pstResult; }
/** Creates an empty FXPointer * @return Created orxFXPOINTER / orxNULL */ orxFXPOINTER *orxFASTCALL orxFXPointer_Create() { orxFXPOINTER *pstResult; /* Checks */ orxASSERT(sstFXPointer.u32Flags & orxFXPOINTER_KU32_STATIC_FLAG_READY); /* Creates FXPointer */ pstResult = orxFXPOINTER(orxStructure_Create(orxSTRUCTURE_ID_FXPOINTER)); /* Created? */ if(pstResult != orxNULL) { /* Inits flags */ orxStructure_SetFlags(pstResult, orxFXPOINTER_KU32_FLAG_ENABLED, orxFXPOINTER_KU32_MASK_ALL); /* Increases counter */ orxStructure_IncreaseCounter(pstResult); } else { /* Logs message */ orxDEBUG_PRINT(orxDEBUG_LEVEL_OBJECT, "Failed to create FX pointer structure."); } /* Done! */ return pstResult; }
/** Enables/disables an FXPointer * @param[in] _pstFXPointer Concerned FXPointer * @param[in] _bEnable enable / disable */ void orxFASTCALL orxFXPointer_Enable(orxFXPOINTER *_pstFXPointer, orxBOOL _bEnable) { /* Checks */ orxASSERT(sstFXPointer.u32Flags & orxFXPOINTER_KU32_STATIC_FLAG_READY); orxSTRUCTURE_ASSERT(_pstFXPointer); /* Enable? */ if(_bEnable != orxFALSE) { /* Updates status flags */ orxStructure_SetFlags(_pstFXPointer, orxFXPOINTER_KU32_FLAG_ENABLED, orxFXPOINTER_KU32_FLAG_NONE); } else { /* Updates status flags */ orxStructure_SetFlags(_pstFXPointer, orxFXPOINTER_KU32_FLAG_NONE, orxFXPOINTER_KU32_FLAG_ENABLED); } return; }
/** Enables/disables a TimeLine * @param[in] _pstTimeLine Concerned TimeLine * @param[in] _bEnable enable / disable */ void orxFASTCALL orxTimeLine_Enable(orxTIMELINE *_pstTimeLine, orxBOOL _bEnable) { /* Checks */ orxASSERT(sstTimeLine.u32Flags & orxTIMELINE_KU32_STATIC_FLAG_READY); orxSTRUCTURE_ASSERT(_pstTimeLine); /* Enable? */ if(_bEnable != orxFALSE) { /* Updates status flags */ orxStructure_SetFlags(_pstTimeLine, orxTIMELINE_KU32_FLAG_ENABLED, orxTIMELINE_KU32_FLAG_NONE); } else { /* Updates status flags */ orxStructure_SetFlags(_pstTimeLine, orxTIMELINE_KU32_FLAG_NONE, orxTIMELINE_KU32_FLAG_ENABLED); } /* Done! */ return; }
/** Sets text font * @param[in] _pstText Concerned text * @param[in] _pstFont Font / orxNULL to use default * @return orxSTATUS_SUCCESS / orxSTATUS_FAILURE */ orxSTATUS orxFASTCALL orxText_SetFont(orxTEXT *_pstText, orxFONT *_pstFont) { orxSTATUS eResult = orxSTATUS_SUCCESS; /* Checks */ orxASSERT(sstText.u32Flags & orxTEXT_KU32_STATIC_FLAG_READY); orxSTRUCTURE_ASSERT(_pstText); /* Different? */ if(_pstText->pstFont != _pstFont) { /* Has current font? */ if(_pstText->pstFont != orxNULL) { /* Updates structure reference counter */ orxStructure_DecreaseCounter(_pstText->pstFont); /* Internally handled? */ if(orxStructure_TestFlags(_pstText, orxTEXT_KU32_FLAG_INTERNAL)) { /* Removes its owner */ orxStructure_SetOwner(_pstText->pstFont, orxNULL); /* Deletes it */ orxFont_Delete(_pstText->pstFont); /* Updates flags */ orxStructure_SetFlags(_pstText, orxTEXT_KU32_FLAG_NONE, orxTEXT_KU32_FLAG_INTERNAL); } /* Cleans it */ _pstText->pstFont = orxNULL; } /* Has new font? */ if(_pstFont != orxNULL) { /* Stores it */ _pstText->pstFont = _pstFont; /* Updates its reference counter */ orxStructure_IncreaseCounter(_pstFont); } /* Updates text's size */ orxText_UpdateSize(_pstText); } /* Done! */ return eResult; }
/** Creates a clock * @param[in] _fTickSize Tick size for the clock (in seconds) * @param[in] _eType Type of the clock * @return orxCLOCK / orxNULL */ orxCLOCK *orxFASTCALL orxClock_Create(orxFLOAT _fTickSize, orxCLOCK_TYPE _eType) { orxCLOCK *pstClock; /* Checks */ orxASSERT(sstClock.u32Flags & orxCLOCK_KU32_STATIC_FLAG_READY); orxASSERT(_fTickSize >= orxFLOAT_0); /* Creates clock */ pstClock = orxCLOCK(orxStructure_Create(orxSTRUCTURE_ID_CLOCK)); /* Valid? */ if(pstClock != orxNULL) { /* Creates function bank */ pstClock->pstFunctionBank = orxBank_Create(orxCLOCK_KU32_FUNCTION_BANK_SIZE, sizeof(orxCLOCK_FUNCTION_STORAGE), orxBANK_KU32_FLAG_NONE, orxMEMORY_TYPE_MAIN); /* Valid? */ if(pstClock->pstFunctionBank != orxNULL) { /* Inits clock */ pstClock->stClockInfo.fTickSize = _fTickSize; pstClock->stClockInfo.eType = _eType; pstClock->stClockInfo.eModType = orxCLOCK_MOD_TYPE_NONE; orxStructure_SetFlags(pstClock, orxCLOCK_KU32_FLAG_NONE, orxCLOCK_KU32_MASK_ALL); /* Increases counter */ orxStructure_IncreaseCounter(pstClock); } else { /* Logs message */ orxDEBUG_PRINT(orxDEBUG_LEVEL_CLOCK, "Couldn't create clock function storage."); /* Deletes clock */ orxStructure_Delete(pstClock); /* Not allocated */ pstClock = orxNULL; } } else { /* Logs message */ orxDEBUG_PRINT(orxDEBUG_LEVEL_CLOCK, "Couldn't allocate bank for clock."); } /* Done! */ return pstClock; }
/** Unpauses a clock * @param[in] _pstClock Concerned clock * @return orxSTATUS_SUCCESS / orxSTATUS_FAILURE */ orxSTATUS orxFASTCALL orxClock_Unpause(orxCLOCK *_pstClock) { orxSTATUS eResult = orxSTATUS_SUCCESS; /* Checks */ orxASSERT(sstClock.u32Flags & orxCLOCK_KU32_STATIC_FLAG_READY); orxSTRUCTURE_ASSERT(_pstClock); /* Sends event */ orxEVENT_SEND(orxEVENT_TYPE_CLOCK, orxCLOCK_EVENT_UNPAUSE, _pstClock, orxNULL, orxNULL); /* Updates clock flags */ orxStructure_SetFlags(_pstClock, orxCLOCK_KU32_FLAG_NONE, orxCLOCK_KU32_FLAG_PAUSED); /* Done! */ return eResult; }
/** Clears graphic color * @param[in] _pstGraphic Concerned graphic * @return orxSTATUS_SUCCESS / orxSTATUS_FAILURE */ orxSTATUS orxFASTCALL orxGraphic_ClearColor(orxGRAPHIC *_pstGraphic) { orxSTATUS eResult = orxSTATUS_SUCCESS; /* Checks */ orxASSERT(sstGraphic.u32Flags & orxGRAPHIC_KU32_STATIC_FLAG_READY); orxSTRUCTURE_ASSERT(_pstGraphic); /* Updates its flag */ orxStructure_SetFlags(_pstGraphic, orxGRAPHIC_KU32_FLAG_NONE, orxGRAPHIC_KU32_FLAG_HAS_COLOR); /* Restores default color */ _pstGraphic->stColor.fAlpha = orxFLOAT_1; orxVector_Copy(&(_pstGraphic->stColor.vRGB), &orxVECTOR_WHITE); /* Done! */ return eResult; }
/** Sets graphic color * @param[in] _pstGraphic Concerned graphic * @param[in] _pstColor Color to set * @return orxSTATUS_SUCCESS / orxSTATUS_FAILURE */ orxSTATUS orxFASTCALL orxGraphic_SetColor(orxGRAPHIC *_pstGraphic, const orxCOLOR *_pstColor) { orxSTATUS eResult = orxSTATUS_SUCCESS; /* Checks */ orxASSERT(sstGraphic.u32Flags & orxGRAPHIC_KU32_STATIC_FLAG_READY); orxSTRUCTURE_ASSERT(_pstGraphic); orxASSERT(_pstColor != orxNULL); /* Stores color */ orxColor_Copy(&(_pstGraphic->stColor), _pstColor); /* Updates its flag */ orxStructure_SetFlags(_pstGraphic, orxGRAPHIC_KU32_FLAG_HAS_COLOR, orxGRAPHIC_KU32_FLAG_NONE); /* Done! */ return eResult; }
/** Sets graphic smoothing * @param[in] _pstGraphic Concerned graphic * @param[in] _eSmoothing Smoothing type (enabled, default or none) * @return orxSTATUS_SUCCESS / orxSTATUS_FAILURE */ orxSTATUS orxFASTCALL orxGraphic_SetSmoothing(orxGRAPHIC *_pstGraphic, orxDISPLAY_SMOOTHING _eSmoothing) { orxU32 u32Flags; orxSTATUS eResult = orxSTATUS_SUCCESS; /* Checks */ orxASSERT(sstGraphic.u32Flags & orxGRAPHIC_KU32_STATIC_FLAG_READY); orxSTRUCTURE_ASSERT(_pstGraphic); /* Depending on smoothing type */ switch(_eSmoothing) { case orxDISPLAY_SMOOTHING_ON: { /* Updates flags */ u32Flags = orxGRAPHIC_KU32_FLAG_SMOOTHING_ON; break; } case orxDISPLAY_SMOOTHING_OFF: { /* Updates flags */ u32Flags = orxGRAPHIC_KU32_FLAG_SMOOTHING_OFF; break; } default: case orxDISPLAY_SMOOTHING_DEFAULT: { /* Updates flags */ u32Flags = orxGRAPHIC_KU32_FLAG_NONE; break; } } /* Updates status */ orxStructure_SetFlags(_pstGraphic, u32Flags, orxGRAPHIC_KU32_FLAG_SMOOTHING_ON|orxGRAPHIC_KU32_FLAG_SMOOTHING_OFF); /* Done! */ return eResult; }
/** Sets graphic flipping * @param[in] _pstGraphic Concerned graphic * @param[in] _bFlipX Flip it on X axis * @param[in] _bFlipY Flip it on Y axis * @return orxSTATUS_SUCCESS / orxSTATUS_FAILURE */ orxSTATUS orxFASTCALL orxGraphic_SetFlip(orxGRAPHIC *_pstGraphic, orxBOOL _bFlipX, orxBOOL _bFlipY) { orxU32 u32Flags; orxSTATUS eResult = orxSTATUS_SUCCESS; /* Checks */ orxASSERT(sstGraphic.u32Flags & orxGRAPHIC_KU32_STATIC_FLAG_READY); orxSTRUCTURE_ASSERT(_pstGraphic); /* Updates flags */ u32Flags = (_bFlipX != orxFALSE) ? orxGRAPHIC_KU32_FLAG_FLIP_X : orxGRAPHIC_KU32_FLAG_NONE; u32Flags |= (_bFlipY != orxFALSE) ? orxGRAPHIC_KU32_FLAG_FLIP_Y : orxGRAPHIC_KU32_FLAG_NONE; /* Updates status */ orxStructure_SetFlags(_pstGraphic, u32Flags, orxGRAPHIC_KU32_MASK_FLIP_BOTH); /* 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; }
/** Creates a clock from config * @param[in] _zConfigID Config ID * @ return orxCLOCK / orxNULL */ orxCLOCK *orxFASTCALL orxClock_CreateFromConfig(const orxSTRING _zConfigID) { orxCLOCK *pstResult; /* Checks */ orxASSERT(sstClock.u32Flags & orxCLOCK_KU32_STATIC_FLAG_READY); /* Search for clock */ pstResult = orxClock_Get(_zConfigID); /* Found? */ if(pstResult != orxNULL) { /* Increases counter */ orxStructure_IncreaseCounter(pstResult); } else { /* Pushes section */ if((orxConfig_HasSection(_zConfigID) != orxFALSE) && (orxConfig_PushSection(_zConfigID) != orxSTATUS_FAILURE)) { orxFLOAT fFrequency; /* Gets its frequency */ fFrequency = orxConfig_GetFloat(orxCLOCK_KZ_CONFIG_FREQUENCY); /* Creates clock */ pstResult = orxClock_Create((fFrequency > orxFLOAT_0) ? orxFLOAT_1 / fFrequency : orxFLOAT_0, orxCLOCK_TYPE_USER); /* Valid? */ if(pstResult != orxNULL) { /* Has a modifier? */ if(orxConfig_HasValue(orxCLOCK_KZ_CONFIG_MODIFIER_TYPE) != orxFALSE) { orxFLOAT fModifierValue; /* Gets its value */ fModifierValue = orxConfig_GetFloat(orxCLOCK_KZ_CONFIG_MODIFIER_VALUE); /* Valid? */ if(fModifierValue > orxFLOAT_0) { const orxSTRING zModifierType; orxCLOCK_MOD_TYPE eModifierType; /* Gets modifier type */ zModifierType = orxConfig_GetString(orxCLOCK_KZ_CONFIG_MODIFIER_TYPE); /* Capped? */ if(orxString_ICompare(zModifierType, orxCLOCK_KZ_MODIFIER_CAPPED) == 0) { /* Updates modifier value */ fModifierValue = orxFLOAT_1 / fModifierValue; /* Updates modifier type */ eModifierType = orxCLOCK_MOD_TYPE_MAXED; } /* Fixed? */ else if(orxString_ICompare(zModifierType, orxCLOCK_KZ_MODIFIER_FIXED) == 0) { /* Updates modifier value */ fModifierValue = orxFLOAT_1 / fModifierValue; /* Updates modifier type */ eModifierType = orxCLOCK_MOD_TYPE_FIXED; } /* Multiply? */ else if(orxString_ICompare(zModifierType, orxCLOCK_KZ_MODIFIER_MULTIPLY) == 0) { /* Updates modifier type */ eModifierType = orxCLOCK_MOD_TYPE_MULTIPLY; } /* None */ else { /* Updates modifier type */ eModifierType = orxCLOCK_MOD_TYPE_NONE; } /* Updates clock */ orxClock_SetModifier(pstResult, eModifierType, fModifierValue); } } /* Stores its reference key */ pstResult->zReference = orxConfig_GetCurrentSection(); /* Protects it */ orxConfig_ProtectSection(pstResult->zReference, orxTRUE); /* Adds it to reference table */ orxHashTable_Add(sstClock.pstReferenceTable, orxString_ToCRC(pstResult->zReference), pstResult); /* Updates status flags */ orxStructure_SetFlags(pstResult, orxCLOCK_KU32_FLAG_REFERENCED, orxCLOCK_KU32_FLAG_NONE); } /* Pops previous section */ orxConfig_PopSection(); } else { /* Logs message */ orxDEBUG_PRINT(orxDEBUG_LEVEL_RENDER, "Cannot find config section named (%s).", _zConfigID); /* Updates result */ pstResult = orxNULL; } } /* Done! */ return pstResult; }
/** Creates a graphic from config * @param[in] _zConfigID Config ID * @ return orxGRAPHIC / orxNULL */ orxGRAPHIC *orxFASTCALL orxGraphic_CreateFromConfig(const orxSTRING _zConfigID) { orxGRAPHIC *pstResult; /* Checks */ orxASSERT(sstGraphic.u32Flags & orxGRAPHIC_KU32_STATIC_FLAG_READY); orxASSERT((_zConfigID != orxNULL) && (_zConfigID != orxSTRING_EMPTY)); /* Pushes section */ if((orxConfig_HasSection(_zConfigID) != orxFALSE) && (orxConfig_PushSection(_zConfigID) != orxSTATUS_FAILURE)) { /* Creates graphic */ pstResult = orxGraphic_Create(); /* Valid? */ if(pstResult != orxNULL) { const orxSTRING zName; orxU32 u32Flags = orxGRAPHIC_KU32_FLAG_NONE; /* Gets texture name */ zName = orxConfig_GetString(orxGRAPHIC_KZ_CONFIG_TEXTURE_NAME); /* Valid? */ if((zName != orxNULL) && (zName != orxSTRING_EMPTY)) { orxTEXTURE *pstTexture; /* Creates texture */ pstTexture = orxTexture_CreateFromFile(zName); /* Valid? */ if(pstTexture != orxNULL) { /* Links it */ if(orxGraphic_SetData(pstResult, (orxSTRUCTURE *)pstTexture) != orxSTATUS_FAILURE) { orxVECTOR vTextureSize; /* Updates its owner */ orxStructure_SetOwner(pstTexture, pstResult); /* Inits default 2D flags */ u32Flags = orxGRAPHIC_KU32_FLAG_INTERNAL | orxGRAPHIC_KU32_FLAG_2D; /* Has size? */ if(orxConfig_GetVector(orxGRAPHIC_KZ_CONFIG_TEXTURE_SIZE, &vTextureSize) != orxNULL) { orxVECTOR vTextureOrigin; /* Has origin? */ if(orxConfig_GetVector(orxGRAPHIC_KZ_CONFIG_TEXTURE_ORIGIN, &vTextureOrigin) != orxNULL) { /* Stores them */ pstResult->fLeft = vTextureOrigin.fX; pstResult->fTop = vTextureOrigin.fY; pstResult->fWidth = vTextureSize.fX; pstResult->fHeight = vTextureSize.fY; } /* Has corner? */ else if(orxConfig_GetVector(orxGRAPHIC_KZ_CONFIG_TEXTURE_CORNER, &vTextureOrigin) != orxNULL) { /* Stores them */ pstResult->fLeft = vTextureOrigin.fX; pstResult->fTop = vTextureOrigin.fY; pstResult->fWidth = vTextureSize.fX; pstResult->fHeight = vTextureSize.fY; } else { /* Updates size */ orxGraphic_UpdateSize(pstResult); } } else { /* Updates size */ orxGraphic_UpdateSize(pstResult); } } else { /* Logs message */ orxDEBUG_PRINT(orxDEBUG_LEVEL_DISPLAY, "Couldn't link texture (%s) data to graphic (%s).", zName, _zConfigID); /* Deletes structures */ orxTexture_Delete(pstTexture); } } } /* Still no data? */ if(pstResult->pstData == orxNULL) { /* Gets text name */ zName = orxConfig_GetString(orxGRAPHIC_KZ_CONFIG_TEXT_NAME); /* Valid? */ if((zName != orxNULL) && (zName != orxSTRING_EMPTY)) { orxTEXT *pstText; /* Creates text */ pstText = orxText_CreateFromConfig(zName); /* Valid? */ if(pstText != orxNULL) { /* Links it */ if(orxGraphic_SetData(pstResult, (orxSTRUCTURE *)pstText) != orxSTATUS_FAILURE) { /* Sets its owner */ orxStructure_SetOwner(pstText, pstResult); /* Inits default text flags */ u32Flags = orxGRAPHIC_KU32_FLAG_INTERNAL | orxGRAPHIC_KU32_FLAG_TEXT; /* Updates size */ orxGraphic_UpdateSize(pstResult); } else { /* Logs message */ orxDEBUG_PRINT(orxDEBUG_LEVEL_DISPLAY, "Couldn't link text (%s) data to graphic (%s).", zName, _zConfigID); /* Deletes structures */ orxText_Delete(pstText); } } } } /* Has data? */ if(pstResult->pstData != orxNULL) { const orxSTRING zFlipping; orxVECTOR vPivot; /* Gets pivot value */ if(orxConfig_GetVector(orxGRAPHIC_KZ_CONFIG_PIVOT, &vPivot) != orxNULL) { /* Updates it */ orxGraphic_SetPivot(pstResult, &vPivot); } /* Has relative pivot point? */ else if(orxConfig_HasValue(orxGRAPHIC_KZ_CONFIG_PIVOT) != orxFALSE) { orxCHAR acBuffer[64]; orxSTRING zRelativePos; orxU32 u32AlignmentFlags = orxGRAPHIC_KU32_FLAG_ALIGN_CENTER; /* Gets lower case value */ acBuffer[sizeof(acBuffer) - 1] = orxCHAR_NULL; zRelativePos = orxString_LowerCase(orxString_NCopy(acBuffer, orxConfig_GetString(orxGRAPHIC_KZ_CONFIG_PIVOT), sizeof(acBuffer) - 1)); /* Left? */ if(orxString_SearchString(zRelativePos, orxGRAPHIC_KZ_LEFT_PIVOT) != orxNULL) { /* Updates alignment flags */ u32AlignmentFlags |= orxGRAPHIC_KU32_FLAG_ALIGN_LEFT; } /* Right? */ else if(orxString_SearchString(zRelativePos, orxGRAPHIC_KZ_RIGHT_PIVOT) != orxNULL) { /* Updates alignment flags */ u32AlignmentFlags |= orxGRAPHIC_KU32_FLAG_ALIGN_RIGHT; } /* Top? */ if(orxString_SearchString(zRelativePos, orxGRAPHIC_KZ_TOP_PIVOT) != orxNULL) { /* Updates alignment flags */ u32AlignmentFlags |= orxGRAPHIC_KU32_FLAG_ALIGN_TOP; } /* Bottom? */ else if(orxString_SearchString(zRelativePos, orxGRAPHIC_KZ_BOTTOM_PIVOT) != orxNULL) { /* Updates alignment flags */ u32AlignmentFlags |= orxGRAPHIC_KU32_FLAG_ALIGN_BOTTOM; } /* Truncate? */ if(orxString_SearchString(zRelativePos, orxGRAPHIC_KZ_TRUNCATE_PIVOT) != orxNULL) { /* Updates alignment flags */ u32AlignmentFlags |= orxGRAPHIC_KU32_FLAG_ALIGN_TRUNCATE; } /* Round? */ else if(orxString_SearchString(zRelativePos, orxGRAPHIC_KZ_ROUND_PIVOT) != orxNULL) { /* Updates alignment flags */ u32AlignmentFlags |= orxGRAPHIC_KU32_FLAG_ALIGN_ROUND; } /* Valid? */ if((u32AlignmentFlags != orxGRAPHIC_KU32_FLAG_ALIGN_CENTER) || (orxString_SearchString(zRelativePos, orxGRAPHIC_KZ_CENTERED_PIVOT) != orxNULL)) { /* Applies it */ orxGraphic_SetRelativePivot(pstResult, u32AlignmentFlags); } } /* Gets flipping value */ zFlipping = orxConfig_GetString(orxGRAPHIC_KZ_CONFIG_FLIP); /* X flipping? */ if(orxString_ICompare(zFlipping, orxGRAPHIC_KZ_X) == 0) { /* Updates frame flags */ u32Flags |= orxGRAPHIC_KU32_FLAG_FLIP_X; } /* Y flipping? */ else if(orxString_ICompare(zFlipping, orxGRAPHIC_KZ_Y) == 0) { /* Updates frame flags */ u32Flags |= orxGRAPHIC_KU32_FLAG_FLIP_Y; } /* Both flipping? */ else if(orxString_ICompare(zFlipping, orxGRAPHIC_KZ_BOTH) == 0) { /* Updates frame flags */ u32Flags |= orxGRAPHIC_KU32_FLAG_FLIP_X | orxGRAPHIC_KU32_FLAG_FLIP_Y; } /* Has color? */ if(orxConfig_HasValue(orxGRAPHIC_KZ_CONFIG_COLOR) != orxFALSE) { orxVECTOR vColor; /* Gets its value */ orxConfig_GetVector(orxGRAPHIC_KZ_CONFIG_COLOR, &vColor); /* Normalizes and applies it */ orxVector_Mulf(&(pstResult->stColor.vRGB), &vColor, orxCOLOR_NORMALIZER); /* Updates status */ orxStructure_SetFlags(pstResult, orxGRAPHIC_KU32_FLAG_HAS_COLOR, orxGRAPHIC_KU32_FLAG_NONE); } /* Has RGB values? */ else if(orxConfig_HasValue(orxGRAPHIC_KZ_CONFIG_RGB) != orxFALSE) { /* Gets its value */ orxConfig_GetVector(orxGRAPHIC_KZ_CONFIG_RGB, &(pstResult->stColor.vRGB)); /* Updates status */ orxStructure_SetFlags(pstResult, orxGRAPHIC_KU32_FLAG_HAS_COLOR, orxGRAPHIC_KU32_FLAG_NONE); } /* Has HSL values? */ else if(orxConfig_HasValue(orxGRAPHIC_KZ_CONFIG_HSL) != orxFALSE) { /* Gets its value */ orxConfig_GetVector(orxGRAPHIC_KZ_CONFIG_HSL, &(pstResult->stColor.vHSL)); /* Stores its RGB equivalent */ orxColor_FromHSLToRGB(&(pstResult->stColor), &(pstResult->stColor)); /* Updates status */ orxStructure_SetFlags(pstResult, orxGRAPHIC_KU32_FLAG_HAS_COLOR, orxGRAPHIC_KU32_FLAG_NONE); } /* Has HSV values? */ else if(orxConfig_HasValue(orxGRAPHIC_KZ_CONFIG_HSV) != orxFALSE) { /* Gets its value */ orxConfig_GetVector(orxGRAPHIC_KZ_CONFIG_HSV, &(pstResult->stColor.vHSV)); /* Stores its RGB equivalent */ orxColor_FromHSVToRGB(&(pstResult->stColor), &(pstResult->stColor)); /* Updates status */ orxStructure_SetFlags(pstResult, orxGRAPHIC_KU32_FLAG_HAS_COLOR, orxGRAPHIC_KU32_FLAG_NONE); } /* Has alpha? */ if(orxConfig_HasValue(orxGRAPHIC_KZ_CONFIG_ALPHA) != orxFALSE) { /* Applies it */ orxColor_SetAlpha(&(pstResult->stColor), orxConfig_GetFloat(orxGRAPHIC_KZ_CONFIG_ALPHA)); /* Updates status */ orxStructure_SetFlags(pstResult, orxGRAPHIC_KU32_FLAG_HAS_COLOR, orxGRAPHIC_KU32_FLAG_NONE); } /* Should repeat? */ if(orxConfig_HasValue(orxGRAPHIC_KZ_CONFIG_REPEAT) != orxFALSE) { orxVECTOR vRepeat; /* Gets its value */ orxConfig_GetVector(orxGRAPHIC_KZ_CONFIG_REPEAT, &vRepeat); /* Stores it */ orxGraphic_SetRepeat(pstResult, vRepeat.fX, vRepeat.fY); } /* Has smoothing value? */ if(orxConfig_HasValue(orxGRAPHIC_KZ_CONFIG_SMOOTHING) != orxFALSE) { /* Updates flags */ u32Flags |= (orxConfig_GetBool(orxGRAPHIC_KZ_CONFIG_SMOOTHING) != orxFALSE) ? orxGRAPHIC_KU32_FLAG_SMOOTHING_ON : orxGRAPHIC_KU32_FLAG_SMOOTHING_OFF; } /* Has blend mode? */ if(orxConfig_HasValue(orxGRAPHIC_KZ_CONFIG_BLEND_MODE) != orxFALSE) { const orxSTRING zBlendMode; orxDISPLAY_BLEND_MODE eBlendMode; /* Gets blend mode value */ zBlendMode = orxConfig_GetString(orxGRAPHIC_KZ_CONFIG_BLEND_MODE); eBlendMode = orxDisplay_GetBlendModeFromString(zBlendMode); /* Depending on blend mode */ switch(eBlendMode) { case orxDISPLAY_BLEND_MODE_ALPHA: { /* Updates flags */ u32Flags |= orxGRAPHIC_KU32_FLAG_BLEND_MODE_ALPHA; break; } case orxDISPLAY_BLEND_MODE_MULTIPLY: { /* Updates flags */ u32Flags |= orxGRAPHIC_KU32_FLAG_BLEND_MODE_MULTIPLY; break; } case orxDISPLAY_BLEND_MODE_ADD: { /* Updates flags */ u32Flags |= orxGRAPHIC_KU32_FLAG_BLEND_MODE_ADD; break; } case orxDISPLAY_BLEND_MODE_PREMUL: { /* Updates flags */ u32Flags |= orxGRAPHIC_KU32_FLAG_BLEND_MODE_PREMUL; break; } default: { } } } else { /* Defaults to alpha */ u32Flags |= orxGRAPHIC_KU32_FLAG_BLEND_MODE_ALPHA; } /* Stores its reference key */ pstResult->zReference = orxConfig_GetCurrentSection(); /* Protects it */ orxConfig_ProtectSection(pstResult->zReference, orxTRUE); /* Updates status flags */ orxStructure_SetFlags(pstResult, u32Flags, orxGRAPHIC_KU32_FLAG_NONE); } else { /* Logs message */ orxDEBUG_PRINT(orxDEBUG_LEVEL_DISPLAY, "Couldn't get text or texture for graphic (%s).", _zConfigID); /* Deletes structures */ orxGraphic_Delete(pstResult); /* Updates result */ pstResult = orxNULL; } } /* Pops previous section */ orxConfig_PopSection(); } else { /* Logs message */ orxDEBUG_PRINT(orxDEBUG_LEVEL_DISPLAY, "Couldn't find config section named (%s).", _zConfigID); /* Updates result */ pstResult = orxNULL; } /* Done! */ return pstResult; }
/** Creates a camera from config * @param[in] _zConfigID Config ID * @ return orxCAMERA / orxNULL */ orxCAMERA *orxFASTCALL orxCamera_CreateFromConfig(const orxSTRING _zConfigID) { orxCAMERA *pstResult; /* Checks */ orxASSERT(sstCamera.u32Flags & orxCAMERA_KU32_STATIC_FLAG_READY); /* Search for camera */ pstResult = orxCamera_Get(_zConfigID); /* Not already created? */ if(pstResult == orxNULL) { /* Pushes section */ if((orxConfig_HasSection(_zConfigID) != orxFALSE) && (orxConfig_PushSection(_zConfigID) != orxSTATUS_FAILURE)) { /* Creates 2D default camera */ pstResult = orxCamera_Create(orxCAMERA_KU32_FLAG_2D); /* Valid? */ if(pstResult != orxNULL) { orxVECTOR vPosition; orxFLOAT fNear, fFar, fWidth, fHeight; /* Gets frustum info */ fNear = orxConfig_GetFloat(orxCAMERA_KZ_CONFIG_FRUSTUM_NEAR); fFar = orxConfig_GetFloat(orxCAMERA_KZ_CONFIG_FRUSTUM_FAR); fWidth = orxConfig_GetFloat(orxCAMERA_KZ_CONFIG_FRUSTUM_WIDTH); fHeight = orxConfig_GetFloat(orxCAMERA_KZ_CONFIG_FRUSTUM_HEIGHT); /* Applies it */ orxCamera_SetFrustum(pstResult, fWidth, fHeight, fNear, fFar); /* Has zoom? */ if(orxConfig_HasValue(orxCAMERA_KZ_CONFIG_ZOOM) != orxFALSE) { orxFLOAT fZoom; /* Gets config zoom */ fZoom = orxConfig_GetFloat(orxCAMERA_KZ_CONFIG_ZOOM); /* Valid? */ if(fZoom > orxFLOAT_0) { /* Applies it */ orxCamera_SetZoom(pstResult, fZoom); } } /* Has a position? */ if(orxConfig_GetVector(orxCAMERA_KZ_CONFIG_POSITION, &vPosition) != orxNULL) { /* Updates camera position */ orxCamera_SetPosition(pstResult, &vPosition); } /* Updates object rotation */ orxCamera_SetRotation(pstResult, orxMATH_KF_DEG_TO_RAD * orxConfig_GetFloat(orxCAMERA_KZ_CONFIG_ROTATION)); /* Stores its reference key */ pstResult->zReference = orxConfig_GetCurrentSection(); /* Protects it */ orxConfig_ProtectSection(pstResult->zReference, orxTRUE); /* Adds it to reference table */ orxHashTable_Add(sstCamera.pstReferenceTable, orxString_ToCRC(pstResult->zReference), pstResult); /* Updates status flags */ orxStructure_SetFlags(pstResult, orxCAMERA_KU32_FLAG_REFERENCED, orxCAMERA_KU32_FLAG_NONE); } /* Pops previous section */ orxConfig_PopSection(); } else { /* Logs message */ orxDEBUG_PRINT(orxDEBUG_LEVEL_RENDER, "Cannot find config section named (%s).", _zConfigID); /* Updates result */ pstResult = orxNULL; } } /* Done! */ return pstResult; }
/** Creates a camera * @param[in] _u32Flags Camera flags (2D / ...) * @return Created orxCAMERA / orxNULL */ orxCAMERA *orxFASTCALL orxCamera_Create(orxU32 _u32Flags) { orxCAMERA *pstCamera = orxNULL; orxFRAME *pstFrame; /* Checks */ orxASSERT(sstCamera.u32Flags & orxCAMERA_KU32_STATIC_FLAG_READY); orxASSERT((_u32Flags & orxCAMERA_KU32_MASK_USER_ALL) == _u32Flags); /* Creates camera */ pstCamera = orxCAMERA(orxStructure_Create(orxSTRUCTURE_ID_CAMERA)); /* Valid? */ if(pstCamera != orxNULL) { /* Creates frame */ pstFrame = orxFrame_Create(orxFRAME_KU32_FLAG_NONE); /* Valid? */ if(pstFrame != orxNULL) { /* 2D? */ if(orxFLAG_TEST(_u32Flags, orxCAMERA_KU32_FLAG_2D)) { /* Stores frame */ pstCamera->pstFrame = pstFrame; /* Increases its reference counter */ orxStructure_IncreaseCounter(pstFrame); /* Updates flags */ orxStructure_SetFlags(pstCamera, orxCAMERA_KU32_FLAG_2D, orxCAMERA_KU32_FLAG_NONE); } else { /* Logs message */ orxDEBUG_PRINT(orxDEBUG_LEVEL_RENDER, "Camera currently only supports 2d."); /* Fress partially allocated camera */ orxFrame_Delete(pstFrame); orxStructure_Delete(pstCamera); /* Updates result */ pstCamera = orxNULL; } } else { /* Logs message */ orxDEBUG_PRINT(orxDEBUG_LEVEL_RENDER, "Failed to create camera's frame."); /* Fress partially allocated camera */ orxStructure_Delete(pstCamera); /* Updates result */ pstCamera = orxNULL; } } else { /* Logs message */ orxDEBUG_PRINT(orxDEBUG_LEVEL_RENDER, "Failed to create camera."); } /* Done! */ return pstCamera; }
/** Adds a track to a TimeLine from config * @param[in] _pstTimeLine Concerned TimeLine * @param[in] _zTrackID Config ID * return orxSTATUS_SUCCESS / orxSTATUS_FAILURE */ orxSTATUS orxFASTCALL orxTimeLine_AddTrackFromConfig(orxTIMELINE *_pstTimeLine, const orxSTRING _zTrackID) { orxU32 u32Index; orxSTATUS eResult = orxSTATUS_FAILURE; /* Checks */ orxSTRUCTURE_ASSERT(_pstTimeLine); orxASSERT((_zTrackID != orxNULL) && (_zTrackID != orxSTRING_EMPTY)); /* Checks */ orxSTRUCTURE_ASSERT(_pstTimeLine); /* Finds an empty track */ for(u32Index = 0; (u32Index < orxTIMELINE_KU32_TRACK_NUMBER) && (_pstTimeLine->astTrackList[u32Index].pstTrack != orxNULL); u32Index++); /* Found? */ if(u32Index < orxTIMELINE_KU32_TRACK_NUMBER) { orxTIMELINE_TRACK *pstTrack; orxU32 u32ID; /* Gets track ID */ u32ID = orxString_ToCRC(_zTrackID); /* Search for reference */ pstTrack = (orxTIMELINE_TRACK *)orxHashTable_Get(sstTimeLine.pstTrackTable, u32ID); /* Found? */ if(pstTrack != orxNULL) { /* Increases counter */ pstTrack->u32RefCounter++; } else { /* Creates track */ pstTrack = orxTimeLine_CreateTrack(_zTrackID); } /* Valid? */ if(pstTrack != orxNULL) { orxTIMELINE_EVENT_PAYLOAD stPayload; orxSTRUCTURE *pstOwner; /* Gets owner */ pstOwner = orxStructure_GetOwner(_pstTimeLine); /* Updates track holder */ _pstTimeLine->astTrackList[u32Index].pstTrack = pstTrack; _pstTimeLine->astTrackList[u32Index].fStartTime = _pstTimeLine->fTime; _pstTimeLine->astTrackList[u32Index].u32NextEventIndex = 0; _pstTimeLine->astTrackList[u32Index].u32Flags = orxTIMELINE_HOLDER_KU32_FLAG_NONE; /* Inits event payload */ orxMemory_Zero(&stPayload, sizeof(orxTIMELINE_EVENT_PAYLOAD)); stPayload.pstTimeLine = _pstTimeLine; stPayload.zTrackName = pstTrack->zReference; /* Sends event */ orxEVENT_SEND(orxEVENT_TYPE_TIMELINE, orxTIMELINE_EVENT_TRACK_ADD, pstOwner, pstOwner, &stPayload); /* Updates timeline flags */ orxStructure_SetFlags(_pstTimeLine, orxTIMELINE_KU32_FLAG_DIRTY, orxTIMELINE_KU32_FLAG_NONE); /* Is immediate? */ if(orxFLAG_TEST(pstTrack->u32Flags, orxTIMELINE_TRACK_KU32_FLAG_IMMEDIATE)) { /* Updates it */ orxTimeLine_Update(orxSTRUCTURE(_pstTimeLine), pstOwner, orxNULL); } /* Updates result */ eResult = orxSTATUS_SUCCESS; } } else { /* Logs message */ orxDEBUG_PRINT(orxDEBUG_LEVEL_OBJECT, "No room for a new track in TimeLine, can't add track <%s>.", _zTrackID); } /* Done! */ return eResult; }
/** Sets graphic data * @param[in] _pstGraphic Graphic concerned * @param[in] _pstData Data structure to set / orxNULL * @return orxSTATUS_SUCCESS / orxSTATUS_FAILURE */ orxSTATUS orxFASTCALL orxGraphic_SetData(orxGRAPHIC *_pstGraphic, orxSTRUCTURE *_pstData) { orxSTATUS eResult = orxSTATUS_SUCCESS; /* Checks */ orxASSERT(sstGraphic.u32Flags & orxGRAPHIC_KU32_STATIC_FLAG_READY); orxSTRUCTURE_ASSERT(_pstGraphic); /* Had previous data? */ if(_pstGraphic->pstData != orxNULL) { /* Updates structure reference counter */ orxStructure_DecreaseCounter(_pstGraphic->pstData); /* Internally handled? */ if(orxStructure_TestFlags(_pstGraphic, orxGRAPHIC_KU32_FLAG_INTERNAL)) { /* Removes its owner */ orxStructure_SetOwner(_pstGraphic->pstData, orxNULL); /* 2D data? */ if(orxStructure_TestFlags(_pstGraphic, orxGRAPHIC_KU32_FLAG_2D)) { /* Deletes it */ orxTexture_Delete(orxTEXTURE(_pstGraphic->pstData)); } /* Text data? */ else if(orxStructure_TestFlags(_pstGraphic, orxGRAPHIC_KU32_FLAG_TEXT)) { /* Deletes it */ orxText_Delete(orxTEXT(_pstGraphic->pstData)); } else { /* Logs message */ orxDEBUG_PRINT(orxDEBUG_LEVEL_DISPLAY, "Non-2d (texture/text) graphics not supported yet."); /* Updates result */ eResult = orxSTATUS_FAILURE; } /* Updates flags */ orxStructure_SetFlags(_pstGraphic, orxGRAPHIC_KU32_FLAG_NONE, orxGRAPHIC_KU32_FLAG_INTERNAL); } /* Cleans reference */ _pstGraphic->pstData = orxNULL; } /* Valid & sets new data? */ if((eResult != orxSTATUS_FAILURE) && (_pstData != orxNULL)) { /* Stores it */ _pstGraphic->pstData = _pstData; /* Updates structure reference counter */ orxStructure_IncreaseCounter(_pstData); /* Is data a texture? */ if(orxTEXTURE(_pstData) != orxNULL) { /* Updates flags */ orxStructure_SetFlags(_pstGraphic, orxGRAPHIC_KU32_FLAG_2D, orxGRAPHIC_KU32_MASK_TYPE); } /* Is data a text? */ else if(orxTEXT(_pstData) != orxNULL) { /* Updates flags */ orxStructure_SetFlags(_pstGraphic, orxGRAPHIC_KU32_FLAG_TEXT, orxGRAPHIC_KU32_MASK_TYPE); } else { /* Logs message */ orxDEBUG_PRINT(orxDEBUG_LEVEL_DISPLAY, "Data given is not a texture nor a text."); /* Updates flags */ orxStructure_SetFlags(_pstGraphic, orxGRAPHIC_KU32_FLAG_NONE, orxGRAPHIC_KU32_MASK_TYPE); /* Updates result */ eResult = orxSTATUS_FAILURE; } } else { /* Updates flags */ orxStructure_SetFlags(_pstGraphic, orxGRAPHIC_KU32_FLAG_NONE, orxGRAPHIC_KU32_MASK_TYPE); } /* Done! */ return eResult; }
/** 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 TimeLine (Callback for generic structure update calling) * @param[in] _pstStructure Generic Structure or the concerned Body * @param[in] _pstCaller Structure of the caller * @param[in] _pstClockInfo Clock info used for time updates * @return orxSTATUS_SUCCESS / orxSTATUS_FAILURE */ static orxSTATUS orxFASTCALL orxTimeLine_Update(orxSTRUCTURE *_pstStructure, const orxSTRUCTURE *_pstCaller, const orxCLOCK_INFO *_pstClockInfo) { orxTIMELINE *pstTimeLine; orxSTATUS eResult = orxSTATUS_SUCCESS; /* Profiles */ orxPROFILER_PUSH_MARKER("orxTimeLine_Update"); /* Checks */ orxASSERT(sstTimeLine.u32Flags & orxTIMELINE_KU32_STATIC_FLAG_READY); orxSTRUCTURE_ASSERT(_pstStructure); orxSTRUCTURE_ASSERT(_pstCaller); /* Gets TimeLine */ pstTimeLine = orxTIMELINE(_pstStructure); /* Is enabled? */ if(orxTimeLine_IsEnabled(pstTimeLine) != orxFALSE) { orxU32 i; /* Cleans its flags */ orxStructure_SetFlags(pstTimeLine, orxTIMELINE_KU32_FLAG_NONE, orxTIMELINE_KU32_FLAG_DIRTY); /* Has clock info? */ if(_pstClockInfo != orxNULL) { /* Computes its new time cursor */ pstTimeLine->fTime += _pstClockInfo->fDT; } /* For all tracks */ for(i = 0; i < orxTIMELINE_KU32_TRACK_NUMBER; i++) { orxTIMELINE_TRACK *pstTrack; /* Is timeline dirty? */ if(orxStructure_TestFlags(pstTimeLine, orxTIMELINE_KU32_FLAG_DIRTY)) { orxU32 j; /* For all previous tracks */ for(j = 0; j < i; j++) { /* Is defined? */ if(pstTimeLine->astTrackList[j].pstTrack != orxNULL) { /* Hasn't been updated? */ if(!orxFLAG_TEST(pstTimeLine->astTrackList[j].u32Flags, orxTIMELINE_HOLDER_KU32_FLAG_UPDATED)) { /* Selects it */ i = j; break; } } } } /* Gets track */ pstTrack = pstTimeLine->astTrackList[i].pstTrack; /* Valid and not already updated? */ if((pstTrack != orxNULL) && (!orxFLAG_TEST(pstTimeLine->astTrackList[i].u32Flags, orxTIMELINE_HOLDER_KU32_FLAG_UPDATED))) { orxFLOAT fTrackLocalTime; /* Gets track local time */ fTrackLocalTime = pstTimeLine->fTime - pstTimeLine->astTrackList[i].fStartTime; /* Has time come? */ if(fTrackLocalTime >= orxFLOAT_0) { orxTIMELINE_EVENT_PAYLOAD stPayload; orxU32 u32EventIndex; /* Is the first time? */ if(!orxFLAG_TEST(pstTimeLine->astTrackList[i].u32Flags, orxTIMELINE_HOLDER_KU32_FLAG_PLAYED)) { /* Inits event payload */ orxMemory_Zero(&stPayload, sizeof(orxTIMELINE_EVENT_PAYLOAD)); stPayload.pstTimeLine = pstTimeLine; stPayload.zTrackName = pstTrack->zReference; /* Sends event */ orxEVENT_SEND(orxEVENT_TYPE_TIMELINE, orxTIMELINE_EVENT_TRACK_START, _pstCaller, _pstCaller, &stPayload); } /* Updates its status */ orxFLAG_SET(pstTimeLine->astTrackList[i].u32Flags, orxTIMELINE_HOLDER_KU32_FLAG_PLAYED | orxTIMELINE_HOLDER_KU32_FLAG_UPDATED, orxTIMELINE_HOLDER_KU32_FLAG_NONE); /* Inits event payload */ orxMemory_Zero(&stPayload, sizeof(orxTIMELINE_EVENT_PAYLOAD)); stPayload.pstTimeLine = pstTimeLine; stPayload.zTrackName = pstTrack->zReference; /* For all recently past events */ for(u32EventIndex = pstTimeLine->astTrackList[i].u32NextEventIndex; (u32EventIndex < pstTrack->u32EventCounter) && (fTrackLocalTime >= pstTrack->astEventList[u32EventIndex].fTimeStamp); u32EventIndex++) { /* Updates payload */ stPayload.zEvent = pstTrack->astEventList[u32EventIndex].zEventText; stPayload.fTimeStamp = pstTrack->astEventList[u32EventIndex].fTimeStamp; /* Sends event */ orxEVENT_SEND(orxEVENT_TYPE_TIMELINE, orxTIMELINE_EVENT_TRIGGER, _pstCaller, _pstCaller, &stPayload); } /* Is over? */ if(u32EventIndex >= pstTrack->u32EventCounter) { orxTIMELINE_TRACK *pstTrack; /* Gets track */ pstTrack = pstTimeLine->astTrackList[i].pstTrack; /* Inits event payload */ orxMemory_Zero(&stPayload, sizeof(orxTIMELINE_EVENT_PAYLOAD)); stPayload.pstTimeLine = pstTimeLine; stPayload.zTrackName = pstTrack->zReference; /* Is a looping track? */ if(orxFLAG_TEST(pstTrack->u32Flags, orxTIMELINE_TRACK_KU32_FLAG_LOOP)) { /* Sends event */ orxEVENT_SEND(orxEVENT_TYPE_TIMELINE, orxTIMELINE_EVENT_LOOP, _pstCaller, _pstCaller, &stPayload); /* Resets track */ pstTimeLine->astTrackList[i].u32NextEventIndex = 0; pstTimeLine->astTrackList[i].fStartTime = pstTimeLine->fTime; } else { /* Sends event */ orxEVENT_SEND(orxEVENT_TYPE_TIMELINE, orxTIMELINE_EVENT_TRACK_STOP, _pstCaller, _pstCaller, &stPayload); /* Removes its reference */ pstTimeLine->astTrackList[i].pstTrack = orxNULL; /* Sends event */ orxEVENT_SEND(orxEVENT_TYPE_TIMELINE, orxTIMELINE_EVENT_TRACK_REMOVE, _pstCaller, _pstCaller, &stPayload); /* Deletes it */ orxTimeLine_DeleteTrack(pstTrack); } } else { /* Updates next event index */ pstTimeLine->astTrackList[i].u32NextEventIndex = u32EventIndex; } } } } /* For all tracks */ for(i = 0; i < orxTIMELINE_KU32_TRACK_NUMBER; i++) { /* Clears its update flag */ orxFLAG_SET(pstTimeLine->astTrackList[i].u32Flags, orxTIMELINE_HOLDER_KU32_FLAG_NONE, orxTIMELINE_HOLDER_KU32_FLAG_UPDATED); } } /* Profiles */ orxPROFILER_POP_MARKER(); /* Done! */ return eResult; }
static orxSTATUS orxFASTCALL orxText_ProcessConfigData(orxTEXT *_pstText) { const orxSTRING zString; const orxSTRING zName; orxSTATUS eResult = orxSTATUS_FAILURE; /* Pushes its config section */ orxConfig_PushSection(_pstText->zReference); /* Gets font name */ zName = orxConfig_GetString(orxTEXT_KZ_CONFIG_FONT); /* Begins with locale marker? */ if(*zName == orxTEXT_KC_LOCALE_MARKER) { /* Gets its locale value */ zName = (*(zName + 1) == orxTEXT_KC_LOCALE_MARKER) ? zName + 1 : orxLocale_GetString(zName + 1); } /* Valid? */ if((zName != orxNULL) && (zName != orxSTRING_EMPTY)) { orxFONT *pstFont; /* Creates font */ pstFont = orxFont_CreateFromConfig(zName); /* Valid? */ if(pstFont != orxNULL) { /* Stores it */ if(orxText_SetFont(_pstText, pstFont) != orxSTATUS_FAILURE) { /* Sets its owner */ orxStructure_SetOwner(pstFont, _pstText); /* Updates flags */ orxStructure_SetFlags(_pstText, orxTEXT_KU32_FLAG_INTERNAL, orxTEXT_KU32_FLAG_NONE); } else { /* Logs message */ orxDEBUG_PRINT(orxDEBUG_LEVEL_DISPLAY, "Couldn't set font (%s) for text (%s).", zName, _pstText->zReference); /* Sets default font */ orxText_SetFont(_pstText, orxFONT(orxFont_GetDefaultFont())); } } else { /* Logs message */ orxDEBUG_PRINT(orxDEBUG_LEVEL_DISPLAY, "Couldn't create font (%s) for text (%s).", zName, _pstText->zReference); /* Sets default font */ orxText_SetFont(_pstText, orxFONT(orxFont_GetDefaultFont())); } } else { /* Sets default font */ orxText_SetFont(_pstText, orxFONT(orxFont_GetDefaultFont())); } /* Gets its string */ zString = orxConfig_GetString(orxTEXT_KZ_CONFIG_STRING); /* Begins with locale marker? */ if(*zString == orxTEXT_KC_LOCALE_MARKER) { /* Stores its locale value */ eResult = orxText_SetString(_pstText, (*(zString + 1) == orxTEXT_KC_LOCALE_MARKER) ? zString + 1 : orxLocale_GetString(zString + 1)); } else { /* Stores raw text */ eResult = orxText_SetString(_pstText, zString); } /* Pops config section */ orxConfig_PopSection(); /* Done! */ return eResult; }
/** Event handler * @param[in] _pstEvent Sent event * @return orxSTATUS_SUCCESS if handled / orxSTATUS_FAILURE otherwise */ static orxSTATUS orxFASTCALL orxText_EventHandler(const orxEVENT *_pstEvent) { orxSTATUS eResult = orxSTATUS_SUCCESS; /* Locale? */ if(_pstEvent->eType == orxEVENT_TYPE_LOCALE) { /* Select language event? */ if(_pstEvent->eID == orxLOCALE_EVENT_SELECT_LANGUAGE) { orxTEXT *pstText; /* For all texts */ for(pstText = orxTEXT(orxStructure_GetFirst(orxSTRUCTURE_ID_TEXT)); pstText != orxNULL; pstText = orxTEXT(orxStructure_GetNext(pstText))) { const orxSTRING zLocaleKey; /* Gets its corresponding locale string */ zLocaleKey = orxText_GetLocaleKey(pstText, orxTEXT_KZ_CONFIG_STRING); /* Valid? */ if(zLocaleKey != orxNULL) { const orxSTRING zText; /* Gets its localized value */ zText = orxLocale_GetString(zLocaleKey); /* Valid? */ if(*zText != orxCHAR_NULL) { /* Updates text */ orxText_SetString(pstText, zText); } } /* Gets its corresponding locale font */ zLocaleKey = orxText_GetLocaleKey(pstText, orxTEXT_KZ_CONFIG_FONT); /* Valid? */ if(zLocaleKey != orxNULL) { orxFONT *pstFont; /* Creates font */ pstFont = orxFont_CreateFromConfig(orxLocale_GetString(zLocaleKey)); /* Valid? */ if(pstFont != orxNULL) { /* Updates text */ if(orxText_SetFont(pstText, pstFont) != orxSTATUS_FAILURE) { /* Sets its owner */ orxStructure_SetOwner(pstFont, pstText); /* Updates flags */ orxStructure_SetFlags(pstText, orxTEXT_KU32_FLAG_INTERNAL, orxTEXT_KU32_FLAG_NONE); } else { /* Sets default font */ orxText_SetFont(pstText, orxFONT(orxFont_GetDefaultFont())); } } } } } } /* Resource */ else { /* Checks */ orxASSERT(_pstEvent->eType == orxEVENT_TYPE_RESOURCE); /* Add or update? */ if((_pstEvent->eID == orxRESOURCE_EVENT_ADD) || (_pstEvent->eID == orxRESOURCE_EVENT_UPDATE)) { orxRESOURCE_EVENT_PAYLOAD *pstPayload; /* Gets payload */ pstPayload = (orxRESOURCE_EVENT_PAYLOAD *)_pstEvent->pstPayload; /* Is config group? */ if(pstPayload->u32GroupID == orxString_ToCRC(orxCONFIG_KZ_RESOURCE_GROUP)) { orxTEXT *pstText; /* For all texts */ for(pstText = orxTEXT(orxStructure_GetFirst(orxSTRUCTURE_ID_TEXT)); pstText != orxNULL; pstText = orxTEXT(orxStructure_GetNext(pstText))) { /* Match origin? */ if(orxConfig_GetOriginID(pstText->zReference) == pstPayload->u32NameID) { /* Re-processes its config data */ orxText_ProcessConfigData(pstText); } } } } } /* Done! */ return eResult; }