/** Deletes a camera * @param[in] _pstCamera Camera to delete * @return orxSTATUS_SUCCESS / orxSTATUS_FAILURE */ orxSTATUS orxFASTCALL orxCamera_Delete(orxCAMERA *_pstCamera) { orxSTATUS eResult = orxSTATUS_SUCCESS; /* Checks */ orxASSERT(sstCamera.u32Flags & orxCAMERA_KU32_STATIC_FLAG_READY); orxSTRUCTURE_ASSERT(_pstCamera); /* Not referenced? */ if(orxStructure_GetRefCounter(_pstCamera) == 0) { /* Removes frame reference */ orxStructure_DecreaseCounter(_pstCamera->pstFrame); /* Deletes frame*/ orxFrame_Delete(_pstCamera->pstFrame); /* Is referenced? */ if(orxStructure_TestFlags(_pstCamera, orxCAMERA_KU32_FLAG_REFERENCED) != orxFALSE) { /* Removes it from reference table */ orxHashTable_Remove(sstCamera.pstReferenceTable, orxString_ToCRC(_pstCamera->zReference)); } /* Has reference? */ if(_pstCamera->zReference != orxNULL) { /* Unprotects it */ orxConfig_ProtectSection(_pstCamera->zReference, orxFALSE); } /* Deletes structure */ orxStructure_Delete(_pstCamera); } else { /* Logs message */ orxDEBUG_PRINT(orxDEBUG_LEVEL_RENDER, "Cannot delete camera while it is still referenced."); /* Referenced by others */ eResult = orxSTATUS_FAILURE; } /* Done! */ return eResult; }
/** Removes a track */ static orxINLINE void orxTimeLine_DeleteTrack(orxTIMELINE_TRACK *_pstTrack) { /* Decreases counter */ _pstTrack->u32RefCounter--; /* Not referenced? */ if(_pstTrack->u32RefCounter == 0) { /* Has an ID? */ if((_pstTrack->zReference != orxNULL) && (_pstTrack->zReference != orxSTRING_EMPTY)) { /* Removes it from the table */ orxHashTable_Remove(sstTimeLine.pstTrackTable, _pstTrack->u32ID); } /* Deletes it */ orxMemory_Free(_pstTrack); } /* Done! */ return; }
/** Event handler */ static orxSTATUS orxFASTCALL orxTimeLine_EventHandler(const orxEVENT *_pstEvent) { orxSTATUS eResult = orxSTATUS_SUCCESS; /* 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)) { orxHANDLE hIterator; orxU64 u64Key; orxTIMELINE_TRACK *pstTrack; /* For all tracks */ for(hIterator = orxHashTable_GetNext(sstTimeLine.pstTrackTable, orxHANDLE_UNDEFINED, &u64Key, (void **)&pstTrack); hIterator != orxHANDLE_UNDEFINED; hIterator = orxHashTable_GetNext(sstTimeLine.pstTrackTable, hIterator, &u64Key, (void **)&pstTrack)) { /* Match origin? */ if(orxConfig_GetOriginID(pstTrack->zReference) == pstPayload->u32NameID) { orxTIMELINE *pstTimeLine; orxTIMELINE_TRACK *pstNewTrack; orxU32 u32Counter, u32ID, u32Flags; const orxSTRING zReference; /* Backups counter, ID, flags & reference */ u32Counter = pstTrack->u32RefCounter; u32ID = pstTrack->u32ID; u32Flags = orxFLAG_GET(pstTrack->u32Flags, orxTIMELINE_TRACK_KU32_MASK_BACKUP); zReference = pstTrack->zReference; /* Deletes it (but keeps it reference in the hashtable to prevent infinite loop upon table changes) */ orxMemory_Free(pstTrack); /* Creates new track */ pstNewTrack = orxTimeLine_CreateTrack(zReference); /* Success? */ if(pstNewTrack != orxNULL) { /* Restores its counter */ pstNewTrack->u32RefCounter = u32Counter; /* Restores its flags */ orxFLAG_SET(pstNewTrack->u32Flags, u32Flags, orxTIMELINE_TRACK_KU32_MASK_BACKUP); } else { /* Removes old reference from the table */ orxHashTable_Remove(sstTimeLine.pstTrackTable, u32ID); } /* For all timelines */ for(pstTimeLine = orxTIMELINE(orxStructure_GetFirst(orxSTRUCTURE_ID_TIMELINE)); pstTimeLine != orxNULL; pstTimeLine = orxTIMELINE(orxStructure_GetNext(pstTimeLine))) { orxU32 u32Index; /* For all its track */ for(u32Index = 0; u32Index < orxTIMELINE_KU32_TRACK_NUMBER; u32Index++) { /* Matches? */ if(pstTimeLine->astTrackList[u32Index].pstTrack == pstTrack) { /* Updates its data */ pstTimeLine->astTrackList[u32Index].pstTrack = pstNewTrack; } } } } } } } /* Done! */ return eResult; }
/** Deletes a clock * @param[in] _pstClock Concerned clock * @return orxSTATUS_SUCCESS / orxSTATUS_FAILURE */ orxSTATUS orxFASTCALL orxClock_Delete(orxCLOCK *_pstClock) { orxSTATUS eResult = orxSTATUS_SUCCESS; /* Checks */ orxASSERT(sstClock.u32Flags & orxCLOCK_KU32_STATIC_FLAG_READY); orxSTRUCTURE_ASSERT(_pstClock); /* Decreases counter */ orxStructure_DecreaseCounter(_pstClock); /* Not referenced? */ if(orxStructure_GetRefCounter(_pstClock) == 0) { /* Not locked? */ if(!orxStructure_TestFlags(_pstClock, orxCLOCK_KU32_FLAG_UPDATE_LOCK)) { orxCLOCK_TIMER_STORAGE *pstTimerStorage; /* For all stored timers */ for(pstTimerStorage = (orxCLOCK_TIMER_STORAGE *)orxLinkList_GetFirst(&(_pstClock->stTimerList)); pstTimerStorage != orxNULL; pstTimerStorage = (orxCLOCK_TIMER_STORAGE *)orxLinkList_GetFirst(&(_pstClock->stTimerList))) { /* Removes it */ orxLinkList_Remove(&(pstTimerStorage->stNode)); /* Deletes it */ orxBank_Free(sstClock.pstTimerBank, pstTimerStorage); } /* Deletes function bank */ orxBank_Delete(_pstClock->pstFunctionBank); /* Is referenced? */ if(orxStructure_TestFlags(_pstClock, orxCLOCK_KU32_FLAG_REFERENCED)) { /* Removes it from reference table */ orxHashTable_Remove(sstClock.pstReferenceTable, orxString_ToCRC(_pstClock->zReference)); } /* Has reference? */ if(_pstClock->zReference != orxNULL) { /* Unprotects it */ orxConfig_ProtectSection(_pstClock->zReference, orxFALSE); } /* Deletes clock */ orxStructure_Delete(_pstClock); } else { /* Increases counter */ orxStructure_IncreaseCounter(_pstClock); /* Logs message */ orxDEBUG_PRINT(orxDEBUG_LEVEL_CLOCK, "Can't delete clock <%s> as it's currently locked for processing!", orxStructure_TestFlags(_pstClock, orxCLOCK_KU32_FLAG_REFERENCED) ? _pstClock->zReference : orxSTRING_EMPTY); /* Updates result */ eResult = orxSTATUS_FAILURE; } } else { /* Referenced by others */ eResult = orxSTATUS_FAILURE; } /* Done! */ return eResult; }