From f3fcd049c461bf80a44b47dc8afaa7974574b905 Mon Sep 17 00:00:00 2001 From: Vladyslav Baranovskyi Date: Fri, 7 Jun 2024 16:09:39 +0300 Subject: [PATCH] Using SequenceAnimationController class in our MovingCubeApp --- examples/ExampleApps/MovingCubeApp.cpp | 98 +++++++++++++++++--------- 1 file changed, 66 insertions(+), 32 deletions(-) diff --git a/examples/ExampleApps/MovingCubeApp.cpp b/examples/ExampleApps/MovingCubeApp.cpp index a1311f9..a3671f2 100644 --- a/examples/ExampleApps/MovingCubeApp.cpp +++ b/examples/ExampleApps/MovingCubeApp.cpp @@ -14,74 +14,108 @@ #include "Scene/SimpleDrawable.hpp" #include "Scene/Camera.hpp" #include "Scene/SimpleAnimationController.hpp" +#include "Scene/SequenceAnimationController.hpp" #include "Input/InputManager.hpp" #include "Host/GraphicsAppManager.hpp" #include "Base/EngineConfiguration.hpp" +#include "Base/Logger.hpp" #include "Controller/FreeCamCameraController.hpp" namespace OpenVulkano { + namespace + { + struct SceneElement + { + Scene::Geometry m_geometry; + Scene::SimpleDrawable m_drawable; + Scene::Node m_node; + }; + } class MovingCubeAppImpl final : public MovingCubeApp { - OpenVulkano::Scene::Scene m_scene; - OpenVulkano::Scene::PerspectiveCamera m_camera; - OpenVulkano::FreeCamCameraController m_cameraControl; - OpenVulkano::Scene::Material m_material; - OpenVulkano::Scene::Shader m_shader; + Scene::Scene m_scene; + Scene::PerspectiveCamera m_camera; + FreeCamCameraController m_cameraControl; + Scene::Material m_material; + Scene::Shader m_shader; - OpenVulkano::Scene::Geometry m_geometry; - OpenVulkano::Scene::SimpleDrawable m_drawable; - OpenVulkano::Scene::Node m_node; - std::unique_ptr m_animationController; + std::unique_ptr m_simpleAnimationController; + std::unique_ptr m_sequenceAnimationController; + + SceneElement m_whiteBox; + SceneElement m_redBox; + + void CreateSceneElement(SceneElement *dest, const Math::Vector4f &color, float scale) + { + dest->m_geometry.InitCube(scale, scale, scale, color); + dest->m_drawable.Init(&m_shader, &dest->m_geometry, &m_material); + + dest->m_node.Init(); + m_scene.GetRoot()->AddChild(&dest->m_node); + dest->m_node.SetUpdateFrequency(Scene::UpdateFrequency::Always); + dest->m_node.AddDrawable(&dest->m_drawable); + dest->m_node.SetMatrix(Math::Matrix4f(1)); + } public: void Init() override { - auto engineConfig = OpenVulkano::EngineConfiguration::GetEngineConfiguration(); + auto engineConfig = EngineConfiguration::GetEngineConfiguration(); m_camera.Init(70, 16, 9, 0.1, 100); // m_camera.SetMatrix(OpenVulkano::Math::Utils::translate(OpenVulkano::Math::Matrix4f(1), OpenVulkano::Math::Vector3f_SIMD(0, 0, -50))); m_scene.Init(); m_scene.SetCamera(&m_camera); - m_shader.AddShaderProgram(OpenVulkano::ShaderProgramType::VERTEX, "Shader/basic"); - m_shader.AddShaderProgram(OpenVulkano::ShaderProgramType::FRAGMENT, "Shader/basic"); - m_shader.AddVertexInputDescription(OpenVulkano::Vertex::GetVertexInputDescription()); - - m_geometry.InitCube(); - m_drawable.Init(&m_shader, &m_geometry, &m_material); - - m_node.Init(); - m_scene.GetRoot()->AddChild(&m_node); - m_node.SetUpdateFrequency(OpenVulkano::Scene::UpdateFrequency::Always); - m_node.AddDrawable(&m_drawable); - m_node.SetMatrix(OpenVulkano::Math::Matrix4f(1)); + m_shader.AddShaderProgram(ShaderProgramType::VERTEX, "Shader/basic"); + m_shader.AddShaderProgram(ShaderProgramType::FRAGMENT, "Shader/basic"); + m_shader.AddVertexInputDescription(Vertex::GetVertexInputDescription()); GetGraphicsAppManager()->GetRenderer()->SetScene(&m_scene); m_cameraControl.Init(&m_camera); m_cameraControl.SetDefaultKeybindings(); - m_animationController = std::make_unique(); - m_animationController->SetNode(&m_node); - m_animationController->SetDuration(3); - - OpenVulkano::Math::Pose srcPose(OpenVulkano::Math::Quaternion(), OpenVulkano::Math::Vector3f_SIMD(-3, 0, 0)); - OpenVulkano::Math::Pose destPose(OpenVulkano::Math::Quaternion(), OpenVulkano::Math::Vector3f_SIMD(3, 0, 0)); - m_animationController->SetPoses(srcPose, destPose); + CreateSceneElement(&m_whiteBox, Math::Vector4f(1, 1, 1, 1), 1); + CreateSceneElement(&m_redBox, Math::Vector4f(1, 0.2, 0.2, 1.0), 0.3); - m_animationController->m_completionEvent += EventHandler(this, &MovingCubeAppImpl::OnAnimationCompleted); + m_simpleAnimationController = std::make_unique(); + m_simpleAnimationController->SetNode(&m_whiteBox.m_node); + m_simpleAnimationController->SetDuration(3); + Math::Pose srcPose(Math::Quaternion(), Math::Vector3f_SIMD(-3, 0, 0)); + Math::Pose destPose(Math::Quaternion(), Math::Vector3f_SIMD(3, 0, 0)); + m_simpleAnimationController->SetPoses(srcPose, destPose); + m_simpleAnimationController->m_completionEvent += EventHandler(this, &MovingCubeAppImpl::OnSimpleAnimationCompleted); + + m_sequenceAnimationController = std::make_unique(); + m_sequenceAnimationController->EnableLoop(false); + m_sequenceAnimationController->SetNode(&m_redBox.m_node); + m_sequenceAnimationController->AddAnimationStep(Math::PoseF(Math::Utils::normalize(Math::QuaternionF(1, 0, 0, 1)), Math::Vector3f_SIMD(0, 0, 1)), 5); + m_sequenceAnimationController->AddAnimationStep(Math::PoseF(Math::Utils::normalize(Math::QuaternionF(2, 1, 0, 1)), Math::Vector3f_SIMD(1, 1, -1)), 3); + m_sequenceAnimationController->AddAnimationStep(Math::PoseF(Math::Utils::normalize(Math::QuaternionF(1, 1, 1, 1)), Math::Vector3f_SIMD(2, 1, -2)), 3); + m_sequenceAnimationController->AddAnimationStep(Math::PoseF(Math::Utils::normalize(Math::QuaternionF(0, 1, 1, 0)), Math::Vector3f_SIMD(2, 1, -1)), 3); + m_sequenceAnimationController->AddAnimationStep(Math::PoseF(Math::Utils::normalize(Math::QuaternionF(3, 2, 1, 1)), Math::Vector3f_SIMD(1, 1, -1)), 3); + m_sequenceAnimationController->AddAnimationStep(Math::PoseF(Math::Utils::normalize(Math::QuaternionF(0, 0, 1, 1)), Math::Vector3f_SIMD(0, 1, 0)), 1); + m_sequenceAnimationController->m_sequenceCompletionEvent += EventHandler(this, &MovingCubeAppImpl::OnSequenceAnimationCompleted); } - void OnAnimationCompleted(OpenVulkano::Scene::SimpleAnimationController *anim) + void OnSimpleAnimationCompleted(Scene::SimpleAnimationController *anim) { anim->SwapPoses(); anim->Reset(); } + void OnSequenceAnimationCompleted(Scene::SequenceAnimationController *anim) + { + Logger::APP->info("Animation sequence completed - restarting..."); + m_sequenceAnimationController->Restart(); + } + void Tick() override { m_cameraControl.Tick(); - m_animationController->Tick(); + m_simpleAnimationController->Tick(); + m_sequenceAnimationController->Tick(); } void Close() override