X-Git-Url: http://git.mutantstargoat.com/user/nuclear/?a=blobdiff_plain;f=src%2Fscene.cc;h=683c9ecf221814528c16731d3ab867a3b919862b;hb=c38b9bd9f3b1f4efdb0de5a2aabc3bddf76b6aec;hp=0d23930839bdba9b3e91604a526436cc43aee183;hpb=dbcb9345c23c5c027d808915962843e7db2d14aa;p=laserbrain_demo diff --git a/src/scene.cc b/src/scene.cc index 0d23930..683c9ec 100644 --- a/src/scene.cc +++ b/src/scene.cc @@ -1,22 +1,16 @@ #include #include "scene.h" #include "objmesh.h" +#include "app.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; - } } Scene::~Scene() @@ -41,11 +35,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 +50,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); @@ -149,6 +182,8 @@ static void find_nodes_rec(std::list *res, SceneNode *tree, const st Scene *Scene::extract_nodes(const char *qstr) { + if(!nodes) return 0; + std::regex re{qstr}; std::list nodelist; @@ -157,7 +192,7 @@ Scene *Scene::extract_nodes(const char *qstr) return 0; } - Scene *res = new Scene(texset); + Scene *res = new Scene; for(SceneNode *n : nodelist) {