rudimentary scenegraph treeview
[laserbrain_demo] / src / sceneload.cc
index ad6e61e..4c0d324 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);
 
@@ -67,6 +68,9 @@ bool Scene::load(const char *fname, unsigned int flags)
                }
 
                info_log("Loading scene file: %s\n", fname);
+               if(this->name.empty()) {
+                       this->name = std::string(fname);
+               }
 
                const aiScene *aiscn = aiImportFile(fname, ppflags);
                if(!aiscn) {
@@ -74,6 +78,27 @@ bool Scene::load(const char *fname, unsigned int flags)
                        return false;
                }
 
+               LoaderData *ldata = new LoaderData;
+               ldata->aiscn = aiscn;
+               ldata->fname = std::string(fname);
+               loader_data = (void*)ldata;
+       }
+
+       /* then, assuming we have successfully loaded everything, proceed to construct
+        * all the engine objects, which require access to the OpenGL context
+        */
+       if(flags & SCNLOAD_STAGE_GL) {
+               if(!loader_data) {
+                       error_log("second stage scene loader failed to find valid I/O data\n");
+                       return false;
+               }
+
+               LoaderData *ldata = (LoaderData*)loader_data;
+               const aiScene *aiscn = ldata->aiscn;
+               fname = ldata->fname.c_str();
+
+               clear();        // clear any previous data (TODO: add flag for not clearing)
+
                // assimp adds its own root node, which might have transformations
                Vec3 root_pos, root_scaling(1.0, 1.0, 1.0);
                Quat root_rot;
@@ -94,25 +119,6 @@ bool Scene::load(const char *fname, unsigned int flags)
                        nodes->set_scaling(root_scaling);
                }
 
-               LoaderData *ldata = new LoaderData;
-               ldata->aiscn = aiscn;
-               ldata->fname = std::string(fname);
-               loader_data = (void*)ldata;
-       }
-
-       /* then, assuming we have successfully loaded everything, proceed to construct
-        * all the engine objects, which require access to the OpenGL context
-        */
-       if(flags & SCNLOAD_STAGE_GL) {
-               if(!loader_data) {
-                       error_log("second stage scene loader failed to find valid I/O data\n");
-                       return false;
-               }
-
-               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++) {
                        aiMesh *aimesh = aiscn->mMeshes[i];
@@ -199,10 +205,11 @@ 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);
-                       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 +342,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 +360,7 @@ static const char *assimp_textypestr(aiTextureType type)
                break;
        }
        return "unknown";
-}
+}*/
 
 static Mat4 assimp_matrix(const aiMatrix4x4 &aim)
 {