/** Update callback */ static void orxFASTCALL orxJoystick_GLFW_Update(const orxCLOCK_INFO *_pstClockInfo, void *_pContext) { /* Profiles */ orxPROFILER_PUSH_MARKER("orxJoystick_Update"); /* Was first joystick present since the beginning? */ if(sstJoystick.astJoyInfoList[0].bIsConnected != orxFALSE) { /* Updates it */ orxJoystick_GLFW_UpdateInfo(0); /* Still connected? */ if(sstJoystick.astJoyInfoList[0].bIsConnected != orxFALSE) { orxSYSTEM_EVENT_PAYLOAD stPayload; /* Inits event payload */ orxMemory_Zero(&stPayload, sizeof(orxSYSTEM_EVENT_PAYLOAD)); stPayload.stAccelerometer.dTime = orxSystem_GetTime(); stPayload.stAccelerometer.vAcceleration.fX = sstJoystick.astJoyInfoList[0].afAxisInfoList[orxJOYSTICK_AXIS_X_1]; stPayload.stAccelerometer.vAcceleration.fY = sstJoystick.astJoyInfoList[0].afAxisInfoList[orxJOYSTICK_AXIS_Y_1]; stPayload.stAccelerometer.vAcceleration.fZ = sstJoystick.astJoyInfoList[0].afAxisInfoList[orxJOYSTICK_AXIS_Z_1]; /* Sends accelerometer event */ orxEVENT_SEND(orxEVENT_TYPE_SYSTEM, orxSYSTEM_EVENT_ACCELERATE, orxNULL, orxNULL, &stPayload); } } /* Profiles */ orxPROFILER_POP_MARKER(); /* Done! */ return; }
/** Restarts a clock * @param[in] _pstClock Concerned clock * @return orxSTATUS_SUCCESS / orxSTATUS_FAILURE */ orxSTATUS orxFASTCALL orxClock_Restart(orxCLOCK *_pstClock) { orxSTATUS eResult; /* Checks */ orxASSERT(sstClock.u32Flags & orxCLOCK_KU32_STATIC_FLAG_READY); orxSTRUCTURE_ASSERT(_pstClock); /* Not locked? */ if(!orxStructure_TestFlags(_pstClock, orxCLOCK_KU32_FLAG_UPDATE_LOCK)) { /* Sends event */ orxEVENT_SEND(orxEVENT_TYPE_CLOCK, orxCLOCK_EVENT_RESTART, _pstClock, orxNULL, orxNULL); /* Restarts clock */ _pstClock->stClockInfo.fTime = _pstClock->stClockInfo.fDT = _pstClock->fPartialDT = orxFLOAT_0; /* Updates result */ eResult = orxSTATUS_SUCCESS; } else { /* Logs message */ orxDEBUG_PRINT(orxDEBUG_LEVEL_CLOCK, "Couldn't restart this clock <%P> as it's currenlty locked/in use.", _pstClock); /* Updates result */ eResult = orxSTATUS_FAILURE; } /* Done! */ return eResult; }
/** Adds a delayed FX * @param[in] _pstFXPointer Concerned FXPointer * @param[in] _pstFX FX to add * @param[in] _fDelay Delay time * @return orxSTATUS_SUCCESS / orxSTATUS_FAILURE */ orxSTATUS orxFASTCALL orxFXPointer_AddDelayedFX(orxFXPOINTER *_pstFXPointer, orxFX *_pstFX, orxFLOAT _fDelay) { orxU32 u32Index; orxSTATUS eResult; /* Checks */ orxASSERT(sstFXPointer.u32Flags & orxFXPOINTER_KU32_STATIC_FLAG_READY); orxSTRUCTURE_ASSERT(_pstFXPointer); orxSTRUCTURE_ASSERT(_pstFX); 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) { 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 flags */ orxFLAG_SET(_pstFXPointer->astFXList[u32Index].u32Flags, orxFXPOINTER_HOLDER_KU32_FLAG_NONE, 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, "No available slots for FX."); /* Updates result */ eResult = orxSTATUS_FAILURE; } /* Done! */ return eResult; }
/** Removes a track using its config ID * @param[in] _pstTimeLine Concerned TimeLine * @param[in] _zTrackID Config ID of the track to remove * @return orxSTATUS_SUCCESS / orxSTATUS_FAILURE */ orxSTATUS orxFASTCALL orxTimeLine_RemoveTrackFromConfig(orxTIMELINE *_pstTimeLine, const orxSTRING _zTrackID) { orxU32 u32Index, u32TrackID; orxSTRUCTURE *pstOwner; orxSTATUS eResult = orxSTATUS_FAILURE; /* Checks */ orxASSERT(sstTimeLine.u32Flags & orxTIMELINE_KU32_STATIC_FLAG_READY); orxASSERT((_zTrackID != orxNULL) && (_zTrackID != orxSTRING_EMPTY)); /* Gets owner */ pstOwner = orxStructure_GetOwner(_pstTimeLine); /* Gets track ID */ u32TrackID = orxString_ToCRC(_zTrackID); /* For all tracks */ for(u32Index = 0; u32Index < orxTIMELINE_KU32_TRACK_NUMBER; u32Index++) { /* Is defined? */ if(_pstTimeLine->astTrackList[u32Index].pstTrack != orxNULL) { /* Do IDs match? */ if(_pstTimeLine->astTrackList[u32Index].pstTrack->u32ID == u32TrackID) { orxTIMELINE_EVENT_PAYLOAD stPayload; orxTIMELINE_TRACK *pstTrack; /* Gets track */ pstTrack = _pstTimeLine->astTrackList[u32Index].pstTrack; /* Removes its reference */ _pstTimeLine->astTrackList[u32Index].pstTrack = orxNULL; /* 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_REMOVE, pstOwner, pstOwner, &stPayload); /* Deletes it */ orxTimeLine_DeleteTrack(pstTrack); break; } } } /* Done! */ return eResult; }
/** 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; }
/** 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; }
/** 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; }
/** Deletes a TimeLine * @param[in] _pstTimeLine Concerned TimeLine * @return orxSTATUS_SUCCESS / orxSTATUS_FAILURE */ orxSTATUS orxFASTCALL orxTimeLine_Delete(orxTIMELINE *_pstTimeLine) { orxSTATUS eResult = orxSTATUS_SUCCESS; /* Checks */ orxASSERT(sstTimeLine.u32Flags & orxTIMELINE_KU32_STATIC_FLAG_READY); orxSTRUCTURE_ASSERT(_pstTimeLine); /* Decreases counter */ orxStructure_DecreaseCounter(_pstTimeLine); /* Not referenced? */ if(orxStructure_GetRefCounter(_pstTimeLine) == 0) { orxTIMELINE_EVENT_PAYLOAD stPayload; orxSTRUCTURE *pstOwner; orxU32 i; /* Gets owner */ pstOwner = orxStructure_GetOwner(_pstTimeLine); /* Inits event payload */ orxMemory_Zero(&stPayload, sizeof(orxTIMELINE_EVENT_PAYLOAD)); stPayload.pstTimeLine = _pstTimeLine; /* For all tracks */ for(i = 0; i < orxTIMELINE_KU32_TRACK_NUMBER; i++) { /* Valid? */ if(_pstTimeLine->astTrackList[i].pstTrack != orxNULL) { orxTIMELINE_TRACK *pstTrack; /* Gets track */ pstTrack = _pstTimeLine->astTrackList[i].pstTrack; /* Removes its reference */ _pstTimeLine->astTrackList[i].pstTrack = orxNULL; /* Updates payload */ stPayload.zTrackName = pstTrack->zReference; /* Sends event */ orxEVENT_SEND(orxEVENT_TYPE_TIMELINE, orxTIMELINE_EVENT_TRACK_REMOVE, pstOwner, pstOwner, &stPayload); /* Deletes it */ orxTimeLine_DeleteTrack(pstTrack); } } /* Deletes structure */ orxStructure_Delete(_pstTimeLine); } else { /* Referenced by others */ 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; }
extern "C" void orxAndroid_PumpEvents() { int ident; int events; while ((ident=ALooper_pollAll(isInteractible() || sstAndroid.bDestroyRequested == orxTRUE ? 0 : -1, NULL, &events, NULL)) >= 0) { if(ident == LOOPER_ID_MAIN) { int8_t cmd = app_read_cmd(); if(cmd == APP_CMD_PAUSE) { LOGI("APP_CMD_PAUSE"); sstAndroid.bPaused = orxTRUE; orxEvent_SendShort(orxEVENT_TYPE_SYSTEM, orxSYSTEM_EVENT_BACKGROUND); } if(cmd == APP_CMD_RESUME) { LOGI("APP_CMD_RESUME"); sstAndroid.bPaused = orxFALSE; orxEvent_SendShort(orxEVENT_TYPE_SYSTEM, orxSYSTEM_EVENT_FOREGROUND); } if(cmd == APP_CMD_SURFACE_DESTROYED) { LOGI("APP_CMD_SURFACE_DESTROYED"); pthread_cond_broadcast(&sstAndroid.cond); sstAndroid.fSurfaceScale = orxFLOAT_0; orxEVENT_SEND(orxANDROID_EVENT_TYPE_SURFACE, orxANDROID_EVENT_SURFACE_DESTROYED, orxNULL, orxNULL, orxNULL); pthread_mutex_lock(&sstAndroid.mutex); if(sstAndroid.window != NULL) { ANativeWindow_release(sstAndroid.window); sstAndroid.window = NULL; } pthread_cond_broadcast(&sstAndroid.cond); pthread_mutex_unlock(&sstAndroid.mutex); } if(cmd == APP_CMD_SURFACE_CHANGED) { LOGI("APP_CMD_SURFACE_CHANGED"); orxANDROID_SURFACE_CHANGED_EVENT stSurfaceChangedEvent; stSurfaceChangedEvent.u32Width = sstAndroid.u32SurfaceWidth; stSurfaceChangedEvent.u32Height = sstAndroid.u32SurfaceHeight; sstAndroid.fSurfaceScale = orxFLOAT_0; orxEVENT_SEND(orxANDROID_EVENT_TYPE_SURFACE, orxANDROID_EVENT_SURFACE_CHANGED, orxNULL, orxNULL, &stSurfaceChangedEvent); } if(cmd == APP_CMD_SURFACE_CREATED) { LOGI("APP_CMD_SURFACE_CREATED"); pthread_mutex_lock(&sstAndroid.mutex); sstAndroid.window = sstAndroid.pendingWindow; pthread_cond_broadcast(&sstAndroid.cond); pthread_mutex_unlock(&sstAndroid.mutex); orxEVENT_SEND(orxANDROID_EVENT_TYPE_SURFACE, orxANDROID_EVENT_SURFACE_CREATED, orxNULL, orxNULL, orxNULL); } if(cmd == APP_CMD_QUIT) { LOGI("APP_CMD_QUIT"); sstAndroid.bDestroyRequested = orxTRUE; orxEvent_SendShort(orxEVENT_TYPE_SYSTEM, orxSYSTEM_EVENT_CLOSE); } if(cmd == APP_CMD_FOCUS_GAINED) { LOGI("APP_CMD_FOCUS_GAINED"); sstAndroid.bHasFocus = orxTRUE; orxEvent_SendShort(orxEVENT_TYPE_SYSTEM, orxSYSTEM_EVENT_FOCUS_GAINED); } if(cmd == APP_CMD_FOCUS_LOST) { LOGI("APP_CMD_FOCUS_LOST"); sstAndroid.bHasFocus = orxFALSE; orxEvent_SendShort(orxEVENT_TYPE_SYSTEM, orxSYSTEM_EVENT_FOCUS_LOST); } } if(ident == LOOPER_ID_SENSOR) { orxEvent_SendShort(orxANDROID_EVENT_TYPE_ACCELERATE, 0); } if(ident == LOOPER_ID_KEY_EVENT) { orxANDROID_KEY_EVENT stKeyEvent; if (read(sstAndroid.pipeKeyEvent[0], &stKeyEvent, sizeof(stKeyEvent)) == sizeof(stKeyEvent)) { orxEVENT_SEND(orxANDROID_EVENT_TYPE_KEYBOARD, 0, orxNULL, orxNULL, &stKeyEvent); } else { LOGE("No data on command pipe!"); } } if(ident == LOOPER_ID_TOUCH_EVENT) { orxANDROID_TOUCH_EVENT stTouchEvent; if (read(sstAndroid.pipeTouchEvent[0], &stTouchEvent, sizeof(stTouchEvent)) == sizeof(stTouchEvent)) { orxSYSTEM_EVENT_PAYLOAD stPayload; if(sstAndroid.fSurfaceScale == orxFLOAT_0) { orxConfig_PushSection(KZ_CONFIG_ANDROID); sstAndroid.fSurfaceScale = orxConfig_GetFloat(KZ_CONFIG_SURFACE_SCALE); orxConfig_PopSection(); } /* Inits event's payload */ orxMemory_Zero(&stPayload, sizeof(orxSYSTEM_EVENT_PAYLOAD)); stPayload.stTouch.fPressure = orxFLOAT_0; stPayload.stTouch.fX = sstAndroid.fSurfaceScale * stTouchEvent.fX; stPayload.stTouch.fY = sstAndroid.fSurfaceScale * stTouchEvent.fY; stPayload.stTouch.u32ID = stTouchEvent.u32ID; switch(stTouchEvent.u32Action) { case 0: // MotionEvent.ACTION_DOWN case 5: // MotionEvent.ACTION_POINTER_DOWN orxEVENT_SEND(orxEVENT_TYPE_SYSTEM, orxSYSTEM_EVENT_TOUCH_BEGIN, orxNULL, orxNULL, &stPayload); break; case 1: // MotionEvent.ACTION_UP case 6: // MotionEvent.ACTION_POINTER_UP orxEVENT_SEND(orxEVENT_TYPE_SYSTEM, orxSYSTEM_EVENT_TOUCH_END, orxNULL, orxNULL, &stPayload); break; case 2: // MotionEvent.ACTION_MOVE orxEVENT_SEND(orxEVENT_TYPE_SYSTEM, orxSYSTEM_EVENT_TOUCH_MOVE, orxNULL, orxNULL, &stPayload); break; } } else { LOGE("No data on command pipe!"); } } if(ident == LOOPER_ID_JOYSTICK_EVENT) { orxANDROID_JOYSTICK_EVENT stJoystickEvent; if (read(sstAndroid.pipeJoystickEvent[0], &stJoystickEvent, sizeof(stJoystickEvent)) == sizeof(stJoystickEvent)) { orxEVENT_SEND(orxANDROID_EVENT_TYPE_JOYSTICK, 0, orxNULL, orxNULL, &stJoystickEvent); } else { LOGE("No data on command pipe!"); } } } }
/** Update callback */ static void orxFASTCALL orxMouse_GLFW_Update(const orxCLOCK_INFO *_pstClockInfo, void *_pContext) { /* Profiles */ orxPROFILER_PUSH_MARKER("orxMouse_Update"); /* Should update cursor? */ if(sstMouse.bUpdateCursor != orxFALSE) { /* Restores cursor status */ if(sstMouse.bShowCursor != orxFALSE) { glfwEnable(GLFW_MOUSE_CURSOR); } else { glfwDisable(GLFW_MOUSE_CURSOR); } /* Updates status */ sstMouse.bUpdateCursor = orxFALSE; } /* Is left button pressed? */ if(glfwGetMouseButton(GLFW_MOUSE_BUTTON_LEFT) != GL_FALSE) { orxSYSTEM_EVENT_PAYLOAD stPayload; /* Inits event payload */ orxMemory_Zero(&stPayload, sizeof(orxSYSTEM_EVENT_PAYLOAD)); stPayload.stTouch.dTime = orxSystem_GetTime(); stPayload.stTouch.u32ID = 0; stPayload.stTouch.fX = sstMouse.vMouseBackup.fX; stPayload.stTouch.fY = sstMouse.vMouseBackup.fY; stPayload.stTouch.fPressure = orxFLOAT_1; /* Wasn't pressed before? */ if(sstMouse.bButtonPressed == orxFALSE) { /* Sends touch event */ orxEVENT_SEND(orxEVENT_TYPE_SYSTEM, orxSYSTEM_EVENT_TOUCH_BEGIN, orxNULL, orxNULL, &stPayload); /* Updates button pressed status */ sstMouse.bButtonPressed = orxTRUE; /* Stores touch position */ orxVector_Copy(&(sstMouse.vMouseTouch), &(sstMouse.vMouseBackup)); } else { /* Has moved? */ if(orxVector_AreEqual(&(sstMouse.vMouseBackup), &(sstMouse.vMouseTouch)) == orxFALSE) { /* Sends touch event */ orxEVENT_SEND(orxEVENT_TYPE_SYSTEM, orxSYSTEM_EVENT_TOUCH_MOVE, orxNULL, orxNULL, &stPayload); /* Stores touch position */ orxVector_Copy(&(sstMouse.vMouseTouch), &(sstMouse.vMouseBackup)); } } } else { /* Was previously pressed? */ if(sstMouse.bButtonPressed != orxFALSE) { orxSYSTEM_EVENT_PAYLOAD stPayload; /* Inits event payload */ orxMemory_Zero(&stPayload, sizeof(orxSYSTEM_EVENT_PAYLOAD)); stPayload.stTouch.dTime = orxSystem_GetTime(); stPayload.stTouch.u32ID = 0; stPayload.stTouch.fX = sstMouse.vMouseBackup.fX; stPayload.stTouch.fY = sstMouse.vMouseBackup.fY; stPayload.stTouch.fPressure = orxFLOAT_0; /* Sends touch event */ orxEVENT_SEND(orxEVENT_TYPE_SYSTEM, orxSYSTEM_EVENT_TOUCH_END, orxNULL, orxNULL, &stPayload); /* Updates button pressed status */ sstMouse.bButtonPressed = orxFALSE; /* Clears touch position */ orxVector_Copy(&(sstMouse.vMouseTouch), &orxVECTOR_0); } } /* Profiles */ orxPROFILER_POP_MARKER(); /* Done! */ return; }
static void orxFASTCALL orxDisplay_SDL_EventUpdate(const orxCLOCK_INFO *_pstClockInfo, void *_pContext) { SDL_Event stSDLEvent; /* Clears event */ orxMemory_Zero(&stSDLEvent, sizeof(SDL_Event)); /* Clears wheel event */ orxEVENT_SEND(orxEVENT_TYPE_FIRST_RESERVED + SDL_MOUSEBUTTONDOWN, SDL_MOUSEBUTTONDOWN, orxNULL, orxNULL, &stSDLEvent); /* Handles all pending events */ while(SDL_PollEvent(&stSDLEvent)) { /* Depending on type */ switch(stSDLEvent.type) { /* Closing? */ case SDL_QUIT: { /* Sends system close event */ orxEvent_SendShort(orxEVENT_TYPE_SYSTEM, orxSYSTEM_EVENT_CLOSE); break; } /* Gained/Lost focus? */ case SDL_ACTIVEEVENT: { /* Sends system focus gained event */ orxEvent_SendShort(orxEVENT_TYPE_SYSTEM, (stSDLEvent.active.gain) ? orxSYSTEM_EVENT_FOCUS_GAINED : orxSYSTEM_EVENT_FOCUS_LOST); break; } case SDL_MOUSEBUTTONDOWN: { /* Not a wheel move? */ if((stSDLEvent.button.button != SDL_BUTTON_WHEELDOWN) && (stSDLEvent.button.button != SDL_BUTTON_WHEELUP)) { /* Stops */ break; } } case SDL_MOUSEMOTION: { /* Sends reserved event */ orxEVENT_SEND(orxEVENT_TYPE_FIRST_RESERVED + stSDLEvent.type, stSDLEvent.type, orxNULL, orxNULL, &stSDLEvent); break; } default: { break; } } } return; }