#pragma once #include "ecs_system.hpp" #include #include #include namespace engine::ecs { struct TransformComponent { uint32_t parent; glm::vec3 scale; glm::vec3 position; glm::quat rotation; }; class TransformSystem : public EcsSystem { public: TransformSystem(Scene* scene) : EcsSystem(scene) { } std::unique_ptr> getMatrices() { auto transforms = std::make_unique>(); for (const auto& [id, data] : m_components) { glm::mat4 transform; // rotation transform = glm::mat4_cast(data.rotation); // position reinterpret_cast(transform[3]) = data.position; // scale (effectively applied first) transform = glm::scale(transform, data.scale); if (data.parent != 0) { transform = transforms->at(data.parent) * transform; } transforms->emplace(id, transform); } return transforms; } }; }