X-Git-Url: http://git.mutantstargoat.com/user/nuclear/?p=laserbrain_demo;a=blobdiff_plain;f=src%2Fscene.cc;h=012847c9fb2f807254705413beb4aa4a111091f8;hp=a31a3ce6991ce71fce8e4ff2ffc6b4fed4aa6b6d;hb=e12a327cc0b4f1e59f4a66a80b170ec41ce97be6;hpb=26c1717925471539b9745cce6275b218a47147cd diff --git a/src/scene.cc b/src/scene.cc index a31a3ce..012847c 100644 --- a/src/scene.cc +++ b/src/scene.cc @@ -2,6 +2,7 @@ #include "scene.h" #include "objmesh.h" #include "app.h" +#include "dbg_gui.h" static void destroy_node_tree(SceneNode *n); @@ -11,6 +12,9 @@ Scene::Scene() nodes = 0; walk_mesh = 0; + + texset = 0; + loader_data = 0; } Scene::~Scene() @@ -20,6 +24,17 @@ Scene::~Scene() void Scene::destroy() { + clear(); + + metascn = 0; + texset = 0; + loader_data = 0; + + datamap.clear(); +} + +void Scene::clear() +{ destroy_node_tree(nodes); nodes = 0; @@ -168,6 +183,36 @@ 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; iget_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; + } + debug_log("no match: \"%s\"\n", tree->get_name()); + + int num = tree->get_num_children(); + for(int i=0; i *res, SceneNode *tree, const std::regex &re) { if(std::regex_match(tree->get_name(), re)) { @@ -180,8 +225,34 @@ static void find_nodes_rec(std::list *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 Scene::match_nodes(const char *qstr) const +{ + std::list 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; + std::regex re{qstr}; std::list nodelist;