exhibit manager progress
[laserbrain_demo] / src / scene.cc
index 35b562d..484310f 100644 (file)
@@ -182,6 +182,35 @@ bool Scene::have_node(SceneNode *n) const
        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, 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)) {
@@ -194,6 +223,30 @@ static void find_nodes_rec(std::list<SceneNode*> *res, SceneNode *tree, const st
        }
 }
 
+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 std::move(res);
+}
+
 Scene *Scene::extract_nodes(const char *qstr)
 {
        if(!nodes) return 0;