Project::OSiRiON - Git repositories
Project::OSiRiON
News . About . Screenshots . Downloads . Forum . Wiki . Tracker . Git
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
Diffstat (limited to 'src/model/mapfile.cc')
-rw-r--r--src/model/mapfile.cc52
1 files changed, 46 insertions, 6 deletions
diff --git a/src/model/mapfile.cc b/src/model/mapfile.cc
index a86e06e..9c9048b 100644
--- a/src/model/mapfile.cc
+++ b/src/model/mapfile.cc
@@ -1211,7 +1211,7 @@ Model * MapFile::load(std::string const &name)
// submodel attributes
if (mapfile.got_key_vector3f("origin", location)) {
- submodel->set_location(location * SCALE);
+ submodel->get_location().assign(location * SCALE);
continue;
} else if (mapfile.got_key_string("model", modelname)) {
@@ -1226,11 +1226,11 @@ Model * MapFile::load(std::string const &name)
} else if (mapfile.got_key_float("angle", angle)) {
if (angle == ANGLEUP) {
- submodel->axis().change_pitch(90.0f);
+ submodel->get_axis().change_pitch(90.0f);
} else if (angle == ANGLEDOWN) {
- submodel->axis().change_pitch(-90.0f);
+ submodel->get_axis().change_pitch(-90.0f);
} else {
- submodel->axis().change_direction(angle);
+ submodel->get_axis().change_direction(angle);
}
} else if (mapfile.got_key_float("modelscale", s)) {
@@ -1316,7 +1316,6 @@ Model * MapFile::load(std::string const &name)
(*dit)->get_location() -= mapfile.map_center;
}
- // FIXME this will go wrong if a Rotate group is imported as submodel
for (SubModelList::iterator smit = submodel_list.begin(); smit != submodel_list.end(); smit++) {
submodel = (*smit);
Model *submodel_model = 0;
@@ -1326,6 +1325,8 @@ Model * MapFile::load(std::string const &name)
}
if (submodel_model) {
+ submodel->get_location() -= mapfile.map_center;
+
// copy fragmentgroups
for (Model::Groups::iterator git = submodel_model->groups().begin(); git != submodel_model->groups().end(); git++) {
FragmentGroup *groupsrc = (*git);
@@ -1335,7 +1336,7 @@ Model * MapFile::load(std::string const &name)
groupdst->set_type(groupsrc->type());
groupdst->set_scale(groupsrc->scale() * submodel->scale());
groupdst->set_speed(groupsrc->speed());
- groupdst->set_location((submodel->location() - mapfile.map_center) + (submodel_model->origin() + groupsrc->location()) * submodel->scale() );
+ groupdst->set_location(submodel->location() + (submodel_model->origin() + groupsrc->location()) * submodel->scale() );
groupdst->set_axis(groupsrc->axis() * submodel->axis());
// copy fragments
@@ -1351,6 +1352,45 @@ Model * MapFile::load(std::string const &name)
}
}
+ // recalculate bbox
+ for (size_t i =0; i < 3; i ++) {
+ float c;
+ c = submodel->location()[i] + (submodel_model->origin()[i] + submodel_model->model_maxbbox[i]) * submodel->scale();
+ if (c > model->model_maxbbox[i]) {
+ model->model_maxbbox[i] = c;
+ }
+
+ c = submodel->location()[i] + (submodel_model->origin()[i] + submodel_model->model_minbbox[i]) * submodel->scale();
+ if (c < model->model_minbbox[i]) {
+ model->model_minbbox[i] = c;
+ }
+
+ }
+ model->set_radius(sqrtf(math::max(model->model_maxbbox.lengthsquared(), model->model_minbbox.lengthsquared())));
+
+ // copy lights, flares and particle systems
+ for (Model::Lights::const_iterator lit = submodel_model->lights().begin(); lit != submodel_model->lights().end(); lit++) {
+ light = new Light(*(*lit));
+ light->get_location().assign(submodel->location() + (submodel_model->origin() + light->location()) * submodel->scale());
+ light->set_radius(light->radius() * submodel->scale());
+ model->add_light(light);
+ }
+
+ for (Model::Flares::const_iterator flit = submodel_model->flares().begin(); flit != submodel_model->flares().end(); flit++) {
+ flare = new Flare(*(*flit));
+ flare->get_location().assign(submodel->location() + (submodel_model->origin() + flare->location()) * submodel->scale());
+ flare->set_radius(flare->radius() * submodel->scale());
+ model->add_flare(flare);
+ }
+
+ for (Model::ParticleSystems::const_iterator pit = submodel_model->particles().begin(); pit != submodel_model->particles().end(); pit++) {
+ particles = new Particles(*(*pit));
+ particles->get_location().assign(submodel->location() + (submodel_model->origin() + particles->location()) * submodel->scale());
+ particles->set_radius(particles->radius() * submodel->scale());
+ model->add_particles(particles);
+ }
+
+
con_debug << " imported submodel '" << submodel->name() << "'" << std::endl;
}