// This method will be called whenever Orx needs the parameters for our shader orxSTATUS orxFASTCALL lightPosHandler(const orxEVENT *_pstEvent) { if(_pstEvent->eID == orxSHADER_EVENT_SET_PARAM) { orxSHADER_EVENT_PAYLOAD * payload = (orxSHADER_EVENT_PAYLOAD *)_pstEvent->pstPayload; if(strcmp(payload->zParamName, "LightPos") == 0) { // Here we set the "LightPos" parameter to be the mouse position orxMouse_GetPosition(&(payload->vValue)); payload->vValue.fZ = 100; } } return orxSTATUS_SUCCESS; }
static orxSTATUS orxFASTCALL Run() { orxSTATUS eResult = orxSTATUS_SUCCESS; orxVECTOR vMousePos, vGravity; /* Updates generator's status */ orxObject_Enable(spstGenerator, orxInput_IsActive("Spawn")); /* Gets mouse position in world space */ if(orxRender_GetWorldPosition(orxMouse_GetPosition(&vMousePos), orxNULL, &vMousePos)) { orxVECTOR vGeneratorPos; /* Gets generator position */ orxObject_GetPosition(spstGenerator, &vGeneratorPos); /* Keeps generator's Z coord */ vMousePos.fZ = vGeneratorPos.fZ; /* Updates generator's position */ orxObject_SetPosition(spstGenerator, &vMousePos); } /* Gets gravity vector from input */ orxVector_Set(&vGravity, orxInput_GetValue("GravityX"), -orxInput_GetValue("GravityY"), orxFLOAT_0); /* Significant enough? */ if(orxVector_GetSquareSize(&vGravity) > orx2F(0.5f)) { static orxVECTOR svSmoothedGravity = { orx2F(0.0f), orx2F(-1.0f), orx2F(0.0f) }; /* Gets smoothed gravity from new value (low-pass filter) */ orxVector_Lerp(&svSmoothedGravity, &svSmoothedGravity, &vGravity, orx2F(0.05f)); /* Updates camera rotation */ orxCamera_SetRotation(orxViewport_GetCamera(spstViewport), orxMATH_KF_PI_BY_2 + orxVector_FromCartesianToSpherical(&vGravity, &svSmoothedGravity)->fTheta); } // Is quit action active? if(orxInput_IsActive("Quit")) { // Logs orxLOG("Quit action triggered, exiting!"); // Sets return value to orxSTATUS_FAILURE, meaning we want to exit eResult = orxSTATUS_FAILURE; } return eResult; }
/** 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)); } }
orxSTATUS orxFASTCALL Run() { orxVECTOR mousePos; orxVECTOR mouseInWorld; // Get the mouse position on screen orxMouse_GetPosition(&mousePos); // Get the mouse position in the game world, // note that the mouse might not be in our game's window orxVECTOR * inWindow = orxRender_GetWorldPosition(&mousePos, viewport, &mouseInWorld); if(inWindow) { mouseInWorld.fZ = -0.1; } else { mouseInWorld.fZ = -2; // Out of camera frustum, so the light_bulb is hidden } orxObject_SetPosition(light_bulb, &mouseInWorld); return orxSTATUS_SUCCESS; }
/** Update callback */ void orxFASTCALL Update(const orxCLOCK_INFO *_pstClockInfo, void *_pstContext) { orxVECTOR vPos, vSoldierPos; orxCAMERA *pstCamera; orxFLOAT fWidth, fHeight, fX, fY; /* *** CAMERA CONTROLS *** */ /* Gets first viewport camera */ pstCamera = orxViewport_GetCamera(pstViewport); /* Camera rotate left? */ if(orxInput_IsActive("CameraRotateLeft")) { /* Rotates camera CCW */ orxCamera_SetRotation(pstCamera, orxCamera_GetRotation(pstCamera) + orx2F(-4.0f) * _pstClockInfo->fDT); } /* Camera rotate right? */ if(orxInput_IsActive("CameraRotateRight")) { /* Rotates camera CW */ orxCamera_SetRotation(pstCamera, orxCamera_GetRotation(pstCamera) + orx2F(4.0f) * _pstClockInfo->fDT); } /* Camera zoom in? */ if(orxInput_IsActive("CameraZoomIn")) { /* Camera zoom in */ orxCamera_SetZoom(pstCamera, orxCamera_GetZoom(pstCamera) * orx2F(1.02f)); } /* Camera zoom out? */ if(orxInput_IsActive("CameraZoomOut")) { /* Camera zoom out */ orxCamera_SetZoom(pstCamera, orxCamera_GetZoom(pstCamera) * orx2F(0.98f)); } /* Gets camera position */ orxCamera_GetPosition(pstCamera, &vPos); /* Camera right? */ if(orxInput_IsActive("CameraRight")) { /* Updates position */ vPos.fX += orx2F(500) * _pstClockInfo->fDT; } /* Camera left? */ if(orxInput_IsActive("CameraLeft")) { /* Updates position */ vPos.fX -= orx2F(500) * _pstClockInfo->fDT; } /* Camera down? */ if(orxInput_IsActive("CameraDown")) { /* Updates position */ vPos.fY += orx2F(500) * _pstClockInfo->fDT; } /* Camera up? */ if(orxInput_IsActive("CameraUp")) { /* Updates position */ vPos.fY -= orx2F(500) * _pstClockInfo->fDT; } /* Updates camera position */ orxCamera_SetPosition(pstCamera, &vPos); /* *** VIEWPORT CONTROLS *** */ /* Gets viewport size */ orxViewport_GetRelativeSize(pstViewport, &fWidth, &fHeight); /* Viewport scale up? */ if(orxInput_IsActive("ViewportScaleUp")) { /* Scales viewport up */ fWidth *= orx2F(1.02f); fHeight*= orx2F(1.02f); } /* Viewport scale down? */ if(orxInput_IsActive("ViewportScaleDown")) { /* Scales viewport down */ fWidth *= orx2F(0.98f); fHeight*= orx2F(0.98f); } /* Updates viewport size */ orxViewport_SetRelativeSize(pstViewport, fWidth, fHeight); /* Gets viewport position */ orxViewport_GetPosition(pstViewport, &fX, &fY); /* Viewport right? */ if(orxInput_IsActive("ViewportRight")) { /* Updates position */ fX += orx2F(500) * _pstClockInfo->fDT; } /* Viewport left? */ if(orxInput_IsActive("ViewportLeft")) { /* Updates position */ fX -= orx2F(500) * _pstClockInfo->fDT; } /* Viewport down? */ if(orxInput_IsActive("ViewportDown")) { /* Updates position */ fY += orx2F(500) * _pstClockInfo->fDT; } /* Viewport up? */ if(orxInput_IsActive("ViewportUp")) { /* Updates position */ fY -= orx2F(500) * _pstClockInfo->fDT; } /* Updates viewport position */ orxViewport_SetPosition(pstViewport, fX, fY); /* *** SOLDIER MOVE UPDATE *** */ /* Gets mouse world position? */ orxRender_GetWorldPosition(orxMouse_GetPosition(&vPos), orxNULL, &vPos); /* Gets object current position */ orxObject_GetWorldPosition(pstSoldier, &vSoldierPos); /* Keeps Z value */ vPos.fZ = vSoldierPos.fZ; /* Moves the soldier under the cursor */ orxObject_SetPosition(pstSoldier, &vPos); }
/** Inits the bounce demo */ static orxSTATUS orxBounce_Init() { orxU32 i; orxSTATUS eResult; /* Loads config file and selects its section */ orxConfig_Load("Bounce.ini"); orxConfig_SelectSection("Bounce"); /* Loads input */ orxInput_Load(orxNULL); /* Creates ball spawner */ spoBallSpawner = orxSpawner_CreateFromConfig("BallSpawner"); /* Valid? */ if(spoBallSpawner != orxNULL) { orxOBJECT *pstParticleSource; orxCLOCK *pstClock; /* Creates particle source */ pstParticleSource = orxObject_CreateFromConfig("ParticleSource"); /* Valid? */ if(pstParticleSource != orxNULL) { /* Sets its parent */ orxObject_SetParent(pstParticleSource, spoBallSpawner); } /* Updates cursor */ orxMouse_ShowCursor(orxConfig_GetBool("ShowCursor")); /* Creates walls */ spstWalls = orxObject_CreateFromConfig("Walls"); /* Inits trail */ for(i = 0; i < TRAIL_POINT_NUMBER; i++) { orxMouse_GetPosition(&savTrailPointList[i]); } /* Creates all viewports */ for(i = 0; i < (orxU32)orxConfig_GetListCounter("ViewportList"); i++) { orxViewport_CreateFromConfig(orxConfig_GetListString("ViewportList", i)); } /* Gets rendering clock */ pstClock = orxClock_FindFirst(orx2F(-1.0f), orxCLOCK_TYPE_CORE); /* Registers callback */ eResult = orxClock_Register(pstClock, &orxBounce_Update, orxNULL, orxMODULE_ID_MAIN, orxCLOCK_PRIORITY_NORMAL); /* Registers update trail timer */ eResult = ((eResult != orxSTATUS_FAILURE) && (orxClock_Register(pstClock, &orxBounce_UpdateTrail, orxNULL, orxMODULE_ID_MAIN, orxCLOCK_PRIORITY_LOW) != orxSTATUS_FAILURE)) ? orxSTATUS_SUCCESS : orxSTATUS_FAILURE; /* Registers event handler */ eResult = ((eResult != orxSTATUS_FAILURE) && (orxEvent_AddHandler(orxEVENT_TYPE_PHYSICS, orxBounce_EventHandler) != orxSTATUS_FAILURE)) ? orxSTATUS_SUCCESS : orxSTATUS_FAILURE; eResult = ((eResult != orxSTATUS_FAILURE) && (orxEvent_AddHandler(orxEVENT_TYPE_INPUT, orxBounce_EventHandler) != orxSTATUS_FAILURE)) ? orxSTATUS_SUCCESS : orxSTATUS_FAILURE; eResult = ((eResult != orxSTATUS_FAILURE) && (orxEvent_AddHandler(orxEVENT_TYPE_SHADER, orxBounce_EventHandler) != orxSTATUS_FAILURE)) ? orxSTATUS_SUCCESS : orxSTATUS_FAILURE; eResult = ((eResult != orxSTATUS_FAILURE) && (orxEvent_AddHandler(orxEVENT_TYPE_SOUND, orxBounce_EventHandler) != orxSTATUS_FAILURE)) ? orxSTATUS_SUCCESS : orxSTATUS_FAILURE; eResult = ((eResult != orxSTATUS_FAILURE) && (orxEvent_AddHandler(orxEVENT_TYPE_DISPLAY, orxBounce_EventHandler) != orxSTATUS_FAILURE)) ? orxSTATUS_SUCCESS : orxSTATUS_FAILURE; eResult = ((eResult != orxSTATUS_FAILURE) && (orxEvent_AddHandler(orxEVENT_TYPE_TIMELINE, orxBounce_EventHandler) != orxSTATUS_FAILURE)) ? orxSTATUS_SUCCESS : orxSTATUS_FAILURE; eResult = ((eResult != orxSTATUS_FAILURE) && (orxEvent_AddHandler(orxEVENT_TYPE_RENDER, orxBounce_EventHandler) != orxSTATUS_FAILURE)) ? orxSTATUS_SUCCESS : orxSTATUS_FAILURE; } else { /* Failure */ eResult = orxSTATUS_FAILURE; } /* Done! */ return eResult; }
/** Update callback */ static void orxFASTCALL orxBounce_Update(const orxCLOCK_INFO *_pstClockInfo, void *_pstContext) { orxVECTOR vMousePos; /* Profiles */ orxPROFILER_PUSH_MARKER("Bounce_Update"); if((sbRecord == orxFALSE) && (orxInput_IsActive("Record") != orxFALSE)) { /* Starts recording with default settings */ orxSound_StartRecording("orxSoundRecording.wav", orxFALSE, 0, 0); /* Updates status */ sbRecord = orxTRUE; } if(orxInput_IsActive("ToggleTrail") && (orxInput_HasNewStatus("ToggleTrail"))) { /* Toggles trail rendering */ orxConfig_PushSection("Bounce"); orxConfig_SetBool("DisplayTrail", !orxConfig_GetBool("DisplayTrail")); orxConfig_PopSection(); } if(orxInput_IsActive("ToggleProfiler") && orxInput_HasNewStatus("ToggleProfiler")) { /* Toggles profiler rendering */ orxConfig_PushSection(orxRENDER_KZ_CONFIG_SECTION); orxConfig_SetBool(orxRENDER_KZ_CONFIG_SHOW_PROFILER, !orxConfig_GetBool(orxRENDER_KZ_CONFIG_SHOW_PROFILER)); orxConfig_PopSection(); } if(orxInput_IsActive("PreviousResolution") && orxInput_HasNewStatus("PreviousResolution")) { /* Updates video mode index */ su32VideoModeIndex = (su32VideoModeIndex == 0) ? orxDisplay_GetVideoModeCounter() - 1 : su32VideoModeIndex - 1; /* Applies it */ orxBounce_ApplyCurrentVideoMode(); } else if(orxInput_IsActive("NextResolution") && orxInput_HasNewStatus("NextResolution")) { /* Updates video mode index */ su32VideoModeIndex = (su32VideoModeIndex >= orxDisplay_GetVideoModeCounter() - 1) ? 0 : su32VideoModeIndex + 1; /* Applies it */ orxBounce_ApplyCurrentVideoMode(); } if(orxInput_IsActive("ToggleFullScreen") && orxInput_HasNewStatus("ToggleFullScreen")) { /* Toggles full screen display */ orxDisplay_SetFullScreen(!orxDisplay_IsFullScreen()); } /* Pushes config section */ orxConfig_PushSection("Bounce"); /* Updates shader values */ sfShaderPhase += orxConfig_GetFloat("ShaderPhaseSpeed") * _pstClockInfo->fDT; sfShaderFrequency = orxConfig_GetFloat("ShaderMaxFrequency") * orxMath_Sin(orxConfig_GetFloat("ShaderFrequencySpeed") * _pstClockInfo->fTime); sfShaderAmplitude = orxConfig_GetFloat("ShaderMaxAmplitude") * orxMath_Sin(orxConfig_GetFloat("ShaderAmplitudeSpeed") * _pstClockInfo->fTime); /* Updates color time */ sfColorTime -= _pstClockInfo->fDT; /* Should update color */ if(sfColorTime <= orxFLOAT_0) { orxConfig_PushSection("BounceShader"); orxConfig_GetVector("color", &svColor); orxConfig_PopSection(); sfColorTime += orx2F(3.0f); } /* Gets mouse world position */ orxRender_GetWorldPosition(&vMousePos, orxNULL, orxMouse_GetPosition(&vMousePos)); /* Updates position */ vMousePos.fZ += orx2F(0.5f); /* Has ball spawner? */ if(spoBallSpawner != orxNULL) { /* Updates its position */ orxSpawner_SetPosition(spoBallSpawner, &vMousePos); } /* Spawning */ if(orxInput_IsActive("Spawn")) { /* Spawns one ball */ orxSpawner_Spawn(spoBallSpawner, 1); } /* Picking? */ else if(orxInput_IsActive("Pick")) { orxOBJECT *pstObject; /* Updates mouse position */ vMousePos.fZ -= orx2F(0.1f); /* Picks object under mouse */ pstObject = orxObject_Pick(&vMousePos, orxU32_UNDEFINED); /* Found? */ if(pstObject) { /* Adds FX */ orxObject_AddUniqueFX(pstObject, "Pick"); } } /* Pops config section */ orxConfig_PopSection(); /* Toggle shader? */ if(orxInput_IsActive("ToggleShader") && (orxInput_HasNewStatus("ToggleShader"))) { /* Toggles shader status */ sbShaderEnabled = !sbShaderEnabled; } /* Profiles */ orxPROFILER_POP_MARKER(); }