From d44f10c87b5f9611c1e6595cf135f73cdd386ec3 Mon Sep 17 00:00:00 2001 From: Sara Date: Wed, 25 Sep 2024 17:34:17 +0200 Subject: [PATCH] feat: added SceneNodeGetChildByTypeclass --- src/core/scene.c | 10 ++++++++++ src/core/scene.h | 4 ++++ 2 files changed, 14 insertions(+) diff --git a/src/core/scene.c b/src/core/scene.c index f0c28f1..d3dded2 100644 --- a/src/core/scene.c +++ b/src/core/scene.c @@ -165,6 +165,16 @@ SceneNodeEntity SceneNodeDetachEntity(SceneNode *self) { return e; } +SceneNode *SceneNodeGetChildByTypeclass(SceneNode *self, char const *typeclass, bool recurse) { + list_foreach(SceneNode **,child, &self->children) { + SceneNodeEntity entity = (*child)->entity; + if(mirror_get_function(entity.data, entity.mirror, typeclass)) + return *child; + if(recurse) + SceneNodeGetChildByTypeclass(*child, typeclass, recurse); + } +} + Scene *CreateScene(SceneNode *root) { Scene *scene = new(Scene); ASSERT_RETURN(scene != NULL, NULL, "CreateScene: Failed to allocate scene"); diff --git a/src/core/scene.h b/src/core/scene.h index d026d02..5ce6340 100644 --- a/src/core/scene.h +++ b/src/core/scene.h @@ -2,6 +2,7 @@ #define SCENE_H #include "stddef.h" +#include "stdbool.h" #include "scene_node_entity.h" #include "utils/list.h" #include "utils/typeclass_helpers.h" @@ -40,6 +41,9 @@ 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. +//! Optionally recurses through the entire branch +extern SceneNode *SceneNodeGetChildByTypeclass(SceneNode *self, char const *typeclass, bool recurse); //! Instantiate a new scene with a root node. extern Scene *CreateScene(SceneNode *root);