From ff304ad3d480ecafbc9507b677bbbf163c3c27b9 Mon Sep 17 00:00:00 2001 From: Nick Fisher Date: Sun, 8 Sep 2024 13:52:04 +0800 Subject: [PATCH] feat: add getAncestor method --- thermion_dart/native/include/SceneManager.hpp | 1 + .../native/include/ThermionDartApi.h | 1 + thermion_dart/native/src/SceneManager.cpp | 21 +++++++++++++++++-- thermion_dart/native/src/ThermionDartApi.cpp | 4 ++++ 4 files changed, 25 insertions(+), 2 deletions(-) diff --git a/thermion_dart/native/include/SceneManager.hpp b/thermion_dart/native/include/SceneManager.hpp index 9626f543..46924508 100644 --- a/thermion_dart/native/include/SceneManager.hpp +++ b/thermion_dart/native/include/SceneManager.hpp @@ -181,6 +181,7 @@ namespace thermion_filament void addCollisionComponent(EntityId entity, void (*onCollisionCallback)(const EntityId entityId1, const EntityId entityId2), bool affectsCollidingTransform); void removeCollisionComponent(EntityId entityId); EntityId getParent(EntityId child); + EntityId getAncestor(EntityId child); void setParent(EntityId child, EntityId parent, bool preserveScaling); bool addAnimationComponent(EntityId entity); void removeAnimationComponent(EntityId entity); diff --git a/thermion_dart/native/include/ThermionDartApi.h b/thermion_dart/native/include/ThermionDartApi.h index 7189694b..baf56fd3 100644 --- a/thermion_dart/native/include/ThermionDartApi.h +++ b/thermion_dart/native/include/ThermionDartApi.h @@ -251,6 +251,7 @@ extern "C" EMSCRIPTEN_KEEPALIVE EntityId create_geometry(void *const sceneManager, float *vertices, int numVertices, uint16_t *indices, int numIndices, int primitiveType, const char *materialPath); EMSCRIPTEN_KEEPALIVE EntityId get_parent(void *const sceneManager, EntityId child); + EMSCRIPTEN_KEEPALIVE EntityId get_ancestor(void *const sceneManager, EntityId child); EMSCRIPTEN_KEEPALIVE void set_parent(void *const sceneManager, EntityId child, EntityId parent, bool preserveScaling); EMSCRIPTEN_KEEPALIVE void test_collisions(void *const sceneManager, EntityId entity); EMSCRIPTEN_KEEPALIVE void set_priority(void *const sceneManager, EntityId entityId, int priority); diff --git a/thermion_dart/native/src/SceneManager.cpp b/thermion_dart/native/src/SceneManager.cpp index ec9a7e1b..3fc08ef4 100644 --- a/thermion_dart/native/src/SceneManager.cpp +++ b/thermion_dart/native/src/SceneManager.cpp @@ -1542,6 +1542,25 @@ namespace thermion_filament return Entity::smuggle(parent); } + EntityId SceneManager::getAncestor(EntityId childEntityId) + { + auto &tm = _engine->getTransformManager(); + const auto child = Entity::import(childEntityId); + auto transformInstance = tm.getInstance(child); + Entity parent; + + while(true) { + auto newParent = tm.getParent(transformInstance); + if(newParent.isNull()) { + break; + } + parent = newParent; + transformInstance = tm.getInstance(parent); + } + + return Entity::smuggle(parent); + } + void SceneManager::setParent(EntityId childEntityId, EntityId parentEntityId, bool preserveScaling) { auto &tm = _engine->getTransformManager(); @@ -1561,8 +1580,6 @@ namespace thermion_filament return; } - Log("Parenting child entity %d to new parent entity %d", childEntityId, parentEntityId); - if (preserveScaling) { auto parentTransform = tm.getWorldTransform(parentInstance); diff --git a/thermion_dart/native/src/ThermionDartApi.cpp b/thermion_dart/native/src/ThermionDartApi.cpp index 866d3ea5..34f6fa49 100644 --- a/thermion_dart/native/src/ThermionDartApi.cpp +++ b/thermion_dart/native/src/ThermionDartApi.cpp @@ -851,6 +851,10 @@ extern "C" return ((SceneManager *)sceneManager)->getParent(child); } + EMSCRIPTEN_KEEPALIVE EntityId get_ancestor(void *const sceneManager, EntityId child) { + return ((SceneManager *)sceneManager)->getAncestor(child); + } + EMSCRIPTEN_KEEPALIVE void set_parent(void *const sceneManager, EntityId child, EntityId parent, bool preserveScaling) { ((SceneManager *)sceneManager)->setParent(child, parent, preserveScaling);