From 0d27f859021b4af5dbb5404ef5af012546abf335 Mon Sep 17 00:00:00 2001 From: John Tsiombikas Date: Tue, 13 Mar 2018 10:57:06 +0200 Subject: [PATCH] added delayed init call after scenegraph/meshes are done loading --- src/app.cc | 12 ++++++++++ src/dataset.h | 3 +++ src/dataset.inl | 14 ++++++++++- src/exman.cc | 3 +++ src/metascene.cc | 69 ++++++++++++++++++++++++++++++++++++++++++++++++++++++ src/metascene.h | 18 ++++++++++++++ src/scene.h | 2 +- src/texture.cc | 2 +- 8 files changed, 120 insertions(+), 3 deletions(-) diff --git a/src/app.cc b/src/app.cc index 63e7cd7..7b4280d 100644 --- a/src/app.cc +++ b/src/app.cc @@ -84,6 +84,8 @@ static Renderer *rend; static Ray last_pick_ray; +static bool post_scene_init_pending = true; + bool app_init(int argc, char **argv) { @@ -206,6 +208,11 @@ bool app_init(int argc, char **argv) return true; } +static void post_scene_init() +{ + exman->load(mscn, "data/exhibits"); +} + void app_cleanup() { if(mscn->music) { @@ -257,6 +264,11 @@ static void update(float dt) texman.update(); sceneman.update(); + if(post_scene_init_pending && !sceneman.pending()) { + post_scene_init_pending = false; + post_scene_init(); + } + mscn->update(dt); exman->update(dt); exui_update(dt); diff --git a/src/dataset.h b/src/dataset.h index 5c4ca51..38fec6b 100644 --- a/src/dataset.h +++ b/src/dataset.h @@ -53,6 +53,9 @@ public: T get(const char *name) const; + int pending() const; + void wait() const; + void add_loaded_callback(LoadedCallbackFunc func, void *cls = 0); bool remove_loaded_callback(LoadedCallbackFunc func); }; diff --git a/src/dataset.inl b/src/dataset.inl index 954081e..41277a1 100644 --- a/src/dataset.inl +++ b/src/dataset.inl @@ -47,11 +47,23 @@ T DataSet::get(const char *name) const T res = create(); data[name] = res; - resman_lookup(rman, name, res); + resman_add(rman, name, res); return res; } template +int DataSet::pending() const +{ + return resman_pending(rman); +} + +template +void DataSet::wait() const +{ + resman_waitall(rman); +} + +template void DataSet::add_loaded_callback(LoadedCallbackFunc func, void *cls) { std::pair cb; diff --git a/src/exman.cc b/src/exman.cc index eea24a6..00f7e39 100644 --- a/src/exman.cc +++ b/src/exman.cc @@ -153,6 +153,8 @@ bool ExhibitManager::remove(Exhibit *ex) bool ExhibitManager::load(MetaScene *mscn, const char *fname) { + info_log("ExhibitManager::load(%s)\n", fname); + struct ts_node *root = ts_load(fname); if(!root || strcmp(root->name, "exhibits") != 0) { ts_free_tree(root); @@ -243,6 +245,7 @@ bool ExhibitManager::load(MetaScene *mscn, const char *fname) const char *voice = ts_get_attr_str(node, "voiceover"); if(desc || voice) { ExData exd; + exd.type = EXDATA_INFO; if(desc) { char *fixed_desc = new char[strlen(desc) + 1]; diff --git a/src/metascene.cc b/src/metascene.cc index 9c88249..c467420 100644 --- a/src/metascene.cc +++ b/src/metascene.cc @@ -13,6 +13,7 @@ #include #include "metascene.h" #include "scene.h" +#include "objmesh.h" #include "treestore.h" #include "logger.h" #include "app.h" @@ -61,12 +62,19 @@ MetaScene::MetaScene() { walk_mesh = 0; music = 0; + mirrors = 0; } MetaScene::~MetaScene() { delete walk_mesh; delete music; + + while(mirrors) { + FlatMirror *m = mirrors; + mirrors = mirrors->next; + delete m; + } } bool MetaScene::load(const char *fname) @@ -134,6 +142,7 @@ void MetaScene::update(float dt) // XXX not used, renderer draws void MetaScene::draw() const { + error_log("Don't call MetaScene::draw, use the Renderer\n"); int nscn = scenes.size(); for(int i=0; idraw(); @@ -191,6 +200,66 @@ Scene *MetaScene::extract_nodes(const char *qstr) return scn; } +int MetaScene::calc_mirror_planes() +{ + int num_mirrors = 0; + while(mirrors) { + FlatMirror *m = mirrors; + mirrors = mirrors->next; + delete m; + } + mirrors = 0; + objmirror.clear(); + + int numscn = scenes.size(); + for(int i=0; iobjects.size(); + for(int j=0; jobjects[j]; + + if(obj->mtl.flat_mirror && obj->get_type() == OBJ_MESH) { + const Mesh *mesh = ((ObjMesh*)obj)->mesh; + if(!mesh) continue; + + // assume the object is actually flat, so grab the first triangle and make a plane + Triangle face = Triangle(0, (const Vec3*)mesh->get_attrib_data(MESH_ATTR_VERTEX), + mesh->get_index_data()); + face.calc_normal(); + + FlatMirror *mir = new FlatMirror; + mir->plane.pt = face.v[0]; + mir->plane.normal = face.normal; + mir->reflect = obj->mtl.reflect; + + // check to see if we have found this mirror plane already + bool found = false; + FlatMirror *node = mirrors; + while(node) { + if(fabs(dot(mir->plane.normal, node->plane.normal)) < 1e-4 && + fabs(dot(mir->plane.normal, normalize(mir->plane.pt - node->plane.pt))) < 1e-4) { + found = true; + break; + } + } + + if(!found) { + mir->next = mirrors; + mirrors = mir; + + objmirror[obj] = mir; // associate with object + ++num_mirrors; + } else { + delete mir; + } + } + } + } + + return num_mirrors; +} + static bool proc_node(MetaScene *mscn, struct ts_node *node) { struct ts_node *c = node->child_list; diff --git a/src/metascene.h b/src/metascene.h index c363901..0417c00 100644 --- a/src/metascene.h +++ b/src/metascene.h @@ -1,12 +1,24 @@ #ifndef METASCENE_H_ #define METASCENE_H_ +#include #include #include "scene.h" #include "mesh.h" +#include "geom.h" #include "audio/ovstream.h" #include "datamap.h" + +struct FlatMirror { + Plane plane; + float reflect; + //std::vector objects; + + FlatMirror *next; +}; + + class MetaScene { public: DataMap datamap; @@ -19,6 +31,10 @@ public: std::map scndata; + FlatMirror *mirrors; + int num_mirrors; + std::map objmirror; + AudioStream *music; MetaScene(); @@ -38,6 +54,8 @@ public: std::list match_nodes(const char *qstr) const; Scene *extract_nodes(const char *qstr); + + int calc_mirror_planes(); }; #endif // METASCENE_H_ diff --git a/src/scene.h b/src/scene.h index dd421d9..65e1a55 100644 --- a/src/scene.h +++ b/src/scene.h @@ -37,7 +37,7 @@ public: TextureSet *texset; void *loader_data; - explicit Scene(); + Scene(); ~Scene(); Scene(const Scene &rhs) = delete; diff --git a/src/texture.cc b/src/texture.cc index 3af8116..ca1a6db 100644 --- a/src/texture.cc +++ b/src/texture.cc @@ -516,7 +516,7 @@ Texture *TextureSet::get_texture(const char *name, TextureType type, const DataM Texture *res = create(); data[fname] = res; res->create_default(type); - resman_lookup(rman, fname, res); + resman_add(rman, fname, res); return res; } -- 1.7.10.4