implemented metascene spawn point/rot
[laserbrain_demo] / src / scene.cc
index 0d23930..683c9ec 100644 (file)
@@ -1,22 +1,16 @@
 #include <regex>
 #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; i<nmeshes; i++) {
+               meshes.push_back(scn->meshes[i]);
+       }
+       scn->meshes.clear();
+
+       int nobj = scn->objects.size();
+       for(int i=0; i<nobj; i++) {
+               objects.push_back(scn->objects[i]);
+       }
+       scn->objects.clear();
+
+       if(nodes) {
+               int nchildren = scn->nodes ? scn->nodes->get_num_children() : 0;
+               for(int i=0; i<nchildren; i++) {
+                       SceneNode *n = scn->nodes->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<SceneNode*> *res, SceneNode *tree, const st
 
 Scene *Scene::extract_nodes(const char *qstr)
 {
+       if(!nodes) return 0;
+
        std::regex re{qstr};
 
        std::list<SceneNode*> 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) {