From 26c1717925471539b9745cce6275b218a47147cd Mon Sep 17 00:00:00 2001 From: John Tsiombikas Date: Sun, 4 Dec 2016 03:19:15 +0200 Subject: [PATCH] fixed background loading of both textures and scenes --- src/app.cc | 7 ++++--- src/app.h | 6 ++++++ src/image.h | 4 ++++ src/metascene.cc | 15 +++++++-------- src/metascene.h | 4 +--- src/scene.cc | 24 +++--------------------- src/scene.h | 5 +---- src/sceneload.cc | 10 +++++----- src/texture.cc | 4 ++++ 9 files changed, 35 insertions(+), 44 deletions(-) diff --git a/src/app.cc b/src/app.cc index f92899d..9e5eba3 100644 --- a/src/app.cc +++ b/src/app.cc @@ -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; } diff --git a/src/app.h b/src/app.h index 2f66bcf..5e7554f 100644 --- 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 { diff --git a/src/image.h b/src/image.h index b812ae1..9d66825 100644 --- a/src/image.h +++ b/src/image.h @@ -1,6 +1,8 @@ #ifndef IMAGE_H_ #define IMAGE_H_ +#include + class Image { public: enum Format { @@ -18,6 +20,8 @@ private: void *pixels; public: + std::string name; + Image(); ~Image(); diff --git a/src/metascene.cc b/src/metascene.cc index 66e0027..399295f 100644 --- a/src/metascene.cc +++ b/src/metascene.cc @@ -4,6 +4,7 @@ #include "scene.h" #include "treestore.h" #include "logger.h" +#include "app.h" #ifdef WIN32 #include @@ -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 diff --git a/src/metascene.h b/src/metascene.h index 00960ca..8d0f5c2 100644 --- a/src/metascene.h +++ b/src/metascene.h @@ -8,8 +8,6 @@ class MetaScene { public: - SceneSet *sceneman; - TextureSet *texman; DataMap datamap; std::vector scenes; @@ -21,7 +19,7 @@ public: std::map scndata; - MetaScene(SceneSet *sman, TextureSet *tman); + MetaScene(); ~MetaScene(); bool load(const char *fname); diff --git a/src/scene.cc b/src/scene.cc index 651e9c6..a31a3ce 100644 --- a/src/scene.cc +++ b/src/scene.cc @@ -1,23 +1,16 @@ #include #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) { diff --git a/src/scene.h b/src/scene.h index b9e338b..1cf8dcc 100644 --- a/src/scene.h +++ b/src/scene.h @@ -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; diff --git a/src/sceneload.cc b/src/sceneload.cc index ad6e61e..e33e457 100644 --- a/src/sceneload.cc +++ b/src/sceneload.cc @@ -13,6 +13,7 @@ #include #include #include +#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) { diff --git a/src/texture.cc b/src/texture.cc index 3aebec3..dae0c7c 100644 --- a/src/texture.cc +++ b/src/texture.cc @@ -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::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; } -- 1.7.10.4