fixed background loading of both textures and scenes
authorJohn Tsiombikas <nuclear@mutantstargoat.com>
Sun, 4 Dec 2016 01:19:15 +0000 (03:19 +0200)
committerJohn Tsiombikas <nuclear@mutantstargoat.com>
Sun, 4 Dec 2016 01:19:15 +0000 (03:19 +0200)
src/app.cc
src/app.h
src/image.h
src/metascene.cc
src/metascene.h
src/scene.cc
src/scene.h
src/sceneload.cc
src/texture.cc

index f92899d..9e5eba3 100644 (file)
@@ -26,6 +26,9 @@ float win_aspect;
 bool fb_srgb;
 bool opt_gear_wireframe;
 
+TextureSet texman;
+SceneSet sceneman;
+
 unsigned int sdr_ltmap, sdr_ltmap_notex;
 
 static float cam_dist = 0.0;
@@ -48,8 +51,6 @@ static Vec2 joy_move, joy_look;
 static float joy_deadzone = 0.01;
 
 static Mat4 view_matrix, mouse_view_matrix, proj_matrix;
-static TextureSet texman;
-static SceneSet sceneman;
 static MetaScene *mscn;
 static unsigned int sdr_post_gamma;
 
@@ -98,7 +99,7 @@ bool app_init(int argc, char **argv)
 
        glClearColor(0.2, 0.2, 0.2, 1.0);
 
-       mscn = new MetaScene(&sceneman, &texman);
+       mscn = new MetaScene;
        if(!mscn->load(opt.scenefile ? opt.scenefile : "data/museum.scene")) {
                return false;
        }
index 2f66bcf..5e7554f 100644 (file)
--- a/src/app.h
+++ b/src/app.h
@@ -1,12 +1,18 @@
 #ifndef APP_H_
 #define APP_H_
 
+#include "texture.h"
+#include "scene.h"
+
 extern long time_msec;
 extern int win_width, win_height;
 extern float win_aspect;
 extern bool opt_gear_wireframe;
 extern bool fb_srgb;
 
+extern TextureSet texman;
+extern SceneSet sceneman;
+
 extern unsigned int sdr_ltmap, sdr_ltmap_notex;
 
 enum {
index b812ae1..9d66825 100644 (file)
@@ -1,6 +1,8 @@
 #ifndef IMAGE_H_
 #define IMAGE_H_
 
+#include <string>
+
 class Image {
 public:
        enum Format {
@@ -18,6 +20,8 @@ private:
        void *pixels;
 
 public:
+       std::string name;
+
        Image();
        ~Image();
 
index 66e0027..399295f 100644 (file)
@@ -4,6 +4,7 @@
 #include "scene.h"
 #include "treestore.h"
 #include "logger.h"
+#include "app.h"
 
 #ifdef WIN32
 #include <malloc.h>
@@ -19,7 +20,7 @@ struct MaterialEdit {
 
 static bool proc_node(MetaScene *mscn, struct ts_node *node);
 static bool proc_scenefile(MetaScene *mscn, struct ts_node *node);
-static bool proc_mtledit(MetaScene *mscn, MaterialEdit *med, struct ts_node *node, TextureSet *texset);
+static bool proc_mtledit(MetaScene *mscn, MaterialEdit *med, struct ts_node *node);
 static void apply_mtledit(Scene *scn, const MaterialEdit &med);
 static void apply_mtledit(Material *mtl, const MaterialEdit &med);
 static struct ts_attr *attr_inscope(struct ts_node *node, const char *name);
@@ -27,10 +28,8 @@ static struct ts_attr *attr_inscope(struct ts_node *node, const char *name);
 static void print_scene_graph(SceneNode *n, int level);
 
 
-MetaScene::MetaScene(SceneSet *sman, TextureSet *tman)
+MetaScene::MetaScene()
 {
-       sceneman = sman;
-       texman = tman;
        walk_mesh = 0;
 }
 
@@ -136,13 +135,13 @@ static bool proc_scenefile(MetaScene *mscn, struct ts_node *node)
                struct ts_node *child = node->child_list;
                while(child) {
                        MaterialEdit medit;
-                       if(proc_mtledit(mscn, &medit, child, mscn->texman)) {
+                       if(proc_mtledit(mscn, &medit, child)) {
                                sdat->mtledit.push_back(medit);
                        }
                        child = child->next;
                }
 
-               Scene *newscn = mscn->sceneman->get(fname);
+               Scene *newscn = sceneman.get(fname);
                /* NOTE: setting all these after get() is not a race condition, because
                 * scene_loaded() which uses this, will only run in our main loop during
                 * SceneSet::update() on the main thread.
@@ -195,7 +194,7 @@ bool MetaScene::scene_loaded(Scene *newscn)
        return true;
 }
 
-static bool proc_mtledit(MetaScene *mscn, MaterialEdit *med, struct ts_node *node, TextureSet *texset)
+static bool proc_mtledit(MetaScene *mscn, MaterialEdit *med, struct ts_node *node)
 {
        if(strcmp(node->name, "mtledit") != 0) {
                return false;
@@ -241,7 +240,7 @@ static bool proc_mtledit(MetaScene *mscn, MaterialEdit *med, struct ts_node *nod
                                // remove
                                med->tex = 0;
                        } else {
-                               med->tex = texset->get_texture(afile->val.str, TEX_2D, &mscn->datamap);
+                               med->tex = texman.get_texture(afile->val.str, TEX_2D, &mscn->datamap);
                        }
                }
                // TODO add more edit modes
index 00960ca..8d0f5c2 100644 (file)
@@ -8,8 +8,6 @@
 
 class MetaScene {
 public:
-       SceneSet *sceneman;
-       TextureSet *texman;
        DataMap datamap;
 
        std::vector<Scene*> scenes;
@@ -21,7 +19,7 @@ public:
        std::map<Scene*, void*> scndata;
 
 
-       MetaScene(SceneSet *sman, TextureSet *tman);
+       MetaScene();
        ~MetaScene();
 
        bool load(const char *fname);
index 651e9c6..a31a3ce 100644 (file)
@@ -1,23 +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()
@@ -42,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)
@@ -64,12 +52,6 @@ static void destroy_node_tree(SceneNode *n)
 
 bool Scene::merge(Scene *scn)
 {
-       if(texset != scn->texset) {
-               // TODO handle this properly
-               error_log("for now only able to merge scenes using the same texture set\n");
-               return false;
-       }
-
        if(walk_mesh) {
                if(scn->walk_mesh) {
                        walk_mesh->append(*scn->walk_mesh);
@@ -208,7 +190,7 @@ Scene *Scene::extract_nodes(const char *qstr)
                return 0;
        }
 
-       Scene *res = new Scene(texset);
+       Scene *res = new Scene;
 
        for(SceneNode *n : nodelist) {
 
index b9e338b..1cf8dcc 100644 (file)
@@ -20,9 +20,6 @@ enum {
 class MetaScene;
 
 class Scene {
-private:
-       bool own_texset;
-
 public:
        MetaScene *metascn;
        DataMap datamap;
@@ -37,7 +34,7 @@ public:
        TextureSet *texset;     // only owned by Scene if own_texset is true
        void *loader_data;
 
-       explicit Scene(TextureSet *tset = 0);
+       explicit Scene();
        ~Scene();
 
        Scene(const Scene &rhs) = delete;
index ad6e61e..e33e457 100644 (file)
@@ -13,6 +13,7 @@
 #include <assimp/vector3.h>
 #include <assimp/matrix4x4.h>
 #include <assimp/quaternion.h>
+#include "app.h"
 #include "scene.h"
 #include "objmesh.h"
 #include "datamap.h"
@@ -25,7 +26,7 @@ static Mesh *load_mesh(Scene *scn, const aiScene *aiscn, unsigned int flags, con
 /*static const char *mprop_semantic(int x);
 static int count_textures(const aiMaterial *aimat);*/
 static int assimp_textype(aiTextureType type);
-static const char *assimp_textypestr(aiTextureType type);
+//static const char *assimp_textypestr(aiTextureType type);
 
 static Mat4 assimp_matrix(const aiMatrix4x4 &aim);
 
@@ -200,9 +201,8 @@ static bool load_material(Scene *scn, Material *mat, const aiMaterial *aimat)
                        } while(*sptr++);
 
                        int textype = assimp_textype(aitype);
-                       info_log("loading %s texture: %s\n", assimp_textypestr(aitype), fname);
 
-                       Texture *tex = scn->texset->get_texture(fname, TEX_2D, &scn->datamap);
+                       Texture *tex = texman.get_texture(fname, TEX_2D, &scn->datamap);
                        assert(tex);
                        mat->textures.push_back(tex);
 
@@ -335,7 +335,7 @@ static int assimp_textype(aiTextureType type)
        return MTL_TEX_UNKNOWN;
 }
 
-static const char *assimp_textypestr(aiTextureType type)
+/*static const char *assimp_textypestr(aiTextureType type)
 {
        switch(type) {
        case aiTextureType_DIFFUSE:
@@ -353,7 +353,7 @@ static const char *assimp_textypestr(aiTextureType type)
                break;
        }
        return "unknown";
-}
+}*/
 
 static Mat4 assimp_matrix(const aiMatrix4x4 &aim)
 {
index 3aebec3..dae0c7c 100644 (file)
@@ -475,8 +475,10 @@ Texture *TextureSet::get_texture(const char *name, TextureType type, const DataM
        if(nsize) {
                fname = (char*)alloca(nsize);
                dmap->lookup(name, fname, nsize);
+               //debug_log("texture lookup: %s -> %s\n", name, fname);
        } else {
                fname = (char*)name;
+               //debug_log("texture lookup failed, using: %s\n", fname);
        }
 
        std::map<std::string, Texture*>::const_iterator iter = data.find(fname);
@@ -501,6 +503,7 @@ Texture *TextureSet::create_tex()
 bool TextureSet::load_tex(Texture *tex, const char *fname)
 {
        Image *img = new Image;
+       img->name = fname;
        if(!img->load(fname)) {
                delete img;
                return false;
@@ -514,6 +517,7 @@ bool TextureSet::load_tex(Texture *tex, const char *fname)
 
 bool TextureSet::done_tex(Texture *tex)
 {
+       //debug_log("TextureSet::done_tex [%s]\n", tex->img->name.c_str());
        if(!tex->img) {
                return false;
        }