Adding a relationship component
The relationship component enables us to define a hierarchy through the ECS. This creates a pathway towards Inverse Kinematics
This commit is contained in:
parent
3722e63495
commit
fe7e168e21
@ -199,18 +199,6 @@ void CreateTestProject(std::unique_ptr<Project>& 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>();
|
||||
render3DComponent.mesh = *(model->renderable->mesh);
|
||||
|
||||
cube.GetComponent<TransformComponent>().Position = glm::vec3(1.0f, 0.0f, 5.0f);
|
||||
|
||||
auto cube2 = scene.AddEntity("Cube1");
|
||||
auto& rendercube2 = cube2.AddComponent<Render3DComponent>();
|
||||
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>& 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>();
|
||||
render3DComponent.mesh = *(model->renderable->mesh);
|
||||
|
||||
cube.GetComponent<TransformComponent>().Position = glm::vec3(1.0f, 0.0f, 5.0f);
|
||||
|
||||
auto cube2 = scene.AddEntity("Cube2");
|
||||
auto& rendercube2 = cube2.AddComponent<Render3DComponent>();
|
||||
rendercube2.mesh = *(model->renderable->mesh);
|
||||
|
||||
auto relationcube = cube.AddComponent<RelationComponent>(cube2);
|
||||
|
||||
|
||||
|
||||
|
||||
}
|
||||
|
@ -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);
|
||||
|
||||
|
@ -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);
|
||||
};
|
||||
|
@ -8,9 +8,9 @@ namespace YoggieEngine {
|
||||
Entity(entt::entity e, Scene* scene) ;
|
||||
Entity(const Entity& other) = default;
|
||||
|
||||
template<class T >
|
||||
T& AddComponent() {
|
||||
return m_scene->m_registry.emplace<T>(m_entity);
|
||||
template<class T, class... argumentType >
|
||||
T& AddComponent(argumentType... args) {
|
||||
return m_scene->m_registry.emplace<T>(m_entity, args...);
|
||||
}
|
||||
|
||||
template<class T>
|
||||
@ -24,8 +24,6 @@ namespace YoggieEngine {
|
||||
return m_scene->getReg().all_of<T>(m_entity);
|
||||
}
|
||||
|
||||
|
||||
|
||||
// NOTE: Not Scene context aware!!
|
||||
bool operator== (Entity& other) {
|
||||
return m_entity == other.m_entity;
|
||||
|
@ -1,7 +1,7 @@
|
||||
#include <YoggieEngine.h>
|
||||
#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<TransformComponent>();
|
||||
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<RelationComponent>())
|
||||
{
|
||||
auto& entityRelation = entity.GetComponent<RelationComponent>();
|
||||
Entity parent = entityRelation.Parent;
|
||||
TransformComponent parentTransform = parent.GetComponent<TransformComponent>();
|
||||
glm::mat4 Model = translationMatrix * rotationMatrix * ScaleMatrix;
|
||||
transform.LocalTransform = parentTransform.LocalTransform * Model;
|
||||
}
|
||||
else {
|
||||
transform.LocalTransform = translationMatrix * rotationMatrix * ScaleMatrix;
|
||||
|
||||
}
|
||||
|
||||
});
|
||||
|
||||
|
||||
|
||||
}
|
||||
|
||||
void Scene::FixedUpdate()
|
||||
|
@ -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"
|
||||
|
Loading…
Reference in New Issue
Block a user