From a3cfb9c4634e3ce7e052e72ce564d25e5367a430 Mon Sep 17 00:00:00 2001 From: Stijn Buys Date: Sat, 15 Aug 2009 13:25:37 +0000 Subject: API cleanups, const optimizations, submodel lights/flares/particles import --- src/model/mapfile.cc | 52 ++++++++++++++++++++++++++++++++++++++++++++++------ 1 file changed, 46 insertions(+), 6 deletions(-) (limited to 'src/model/mapfile.cc') 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; } -- cgit v1.2.3