#include "scene.h"
#include "objmesh.h"
#include "app.h"
+#include "dbg_gui.h"
static void destroy_node_tree(SceneNode *n);
nodes = 0;
walk_mesh = 0;
+
+ texset = 0;
+ loader_data = 0;
}
Scene::~Scene()
void Scene::destroy()
{
+ clear();
+
+ metascn = 0;
+ texset = 0;
+ loader_data = 0;
+
+ datamap.clear();
+}
+
+void Scene::clear()
+{
destroy_node_tree(nodes);
nodes = 0;
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 std::move(res);
+}
+
Scene *Scene::extract_nodes(const char *qstr)
{
if(!nodes) return 0;