Project::OSiRiON - Git repositories
Project::OSiRiON
News . About . Screenshots . Downloads . Forum . Wiki . Tracker . Git
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorStijn Buys <ingar@osirion.org>2008-08-15 13:05:58 +0000
committerStijn Buys <ingar@osirion.org>2008-08-15 13:05:58 +0000
commit62de0496836e729ff955274cf153914709775bfb (patch)
tree54a868d8e4620b4dad49881af7a2614128697cbf /src/model/map.cc
parent68fc01c7ce3f089e10a53e6dac92e2f63a9a8efd (diff)
func_group support
Diffstat (limited to 'src/model/map.cc')
-rw-r--r--src/model/map.cc164
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;
}