From 12e70d8b9c2d5c81500d7631b9db5d17a34fe918 Mon Sep 17 00:00:00 2001 From: John Tsiombikas Date: Mon, 5 Dec 2016 15:11:24 +0200 Subject: [PATCH] implemented metascene spawn point/rot --- src/app.cc | 6 ++++-- src/dataset.inl | 1 + src/metascene.cc | 50 +++++++++++++++++++++++++++++++++++++++++++++++++- src/scene.cc | 2 ++ 4 files changed, 56 insertions(+), 3 deletions(-) diff --git a/src/app.cc b/src/app.cc index 9e5eba3..665ded4 100644 --- a/src/app.cc +++ b/src/app.cc @@ -32,7 +32,7 @@ SceneSet sceneman; unsigned int sdr_ltmap, sdr_ltmap_notex; static float cam_dist = 0.0; -static float cam_theta, cam_phi = 20; +static float cam_theta, cam_phi; static Vec3 cam_pos; static float floor_y; // last floor height static float user_eye_height = 165; @@ -105,7 +105,9 @@ bool app_init(int argc, char **argv) } cam_pos = mscn->start_pos; - // TODO use start_rot + Vec3 dir = rotate(Vec3(0, 0, 1), mscn->start_rot); + dir.y = 0; + cam_theta = rad_to_deg(acos(dot(dir, Vec3(0, 0, 1)))); if(!(sdr_ltmap_notex = create_program_load("sdr/lightmap.v.glsl", "sdr/lightmap-notex.p.glsl"))) { return false; diff --git a/src/dataset.inl b/src/dataset.inl index bf6140c..ca01ea2 100644 --- a/src/dataset.inl +++ b/src/dataset.inl @@ -59,6 +59,7 @@ int DataSet::dataset_load_func(const char *fname, int id, void *cls) { DataSet *dset = (DataSet*)cls; T data = (T)resman_get_res_data(dset->rman, id); + if(!data) return -1; if(!dset->load(data, fname)) { return -1; diff --git a/src/metascene.cc b/src/metascene.cc index 399295f..e0b2b20 100644 --- a/src/metascene.cc +++ b/src/metascene.cc @@ -102,7 +102,8 @@ static bool proc_node(MetaScene *mscn, struct ts_node *node) struct SceneData { - std::string walkmesh_regexp; + MetaScene *meta; + std::string walkmesh_regexp, spawn_regexp; std::vector mtledit; }; @@ -111,6 +112,7 @@ static bool proc_scenefile(MetaScene *mscn, struct ts_node *node) const char *fname = ts_get_attr_str(node, "file"); if(fname) { SceneData *sdat = new SceneData; + sdat->meta = mscn; // datapath struct ts_attr *adpath = attr_inscope(node, "datapath"); @@ -125,6 +127,28 @@ static bool proc_scenefile(MetaScene *mscn, struct ts_node *node) sdat->walkmesh_regexp = std::string(awmesh->val.str); } + // spawn node + struct ts_attr *awspawn = attr_inscope(node, "spawn"); + if(awspawn) { + switch(awspawn->val.type) { + case TS_VECTOR: + mscn->start_pos = Vec3(awspawn->val.vec[0], awspawn->val.vec[1], + awspawn->val.vec[2]); + break; + + case TS_STRING: + default: + sdat->spawn_regexp = std::string(awspawn->val.str); + } + } + if((awspawn = attr_inscope(node, "spawn_rot")) && awspawn->val.type == TS_VECTOR) { + Quat rot; + rot.rotate(Vec3(1, 0, 0), deg_to_rad(awspawn->val.vec[0])); + rot.rotate(Vec3(0, 1, 0), deg_to_rad(awspawn->val.vec[1])); + rot.rotate(Vec3(0, 0, 1), deg_to_rad(awspawn->val.vec[2])); + mscn->start_rot = rot; + } + int namesz = mscn->datamap.lookup(fname, 0, 0); char *namebuf = (char*)alloca(namesz + 1); if(mscn->datamap.lookup(fname, namebuf, namesz + 1)) { @@ -184,6 +208,30 @@ bool MetaScene::scene_loaded(Scene *newscn) delete wscn; } + // extract the spawn node + if(!sdat->spawn_regexp.empty() && (wscn = newscn->extract_nodes(sdat->spawn_regexp.c_str()))) { + + int nmeshes = wscn->meshes.size(); + int nnodes = wscn->nodes ? wscn->nodes->get_num_children() : 0; + + if(nmeshes) { + Vec3 pos; + for(int i=0; imeshes[i]->get_bsphere(); + pos += bsph.center; + } + pos /= (float)nmeshes; + sdat->meta->start_pos = pos; + + } else if(nnodes) { + // just use the first one + SceneNode *first = wscn->nodes->get_child(0); + sdat->meta->start_pos = first->get_position(); + sdat->meta->start_rot = first->get_rotation(); + } + delete wscn; + } + int num_medits = sdat->mtledit.size(); for(int i=0; i *res, SceneNode *tree, const st Scene *Scene::extract_nodes(const char *qstr) { + if(!nodes) return 0; + std::regex re{qstr}; std::list nodelist; -- 1.7.10.4