fixed background loading of both textures and scenes
[laserbrain_demo] / src / sceneload.cc
index 7fdc004..e33e457 100644 (file)
@@ -1,5 +1,6 @@
 #include <stdio.h>
 #include <assert.h>
+#include <string>
 #include <vector>
 #include <map>
 #include <gmath/gmath.h>
 #include <assimp/vector3.h>
 #include <assimp/matrix4x4.h>
 #include <assimp/quaternion.h>
+#include "app.h"
 #include "scene.h"
 #include "objmesh.h"
 #include "datamap.h"
 #include "logger.h"
+#include "metascene.h"
 
 static bool load_material(Scene *scn, Material *mat, const aiMaterial *aimat);
 static SceneNode *load_node(Scene *scn, const aiScene *aiscn, unsigned int flags, const aiNode *ainode);
@@ -23,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);
 
@@ -35,6 +38,7 @@ static void print_hierarchy(const aiNode *node);
 
 struct LoaderData {
        const aiScene *aiscn;
+       std::string fname;
        std::map<std::string, SceneNode*> node_by_name;
        std::map<aiMesh*, Mesh*> mesh_by_aimesh;
 };
@@ -93,6 +97,7 @@ bool Scene::load(const char *fname, unsigned int flags)
 
                LoaderData *ldata = new LoaderData;
                ldata->aiscn = aiscn;
+               ldata->fname = std::string(fname);
                loader_data = (void*)ldata;
        }
 
@@ -107,6 +112,7 @@ bool Scene::load(const char *fname, unsigned int flags)
 
                LoaderData *ldata = (LoaderData*)loader_data;
                const aiScene *aiscn = ldata->aiscn;
+               fname = ldata->fname.c_str();
 
                // load all meshes
                for(unsigned int i=0; i<aiscn->mNumMeshes; i++) {
@@ -135,10 +141,11 @@ bool Scene::load(const char *fname, unsigned int flags)
                        }
                }
 
+               info_log("loaded scene file: %s, %d meshes\n", fname, (int)meshes.size());
+
                aiReleaseImport(aiscn);
                delete ldata;
                loader_data = 0;
-               info_log("loaded scene file: %s, %d meshes\n", fname, (int)meshes.size());
                nodes->update(0);
        }
        return true;
@@ -194,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);
+                       Texture *tex = texman.get_texture(fname, TEX_2D, &scn->datamap);
                        assert(tex);
                        mat->textures.push_back(tex);
 
@@ -329,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:
@@ -347,7 +353,7 @@ static const char *assimp_textypestr(aiTextureType type)
                break;
        }
        return "unknown";
-}
+}*/
 
 static Mat4 assimp_matrix(const aiMatrix4x4 &aim)
 {
@@ -355,3 +361,35 @@ static Mat4 assimp_matrix(const aiMatrix4x4 &aim)
        memcpy(m[0], &aim, 16 * sizeof(float));
        return transpose(m);
 }
+
+
+// --- SceneSet ---
+
+SceneSet::SceneSet()
+       : DataSet<Scene*>(create_scene, load_scene, done_scene, free_scene)
+{
+}
+
+Scene *SceneSet::create_scene()
+{
+       return new Scene;
+}
+
+bool SceneSet::load_scene(Scene *scn, const char *fname)
+{
+       return scn->load(fname, SCNLOAD_FLIPTEX | SCNLOAD_STAGE_IO);
+}
+
+bool SceneSet::done_scene(Scene *scn)
+{
+       bool res = scn->load(0, SCNLOAD_STAGE_GL);
+       if(scn->metascn) {
+               scn->metascn->scene_loaded(scn);
+       }
+       return res;
+}
+
+void SceneSet::free_scene(Scene *scn)
+{
+       delete scn;
+}