129 lines
3.3 KiB
C++
Executable File
129 lines
3.3 KiB
C++
Executable File
#include "DeerCore/Components.h"
|
|
#include "DeerCore/EntityEnviroment.h"
|
|
#include "DeerCore/Log.h"
|
|
|
|
namespace Deer {
|
|
Entity::Entity(entt::entity handle, EntityEnvironment* scene, uint32_t entityID)
|
|
: entHandle(handle),
|
|
environment(scene),
|
|
entId(entityID) {}
|
|
|
|
Entity::Entity(Entity&& ent) noexcept {
|
|
environment = ent.environment;
|
|
entHandle = ent.entHandle;
|
|
parentId = ent.parentId;
|
|
entId = ent.entId;
|
|
|
|
ent.environment = nullptr;
|
|
ent.entHandle = entt::null;
|
|
ent.parentId = 0;
|
|
ent.entId = 0;
|
|
}
|
|
|
|
Entity& Entity::operator=(Entity&& ent) noexcept {
|
|
environment = ent.environment;
|
|
entHandle = ent.entHandle;
|
|
parentId = ent.parentId;
|
|
entId = ent.entId;
|
|
|
|
ent.environment = nullptr;
|
|
ent.entHandle = entt::null;
|
|
ent.parentId = 0;
|
|
ent.entId = 0;
|
|
|
|
return *this;
|
|
}
|
|
|
|
inline bool Entity::isValid() const {
|
|
return environment != nullptr;
|
|
}
|
|
|
|
void Entity::setParent(Entity& parent) {
|
|
DEER_CORE_ASSERT(isValid(), "Entity is not valid");
|
|
DEER_CORE_ASSERT(parent.environment == environment,
|
|
"Cannot set parent from different environments");
|
|
DEER_CORE_ASSERT(parent.isValid(), "Parent is not valid");
|
|
if (parent.getId() == getId())
|
|
return;
|
|
|
|
Entity& current_parent = getParent();
|
|
|
|
if (parent.isDescendantOf(*this)) {
|
|
DEER_CORE_WARN("Cannot set parent: would create cycle");
|
|
return;
|
|
}
|
|
|
|
if (current_parent.isValid() && current_parent.getId() != parent.getId()) {
|
|
current_parent.getComponent<RelationshipComponent>().removeChild(getId());
|
|
}
|
|
|
|
parent.getComponent<RelationshipComponent>().addChildId(getId());
|
|
|
|
getComponent<RelationshipComponent>().parent_id = parent.getId();
|
|
parentId = parent.getId();
|
|
}
|
|
|
|
bool Entity::isDescendantOf(Entity& parent) const {
|
|
DEER_CORE_ASSERT(isValid(), "Entity is not valid");
|
|
if (getId() == parent.getId())
|
|
return true;
|
|
if (isRoot())
|
|
return false;
|
|
|
|
return getParent().isDescendantOf(parent);
|
|
}
|
|
|
|
Entity& Entity::duplicate() {
|
|
DEER_CORE_ASSERT(isValid(), "Entity is not valid");
|
|
Entity& creation = environment->createEntity(
|
|
getComponent<TagComponent>().tag + "(d)");
|
|
|
|
creation.setParent(getParent());
|
|
|
|
creation.getComponent<TransformComponent>() =
|
|
getComponent<TransformComponent>();
|
|
|
|
/*
|
|
#ifdef DEER_RENDER
|
|
if (environment->m_registry->any_of<MeshComponent>(entHandle))
|
|
creation.addComponent<MeshComponent>(
|
|
getComponent<MeshComponent>());
|
|
|
|
if (environment->m_registry->any_of<CameraComponent>(entHandle))
|
|
creation.addComponent<CameraComponent>(
|
|
getComponent<CameraComponent>());
|
|
#endif
|
|
*/
|
|
return creation;
|
|
}
|
|
|
|
void Entity::destroy() {
|
|
DEER_CORE_ASSERT(isValid(), "Entity is not valid");
|
|
DEER_CORE_ASSERT(!isRoot(), "Can not destroy the root");
|
|
environment->destroyEntity(getId());
|
|
}
|
|
|
|
Entity& Entity::getParent() const {
|
|
DEER_CORE_ASSERT(isValid(), "Entity is not valid");
|
|
return environment->getEntity(parentId);
|
|
}
|
|
|
|
glm::mat4 Entity::getWorldMatrix() const {
|
|
if (isRoot())
|
|
return glm::mat4(1.0f);
|
|
|
|
return getParent().getWorldMatrix() * getRelativeMatrix();
|
|
}
|
|
|
|
void Entity::clear() {
|
|
environment = nullptr;
|
|
entHandle = entt::null;
|
|
parentId = 0;
|
|
entId = 0;
|
|
}
|
|
|
|
glm::mat4 Entity::getRelativeMatrix() const {
|
|
return getComponent<TransformComponent>().getMatrix();
|
|
}
|
|
} // namespace Deer
|