X-Git-Url: http://git.mutantstargoat.com/user/nuclear/?p=laserbrain_demo;a=blobdiff_plain;f=src%2Fmetascene.cc;h=e0b2b205137ebff222926101ff7e358229feb041;hp=399295f3a8a79012f4841f3dce6d136caad37c68;hb=12e70d8b9c2d5c81500d7631b9db5d17a34fe918;hpb=26c1717925471539b9745cce6275b218a47147cd 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