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 <glm/glm.hpp>
#include <glm/gtc/matrix_transform.hpp>
namespace Light {
struct TransformComponent
{
glm::mat4 transform;
glm::vec3 translation;
glm::vec3 scale;
glm::vec3 rotation;
TransformComponent() = default;
TransformComponent(const TransformComponent&) = default;
TransformComponent(const glm::mat4& _transform)
: transform(_transform)
TransformComponent(const glm::vec3& _translation = glm::vec3(0.0f, 0.0f, 0.0f),
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; }
operator const glm::mat4& () const { return transform; }
const glm::mat4& GetTransform() const
{
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 */)
{
Camera* sceneCamera = nullptr;
glm::mat4* sceneCameraTransform;
TransformComponent* sceneCameraTransform;
/* scene camera */
{
@ -61,7 +61,7 @@ namespace Light {
if (cameraComp.isPrimary)
{
sceneCamera = &cameraComp.camera;
sceneCameraTransform = &transformComp.transform;
sceneCameraTransform = &transformComp;
}
});
}
@ -75,7 +75,7 @@ namespace Light {
m_Registry.group(entt::get<TransformComponent, SpriteRendererComponent>).
each([](TransformComponent& transformComp, SpriteRendererComponent& spriteRendererComp)
{
Renderer::DrawQuad(transformComp.transform, spriteRendererComp.tint, spriteRendererComp.texture);
Renderer::DrawQuad(transformComp, spriteRendererComp.tint, spriteRendererComp.texture);
});
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.AddComponent<TransformComponent>(transform);

View file

@ -2,6 +2,8 @@
#include "Base/Base.h"
#include "Components/TransformComponent.h"
#include <entt.hpp>
#include <glm/glm.hpp>
@ -28,7 +30,7 @@ namespace Light {
void OnUpdate(float deltaTime);
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::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 }) *
glm::scale(glm::mat4(1.0f), { size.x, size.y, 1.0f}));
Entity quad = m_Scene->CreateEntity("quad", TransformComponent(glm::vec3(position.x, position.y, 0.0f), glm::vec3(size.x, size.y, 1.0f)));
quad.AddComponent<SpriteRendererComponent>(m_AwesomefaceTexture);
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<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<TagComponent>("NativeScript");
@ -90,7 +89,7 @@ namespace Light {
m_Direction.y = 0.0f;
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);
}

View file

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