X-Git-Url: http://git.mutantstargoat.com/user/nuclear/?a=blobdiff_plain;f=src%2Fsceneload.cc;h=e33e4578705bfa1e249a429667759d2c20f32cc8;hb=8d1b1714bb8e63a9d454e84454055500a17988b9;hp=7fdc0041430505d9178764dabe39c193daa9e633;hpb=7dc732cd42c88fa16accdbc606f10bcd6815d478;p=laserbrain_demo diff --git a/src/sceneload.cc b/src/sceneload.cc index 7fdc004..e33e457 100644 --- a/src/sceneload.cc +++ b/src/sceneload.cc @@ -1,5 +1,6 @@ #include #include +#include #include #include #include @@ -12,10 +13,12 @@ #include #include #include +#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 node_by_name; std::map 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; imNumMeshes; 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(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; +}