From 9fa5be20a9d53becf1f364cb5e6e277ecb74b875 Mon Sep 17 00:00:00 2001 From: John Tsiombikas Date: Mon, 26 Dec 2016 10:20:24 +0200 Subject: [PATCH] scn->clear() can't be called from the load callback, because it destroys meshes which call glDeleteBuffers. Moved to the start of the second-stage scene loader. --- src/sceneload.cc | 41 +++++++++++++++++++++-------------------- 1 file changed, 21 insertions(+), 20 deletions(-) diff --git a/src/sceneload.cc b/src/sceneload.cc index 58d1865..1996663 100644 --- a/src/sceneload.cc +++ b/src/sceneload.cc @@ -75,6 +75,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; @@ -95,25 +116,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; imNumMeshes; i++) { aiMesh *aimesh = aiscn->mMeshes[i]; @@ -379,7 +381,6 @@ Scene *SceneSet::create_scene() bool SceneSet::load_scene(Scene *scn, const char *fname) { - scn->clear(); return scn->load(fname, SCNLOAD_FLIPTEX | SCNLOAD_STAGE_IO); } -- 1.7.10.4