85 lines
1.7 KiB
C++
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();
|
|
}
|