/** 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; }
/** Deletes an FXPointer * @param[in] _pstFXPointer Concerned FXPointer * @return orxSTATUS_SUCCESS / orxSTATUS_FAILURE */ orxSTATUS orxFASTCALL orxFXPointer_Delete(orxFXPOINTER *_pstFXPointer) { orxSTATUS eResult = orxSTATUS_SUCCESS; /* Checks */ orxASSERT(sstFXPointer.u32Flags & orxFXPOINTER_KU32_STATIC_FLAG_READY); orxSTRUCTURE_ASSERT(_pstFXPointer); /* Decreases counter */ orxStructure_DecreaseCounter(_pstFXPointer); /* Not referenced? */ if(orxStructure_GetRefCounter(_pstFXPointer) == 0) { orxU32 i; /* For all FXs */ for(i = 0; i < orxFXPOINTER_KU32_FX_NUMBER; i++) { /* Valid? */ if(_pstFXPointer->astFXList[i].pstFX != orxNULL) { /* Decreases its reference counter */ orxStructure_DecreaseCounter(_pstFXPointer->astFXList[i].pstFX); /* Is internal? */ if(orxFLAG_TEST(_pstFXPointer->astFXList[i].u32Flags, orxFXPOINTER_HOLDER_KU32_FLAG_INTERNAL)) { /* Removes its owner */ orxStructure_SetOwner(_pstFXPointer->astFXList[i].pstFX, orxNULL); /* Deletes it */ orxFX_Delete(_pstFXPointer->astFXList[i].pstFX); } } } /* Deletes structure */ orxStructure_Delete(_pstFXPointer); } else { /* Referenced by others */ eResult = orxSTATUS_FAILURE; } /* Done! */ return eResult; }
/** Removes an FX using its config ID * @param[in] _pstFXPointer Concerned FXPointer * @param[in] _zFXConfigID Config ID of the FX to remove * @return orxSTATUS_SUCCESS / orxSTATUS_FAILURE */ orxSTATUS orxFASTCALL orxFXPointer_RemoveFXFromConfig(orxFXPOINTER *_pstFXPointer, const orxSTRING _zFXConfigID) { orxU32 i, u32ID; orxSTRUCTURE *pstOwner; orxSTATUS eResult = orxSTATUS_FAILURE; /* Checks */ orxASSERT(sstFXPointer.u32Flags & orxFXPOINTER_KU32_STATIC_FLAG_READY); orxSTRUCTURE_ASSERT(_pstFXPointer); orxASSERT((_zFXConfigID != orxNULL) && (_zFXConfigID != orxSTRING_EMPTY)); /* Gets owner */ pstOwner = orxStructure_GetOwner(_pstFXPointer); /* Gets ID */ u32ID = orxString_ToCRC(_zFXConfigID); /* For all slots */ for(i = 0; i < orxFXPOINTER_KU32_FX_NUMBER; i++) { orxFX *pstFX; /* Gets FX */ pstFX = _pstFXPointer->astFXList[i].pstFX; /* Valid? */ if(pstFX != orxNULL) { /* Found? */ if(orxString_ToCRC(orxFX_GetName(pstFX)) == u32ID) { orxFX_EVENT_PAYLOAD stPayload; /* Decreases its reference counter */ orxStructure_DecreaseCounter(pstFX); /* Removes its reference */ _pstFXPointer->astFXList[i].pstFX = orxNULL; /* Inits event payload */ orxMemory_Zero(&stPayload, sizeof(orxFX_EVENT_PAYLOAD)); stPayload.pstFX = pstFX; stPayload.zFXName = orxFX_GetName(pstFX); /* Sends event */ orxEVENT_SEND(orxEVENT_TYPE_FX, orxFX_EVENT_REMOVE, pstOwner, pstOwner, &stPayload); /* Is internal? */ if(orxFLAG_TEST(_pstFXPointer->astFXList[i].u32Flags, orxFXPOINTER_HOLDER_KU32_FLAG_INTERNAL)) { /* Removes its owner */ orxStructure_SetOwner(pstFX, orxNULL); /* Deletes it */ orxFX_Delete(pstFX); } /* Updates result */ eResult = orxSTATUS_SUCCESS; break; } } } /* Done! */ return eResult; }
/** Adds a delayed FX using its config ID * @param[in] _pstFXPointer Concerned FXPointer * @param[in] _zFXConfigID Config ID of the FX to add * @param[in] _fDelay Delay time * @return orxSTATUS_SUCCESS / orxSTATUS_FAILURE */ orxSTATUS orxFASTCALL orxFXPointer_AddDelayedFXFromConfig(orxFXPOINTER *_pstFXPointer, const orxSTRING _zFXConfigID, orxFLOAT _fDelay) { orxU32 u32Index; orxSTATUS eResult; /* Checks */ orxASSERT(sstFXPointer.u32Flags & orxFXPOINTER_KU32_STATIC_FLAG_READY); orxSTRUCTURE_ASSERT(_pstFXPointer); orxASSERT((_zFXConfigID != orxNULL) && (_zFXConfigID != orxSTRING_EMPTY)); orxASSERT(_fDelay >= orxFLOAT_0); /* Finds an empty slot */ for(u32Index = 0; (u32Index < orxFXPOINTER_KU32_FX_NUMBER) && (_pstFXPointer->astFXList[u32Index].pstFX != orxNULL); u32Index++); /* Found? */ if(u32Index < orxFXPOINTER_KU32_FX_NUMBER) { orxFX *pstFX; /* Creates FX */ pstFX = orxFX_CreateFromConfig(_zFXConfigID); /* Valid? */ if(pstFX != orxNULL) { orxSTRUCTURE *pstOwner; orxFX_EVENT_PAYLOAD stPayload; /* Gets owner */ pstOwner = orxStructure_GetOwner(_pstFXPointer); /* Increases its reference counter */ orxStructure_IncreaseCounter(pstFX); /* Adds it to holder */ _pstFXPointer->astFXList[u32Index].pstFX = pstFX; /* Inits its start time */ _pstFXPointer->astFXList[u32Index].fStartTime = _pstFXPointer->fTime + _fDelay; /* Updates its owner */ orxStructure_SetOwner(pstFX, _pstFXPointer); /* Updates its flags */ orxFLAG_SET(_pstFXPointer->astFXList[u32Index].u32Flags, orxFXPOINTER_HOLDER_KU32_FLAG_INTERNAL, orxFXPOINTER_HOLDER_KU32_MASK_ALL); /* Inits event payload */ orxMemory_Zero(&stPayload, sizeof(orxFX_EVENT_PAYLOAD)); stPayload.pstFX = pstFX; stPayload.zFXName = orxFX_GetName(pstFX); /* Sends event */ orxEVENT_SEND(orxEVENT_TYPE_FX, orxFX_EVENT_ADD, pstOwner, pstOwner, &stPayload); /* Updates result */ eResult = orxSTATUS_SUCCESS; } else { /* Logs message */ orxDEBUG_PRINT(orxDEBUG_LEVEL_OBJECT, "Loading FX <%s> from config failed.", _zFXConfigID); /* Updates result */ eResult = orxSTATUS_FAILURE; } } else { /* Logs message */ orxDEBUG_PRINT(orxDEBUG_LEVEL_SOUND, "Failed to find an empty slot to put FX <%s> into.", _zFXConfigID); /* Updates result */ eResult = orxSTATUS_FAILURE; } /* Done! */ return eResult; }
/** Updates the FXPointer (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 orxFXPointer_Update(orxSTRUCTURE *_pstStructure, const orxSTRUCTURE *_pstCaller, const orxCLOCK_INFO *_pstClockInfo) { orxFXPOINTER *pstFXPointer; orxOBJECT *pstObject; orxSTATUS eResult = orxSTATUS_SUCCESS; /* Profiles */ orxPROFILER_PUSH_MARKER("orxFXPointer_Update"); /* Checks */ orxASSERT(sstFXPointer.u32Flags & orxFXPOINTER_KU32_STATIC_FLAG_READY); orxSTRUCTURE_ASSERT(_pstStructure); orxSTRUCTURE_ASSERT(_pstCaller); /* Gets FXPointer */ pstFXPointer = orxFXPOINTER(_pstStructure); /* Gets calling object */ pstObject = orxOBJECT(_pstCaller); /* Is enabled? */ if(orxFXPointer_IsEnabled(pstFXPointer) != orxFALSE) { orxFLOAT fLastTime; orxU32 i; orxSTRUCTURE *pstOwner; /* Gets owner */ pstOwner = orxStructure_GetOwner(pstFXPointer); /* Backups last time */ fLastTime = pstFXPointer->fTime; /* Computes its new time cursor */ pstFXPointer->fTime += _pstClockInfo->fDT; /* For all FXs */ for(i = 0; i < orxFXPOINTER_KU32_FX_NUMBER; i++) { orxFX *pstFX; /* Gets FX */ pstFX = pstFXPointer->astFXList[i].pstFX; /* Valid? */ if(pstFX != orxNULL) { orxFLOAT fFXLocalStartTime, fFXLocalEndTime; /* Gets FX local times */ fFXLocalStartTime = fLastTime - pstFXPointer->astFXList[i].fStartTime; fFXLocalEndTime = pstFXPointer->fTime - pstFXPointer->astFXList[i].fStartTime; /* Is the FX reached? */ if(fFXLocalEndTime >= orxFLOAT_0) { /* Is the first time? */ if(!orxFLAG_TEST(pstFXPointer->astFXList[i].u32Flags, orxFXPOINTER_HOLDER_KU32_FLAG_PLAYED)) { orxFX_EVENT_PAYLOAD stPayload; /* Inits event payload */ orxMemory_Zero(&stPayload, sizeof(orxFX_EVENT_PAYLOAD)); stPayload.pstFX = pstFX; stPayload.zFXName = orxFX_GetName(pstFX); /* Sends event */ orxEVENT_SEND(orxEVENT_TYPE_FX, orxFX_EVENT_START, pstOwner, pstOwner, &stPayload); } /* Updates its status */ orxFLAG_SET(pstFXPointer->astFXList[i].u32Flags, orxFXPOINTER_HOLDER_KU32_FLAG_PLAYED, orxFXPOINTER_HOLDER_KU32_FLAG_NONE); /* Applies FX from last time to now */ if(orxFX_Apply(pstFX, pstObject, fFXLocalStartTime, fFXLocalEndTime) == orxSTATUS_FAILURE) { orxFX_EVENT_PAYLOAD stPayload; /* Inits event payload */ orxMemory_Zero(&stPayload, sizeof(orxFX_EVENT_PAYLOAD)); stPayload.pstFX = pstFX; stPayload.zFXName = orxFX_GetName(pstFX); /* Is a looping FX? */ if(orxFX_IsLooping(pstFX) != orxFALSE) { /* Sends event */ orxEVENT_SEND(orxEVENT_TYPE_FX, orxFX_EVENT_LOOP, pstOwner, pstOwner, &stPayload); /* Updates its start time */ pstFXPointer->astFXList[i].fStartTime = pstFXPointer->fTime; } else { /* Decreases its reference counter */ orxStructure_DecreaseCounter(pstFX); /* Removes its reference */ pstFXPointer->astFXList[i].pstFX = orxNULL; /* Sends event */ orxEVENT_SEND(orxEVENT_TYPE_FX, orxFX_EVENT_STOP, pstOwner, pstOwner, &stPayload); /* Sends event */ orxEVENT_SEND(orxEVENT_TYPE_FX, orxFX_EVENT_REMOVE, pstOwner, pstOwner, &stPayload); /* Is internal? */ if(orxFLAG_TEST(pstFXPointer->astFXList[i].u32Flags, orxFXPOINTER_HOLDER_KU32_FLAG_INTERNAL)) { /* Removes its owner */ orxStructure_SetOwner(pstFX, orxNULL); /* Deletes it */ orxFX_Delete(pstFX); } } } } } } } /* Profiles */ orxPROFILER_POP_MARKER(); /* Done! */ return eResult; }
/** Adds a sound using its config ID * @param[in] _pstSoundPointer Concerned SoundPointer * @param[in] _zSoundConfigID Config ID of the sound to add * @return orxSTATUS_SUCCESS / orxSTATUS_FAILURE */ orxSTATUS orxFASTCALL orxSoundPointer_AddSoundFromConfig(orxSOUNDPOINTER *_pstSoundPointer, const orxSTRING _zSoundConfigID) { orxU32 u32Index; orxSTATUS eResult; /* Checks */ orxASSERT(sstSoundPointer.u32Flags & orxSOUNDPOINTER_KU32_STATIC_FLAG_READY); orxSTRUCTURE_ASSERT(_pstSoundPointer); orxASSERT((_zSoundConfigID != orxNULL) && (_zSoundConfigID != orxSTRING_EMPTY)); /* Finds an empty slot */ for(u32Index = 0; (u32Index < orxSOUNDPOINTER_KU32_SOUND_NUMBER) && (_pstSoundPointer->astSoundList[u32Index].pstSound != orxNULL); u32Index++); /* Not found? */ if(u32Index == orxSOUNDPOINTER_KU32_SOUND_NUMBER) { orxFLOAT fShortestDuration; orxU32 u32ShortestIndex; /* Logs message */ orxDEBUG_PRINT(orxDEBUG_LEVEL_SOUND, "No free slot to play sound <%s>, replacing shortest one.", _zSoundConfigID); /* Gets first index */ u32ShortestIndex = (_pstSoundPointer->u32LastAddedIndex == 0) ? 1 : 0; /* Gets its duration */ fShortestDuration = orxSound_GetDuration(_pstSoundPointer->astSoundList[u32ShortestIndex].pstSound); /* For all other sounds */ for(u32Index = u32ShortestIndex + 1; (u32Index < orxSOUNDPOINTER_KU32_SOUND_NUMBER); u32Index++) { /* Not the latest added one? */ if(u32Index != _pstSoundPointer->u32LastAddedIndex) { orxFLOAT fDuration; /* Gets its duration */ fDuration = orxSound_GetDuration(_pstSoundPointer->astSoundList[u32Index].pstSound); /* Shorter? */ if(fDuration < fShortestDuration) { /* Selects it */ u32ShortestIndex = u32Index; } } } /* Removes it */ orxSoundPointer_RemoveSound(_pstSoundPointer, _pstSoundPointer->astSoundList[u32ShortestIndex].pstSound); /* Updates index */ u32Index = u32ShortestIndex; } /* Found? */ if(u32Index < orxSOUNDPOINTER_KU32_SOUND_NUMBER) { orxSOUND *pstSound; /* Creates sound */ pstSound = orxSound_CreateFromConfig(_zSoundConfigID); /* Valid? */ if(pstSound != orxNULL) { orxSOUND_EVENT_PAYLOAD stPayload; orxOBJECT *pstOwner; /* Increases its reference counter */ orxStructure_IncreaseCounter(pstSound); /* Adds it to holder */ _pstSoundPointer->astSoundList[u32Index].pstSound = pstSound; /* Updates its owner */ orxStructure_SetOwner(pstSound, _pstSoundPointer); /* Updates its flags */ orxFLAG_SET(_pstSoundPointer->astSoundList[u32Index].u32Flags, orxSOUNDPOINTER_HOLDER_KU32_FLAG_INTERNAL | orxSOUNDPOINTER_HOLDER_KU32_FLAG_AUTO_PLAY, orxSOUNDPOINTER_HOLDER_KU32_MASK_ALL); /* Stores it as last added sound */ _pstSoundPointer->u32LastAddedIndex = u32Index; /* Gets its owner object */ pstOwner = orxOBJECT(orxStructure_GetOwner(_pstSoundPointer)); /* Valid? */ if(pstOwner != orxNULL) { orxVECTOR vPosition; /* Updates its position */ orxSound_SetPosition(pstSound, orxObject_GetWorldPosition(pstOwner, &vPosition)); } /* Inits event payload */ orxMemory_Zero(&stPayload, sizeof(orxSOUND_EVENT_PAYLOAD)); stPayload.pstSound = pstSound; /* Sends event */ orxEVENT_SEND(orxEVENT_TYPE_SOUND, orxSOUND_EVENT_ADD, pstOwner, pstOwner, &stPayload); /* Updates result */ eResult = orxSTATUS_SUCCESS; } else { /* Logs message */ orxDEBUG_PRINT(orxDEBUG_LEVEL_SOUND, "Could not find object named '%s' in config.", _zSoundConfigID); /* Clears last added sound index */ _pstSoundPointer->u32LastAddedIndex = orxU32_UNDEFINED; /* Updates result */ eResult = orxSTATUS_FAILURE; } } else { /* Logs message */ orxDEBUG_PRINT(orxDEBUG_LEVEL_SOUND, "Failed to find an empty slot to put sound <%s> into.", _zSoundConfigID); /* Updates result */ eResult = orxSTATUS_FAILURE; } /* Done! */ return eResult; }
/** Removes all sounds * @param[in] _pstSoundPointer Concerned SoundPointer * @return orxSTATUS_SUCCESS / orxSTATUS_FAILURE */ orxSTATUS orxFASTCALL orxSoundPointer_RemoveAllSounds(orxSOUNDPOINTER *_pstSoundPointer) { orxU32 i; orxSTATUS eResult = orxSTATUS_FAILURE; /* Checks */ orxASSERT(sstSoundPointer.u32Flags & orxSOUNDPOINTER_KU32_STATIC_FLAG_READY); orxSTRUCTURE_ASSERT(_pstSoundPointer); /* For all slots */ for(i = 0; i < orxSOUNDPOINTER_KU32_SOUND_NUMBER; i++) { orxSOUND *pstSound; /* Gets sound */ pstSound = _pstSoundPointer->astSoundList[i].pstSound; /* Valid? */ if(pstSound != orxNULL) { orxSOUND_EVENT_PAYLOAD stPayload; orxSTRUCTURE *pstOwner; /* Inits event payload */ orxMemory_Zero(&stPayload, sizeof(orxSOUND_EVENT_PAYLOAD)); stPayload.pstSound = pstSound; /* Gets owner */ pstOwner = orxStructure_GetOwner(_pstSoundPointer); /* Wasn't stopped? */ if(orxSound_GetStatus(pstSound) != orxSOUND_STATUS_STOP) { /* Sends stop event */ orxEVENT_SEND(orxEVENT_TYPE_SOUND, orxSOUND_EVENT_STOP, pstOwner, pstOwner, &stPayload); } /* Sends event */ orxEVENT_SEND(orxEVENT_TYPE_SOUND, orxSOUND_EVENT_REMOVE, pstOwner, pstOwner, &stPayload); /* Decreases its reference counter */ orxStructure_DecreaseCounter(pstSound); /* Was last added sound? */ if(_pstSoundPointer->u32LastAddedIndex == i) { /* Clears last added sound index */ _pstSoundPointer->u32LastAddedIndex = orxU32_UNDEFINED; } /* Removes its reference */ _pstSoundPointer->astSoundList[i].pstSound = orxNULL; /* Is internal? */ if(orxFLAG_TEST(_pstSoundPointer->astSoundList[i].u32Flags, orxSOUNDPOINTER_HOLDER_KU32_FLAG_INTERNAL)) { /* Removes its owner */ orxStructure_SetOwner(pstSound, orxNULL); /* Deletes it */ orxSound_Delete(pstSound); } /* Updates result */ eResult = orxSTATUS_SUCCESS; } } /* 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; }
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; }
/** 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; }
/** 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; }
/** Inits clock module * @return orxSTATUS_SUCCESS / orxSTATUS_FAILURE */ orxSTATUS orxFASTCALL orxClock_Init() { orxSTATUS eResult = orxSTATUS_FAILURE; /* Not already Initialized? */ if(!(sstClock.u32Flags & orxCLOCK_KU32_STATIC_FLAG_READY)) { /* Registers structure type */ eResult = orxSTRUCTURE_REGISTER(CLOCK, orxSTRUCTURE_STORAGE_TYPE_LINKLIST, orxMEMORY_TYPE_MAIN, orxCLOCK_KU32_BANK_SIZE, orxNULL); /* Successful? */ if(eResult != orxSTATUS_FAILURE) { /* Cleans control structure */ orxMemory_Zero(&sstClock, sizeof(orxCLOCK_STATIC)); /* Creates timer bank */ sstClock.pstTimerBank = orxBank_Create(orxCLOCK_KU32_TIMER_BANK_SIZE, sizeof(orxCLOCK_TIMER_STORAGE), orxBANK_KU32_FLAG_NONE, orxMEMORY_TYPE_MAIN); /* Valid? */ if(sstClock.pstTimerBank != orxNULL) { /* Creates reference table */ sstClock.pstReferenceTable = orxHashTable_Create(orxCLOCK_KU32_REFERENCE_TABLE_SIZE, orxHASHTABLE_KU32_FLAG_NONE, orxMEMORY_TYPE_MAIN); /* Valid? */ if(sstClock.pstReferenceTable != orxNULL) { orxCLOCK *pstClock; /* No mod type by default */ sstClock.eModType = orxCLOCK_MOD_TYPE_NONE; /* Gets init time */ sstClock.dTime = orxSystem_GetTime(); /* Inits Flags */ sstClock.u32Flags = orxCLOCK_KU32_STATIC_FLAG_READY; /* Gets main clock tick size */ orxConfig_PushSection(orxCLOCK_KZ_CONFIG_SECTION); sstClock.fMainClockTickSize = (orxConfig_HasValue(orxCLOCK_KZ_CONFIG_MAIN_CLOCK_FREQUENCY) && orxConfig_GetFloat(orxCLOCK_KZ_CONFIG_MAIN_CLOCK_FREQUENCY) > orxFLOAT_0) ? (orxFLOAT_1 / orxConfig_GetFloat(orxCLOCK_KZ_CONFIG_MAIN_CLOCK_FREQUENCY)) : orxFLOAT_0; orxConfig_PopSection(); /* Creates default full speed core clock */ pstClock = orxClock_Create(sstClock.fMainClockTickSize, orxCLOCK_TYPE_CORE); /* Success? */ if(pstClock != orxNULL) { /* Sets it as its own owner */ orxStructure_SetOwner(pstClock, pstClock); /* Updates result */ eResult = orxSTATUS_SUCCESS; } else { /* Updates result */ eResult = orxSTATUS_FAILURE; } } else { /* Deletes timer bank */ orxBank_Delete(sstClock.pstTimerBank); sstClock.pstTimerBank = orxNULL; /* Updates result */ eResult = orxSTATUS_FAILURE; } } else { /* Logs message */ orxDEBUG_PRINT(orxDEBUG_LEVEL_CLOCK, "Failed creating clock bank."); /* Clock bank not created */ eResult = orxSTATUS_FAILURE; } } else { /* Logs message */ orxDEBUG_PRINT(orxDEBUG_LEVEL_OBJECT, "Failed to register link list structure."); } } else { /* Logs message */ orxDEBUG_PRINT(orxDEBUG_LEVEL_CLOCK, "Tried to initialize clock module when it was already initialized."); /* Already initialized */ eResult = orxSTATUS_SUCCESS; } /* Done! */ return eResult; }