X-Git-Url: http://git.mutantstargoat.com/user/nuclear/?p=laserbrain_demo;a=blobdiff_plain;f=src%2Fscene.cc;h=10304f69849ff3a80531284eb5b71178ca8067ae;hp=0d23930839bdba9b3e91604a526436cc43aee183;hb=9480e20f4de41693ebd1f22e63d3bcecde878f70;hpb=dbcb9345c23c5c027d808915962843e7db2d14aa diff --git a/src/scene.cc b/src/scene.cc index 0d23930..10304f6 100644 --- a/src/scene.cc +++ b/src/scene.cc @@ -1,22 +1,20 @@ #include #include "scene.h" #include "objmesh.h" +#include "app.h" +#include "dbg_gui.h" static void destroy_node_tree(SceneNode *n); -Scene::Scene(TextureSet *tset) +Scene::Scene() { + metascn = 0; nodes = 0; walk_mesh = 0; - if(tset) { - texset = tset; - own_texset = false; - } else { - texset = new TextureSet; - own_texset = true; - } + texset = 0; + loader_data = 0; } Scene::~Scene() @@ -26,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; @@ -41,11 +50,6 @@ void Scene::destroy() delete objects[i]; } objects.clear(); - - if(own_texset) { - delete texset; - } - texset = 0; } static void destroy_node_tree(SceneNode *n) @@ -61,6 +65,50 @@ static void destroy_node_tree(SceneNode *n) // Scene::load defined in sceneload.cc +bool Scene::merge(Scene *scn) +{ + if(walk_mesh) { + if(scn->walk_mesh) { + walk_mesh->append(*scn->walk_mesh); + delete scn->walk_mesh; + scn->walk_mesh = 0; + } + } else { + walk_mesh = scn->walk_mesh; + scn->walk_mesh = 0; + } + + int nmeshes = scn->meshes.size(); + for(int i=0; imeshes[i]); + } + scn->meshes.clear(); + + int nobj = scn->objects.size(); + for(int i=0; iobjects[i]); + } + scn->objects.clear(); + + if(nodes) { + int nchildren = scn->nodes ? scn->nodes->get_num_children() : 0; + for(int i=0; inodes->get_child(i); + scn->nodes->remove_child(n); + nodes->add_child(n); + } + if(scn->nodes && scn->nodes->get_num_objects() > 0) { + warning_log("merging with scene which has objects in its root node. these objects will not be merged!\n"); + } + delete scn->nodes; + } else { + nodes = scn->nodes; + } + scn->nodes = 0; + + return true; +} + void Scene::add_object(Object *obj) { objects.push_back(obj); @@ -135,6 +183,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; 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; + } + + int num = tree->get_num_children(); + for(int i=0; iget_child(i), re); + if(n) return n; + } + return 0; +} + static void find_nodes_rec(std::list *res, SceneNode *tree, const std::regex &re) { if(std::regex_match(tree->get_name(), re)) { @@ -147,8 +224,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 res; +} + Scene *Scene::extract_nodes(const char *qstr) { + if(!nodes) return 0; + std::regex re{qstr}; std::list nodelist; @@ -157,7 +260,7 @@ Scene *Scene::extract_nodes(const char *qstr) return 0; } - Scene *res = new Scene(texset); + Scene *res = new Scene; for(SceneNode *n : nodelist) {