From a0a4c935e48d18c5fc6cbf1630a3c0ae2ceca8ab Mon Sep 17 00:00:00 2001 From: Vladyslav Baranovskyi Date: Thu, 13 Jun 2024 23:35:02 +0300 Subject: [PATCH] Example app adjustments to the changes, using factory in MovingCubeApp --- examples/ExampleApps/CubesExampleApp.cpp | 6 +- examples/ExampleApps/MovingCubeApp.cpp | 76 ++++++++++++++++++++++-- 2 files changed, 74 insertions(+), 8 deletions(-) diff --git a/examples/ExampleApps/CubesExampleApp.cpp b/examples/ExampleApps/CubesExampleApp.cpp index bb1b615..b167569 100644 --- a/examples/ExampleApps/CubesExampleApp.cpp +++ b/examples/ExampleApps/CubesExampleApp.cpp @@ -8,6 +8,7 @@ #include "Scene/Scene.hpp" #include "Scene/Shader/Shader.hpp" #include "Scene/Geometry.hpp" +#include "Scene/GeometryFactory.hpp" #include "Scene/Material.hpp" #include "Scene/Vertex.hpp" #include "Scene/SimpleDrawable.hpp" @@ -59,9 +60,8 @@ namespace OpenVulkano drawablesPool.resize(GEOS); for (uint32_t i = 0; i < GEOS; i++) { - Geometry* geo = new Geometry(); - geo->InitCube(std::rand() % 1000 / 1000.0f + 0.01f, std::rand() % 1000 / 1000.0f + 0.01f, std::rand() % 1000 / 1000.0f + 0.01f, - Vector4f((std::rand() % 255) / 255.0f, (std::rand() % 255) / 255.0f, (std::rand() % 255) / 255.0f, 1)); + Geometry* geo = GeometryFactory::MakeCube(std::rand() % 1000 / 1000.0f + 0.01f, std::rand() % 1000 / 1000.0f + 0.01f, std::rand() % 1000 / 1000.0f + 0.01f, + Vector4f((std::rand() % 255) / 255.0f, (std::rand() % 255) / 255.0f, (std::rand() % 255) / 255.0f, 1)); drawablesPool[i].Init(&shader, geo, &mat); } nodesPool.resize(OBJECTS); diff --git a/examples/ExampleApps/MovingCubeApp.cpp b/examples/ExampleApps/MovingCubeApp.cpp index 472583e..fe97ee3 100644 --- a/examples/ExampleApps/MovingCubeApp.cpp +++ b/examples/ExampleApps/MovingCubeApp.cpp @@ -9,6 +9,7 @@ #include "Scene/Scene.hpp" #include "Scene/Shader/Shader.hpp" #include "Scene/Geometry.hpp" +#include "Scene/GeometryFactory.hpp" #include "Scene/Material.hpp" #include "Scene/Vertex.hpp" #include "Scene/SimpleDrawable.hpp" @@ -27,7 +28,7 @@ namespace OpenVulkano { struct SceneElement { - Scene::Geometry m_geometry; + Scene::Geometry *m_geometry; Scene::SimpleDrawable m_drawable; Scene::Node m_node; }; @@ -46,11 +47,16 @@ namespace OpenVulkano SceneElement m_whiteBox; SceneElement m_redBox; - void CreateSceneElement(SceneElement *dest, const Math::Vector4f &color, float scale) + SceneElement m_plane; + SceneElement m_sphere; + SceneElement m_hemisphere; + SceneElement m_triangle; + SceneElement m_cylinder; + SceneElement m_pyramid; + + void CompleteSceneElement(SceneElement *dest) { - dest->m_geometry.InitCube(scale, scale, scale, color); - dest->m_drawable.Init(&m_shader, &dest->m_geometry, &m_material); - + 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); @@ -58,6 +64,48 @@ namespace OpenVulkano dest->m_node.SetMatrix(Math::Matrix4f(1)); } + void CreateSceneElement(SceneElement *dest, const Math::Vector4f &color, float scale) + { + dest->m_geometry = Scene::GeometryFactory::MakeCube(scale, scale, scale, color); + CompleteSceneElement(dest); + } + + void CreatePlane(SceneElement *dest, const Math::Vector4f& color) + { + dest->m_geometry = Scene::GeometryFactory::MakePlane(1, 1, color); + CompleteSceneElement(dest); + } + + void CreateSphere(SceneElement *dest, const Math::Vector4f& color) + { + dest->m_geometry = Scene::GeometryFactory::MakeSphere(1, 32, 16, color); + CompleteSceneElement(dest); + } + + void CreateHemisphere(SceneElement *dest, const Math::Vector4f& color) + { + dest->m_geometry = Scene::GeometryFactory::MakeHemisphere(1, 16, 16, color); + CompleteSceneElement(dest); + } + + void CreateTriangle(SceneElement *dest, const Math::Vector4f& color) + { + dest->m_geometry = Scene::GeometryFactory::MakeTriangle(Math::Vector3f(0.5, 0., 0.), Math::Vector3f(0., 0.5, 0.), Math::Vector3f(-0.5, 0., 0.), color); + CompleteSceneElement(dest); + } + + void CreateCylinder(SceneElement *dest, const Math::Vector4f& color) + { + dest->m_geometry = Scene::GeometryFactory::MakeCylinder(1, 3, 64, color); + CompleteSceneElement(dest); + } + + void CreatePyramid(SceneElement *dest, const Math::Vector4f& color) + { + dest->m_geometry = Scene::GeometryFactory::MakePyramid(0.5, 2, color); + CompleteSceneElement(dest); + } + public: void Init() override { @@ -95,6 +143,24 @@ namespace OpenVulkano 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.SetAnimationPoseResetTime(10); + + CreatePlane(&m_plane, Math::Vector4f(0.3, 0.6, 0.9, 1.0)); + m_plane.m_node.worldMat = Math::Utils::translate(Math::Vector3f(3, 0, 0)); + + CreateSphere(&m_sphere, Math::Vector4f(0.9, 0.6, 0.9, 1.0)); + m_sphere.m_node.worldMat = Math::Utils::translate(Math::Vector3f(5, 0, 0)); + + CreateHemisphere(&m_hemisphere, Math::Vector4f(0.6, 0.3, 0.9, 1.0)); + m_hemisphere.m_node.worldMat = Math::Utils::translate(Math::Vector3f(7, 0, 0)); + + CreateTriangle(&m_triangle, Math::Vector4f(0.6, 0.9, 0.3, 1.0)); + m_triangle.m_node.worldMat = Math::Utils::translate(Math::Vector3f(9, 0, 0)); + + CreateCylinder(&m_cylinder, Math::Vector4f(0.3, 0.9, 0.9, 1.0)); + m_cylinder.m_node.worldMat = Math::Utils::translate(Math::Vector3f(11, 0, 0)); + + CreatePyramid(&m_pyramid, Math::Vector4f(0.9, 0.9, 0.6, 1.0)); + m_pyramid.m_node.worldMat = Math::Utils::translate(Math::Vector3f(13, 0, 0)); } void OnSimpleAnimationCompleted(Scene::SimpleAnimationController *anim)