backported changes from museum project
authorJohn Tsiombikas <nuclear@mutantstargoat.com>
Mon, 12 Dec 2016 03:14:47 +0000 (05:14 +0200)
committerJohn Tsiombikas <nuclear@mutantstargoat.com>
Mon, 12 Dec 2016 03:14:47 +0000 (05:14 +0200)
src/app.cc
src/metascene.cc
src/scene.cc
src/scene.h
src/sceneload.cc
src/texture.cc

index 97930d6..db3031f 100644 (file)
@@ -61,7 +61,7 @@ static unsigned int sdr_post_gamma;
 static long prev_msec;
 
 static BlobExhibit *blobs;
-static bool show_blobs = 1;
+static bool show_blobs;
 
 
 bool app_init(int argc, char **argv)
index e0b2b20..53474f7 100644 (file)
@@ -1,3 +1,4 @@
+#include <assert.h>
 #include <string>
 #include <regex>
 #include "metascene.h"
@@ -303,7 +304,7 @@ static void apply_mtledit(Scene *scn, const MaterialEdit &med)
        int nobj = scn->objects.size();
        for(int i=0; i<nobj; i++) {
                Object *obj = scn->objects[i];
-               if(std::regex_match(obj->get_name(), med.name_re)) {
+               if(std::regex_match(obj->mtl.name, med.name_re)) {
                        apply_mtledit(&obj->mtl, med);
                }
        }
index 683c9ec..35b562d 100644 (file)
@@ -11,6 +11,9 @@ Scene::Scene()
        nodes = 0;
 
        walk_mesh = 0;
+
+       texset = 0;
+       loader_data = 0;
 }
 
 Scene::~Scene()
@@ -20,6 +23,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;
 
index 1cf8dcc..f295bbc 100644 (file)
@@ -31,7 +31,7 @@ public:
 
        Mesh *walk_mesh;
 
-       TextureSet *texset;     // only owned by Scene if own_texset is true
+       TextureSet *texset;
        void *loader_data;
 
        explicit Scene();
@@ -41,6 +41,7 @@ public:
        Scene &operator =(const Scene &rhs) = delete;
 
        void destroy();
+       void clear();   // clear all contents (meshes, objects, and nodes)
 
        bool load(const char *fname, unsigned int flags = 0);
 
index e33e457..58d1865 100644 (file)
@@ -200,6 +200,8 @@ static bool load_material(Scene *scn, Material *mat, const aiMaterial *aimat)
                                *dptr++ = *sptr == '\\' ? '/' : *sptr;
                        } while(*sptr++);
 
+                       if(!fname || !*fname) continue;
+
                        int textype = assimp_textype(aitype);
 
                        Texture *tex = texman.get_texture(fname, TEX_2D, &scn->datamap);
@@ -377,6 +379,7 @@ Scene *SceneSet::create_scene()
 
 bool SceneSet::load_scene(Scene *scn, const char *fname)
 {
+       scn->clear();
        return scn->load(fname, SCNLOAD_FLIPTEX | SCNLOAD_STAGE_IO);
 }
 
index ff4d1b5..18dd28f 100644 (file)
@@ -38,6 +38,7 @@ void bind_texture(Texture *tex, int tunit)
        } else {
                glActiveTexture(GL_TEXTURE0 + tunit);
                glBindTexture(cur_target[tunit], 0);
+               glDisable(cur_target[tunit]);
                assert(glGetError() == GL_NO_ERROR);
                glActiveTexture(GL_TEXTURE0);
        }
@@ -139,6 +140,7 @@ TextureType Texture::get_type() const
 void Texture::bind(int tex_unit) const
 {
        glActiveTexture(GL_TEXTURE0 + tex_unit);
+       glEnable(target);
        glBindTexture(target, id);
        assert(glGetError() == GL_NO_ERROR);
        glActiveTexture(GL_TEXTURE0);