Update TransformComponent

- TransformComponent now holds translation, rotation and scale instead of transform
This commit is contained in:
Light 2021-08-07 19:04:38 +04:30
parent 0e31de13b9
commit 0f9a8ff95e
5 changed files with 36 additions and 18 deletions

View file

@ -3,23 +3,40 @@
#include "Base/Base.h" #include "Base/Base.h"
#include <glm/glm.hpp> #include <glm/glm.hpp>
#include <glm/gtc/matrix_transform.hpp>
namespace Light { namespace Light {
struct TransformComponent struct TransformComponent
{ {
glm::mat4 transform; glm::vec3 translation;
glm::vec3 scale;
glm::vec3 rotation;
TransformComponent() = default;
TransformComponent(const TransformComponent&) = default; TransformComponent(const TransformComponent&) = default;
TransformComponent(const glm::mat4& _transform) TransformComponent(const glm::vec3& _translation = glm::vec3(0.0f, 0.0f, 0.0f),
: transform(_transform) const glm::vec3& _scale = glm::vec3(1.0f, 1.0f, 1.0f),
const glm::vec3& _rotation = glm::vec3(0.0f, 0.0f, 0.0f))
: translation(_translation),
scale(_scale),
rotation(_rotation)
{ {
} }
operator glm::mat4&() { return transform; } const glm::mat4& GetTransform() const
operator const glm::mat4& () const { return transform; } {
return glm::translate(glm::mat4(1.0f), translation) *
glm::rotate(glm::mat4(1.0f), rotation.x, glm::vec3(1.0f, 0.0f, 0.0f)) *
glm::rotate(glm::mat4(1.0f), rotation.y, glm::vec3(0.0f, 1.0f, 0.0f)) *
glm::rotate(glm::mat4(1.0f), rotation.z, glm::vec3(0.0f, 0.0f, 1.0f)) *
glm::scale(glm::mat4(1.0f), scale);
}
operator const glm::mat4& () const { return GetTransform(); }
}; };
} }

View file

@ -50,7 +50,7 @@ namespace Light {
void Scene::OnRender(const Ref<Framebuffer>& targetFrameBuffer /* = nullptr */) void Scene::OnRender(const Ref<Framebuffer>& targetFrameBuffer /* = nullptr */)
{ {
Camera* sceneCamera = nullptr; Camera* sceneCamera = nullptr;
glm::mat4* sceneCameraTransform; TransformComponent* sceneCameraTransform;
/* scene camera */ /* scene camera */
{ {
@ -61,7 +61,7 @@ namespace Light {
if (cameraComp.isPrimary) if (cameraComp.isPrimary)
{ {
sceneCamera = &cameraComp.camera; sceneCamera = &cameraComp.camera;
sceneCameraTransform = &transformComp.transform; sceneCameraTransform = &transformComp;
} }
}); });
} }
@ -75,7 +75,7 @@ namespace Light {
m_Registry.group(entt::get<TransformComponent, SpriteRendererComponent>). m_Registry.group(entt::get<TransformComponent, SpriteRendererComponent>).
each([](TransformComponent& transformComp, SpriteRendererComponent& spriteRendererComp) each([](TransformComponent& transformComp, SpriteRendererComponent& spriteRendererComp)
{ {
Renderer::DrawQuad(transformComp.transform, spriteRendererComp.tint, spriteRendererComp.texture); Renderer::DrawQuad(transformComp, spriteRendererComp.tint, spriteRendererComp.texture);
}); });
Renderer::EndScene(); Renderer::EndScene();
@ -83,7 +83,7 @@ namespace Light {
} }
} }
Entity Scene::CreateEntity(const std::string& name, const glm::mat4& transform) Entity Scene::CreateEntity(const std::string& name, const TransformComponent& transform)
{ {
Entity entity { m_Registry.create(), this } ; Entity entity { m_Registry.create(), this } ;
entity.AddComponent<TransformComponent>(transform); entity.AddComponent<TransformComponent>(transform);

View file

@ -2,6 +2,8 @@
#include "Base/Base.h" #include "Base/Base.h"
#include "Components/TransformComponent.h"
#include <entt.hpp> #include <entt.hpp>
#include <glm/glm.hpp> #include <glm/glm.hpp>
@ -28,7 +30,7 @@ namespace Light {
void OnUpdate(float deltaTime); void OnUpdate(float deltaTime);
void OnRender(const Ref<Framebuffer>& targetFrameBuffer = nullptr); void OnRender(const Ref<Framebuffer>& targetFrameBuffer = nullptr);
Entity CreateEntity(const std::string& name, const glm::mat4& transform); Entity CreateEntity(const std::string& name, const TransformComponent& transform = TransformComponent());
}; };
} }

View file

@ -41,18 +41,17 @@ namespace Light {
glm::vec3 position = glm::vec3(rand() % 3000 - 1400.0f, rand() % 3000 - 1400.0f, 0.0f); glm::vec3 position = glm::vec3(rand() % 3000 - 1400.0f, rand() % 3000 - 1400.0f, 0.0f);
glm::vec2 size = glm::vec2(250.0f, 250.0f); glm::vec2 size = glm::vec2(250.0f, 250.0f);
Entity quad = m_Scene->CreateEntity("quad", glm::translate(glm::mat4(1.0f), { position.x, position.y, 0.0f }) * Entity quad = m_Scene->CreateEntity("quad", TransformComponent(glm::vec3(position.x, position.y, 0.0f), glm::vec3(size.x, size.y, 1.0f)));
glm::scale(glm::mat4(1.0f), { size.x, size.y, 1.0f}));
quad.AddComponent<SpriteRendererComponent>(m_AwesomefaceTexture); quad.AddComponent<SpriteRendererComponent>(m_AwesomefaceTexture);
quad.AddComponent<TagComponent>("quad"); quad.AddComponent<TagComponent>("quad");
} }
m_CameraEntity = m_Scene->CreateEntity("camera", glm::translate(glm::mat4(1.0f), glm::vec3(0.0f, 0.0f, 1000.0f))); m_CameraEntity = m_Scene->CreateEntity("camera", TransformComponent(glm::vec3(0.0f, 0.0f, 1000.0f)));
m_CameraEntity.AddComponent<CameraComponent>(SceneCamera(), true); m_CameraEntity.AddComponent<CameraComponent>(SceneCamera(), true);
m_CameraEntity.AddComponent<TagComponent>("Camera"); m_CameraEntity.AddComponent<TagComponent>("Camera");
m_NativeScriptEntity = m_Scene->CreateEntity("nsc", glm::translate(glm::mat4(1.0f), glm::vec3(0.0f)) * glm::scale(glm::mat4(1.0f), glm::vec3(250.0f, 250.0f, 1.0f))); m_NativeScriptEntity = m_Scene->CreateEntity("nsc");
m_NativeScriptEntity.AddComponent<SpriteRendererComponent>(m_AwesomefaceTexture); m_NativeScriptEntity.AddComponent<SpriteRendererComponent>(m_AwesomefaceTexture);
m_NativeScriptEntity.AddComponent<TagComponent>("NativeScript"); m_NativeScriptEntity.AddComponent<TagComponent>("NativeScript");
@ -90,7 +89,7 @@ namespace Light {
m_Direction.y = 0.0f; m_Direction.y = 0.0f;
auto& transform = m_CameraEntity.GetComponent<TransformComponent>(); auto& transform = m_CameraEntity.GetComponent<TransformComponent>();
transform = glm::translate(transform.transform, glm::vec3(m_Direction * m_Speed * deltaTime, 0.0)); transform.translation += glm::vec3(m_Direction * m_Speed * deltaTime, 0.0);
m_Scene->OnUpdate(deltaTime); m_Scene->OnUpdate(deltaTime);
} }

View file

@ -35,8 +35,8 @@ namespace Light {
if (ImGui::TreeNodeEx((void*)typeid(TransformComponent).hash_code(), ImGuiTreeNodeFlags_DefaultOpen, "Transform")) if (ImGui::TreeNodeEx((void*)typeid(TransformComponent).hash_code(), ImGuiTreeNodeFlags_DefaultOpen, "Transform"))
{ {
auto& transformComponent = m_EntityContext.GetComponent<TransformComponent>(); auto transform = m_EntityContext.GetComponent<TransformComponent>().GetTransform();
ImGui::DragFloat3("Position", glm::value_ptr(transformComponent.transform[3]), 0.5f); ImGui::DragFloat3("Position", glm::value_ptr(transform[3]), 0.5f);
ImGui::TreePop(); ImGui::TreePop();
} }