#include "Entity.h" void Entity::_UpdateChildTransform() const { for(auto& child : _children) { child->_localToWorld = _localToWorld * child->_transform; child->_worldToLocal = glm::inverse(child->_transform); child->_UpdateChildTransform(); } } Entity::Entity(Entity* parent) : _localToWorld(1.0f), _worldToLocal(1.0f) { _parent = parent; _transform = glm::mat4(1.0f); if (parent == nullptr) return; parent->AddChild(this); _localToWorld = _parent->_localToWorld; _worldToLocal = glm::inverse(_localToWorld); } Entity::~Entity() { _parent->RemoveChild(this); } void Entity::AddChild(Entity* entity) { _children.insert(entity); } void Entity::RemoveChild(Entity* entity) { _children.erase(entity); } void Entity::Transform(const glm::mat4& transform) { glm::mat4 transformLocalBasis = _worldToLocal * transform; _transform = transformLocalBasis * _transform; if (_parent == nullptr) { _localToWorld = _transform; } else { _localToWorld = _parent->LocalToWorld() * _transform; } _worldToLocal = glm::inverse(_localToWorld); _UpdateChildTransform(); } void Entity::TransformLocal(const glm::mat4& transform) { _transform = transform * _transform; if (_parent == nullptr) { _localToWorld = _transform; } else { _localToWorld = _parent->LocalToWorld() * _transform; } _worldToLocal = glm::inverse(_localToWorld); _UpdateChildTransform(); } void Entity::SetTransform(const glm::mat4& transform) { _transform = transform; if (_parent != nullptr) { _localToWorld = transform * _parent->_localToWorld; _worldToLocal = glm::inverse(transform) * _parent->_worldToLocal; } else { _localToWorld = transform; _worldToLocal = glm::inverse(transform); } _UpdateChildTransform(); }