From fe7e168e21cb271c8bb9797da56f83b364406216 Mon Sep 17 00:00:00 2001 From: Nigel Barink Date: Sat, 31 Dec 2022 02:42:27 +0100 Subject: [PATCH] Adding a relationship component The relationship component enables us to define a hierarchy through the ECS. This creates a pathway towards Inverse Kinematics --- Editor/src/app.cpp | 29 ++++++++------- YoggieEngine/src/Graphics/Renderer.cpp | 19 ++-------- YoggieEngine/src/Scene/Components.h | 20 ++++++----- YoggieEngine/src/Scene/Entity.h | 8 ++--- YoggieEngine/src/Scene/Scene.cpp | 50 +++++++++++++++++++++++++- YoggieEngine/src/YoggieEngine.h | 3 +- 6 files changed, 84 insertions(+), 45 deletions(-) diff --git a/Editor/src/app.cpp b/Editor/src/app.cpp index 8f3d60e..fd514d2 100644 --- a/Editor/src/app.cpp +++ b/Editor/src/app.cpp @@ -199,18 +199,6 @@ void CreateTestProject(std::unique_ptr& project, Scene& scene ) { // Create a level and load it as the current level auto importer = ModelImporter(); - // Create a cube - auto model = importer.Import("build/Debug/Models/Cube.obj"); - auto cube = scene.AddEntity("Cube"); - - auto& render3DComponent = cube.AddComponent(); - render3DComponent.mesh = *(model->renderable->mesh); - - cube.GetComponent().Position = glm::vec3(1.0f, 0.0f, 5.0f); - - auto cube2 = scene.AddEntity("Cube1"); - auto& rendercube2 = cube2.AddComponent(); - rendercube2.mesh = *(model->renderable->mesh); // create an ambient light source auto light = scene.AddEntity("Light"); @@ -218,5 +206,22 @@ void CreateTestProject(std::unique_ptr& project, Scene& scene ) { lightComponent.Color = glm::vec3(1.0f); + // Create a cube + auto model = importer.Import("build/Debug/Models/Cube.obj"); + + auto cube = scene.AddEntity("Cube"); + auto& render3DComponent = cube.AddComponent(); + render3DComponent.mesh = *(model->renderable->mesh); + + cube.GetComponent().Position = glm::vec3(1.0f, 0.0f, 5.0f); + + auto cube2 = scene.AddEntity("Cube2"); + auto& rendercube2 = cube2.AddComponent(); + rendercube2.mesh = *(model->renderable->mesh); + + auto relationcube = cube.AddComponent(cube2); + + + } diff --git a/YoggieEngine/src/Graphics/Renderer.cpp b/YoggieEngine/src/Graphics/Renderer.cpp index 4e594f0..a0895e5 100644 --- a/YoggieEngine/src/Graphics/Renderer.cpp +++ b/YoggieEngine/src/Graphics/Renderer.cpp @@ -199,15 +199,8 @@ void Renderer::GeometryPass() { glBindVertexArray(command.VAO_identifier); glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, command.IBO_identifier); - glm::mat4 rotation = glm::rotate(glm::mat4(1.0f), command.transform.Rotation.x, glm::vec3(1.0f, 0.0f, 0.0f)); - rotation *= glm::rotate(glm::mat4(1.0f), command.transform.Rotation.y, glm::vec3(0.0f, 1.0f, 0.0f)); - rotation *= glm::rotate(glm::mat4(1.0f), command.transform.Rotation.z, glm::vec3(0.0f, 0.0f, 1.0f)); - - glm::mat4 modelMatrix = glm::translate(glm::mat4(1.0f), command.transform.Position) * glm::scale(glm::mat4(1.0f), command.transform.Scale) * rotation; - - gBufferShader.setUniformVec3("Color", command.color); - gBufferShader.setUniformMat4("Model", modelMatrix); + gBufferShader.setUniformMat4("Model", command.transform.LocalTransform); gBufferShader.setUniformMat4("View", cam.ViewMatrix); gBufferShader.setUniformMat4("Projection", cam.ProjectionMatrix); @@ -330,16 +323,8 @@ void Renderer::Render(Scene& scene) command.shader.Use(); - glm::mat4 rotation = glm::rotate(glm::mat4(1.0f), command.transform.Rotation.x, glm::vec3(1.0f, 0.0f, 0.0f)); - rotation *= glm::rotate(glm::mat4(1.0f), command.transform.Rotation.y, glm::vec3(0.0f, 1.0f, 0.0f)); - rotation *= glm::rotate(glm::mat4(1.0f), command.transform.Rotation.z, glm::vec3(0.0f, 0.0f, 1.0f)); - - - glm::mat4 modelMatrix = glm::translate(glm::mat4(1.0f), command.transform.Position) * glm::scale(glm::mat4(1.0f), command.transform.Scale) * rotation; - - command.shader.setUniformVec3("Color", command.color); - command.shader.setUniformMat4("M", modelMatrix); + command.shader.setUniformMat4("M", command.transform.LocalTransform); command.shader.setUniformMat4("V", cam.ViewMatrix); command.shader.setUniformMat4("P", cam.ProjectionMatrix); diff --git a/YoggieEngine/src/Scene/Components.h b/YoggieEngine/src/Scene/Components.h index 8a1eb5b..443bf12 100644 --- a/YoggieEngine/src/Scene/Components.h +++ b/YoggieEngine/src/Scene/Components.h @@ -1,29 +1,31 @@ #pragma once +#include "Entity.h" namespace YoggieEngine { struct IdentifierComponent { std::string name; }; + struct TransformComponent { glm::vec3 Position = glm::vec3(0.0f); glm::vec3 Rotation = glm::vec3(0.0f); glm::vec3 Scale = glm::vec3(1.0f); + + glm::mat4 LocalTransform = glm::mat4(1.0f); + }; - glm::mat4 GetTransformMatrix() { - glm::mat4 result = glm::mat4(1.0f); - glm::mat4 rotate = glm::rotate(glm::mat4(1.0f), Rotation.x, glm::vec3(1.f, 0.f, 0.f)); - rotate *= glm::rotate(glm::mat4(1.0f), Rotation.y, glm::vec3(0.f, 1.f, 0.f)); - rotate *= glm::rotate(glm::mat4(1.0f), Rotation.z, glm::vec3(0.f, 0.f, 1.f)); + struct RelationComponent { + Entity Parent; - - result = rotate * glm::scale(glm::mat4(1.0f), Scale) * glm::translate(glm::mat4(1.0f), Position) ; - - return result; + RelationComponent(Entity& entity) + { + Parent = entity; } }; + struct LightComponent { glm::vec3 Color = glm::vec3(1.0f, .5f, .5f); }; diff --git a/YoggieEngine/src/Scene/Entity.h b/YoggieEngine/src/Scene/Entity.h index 879d8be..6ddfe04 100644 --- a/YoggieEngine/src/Scene/Entity.h +++ b/YoggieEngine/src/Scene/Entity.h @@ -8,9 +8,9 @@ namespace YoggieEngine { Entity(entt::entity e, Scene* scene) ; Entity(const Entity& other) = default; - template - T& AddComponent() { - return m_scene->m_registry.emplace(m_entity); + template + T& AddComponent(argumentType... args) { + return m_scene->m_registry.emplace(m_entity, args...); } template @@ -24,8 +24,6 @@ namespace YoggieEngine { return m_scene->getReg().all_of(m_entity); } - - // NOTE: Not Scene context aware!! bool operator== (Entity& other) { return m_entity == other.m_entity; diff --git a/YoggieEngine/src/Scene/Scene.cpp b/YoggieEngine/src/Scene/Scene.cpp index e6e1bd5..abede83 100644 --- a/YoggieEngine/src/Scene/Scene.cpp +++ b/YoggieEngine/src/Scene/Scene.cpp @@ -1,7 +1,7 @@ #include #include "Scene.h" #include "Entity.h" -#include "Components.h" +using namespace entt; namespace YoggieEngine{ Scene::Scene() @@ -32,6 +32,54 @@ namespace YoggieEngine{ { // Execute Update functions in scripts etc.... + // Update transforms + + auto& transforms = m_registry.view(); + transforms.each([&](auto ent, TransformComponent& transform) { + + glm::mat4 rotationX = + glm::rotate( + glm::mat4(1.0f), + glm::radians(transform.Rotation.x), + glm::vec3(1.f, 0.f, 0.0f) + ); + glm::mat4 rotationY = + glm::rotate( + glm::mat4(1.0f), + glm::radians(transform.Rotation.y), + glm::vec3(0.f, 1.f, 0.0f) + ); + glm::mat4 rotationZ = + glm::rotate( + glm::mat4(1.0f), + transform.Rotation.z, + glm::vec3(0.f, 0.f, 1.0f) + ); + + glm::mat4 rotationMatrix = rotationY * rotationX * rotationZ; + glm::mat4 translationMatrix = glm::translate(glm::mat4(1.0f), transform.Position); + glm::mat4 ScaleMatrix = glm::scale(glm::mat4(1.0f), transform.Scale); + + Entity entity( ent, this ); + + + if (entity.HasComponent()) + { + auto& entityRelation = entity.GetComponent(); + Entity parent = entityRelation.Parent; + TransformComponent parentTransform = parent.GetComponent(); + glm::mat4 Model = translationMatrix * rotationMatrix * ScaleMatrix; + transform.LocalTransform = parentTransform.LocalTransform * Model; + } + else { + transform.LocalTransform = translationMatrix * rotationMatrix * ScaleMatrix; + + } + + }); + + + } void Scene::FixedUpdate() diff --git a/YoggieEngine/src/YoggieEngine.h b/YoggieEngine/src/YoggieEngine.h index 0eb2c33..6ab5e3e 100644 --- a/YoggieEngine/src/YoggieEngine.h +++ b/YoggieEngine/src/YoggieEngine.h @@ -45,6 +45,7 @@ extern "C" #include "EventSystem/EventEmitter.h" #include "EventSystem/EventListener.h" - +#include "Scene/Entity.h" #include "Scene/Scene.h" +#include "Scene/Components.h" #include "Application.h"