/** 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; }
static orxSTATUS orxFASTCALL ParseTextFile(const orxSTRING _zFileName) { orxFILE *pstFile; orxSTATUS eResult; // Opens file pstFile = orxFile_Open(_zFileName, orxFILE_KU32_FLAG_OPEN_READ | orxFILE_KU32_FLAG_OPEN_BINARY); // Success? if(pstFile) { orxCHAR acBuffer[orxFONTGEN_KU32_BUFFER_SIZE]; orxU32 u32Size, u32Offset, u32Counter; orxBOOL bFirst; // While file isn't empty for(u32Size = (orxU32)orxFile_Read(acBuffer, sizeof(orxCHAR), orxFONTGEN_KU32_BUFFER_SIZE, pstFile), u32Offset = 0, u32Counter = 0, bFirst = orxTRUE; u32Size > 0; u32Size = (orxU32)orxFile_Read(acBuffer + u32Offset, sizeof(orxCHAR), orxFONTGEN_KU32_BUFFER_SIZE - u32Offset, pstFile) + u32Offset, bFirst = orxFALSE) { orxCHAR *pc, *pcNext; // Has UTF-8 BOM? if((bFirst != orxFALSE) && (orxString_NCompare(acBuffer, orxFONTGEN_KZ_UTF8_BOM, orxFONTGEN_KU32_UTF8_BOM_LENGTH) == 0)) { // Skips it pc = acBuffer + orxFONTGEN_KU32_UTF8_BOM_LENGTH; } else { // Starts at the beginning of the buffer pc = acBuffer; } // For all characters for(pcNext = orxNULL; pc < acBuffer + u32Size; pc = pcNext) { orxU32 u32CharacterCodePoint; // Reads it u32CharacterCodePoint = orxString_GetFirstCharacterCodePoint(pc, (const orxSTRING *)&pcNext); // Non EOL? if((u32CharacterCodePoint != orxCHAR_CR) && (u32CharacterCodePoint != orxCHAR_LF)) { // Valid? if(u32CharacterCodePoint != orxU32_UNDEFINED) { // Not already in table? if(orxHashTable_Get(sstFontGen.pstCharacterTable, u32CharacterCodePoint) == orxNULL) { orxU32 u32GlyphIndex; // Gets character's glyph index u32GlyphIndex = (orxU32)FT_Get_Char_Index(sstFontGen.pstFontFace, (FT_ULong)u32CharacterCodePoint); // Valid? if(u32GlyphIndex) { orxFONTGEN_GLYPH *pstGlyph; // Allocates glyph pstGlyph = (orxFONTGEN_GLYPH *)orxBank_Allocate(sstFontGen.pstGlyphBank); // Checks orxASSERT(pstGlyph); // Inits it pstGlyph->u32Index = u32GlyphIndex; pstGlyph->u32CodePoint = u32CharacterCodePoint; // Adds it if(orxHashTable_Add(sstFontGen.pstCharacterTable, u32CharacterCodePoint, (void *)pstGlyph) != orxSTATUS_FAILURE) { orxFONTGEN_GLYPH *pstSearchGlyph; // Finds position for(pstSearchGlyph = (orxFONTGEN_GLYPH *)orxLinkList_GetFirst(&sstFontGen.stGlyphList); pstSearchGlyph && (u32CharacterCodePoint > pstSearchGlyph->u32CodePoint); pstSearchGlyph = (orxFONTGEN_GLYPH *)orxLinkList_GetNext(&pstSearchGlyph->stNode)); // Valid? if(pstSearchGlyph) { // Adds it before orxLinkList_AddBefore(&pstSearchGlyph->stNode, &pstGlyph->stNode); } else { // Adds it at the end orxLinkList_AddEnd(&sstFontGen.stGlyphList, &pstGlyph->stNode); } // Updates counter u32Counter++; } else { // Logs message orxFONTGEN_LOG(LOAD, "Character '0x%X': couldn't add to table, skipping.", u32CharacterCodePoint); } } else { // Adds it orxHashTable_Add(sstFontGen.pstCharacterTable, u32CharacterCodePoint, (void *)sstFontGen.pstCharacterTable); // Logs message orxFONTGEN_LOG(LOAD, "Character '0x%X': glyph not found in font, skipping.", u32CharacterCodePoint); } } } else { // End of buffer? if(pcNext >= acBuffer + u32Size) { // Stops break; } else { // Logs message orxFONTGEN_LOG(LOAD, "Invalid character code point '0x%X', skipping.", u32CharacterCodePoint); } } } } // Has remaining buffer? if((pc != acBuffer) && (pcNext > pc)) { // Updates offset u32Offset = (orxU32)(orxMIN(pcNext, acBuffer + u32Size) - pc); // Copies it at the beginning of the buffer orxMemory_Copy(acBuffer, pc, u32Offset); } else { // Clears offset u32Offset = 0; } } // Logs message orxFONTGEN_LOG(LOAD, "'%s': added %d characters.", _zFileName, u32Counter); // Updates result eResult = orxSTATUS_SUCCESS; } else { // Updates result eResult = orxSTATUS_FAILURE; } // Done! return eResult; }
/** Adds an event handler with user-defined context * @param[in] _eEventType Concerned type of event * @param[in] _pfnHandler Event handler to add * @param[in] _pContext Context that will be stored in events sent to this handler * return orxSTATUS_SUCCESS / orxSTATUS_FAILURE */ orxSTATUS orxFASTCALL orxEvent_AddHandlerWithContext(orxEVENT_TYPE _eEventType, orxEVENT_HANDLER _pfnEventHandler, void *_pContext) { orxEVENT_HANDLER_STORAGE *pstStorage; orxSTATUS eResult = orxSTATUS_FAILURE; /* Checks */ orxASSERT(orxFLAG_TEST(sstEvent.u32Flags, orxEVENT_KU32_STATIC_FLAG_READY)); orxASSERT(_pfnEventHandler != orxNULL); /* Gets corresponding storage */ pstStorage = (_eEventType < orxEVENT_TYPE_CORE_NUMBER) ? sstEvent.astCoreHandlerStorageList[_eEventType] : (orxEVENT_HANDLER_STORAGE *)orxHashTable_Get(sstEvent.pstHandlerStorageTable, _eEventType); /* No storage yet? */ if(pstStorage == orxNULL) { /* Allocates it */ pstStorage = (orxEVENT_HANDLER_STORAGE *)orxBank_Allocate(sstEvent.pstHandlerStorageBank); /* Success? */ if(pstStorage != orxNULL) { /* Creates its bank */ pstStorage->pstBank = orxBank_Create(orxEVENT_KU32_HANDLER_BANK_SIZE, sizeof(orxEVENT_HANDLER_INFO), orxBANK_KU32_FLAG_NONE, orxMEMORY_TYPE_MAIN); /* Success? */ if(pstStorage->pstBank != orxNULL) { /* Clears its list */ orxMemory_Zero(&(pstStorage->stList), sizeof(orxLINKLIST)); /* Is a core event handler? */ if(_eEventType < orxEVENT_TYPE_CORE_NUMBER) { /* Stores it */ sstEvent.astCoreHandlerStorageList[_eEventType] = pstStorage; } else { /* Tries to add it to the table */ if(orxHashTable_Add(sstEvent.pstHandlerStorageTable, _eEventType, pstStorage) == orxSTATUS_FAILURE) { /* Deletes its bank */ orxBank_Delete(pstStorage->pstBank); /* Frees storage */ orxBank_Free(sstEvent.pstHandlerStorageBank, pstStorage); pstStorage = orxNULL; } } } else { /* Frees storage */ orxBank_Free(sstEvent.pstHandlerStorageBank, pstStorage); pstStorage = orxNULL; } } } /* Valid? */ if(pstStorage != orxNULL) { orxEVENT_HANDLER_INFO *pstInfo; /* Allocates a new handler info */ pstInfo = (orxEVENT_HANDLER_INFO *)orxBank_Allocate(pstStorage->pstBank); /* Valid? */ if(pstInfo != orxNULL) { /* Clears its node */ orxMemory_Zero(&(pstInfo->stNode), sizeof(orxLINKLIST_NODE)); /* Stores its handler */ pstInfo->pfnHandler = _pfnEventHandler; /* Stores context */ pstInfo->pContext = _pContext; /* Adds it to the list */ eResult = orxLinkList_AddEnd(&(pstStorage->stList), &(pstInfo->stNode)); } } /* Done! */ return eResult; }
/** Registers a plugin * @param[in] _pstSysPlugin Concerned plugin * @param[in] _pstPluginInfo Info of the plugin to register * @return orxSTATUS_SUCCESS / orxSTATUS_FAILURE */ static orxSTATUS orxPlugin_RegisterPlugin(orxPLUGIN_INFO *_pstPluginInfo) { orxPLUGIN_INIT_FUNCTION pfnInit; orxU32 u32UserFunctionNumber; orxPLUGIN_USER_FUNCTION_INFO *astUserFunctionInfo; orxSTATUS eResult = orxSTATUS_SUCCESS; /* Checks */ orxASSERT(_pstPluginInfo != orxNULL); /* Gets init function */ pfnInit = (orxPLUGIN_INIT_FUNCTION)orxPlugin_GetFunctionAddress(_pstPluginInfo->pstSysPlugin, orxPLUGIN_KZ_INIT_FUNCTION_NAME); /* Valid? */ if(pfnInit != orxNULL) { orxU32 i; /* Calls it */ eResult = pfnInit(&u32UserFunctionNumber, &astUserFunctionInfo); /* Adds all functions to plugin info */ for(i = 0; (eResult != orxSTATUS_FAILURE) && (i < u32UserFunctionNumber); i++) { /* Is function valid? */ if(astUserFunctionInfo[i].pfnFunction != orxNULL) { orxPLUGIN_FUNCTION_INFO *pstFunctionInfo; /* Creates function info */ pstFunctionInfo = orxPlugin_CreateFunctionInfo(_pstPluginInfo); /* Copies info */ pstFunctionInfo->pfnFunction = astUserFunctionInfo[i].pfnFunction; pstFunctionInfo->eFunctionID = astUserFunctionInfo[i].eFunctionID; pstFunctionInfo->zFunctionArgs = astUserFunctionInfo[i].zFunctionArgs; pstFunctionInfo->zFunctionName = astUserFunctionInfo[i].zFunctionName; /* Adds function info in plugin info structure */ orxHashTable_Add(_pstPluginInfo->pstFunctionTable, pstFunctionInfo->eFunctionID, pstFunctionInfo); /* Is it a core function? */ if(pstFunctionInfo->eFunctionID & orxPLUGIN_KU32_FLAG_CORE_ID) { /* Registers core function */ eResult = orxPlugin_RegisterCoreFunction(pstFunctionInfo->eFunctionID, pstFunctionInfo->pfnFunction, orxFALSE); } } else { /* Logs message */ orxDEBUG_PRINT(orxDEBUG_LEVEL_PLUGIN, "Invalid function."); /* Updates result */ eResult = orxSTATUS_FAILURE; } } } else { /* Logs message */ orxDEBUG_PRINT(orxDEBUG_LEVEL_PLUGIN, "Failed to get function address."); /* Can't load plugin */ eResult = orxSTATUS_FAILURE; } /* 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; }