#pragma once #include "Vector3.hpp" #include "Quaternion.hpp" #include "Matrix4x4.hpp" #include "uuid.h" #include "Types.hpp" #include #include #include namespace TSE { class BehaviourScript; class Layer; class Transformable { public: Vector3 position; Vector3 scale; Quaternion rotation; string name; bool _enabled = true; uuids::uuid id; private: std::unordered_multimap components; std::vector children; Transformable* parent = nullptr; inline static std::unordered_map objectEntries = {}; public: Transformable(); Transformable(uuids::uuid id); Transformable(const string& name); Transformable(const string& name, uuids::uuid id); ~Transformable(); Vector3 forward() const; Vector3 right() const; Vector3 up() const; Vector3 GetPosition() const; void SetPosition(const Vector3& pos); Quaternion GetRotation() const; void SetRotation(const Quaternion& rot); Vector3 GetScale() const; void SetScale(const Vector3& scale); string GetName() const; uuids::uuid GetId() const; Vector3 GetEuler(); void SetEuler(const Vector3& euler); int GetComponentCount(); Matrix4x4 GetLocalMatrix() const; Matrix4x4 GetGlobalMatrix() const; Vector3 GetGlobalPosition() const; Vector3 GlobalToLocalPosition(const Vector3& global) const; Vector3 LocalToGlobalPosition(const Vector3& local) const; void LookAt_2D(const Vector3& globalTarget); void SetParent(Transformable* parent); Transformable* GetParent() const; const std::vector& GetChildren() const; bool IsMyChild(Transformable* other); void MoveUp(Layer* l = nullptr); void MoveDown(Layer* l = nullptr); bool IsEnabled() const; void SetEnabled(bool v); BehaviourScript* AddBehaviourScript(BehaviourScript* script); BehaviourScript* GetBehaviourScript(const string& name) const; BehaviourScript* GetBehaviourScriptAt(const int i) const; std::vector GetAllBehaviourScripts(const string& name) const; void RemoveBehaviourScript(BehaviourScript* script); bool HasBehaviourScript(const string& name) const; void Update(); static void Delete(Transformable* t); static void Delete(const uuids::uuid id); static void HardDelete(Transformable* t, bool onlyThis = false); static void HardDelete(const uuids::uuid id, bool onlyThis = false); static void DeleteAll(); static bool Exists(const uuids::uuid id); bool operator==(const Transformable& other) const; bool operator!=(const Transformable& other) const; private: void OnEnable(); void OnDisable(); public: static int GetTansformableCount(); static Transformable* GetTansformableAt(int i); static Transformable* Find(string name); static Transformable* Find(uuids::uuid id); }; }