// Copyright (c) 2022 Dominic Masters // // This software is released under the MIT License. // https://opensource.org/licenses/MIT #pragma once #include "dawnlibs.hpp" #include "util/flag.hpp" namespace Dawn { class SceneItem; class Transform : public std::enable_shared_from_this { private: // Local (real) values glm::vec3 localPosition; glm::vec3 localScale; glm::quat localRotation; // Cached (non-real) values glm::mat4 transformLocal; glm::mat4 transformWorld; // glm::vec3 position; // glm::vec3 scale; // glm::quat rotation; // Heirarchy Transform *parent = nullptr; std::vector children; // Hidden methods void updateLocalValuesFromLocalTransform(); void updateLocalTransformFromLocalValues(); void updateWorldTransformFromLocalTransform(); void updateLocalTransformFromWorldTransform(); void updateChildrenTransforms(); public: SceneItem &item; Transform(SceneItem &item); void lookAt(glm::vec3 position, glm::vec3 look); void lookAt(glm::vec3 position, glm::vec3 look, glm::vec3 up); glm::vec3 getLocalPosition(); void setLocalPosition(glm::vec3 position); glm::vec3 getLocalScale(); void setLocalScale(glm::vec3 scale); glm::quat getLocalRotation(); void setLocalRotation(glm::quat rotation); glm::mat4 getLocalTransform(); void setLocalTransform(glm::mat4 transform); glm::mat4 getWorldTransform(); void setWorldTransform(glm::mat4 transform); void setParent(Transform *p); Transform * getParent(); ~Transform(); }; }