From e502785b1fcc976074a9b48c2aaf71f824afa066 Mon Sep 17 00:00:00 2001 From: saschawillems Date: Fri, 11 Mar 2016 20:09:12 +0100 Subject: [PATCH] Frame rate independent animation updates --- android/base/vulkanandroidbase.hpp | 2 +- .../computeparticles.cpp | 55 +++++++++++-------- android/mesh/mesh.NativeActivity/mesh.cpp | 39 +++++++------ .../texture.NativeActivity/texture.cpp | 37 +++++++------ .../triangle.NativeActivity/triangle.cpp | 2 +- 5 files changed, 76 insertions(+), 59 deletions(-) diff --git a/android/base/vulkanandroidbase.hpp b/android/base/vulkanandroidbase.hpp index 3a468cbd..596fadd6 100644 --- a/android/base/vulkanandroidbase.hpp +++ b/android/base/vulkanandroidbase.hpp @@ -60,7 +60,7 @@ public: struct android_app* app; uint32_t width; uint32_t height; - float frameTimer = 0; + float frameTimer = 1.0f; struct Texture { VkSampler sampler; diff --git a/android/computeparticles/computeparticles.NativeActivity/computeparticles.cpp b/android/computeparticles/computeparticles.NativeActivity/computeparticles.cpp index aa387bc8..3b46e31c 100644 --- a/android/computeparticles/computeparticles.NativeActivity/computeparticles.cpp +++ b/android/computeparticles/computeparticles.NativeActivity/computeparticles.cpp @@ -196,7 +196,7 @@ public: void updateUniformBuffers() { - computeUbo.deltaT = (1.0f / 60.0f) * 4.0f; + computeUbo.deltaT = (1.0f / frameTimer) * 0.15f; computeUbo.destX = sin(glm::radians(timer*360.0)) * 0.75f; computeUbo.destY = cos(glm::radians(timer*360.0)) * 0.10f; uint8_t *pData; @@ -314,8 +314,8 @@ public: pipelineCreateInfo.renderPass = renderPass; // Additive blending - blendAttachmentState.colorWriteMask = 0xF; blendAttachmentState.blendEnable = VK_TRUE; + blendAttachmentState.colorWriteMask = VK_COLOR_COMPONENT_R_BIT | VK_COLOR_COMPONENT_G_BIT | VK_COLOR_COMPONENT_B_BIT | VK_COLOR_COMPONENT_A_BIT; blendAttachmentState.colorBlendOp = VK_BLEND_OP_ADD; blendAttachmentState.srcColorBlendFactor = VK_BLEND_FACTOR_ONE; blendAttachmentState.dstColorBlendFactor = VK_BLEND_FACTOR_ONE; @@ -323,6 +323,7 @@ public: blendAttachmentState.srcAlphaBlendFactor = VK_BLEND_FACTOR_SRC_ALPHA; blendAttachmentState.dstAlphaBlendFactor = VK_BLEND_FACTOR_DST_ALPHA; + err = vkCreateGraphicsPipelines(device, pipelineCache, 1, &pipelineCreateInfo, nullptr, &pipelines.solid); assert(!err); } @@ -714,6 +715,33 @@ public: assert(!err); } + void render() + { + // Render frame + if (prepared) + { + startTiming(); + if (animating) + { + if (animStart > 0.0f) + { + animStart -= 0.15f * (1.0f / frameTimer); + } + if ((animate) & (animStart <= 0.0f)) + { + timer += 0.5f * (1.0f / frameTimer); + if (timer > 1.0) + { + timer -= 1.0f; + } + } + updateUniformBuffers(); + } + draw(); + endTiming(); + } + } + }; static int32_t handleInput(struct android_app* app, AInputEvent* event) @@ -759,7 +787,6 @@ void android_main(struct android_app* state) { VulkanExample *engine = new VulkanExample(); - //memset(&engine, 0, sizeof(engine)); state->userData = engine; state->onAppCmd = handleCommand; state->onInputEvent = handleInput; @@ -790,26 +817,6 @@ void android_main(struct android_app* state) } } - // Render frame - if (engine->prepared) - { - if (engine->animating) - { - if (engine->animStart > 0.0f) - { - engine->animStart -= (1.0f / 60.0f) * 5.0f; - } - if ((engine->animate) & (engine->animStart <= 0.0f)) - { - engine->timer += (1.0f / 60.0f) * 0.1f; - if (engine->timer > 1.0) - { - engine->timer -= 1.0f; - } - } - engine->updateUniformBuffers(); - } - engine->draw(); - } + engine->render(); } } diff --git a/android/mesh/mesh.NativeActivity/mesh.cpp b/android/mesh/mesh.NativeActivity/mesh.cpp index 19bff10e..862c73f1 100644 --- a/android/mesh/mesh.NativeActivity/mesh.cpp +++ b/android/mesh/mesh.NativeActivity/mesh.cpp @@ -611,6 +611,27 @@ public: err = swapChain.queuePresent(queue, currentBuffer, semaphores.submitSignal); assert(!err); } + + void render() + { + if (prepared) + { + startTiming(); + if (animating) + { + // Update rotation + state.rotation.y += 0.05f * frameTimer; + if (state.rotation.y > 360.0f) + { + state.rotation.y -= 360.0f; + + } + updateUniformBuffers(); + } + draw(); + endTiming(); + } + } }; static int32_t handleInput(struct android_app* app, AInputEvent* event) @@ -656,7 +677,6 @@ void android_main(struct android_app* state) { VulkanExample *engine = new VulkanExample(); - //memset(&engine, 0, sizeof(engine)); state->userData = engine; state->onAppCmd = handleCommand; state->onInputEvent = handleInput; @@ -687,21 +707,6 @@ void android_main(struct android_app* state) } } - // Render frame - if (engine->prepared) - { - if (engine->animating) - { - // Update rotation - engine->state.rotation.y += 0.25f; - if (engine->state.rotation.y > 360.0f) - { - engine->state.rotation.y -= 360.0f; - - } - engine->updateUniformBuffers(); - } - engine->draw(); - } + engine->render(); } } diff --git a/android/texture/texture.NativeActivity/texture.cpp b/android/texture/texture.NativeActivity/texture.cpp index 16b3c848..fc3f27e5 100644 --- a/android/texture/texture.NativeActivity/texture.cpp +++ b/android/texture/texture.NativeActivity/texture.cpp @@ -570,6 +570,26 @@ public: assert(!err); } + void render() + { + if (prepared) + { + startTiming(); + if (animating) + { + // Update rotation + state.rotation.y += 0.15f * frameTimer; + if (state.rotation.y > 360.0f) + { + state.rotation.y -= 360.0f; + + } + updateUniformBuffers(); + } + draw(); + endTiming(); + } + } }; @@ -616,7 +636,6 @@ void android_main(struct android_app* state) { VulkanExample *engine = new VulkanExample(); - //memset(&engine, 0, sizeof(engine)); state->userData = engine; state->onAppCmd = handleCommand; state->onInputEvent = handleInput; @@ -647,21 +666,7 @@ void android_main(struct android_app* state) } } - // Render frame - if (engine->prepared) - { - if (engine->animating) - { - // Update rotation - engine->state.rotation.y += 0.5f; - if (engine->state.rotation.y > 360.0f) - { - engine->state.rotation.y -= 360.0f; + engine->render(); - } - engine->updateUniformBuffers(); - } - engine->draw(); - } } } diff --git a/android/triangle/triangle.NativeActivity/triangle.cpp b/android/triangle/triangle.NativeActivity/triangle.cpp index 2eb0f039..622cdc92 100644 --- a/android/triangle/triangle.NativeActivity/triangle.cpp +++ b/android/triangle/triangle.NativeActivity/triangle.cpp @@ -40,7 +40,7 @@ struct VulkanExample uint32_t width; uint32_t height; struct saved_state state; - float frameTimer; + float frameTimer = 0; // Vulkan VkInstance instance;