X-Git-Url: http://git.mutantstargoat.com/user/nuclear/?a=blobdiff_plain;f=src%2Fmetascene.cc;h=6059664a66b51b2b08844504665fda608986fee9;hb=a16a1a6cb3d831842f75e13653934360db617097;hp=399295f3a8a79012f4841f3dce6d136caad37c68;hpb=26c1717925471539b9745cce6275b218a47147cd;p=laserbrain_demo diff --git a/src/metascene.cc b/src/metascene.cc index 399295f..6059664 100644 --- a/src/metascene.cc +++ b/src/metascene.cc @@ -1,3 +1,4 @@ +#include #include #include #include "metascene.h" @@ -102,7 +103,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,20 +113,48 @@ 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"); if(adpath && adpath->val.type == TS_STRING) { - info_log("adding data path: %s\n", adpath->val.str); mscn->datamap.set_path(adpath->val.str); } + // strip path + struct ts_attr *aspath = attr_inscope(node, "strip_path"); + if(aspath && aspath->val.type == TS_NUMBER) { + mscn->datamap.set_strip(aspath->val.inum); + } + // walkmesh struct ts_attr *awmesh = attr_inscope(node, "walkmesh"); if(awmesh && awmesh->val.type == TS_STRING) { 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 +214,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; iobjects.size(); for(int i=0; iobjects[i]; - if(std::regex_match(obj->get_name(), med.name_re)) { + if(std::regex_match(obj->mtl.name, med.name_re)) { apply_mtledit(&obj->mtl, med); } }