From 30d8182f4d5f6717d7037f9858f7e3e0463917fe Mon Sep 17 00:00:00 2001 From: Sara Date: Fri, 27 Sep 2024 10:34:32 +0200 Subject: [PATCH] feat: added get child by typeid function with option to recurse --- src/core/scene.c | 19 +++++++++++++++++-- src/core/scene.h | 6 ++++-- 2 files changed, 21 insertions(+), 4 deletions(-) diff --git a/src/core/scene.c b/src/core/scene.c index f017c22..f252d14 100644 --- a/src/core/scene.c +++ b/src/core/scene.c @@ -170,8 +170,23 @@ SceneNode *SceneNodeGetChildByTypeclass(SceneNode *self, char const *typeclass, SceneNodeEntity entity = (*child)->entity; if(mirror_get_function(entity.data, entity.mirror, typeclass)) return *child; - if(recurse) - SceneNodeGetChildByTypeclass(*child, typeclass, recurse); + if(recurse) { + SceneNode *recursed = SceneNodeGetChildByTypeclass(*child, typeclass, recurse); + if(recursed != NULL) return recursed; + } + } + return NULL; +} + +SceneNode *SceneNodeGetChildByTypeid(SceneNode *self, typeid id, bool recurse) { + list_foreach(SceneNode **,child, &self->children) { + SceneNodeEntity entity = (*child)->entity; + if(entity.mirror->get_typeid() == id) + return *child; + if(recurse) { + SceneNode *recursed = SceneNodeGetChildByTypeid(*child, id, recurse); + if(recursed != NULL) return recursed; + } } return NULL; } diff --git a/src/core/scene.h b/src/core/scene.h index 5ce6340..4e4826e 100644 --- a/src/core/scene.h +++ b/src/core/scene.h @@ -41,10 +41,12 @@ extern void SceneNodeRemoveChild(SceneNode *self, SceneNode *child); extern void SceneNodeAttachEntity(SceneNode *self, SceneNodeEntity entity); //! Detach an entity from a scene node extern SceneNodeEntity SceneNodeDetachEntity(SceneNode *self); -//! Returns the first child node that implements a specific typeclass. +//! Returns the first child node with an entity that implements a specific typeclass. //! Optionally recurses through the entire branch extern SceneNode *SceneNodeGetChildByTypeclass(SceneNode *self, char const *typeclass, bool recurse); - +//! Returns the first child node with an entity that matches the given typeid. +//! Optionally recurses through the entire branch. +extern SceneNode *SceneNodeGetChildByTypeid(SceneNode *self, typeid id, bool recurse); //! Instantiate a new scene with a root node. extern Scene *CreateScene(SceneNode *root); //! Destroy a node and it's scene tree.