/** 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; }
/** Gets graphic pivot * @param[in] _pstGraphic Concerned graphic * @param[out] _pvPivot Graphic pivot * @return orxPIVOT / orxNULL */ orxVECTOR *orxFASTCALL orxGraphic_GetPivot(const orxGRAPHIC *_pstGraphic, orxVECTOR *_pvPivot) { orxVECTOR *pvResult; /* Checks */ orxASSERT(sstGraphic.u32Flags & orxGRAPHIC_KU32_STATIC_FLAG_READY); orxSTRUCTURE_ASSERT(_pstGraphic); orxASSERT(_pvPivot != orxNULL); /* Has pivot? */ if(orxStructure_TestFlags(_pstGraphic, orxGRAPHIC_KU32_FLAG_HAS_PIVOT) != orxFALSE) { /* Copies it */ orxVector_Copy(_pvPivot, &(_pstGraphic->vPivot)); /* Updates result */ pvResult = _pvPivot; } else { /* Clears it */ orxVector_Copy(_pvPivot, &orxVECTOR_0); /* Updates result */ pvResult = orxNULL; } /* Done! */ return pvResult; }
/** Updates trail */ static void orxFASTCALL orxBounce_UpdateTrail(const orxCLOCK_INFO *_pstClockInfo, void *_pContext) { orxU32 i; orxVECTOR vMousePos; /* Gets mouse position */ orxMouse_GetPosition(&vMousePos); /* Updates trail timer */ sfTrailTimer -= _pstClockInfo->fDT; /* Should add new segment? */ if(sfTrailTimer <= orxFLOAT_0) { /* Pushes bounce section */ orxConfig_PushSection("Bounce"); /* Resets trail timer */ sfTrailTimer = orxConfig_GetFloat("TrailTimer"); /* Adds it to the trail */ orxVector_Copy(&savTrailPointList[su32TrailIndex], &vMousePos); /* Gets its speed */ orxConfig_GetVector("TrailSpeed", &savTrailSpeedList[su32TrailIndex]); /* Pops config section */ orxConfig_PopSection(); /* Updates trail index */ su32TrailIndex = (su32TrailIndex + 1) % TRAIL_POINT_NUMBER; } else { /* Keeps last created point on pos */ orxVector_Copy(&savTrailPointList[(su32TrailIndex == 0) ? TRAIL_POINT_NUMBER - 1 : su32TrailIndex - 1], &vMousePos); } /* For all segments */ for(i = 0; i < TRAIL_POINT_NUMBER; i++) { orxVECTOR vTemp; /* Updates its position */ orxVector_Add(&savTrailPointList[i], &savTrailPointList[i], orxVector_Mulf(&vTemp, &savTrailSpeedList[i], _pstClockInfo->fDT)); } }
orxVECTOR *orxFASTCALL orxMouse_GLFW_GetMoveDelta(orxVECTOR *_pvMoveDelta) { orxVECTOR *pvResult = _pvMoveDelta; /* Checks */ orxASSERT((sstMouse.u32Flags & orxMOUSE_KU32_STATIC_FLAG_READY) == orxMOUSE_KU32_STATIC_FLAG_READY); orxASSERT(_pvMoveDelta != orxNULL); /* Updates result */ orxVector_Copy(_pvMoveDelta, &(sstMouse.vMouseMove)); /* Clears mouse move on next update */ sstMouse.bClearMove = orxTRUE; /* Done! */ return pvResult; }
/** 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; }
/** 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; }
/** Bounce event handler * @param[in] _pstEvent Sent event * @return orxSTATUS_SUCCESS if handled / orxSTATUS_FAILURE otherwise */ static orxSTATUS orxFASTCALL orxBounce_EventHandler(const orxEVENT *_pstEvent) { orxSTATUS eResult = orxSTATUS_SUCCESS; /* Profiles */ orxPROFILER_PUSH_MARKER("Bounce_EventHandler"); /* Checks */ orxASSERT((_pstEvent->eType == orxEVENT_TYPE_PHYSICS) || (_pstEvent->eType == orxEVENT_TYPE_INPUT) || (_pstEvent->eType == orxEVENT_TYPE_SHADER) || (_pstEvent->eType == orxEVENT_TYPE_SOUND) || (_pstEvent->eType == orxEVENT_TYPE_DISPLAY) || (_pstEvent->eType == orxEVENT_TYPE_TIMELINE) || (_pstEvent->eType == orxEVENT_TYPE_RENDER)); /* Depending on event type */ switch(_pstEvent->eType) { /* Input */ case orxEVENT_TYPE_INPUT: { /* Not a set selection and console not enabled? */ if((_pstEvent->eID != orxINPUT_EVENT_SELECT_SET) && (orxConsole_IsEnabled() == orxFALSE)) { orxINPUT_EVENT_PAYLOAD *pstPayload; /* Gets event payload */ pstPayload = (orxINPUT_EVENT_PAYLOAD *)_pstEvent->pstPayload; /* Has a multi-input info? */ if(pstPayload->aeType[1] != orxINPUT_TYPE_NONE) { /* Logs info */ orxLOG("[%s::%s] is %s (%s/v=%g + %s/v=%g)", pstPayload->zSetName, pstPayload->zInputName, (_pstEvent->eID == orxINPUT_EVENT_ON) ? "ON " : "OFF", orxInput_GetBindingName(pstPayload->aeType[0], pstPayload->aeID[0], pstPayload->aeMode[0]), pstPayload->afValue[0], orxInput_GetBindingName(pstPayload->aeType[1], pstPayload->aeID[1], pstPayload->aeMode[1]), pstPayload->afValue[1]); } else { /* Logs info */ orxLOG("[%s::%s] is %s (%s/v=%g)", pstPayload->zSetName, pstPayload->zInputName, (_pstEvent->eID == orxINPUT_EVENT_ON) ? "ON " : "OFF", orxInput_GetBindingName(pstPayload->aeType[0], pstPayload->aeID[0], pstPayload->aeMode[0]), pstPayload->afValue[0]); } } break; } /* Physics */ case orxEVENT_TYPE_PHYSICS: { /* Colliding? */ if(_pstEvent->eID == orxPHYSICS_EVENT_CONTACT_ADD) { /* Adds bump FX on both objects */ orxObject_AddUniqueFX(orxOBJECT(_pstEvent->hSender), "Bump"); orxObject_AddUniqueFX(orxOBJECT(_pstEvent->hRecipient), "Bump"); } break; } /* Shader */ case orxEVENT_TYPE_SHADER: { orxSHADER_EVENT_PAYLOAD *pstPayload; /* Profiles */ orxPROFILER_PUSH_MARKER("Bounce_EventHandler_Shader"); /* Checks */ orxASSERT(_pstEvent->eID == orxSHADER_EVENT_SET_PARAM); /* Gets its payload */ pstPayload = (orxSHADER_EVENT_PAYLOAD *)_pstEvent->pstPayload; /* Enabled? */ if(!orxString_Compare(pstPayload->zParamName, "enabled")) { /* Updates its value */ pstPayload->fValue = (sbShaderEnabled != orxFALSE) ? orxFLOAT_1 : orxFLOAT_0; } /* Phase? */ else if(!orxString_Compare(pstPayload->zParamName, "phase")) { /* Updates its value */ pstPayload->fValue = sfShaderPhase; } else if(!orxString_Compare(pstPayload->zParamName, "color")) { orxVector_Copy(&pstPayload->vValue, &svColor); } /* Frequency? */ else if(!orxString_Compare(pstPayload->zParamName, "frequency")) { /* Updates its value */ pstPayload->fValue = sfShaderFrequency; } /* Amplitude? */ else if(!orxString_Compare(pstPayload->zParamName, "amplitude")) { /* Updates its value */ pstPayload->fValue = sfShaderAmplitude; } /* Profiles */ orxPROFILER_POP_MARKER(); break; } /* Sound */ case orxEVENT_TYPE_SOUND: { /* Recording packet? */ if(_pstEvent->eID == orxSOUND_EVENT_RECORDING_PACKET) { orxSOUND_EVENT_PAYLOAD *pstPayload; /* Gets event payload */ pstPayload = (orxSOUND_EVENT_PAYLOAD *)_pstEvent->pstPayload; /* Is recording input active? */ if(orxInput_IsActive("Record") != orxFALSE) { orxU32 i; /* For all samples */ for(i = 0; i < pstPayload->stStream.stPacket.u32SampleNumber / 2; i++) { /* Shorten the packets by half */ pstPayload->stStream.stPacket.as16SampleList[i] = pstPayload->stStream.stPacket.as16SampleList[i * 2]; } /* Updates sample number */ pstPayload->stStream.stPacket.u32SampleNumber = pstPayload->stStream.stPacket.u32SampleNumber / 2; /* Asks for writing it */ pstPayload->stStream.stPacket.bDiscard = orxFALSE; } else { /* Asks for not writing it */ pstPayload->stStream.stPacket.bDiscard = orxTRUE; } } break; } /* Display */ case orxEVENT_TYPE_DISPLAY: { /* New video mode? */ if(_pstEvent->eID == orxDISPLAY_EVENT_SET_VIDEO_MODE) { orxDISPLAY_EVENT_PAYLOAD *pstPayload; orxCHAR acBuffer[1024]; /* Gets payload */ pstPayload = (orxDISPLAY_EVENT_PAYLOAD *)_pstEvent->pstPayload; /* Updates title string */ orxConfig_PushSection("Bounce"); orxString_NPrint(acBuffer, sizeof(acBuffer) - 1, "%s (%dx%d)", orxConfig_GetString("Title"), pstPayload->stVideoMode.u32Width, pstPayload->stVideoMode.u32Height); acBuffer[sizeof(acBuffer) - 1] = orxCHAR_NULL; orxConfig_PopSection(); /* Updates display module config content */ orxConfig_PushSection(orxDISPLAY_KZ_CONFIG_SECTION); orxConfig_SetString(orxDISPLAY_KZ_CONFIG_TITLE, acBuffer); orxConfig_PopSection(); /* Updates window */ orxDisplay_SetVideoMode(orxNULL); } break; } /* TimeLine */ case orxEVENT_TYPE_TIMELINE: { /* New event triggered? */ if(_pstEvent->eID == orxTIMELINE_EVENT_TRIGGER) { orxTIMELINE_EVENT_PAYLOAD *pstPayload; /* Gets event payload */ pstPayload = (orxTIMELINE_EVENT_PAYLOAD *)_pstEvent->pstPayload; /* Logs info */ orxLOG("[%s::%s::%s] has been triggered", orxObject_GetName(orxOBJECT(_pstEvent->hSender)), pstPayload->zTrackName, pstPayload->zEvent); } break; } /* Render */ case orxEVENT_TYPE_RENDER: { /* Object start? */ if(_pstEvent->eID == orxRENDER_EVENT_OBJECT_START) { /* Is walls? */ if(orxOBJECT(_pstEvent->hSender) == spstWalls) { /* Pushes config section */ orxConfig_PushSection("Bounce"); /* Should display trail */ if(orxConfig_GetBool("DisplayTrail")) { /* Draws trail */ orxBounce_DisplayTrail(orxTexture_GetBitmap(orxTEXTURE(orxGraphic_GetData(orxOBJECT_GET_STRUCTURE(orxOBJECT(_pstEvent->hSender), GRAPHIC))))); } /* Pops config section */ orxConfig_PopSection(); /* Updates result */ eResult = orxSTATUS_FAILURE; } } break; } default: { break; } } /* Profiles */ orxPROFILER_POP_MARKER(); /* Done! */ return eResult; }