2025-01-19 16:03:36 +01:00

85 lines
1.7 KiB
C++

#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() {
if (_parent == nullptr)
return;
_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();
}