#include "scene.h"
#include "objmesh.h"
#include "app.h"
+#include "dbg_gui.h"
static void destroy_node_tree(SceneNode *n);
return n->scene == this;
}
+/* traverse scene graph and find node by name */
+static SceneNode *find_node_rec(SceneNode *tree, const char *name)
+{
+ if(strcmp(tree->get_name(), name) == 0) {
+ return tree;
+ }
+
+ int num = tree->get_num_children();
+ for(int i=0; i<num; i++) {
+ SceneNode *n = find_node_rec(tree->get_child(i), name);
+ if(n) return n;
+ }
+ return 0;
+}
+
+static SceneNode *find_node_rec(SceneNode *tree, const std::regex &re)
+{
+ if(std::regex_match(tree->get_name(), re)) {
+ return tree;
+ }
+
+ int num = tree->get_num_children();
+ for(int i=0; i<num; i++) {
+ SceneNode *n = find_node_rec(tree->get_child(i), re);
+ if(n) return n;
+ }
+ return 0;
+}
+
static void find_nodes_rec(std::list<SceneNode*> *res, SceneNode *tree, const std::regex &re)
{
if(std::regex_match(tree->get_name(), re)) {
}
}
+SceneNode *Scene::find_node(const char *name) const
+{
+ if(!nodes) return 0;
+ return find_node_rec(nodes, name);
+}
+
+SceneNode *Scene::match_node(const char *qstr) const
+{
+ if(!nodes) return 0;
+
+ std::regex re{qstr};
+ return find_node_rec(nodes, re);
+}
+
+std::list<SceneNode*> Scene::match_nodes(const char *qstr) const
+{
+ std::list<SceneNode*> res;
+ if(nodes) {
+ std::regex re{qstr};
+ find_nodes_rec(&res, nodes, re);
+ }
+ return res;
+}
+
Scene *Scene::extract_nodes(const char *qstr)
{
if(!nodes) return 0;