diff options
author | Stijn Buys <ingar@osirion.org> | 2008-08-15 13:05:58 +0000 |
---|---|---|
committer | Stijn Buys <ingar@osirion.org> | 2008-08-15 13:05:58 +0000 |
commit | 62de0496836e729ff955274cf153914709775bfb (patch) | |
tree | 54a868d8e4620b4dad49881af7a2614128697cbf /src/model/map.cc | |
parent | 68fc01c7ce3f089e10a53e6dac92e2f63a9a8efd (diff) |
func_group support
Diffstat (limited to 'src/model/map.cc')
-rw-r--r-- | src/model/map.cc | 164 |
1 files changed, 106 insertions, 58 deletions
diff --git a/src/model/map.cc b/src/model/map.cc index e902cfd..d138b49 100644 --- a/src/model/map.cc +++ b/src/model/map.cc @@ -6,6 +6,7 @@ #include "filesystem/filesystem.h" #include "math/mathlib.h" +#include "model/dock.h" #include "model/engine.h" #include "model/light.h" #include "model/map.h" @@ -34,9 +35,12 @@ const float SCALE = 1.0f / 1024.0f; const float MIN_DELTA = 10e-10; -Map::Map() +Map::Map() : map_center(0,0,0) { mapfile_name.clear(); + map_brushes = 0; + map_faces = 0; + map_faces_detail = 0; } Map::~Map() @@ -51,10 +55,6 @@ void Map::clear_materials() delete(*mit).second; } map_materials.clear(); - - map_brushes = 0; - map_faces = 0; - map_faces_detail = 0; } bool Map::open(std::string const & name) @@ -104,6 +104,11 @@ bool Map::got_classname(const char * classnamelabel) const return (last_read_was_classname && (classname_current.compare(classnamelabel) == 0)); } +bool Map::got_classend(const char * classnamelabel) const +{ + return (last_read_was_classend && (classname_current.compare(classnamelabel) == 0)); +} + bool Map::getline() { using math::Vector3f; @@ -112,6 +117,7 @@ bool Map::getline() last_read_was_classname = false; last_read_was_key = false; + last_read_was_classend = false; key_current = ""; value_current = ""; @@ -135,8 +141,8 @@ bool Map::getline() parse_level++; } else if (firstword == "}") { - if ((parse_level == 2) && (classname_current == "worldspawn")) { - // brush + if ((parse_level == 2) && (planes.size())) { + // end-of-brush if (VertexArray::instance()) { // for every face for (std::vector<Plane *>::iterator face = planes.begin(); face != planes.end(); face++) { @@ -152,7 +158,12 @@ bool Map::getline() map_brushes++; } value_current.clear(); + + } else if ((parse_level == 1)) { + // end-of-class + last_read_was_classend = true; } + parse_level--; } else if (parse_level == 1) { @@ -187,7 +198,7 @@ bool Map::getline() } else if (parse_level == 2) { - if ((firstword == "(") && (classname_current == "worldspawn")) { + if (firstword == "(") { // brush plane if (VertexArray::instance()) { Vector3f p1, p2, p3; @@ -666,35 +677,34 @@ void Map::close() mapfile_ifs.close(); } -void Map::load_fragments(Model *model) +void Map::load_worldspawn(Model *model) { + // set default values if (!VertexArray::instance() || VertexArray::instance()->overflow()) return; if (!map_materials.size()) return; - + // FIXME center in maps without brushes - math::Vector3f center = (class_minbbox + class_maxbbox) / 2; + map_center = (class_minbbox + class_maxbbox) / 2; - model->model_minbbox = class_minbbox - center; - model->model_maxbbox = class_maxbbox - center; + model->model_minbbox = class_minbbox - map_center; + model->model_maxbbox = class_maxbbox - map_center; model->model_radius = model->model_maxbbox.length(); - - // reposition lights, flares and engines - for (Model::Lights::iterator lit = model->lights().begin(); lit != model->lights().end(); lit++) { - (*lit)->light_location -= center; - } - - for (Model::Flares::iterator flit = model->flares().begin(); flit != model->flares().end(); flit++) { - (*flit)->light_location -= center; - } - - for (Model::Engines::iterator eit = model->engines().begin(); eit != model->engines().end(); eit++) { - (*eit)->engine_location -= center; - } - + + load_fragmentgroup(model, model->worldspawn()); +} + +void Map::load_fragmentgroup(Model *model, FragmentGroup &group) +{ + if (!VertexArray::instance() || VertexArray::instance()->overflow()) + return; + + if (!map_materials.size()) + return; + for (Materials::iterator mit = map_materials.begin(); mit != map_materials.end(); mit++) { // split the Primitives with this material into fragments Primitives *primitives = (*mit).second; @@ -708,9 +718,9 @@ void Map::load_fragments(Model *model) Triangle *triangle = (*tris_it); if (!triangle->detail()) { size_t count = 0; - count += fragment->add_vertex(triangle->v0()-center, triangle->normal(), triangle->color(), false); - count += fragment->add_vertex(triangle->v1()-center, triangle->normal(), triangle->color(), false); - count += fragment->add_vertex(triangle->v2()-center, triangle->normal(), triangle->color(), false); + count += fragment->add_vertex(triangle->v0()-map_center, triangle->normal(), triangle->color(), false); + count += fragment->add_vertex(triangle->v1()-map_center, triangle->normal(), triangle->color(), false); + count += fragment->add_vertex(triangle->v2()-map_center, triangle->normal(), triangle->color(), false); if (count == 3) model->model_tris_count++; } @@ -721,9 +731,9 @@ void Map::load_fragments(Model *model) Triangle *triangle = (*tris_it); if (triangle->detail()) { size_t count = 0; - count += fragment->add_vertex(triangle->v0()-center, triangle->normal(), triangle->color(), true); - count += fragment->add_vertex(triangle->v1()-center, triangle->normal(), triangle->color(), true); - count += fragment->add_vertex(triangle->v2()-center, triangle->normal(), triangle->color(), true); + count += fragment->add_vertex(triangle->v0()-map_center, triangle->normal(), triangle->color(), true); + count += fragment->add_vertex(triangle->v1()-map_center, triangle->normal(), triangle->color(), true); + count += fragment->add_vertex(triangle->v2()-map_center, triangle->normal(), triangle->color(), true); if (count == 3) { model->model_tris_count++; model->model_tris_detail_count++; @@ -731,8 +741,8 @@ void Map::load_fragments(Model *model) } } - // add the fragment to the model - model->fragments().push_back(fragment); + // add the fragment to the fragment group + group.push_back(fragment); } // store quads @@ -744,10 +754,10 @@ void Map::load_fragments(Model *model) Quad *quad = (*quad_it); if (!quad->detail()) { size_t count = 0; - count += fragment->add_vertex(quad->v0()-center, quad->normal(), quad->color(), false); - count += fragment->add_vertex(quad->v1()-center, quad->normal(), quad->color(), false); - count += fragment->add_vertex(quad->v2()-center, quad->normal(), quad->color(), false); - count += fragment->add_vertex(quad->v3()-center, quad->normal(), quad->color(), false); + count += fragment->add_vertex(quad->v0()-map_center, quad->normal(), quad->color(), false); + count += fragment->add_vertex(quad->v1()-map_center, quad->normal(), quad->color(), false); + count += fragment->add_vertex(quad->v2()-map_center, quad->normal(), quad->color(), false); + count += fragment->add_vertex(quad->v3()-map_center, quad->normal(), quad->color(), false); if (count == 4) model->model_quad_count++; } @@ -758,10 +768,10 @@ void Map::load_fragments(Model *model) Quad *quad = (*quad_it); if (quad->detail()) { size_t count = 0; - count += fragment->add_vertex(quad->v0()-center, quad->normal(), quad->color(), false); - count += fragment->add_vertex(quad->v1()-center, quad->normal(), quad->color(), false); - count += fragment->add_vertex(quad->v2()-center, quad->normal(), quad->color(), false); - count += fragment->add_vertex(quad->v3()-center, quad->normal(), quad->color(), false); + count += fragment->add_vertex(quad->v0()-map_center, quad->normal(), quad->color(), false); + count += fragment->add_vertex(quad->v1()-map_center, quad->normal(), quad->color(), false); + count += fragment->add_vertex(quad->v2()-map_center, quad->normal(), quad->color(), false); + count += fragment->add_vertex(quad->v3()-map_center, quad->normal(), quad->color(), false); if (count == 4) { model->model_quad_count++; model->model_quad_detail_count++; @@ -770,7 +780,7 @@ void Map::load_fragments(Model *model) } // add the fragment to the model - model->fragments().push_back(fragment); + group.push_back(fragment); } } @@ -787,17 +797,23 @@ Model * Map::load(std::string const &name) } Model *model = new Model(name); - Light *light = 0; - Flare *flare = 0; - Engine *engine = 0; + Dock *dock = 0; + Engine *engine = 0; + Flare *flare = 0; + Light *light = 0; + unsigned int u; while (mapfile.getline()) { if (mapfile.got_classname("worldspawn")) { - // new wordspawn + + } else if (mapfile.got_classend("worldspawn")) { + + mapfile.load_worldspawn(model); + mapfile.clear_materials(); } else if (mapfile.classname().compare("worldspawn") == 0) { @@ -808,7 +824,16 @@ Model * Map::load(std::string const &name) } else if (mapfile.got_key_color("enginecolor", model->model_enginecolor) ==0) { continue; } - + + } else if (mapfile.got_classend("func_group")) { + + // func_group fragments are loaded into worldspawn + mapfile.load_fragmentgroup(model, model->worldspawn()); + + } else if (mapfile.got_classend()) { + + mapfile.clear_materials(); + } else if (mapfile.got_classname("light")) { // new light @@ -846,6 +871,24 @@ Model * Map::load(std::string const &name) } + } else if (mapfile.got_classname("trigger_dock")) { + + // new docking location + dock = new Dock(); + model->add_dock(dock); + + } else if (mapfile.classname().compare("target_dock") == 0) { + + // dock attributes + if (mapfile.got_key_vector3f("origin", dock->dock_location)) { + flare->light_location *= SCALE; + continue; + + } else if (mapfile.got_key_float("radius", dock->dock_radius)) { + continue; + + } + } else if (mapfile.got_classname("target_flare")) { // new flare @@ -915,18 +958,23 @@ Model * Map::load(std::string const &name) } mapfile.close(); + + // reposition lights, flares and engines according to the model center + for (Model::Lights::iterator lit = model->lights().begin(); lit != model->lights().end(); lit++) { + (*lit)->light_location -= mapfile.map_center; + } + + for (Model::Flares::iterator flit = model->flares().begin(); flit != model->flares().end(); flit++) { + (*flit)->light_location -= mapfile.map_center; + } + for (Model::Engines::iterator eit = model->engines().begin(); eit != model->engines().end(); eit++) { + (*eit)->engine_location -= mapfile.map_center; + } + con_debug << " " << mapfile.name() << " " << mapfile.map_brushes << " brushes " << mapfile.map_faces << "/" << mapfile.map_faces_detail << " faces/detail " << std::endl; - - mapfile.load_fragments(model); - -/* con_debug << " " << mapfile.name() << " " << model->fragments().size() << " frags " << - model->model_tris_count << "/" << model->model_tris_detail_count << " tris/detail " << - model->model_quad_count << "/" << model->model_quad_detail_count << " quads/detail" << std::endl; -*/ - mapfile.clear_materials(); - + return model; } |