Project::OSiRiON - Git repositories
Project::OSiRiON
News . About . Screenshots . Downloads . Forum . Wiki . Tracker . Git
summaryrefslogtreecommitdiff
path: root/src/model
diff options
context:
space:
mode:
Diffstat (limited to 'src/model')
-rw-r--r--src/model/mapfile.cc52
-rw-r--r--src/model/parts.cc42
-rw-r--r--src/model/parts.h64
3 files changed, 130 insertions, 28 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;
}
diff --git a/src/model/parts.cc b/src/model/parts.cc
index eabc108..ac54410 100644
--- a/src/model/parts.cc
+++ b/src/model/parts.cc
@@ -28,6 +28,22 @@ Light::Light() :
light_texture = 0;
}
+Light::Light(const Light& other) : Part(other),
+ light_color(other.color())
+{
+ light_entity = other.entity();
+ light_engine = other.engine();
+ light_strobe = other.strobe();
+
+ light_radius = other.radius();
+ light_frequency = other.frequency();
+ light_offset = other.offset();
+ light_time = other.time();
+
+ light_flare = other.flare();
+
+ light_texture = other.texture();
+}
Light::~Light()
{}
@@ -38,13 +54,17 @@ Flare::Flare() : Light()
flare_cull = CullBack;
}
+Flare::Flare(const Flare& other) : Light(other)
+{
+ flare_cull = other.cull();
+}
+
Flare::~Flare()
{}
/* ---- class Particles -------------------------------------------- */
-Particles::Particles() :
- Part()
+Particles::Particles() : Part()
{
particles_entity = false;
particles_engine = false;
@@ -52,7 +72,7 @@ Particles::Particles() :
particles_cull = CullNone;
}
-Particles::Particles(math::Vector3f const & location) :
+Particles::Particles(const math::Vector3f& location) :
Part(location)
{
}
@@ -63,22 +83,34 @@ Particles::~Particles()
/* ---- class Dock ------------------------------------------------- */
-Dock::Dock()
+Dock::Dock() : Part()
{
dock_radius = 0.01f;
}
+Dock::Dock(const Dock& other) : Part(other)
+{
+ dock_radius = other.radius();
+}
+
Dock::~Dock()
{
}
/* ---- class SubModel---------------------------------------------- */
-SubModel::SubModel()
+SubModel::SubModel() : Part()
{
submodel_scale = 1.0f;
}
+SubModel::SubModel(const SubModel& other) : Part(other),
+ submodel_name(other.name()),
+ submodel_axis(other.axis())
+{
+ submodel_scale = other.scale();
+}
+
SubModel::~SubModel()
{
}
diff --git a/src/model/parts.h b/src/model/parts.h
index c3a0401..5c90efb 100644
--- a/src/model/parts.h
+++ b/src/model/parts.h
@@ -42,9 +42,17 @@ public:
}
/**
+ * @brief copy constructor
+ */
+ inline Part(const Part& other) : part_location(other.location())
+ {
+ }
+
+ /**
* @brief constructor with location
+ * @param location location of this part within the parent model
*/
- inline Part(const math::Vector3f &location) : part_location(location)
+ inline Part(const math::Vector3f& location) : part_location(location)
{
}
@@ -53,7 +61,7 @@ public:
/**
* @brief location of this part within the parent model
*/
- inline const math::Vector3f &location() const
+ inline const math::Vector3f& location() const
{
return part_location;
}
@@ -62,7 +70,7 @@ public:
/**
* @brief set the location within the parent model
*/
- inline void set_location(const math::Vector3f location) { part_location.assign(location); }
+ inline void set_location(const math::Vector3f& location) { part_location.assign(location); }
/**
* @brief set the location within the parent model
@@ -74,7 +82,7 @@ public:
/**
* @brief mutable reference to the location of this part within the parent model
*/
- inline math::Vector3f &get_location()
+ inline math::Vector3f& get_location()
{
return part_location;
}
@@ -95,6 +103,11 @@ public:
Light();
/**
+ * @brief copy constructor
+ */
+ Light(const Light& other);
+
+ /**
* @brief destructor
*/
~Light();
@@ -102,7 +115,7 @@ public:
/* ---- inspectors ----------------------------------------- */
/// light color
- inline const math::Color & color() const
+ inline const math::Color& color() const
{
return light_color;
};
@@ -237,6 +250,11 @@ class Flare : public Light
public:
Flare();
+ /**
+ * @brief copy constructor
+ */
+ Flare(const Flare& other);
+
~Flare();
/* ---- inspectors ----------------------------------------- */
@@ -282,7 +300,7 @@ public:
return particles_axis;
}
- inline const std::string & script() const
+ inline const std::string& script() const
{
return particles_script;
}
@@ -323,14 +341,14 @@ public:
inline void set_cull(const Cull cull) { particles_cull = cull; }
- inline void set_script(const std::string &script) { particles_script.assign(script); }
+ inline void set_script(const std::string& script) { particles_script.assign(script); }
/* ---- actors --------------------------------------------- */
/**
* @brief mutable reference to the axis
*/
- inline math::Axis &get_axis() { return particles_axis; }
+ inline math::Axis& get_axis() { return particles_axis; }
private:
bool particles_entity;
@@ -351,6 +369,12 @@ class Dock : public Part
{
public:
Dock();
+
+ /**
+ * @brief copy constructor
+ */
+ Dock(const Dock& other);
+
~Dock();
/// dock radius, default is 0.01f
@@ -369,32 +393,38 @@ private:
/* ---- class SubModel --------------------------------------------- */
/// a submodel
-class SubModel
+class SubModel : public Part
{
public:
SubModel();
+
+ SubModel(const SubModel& other);
+
~SubModel();
- inline const std::string &name() const { return submodel_name; }
+ inline const std::string& name() const { return submodel_name; }
inline const float scale() const { return submodel_scale; }
- inline const math::Vector3f &location() const { return submodel_location; }
+ inline const math::Axis& axis() const { return submodel_axis; }
- inline math::Axis &axis() { return submodel_axis; }
inline void set_scale(const float scale) { submodel_scale = scale; }
- inline void set_name(const std::string &name) { submodel_name.assign(name); }
+ inline void set_name(const std::string& name) { submodel_name.assign(name); }
+
+ inline void set_axis(const math::Axis& axis) { submodel_axis.assign(axis); }
- inline void set_location(const math::Vector3f &location) { submodel_location.assign(location); }
+ /* ---- actors --------------------------------------------- */
- inline void set_axis(const math::Axis &axis) { submodel_axis.assign(axis); }
+ /**
+ * @brief mutable reference to the axis
+ */
+ inline math::Axis& get_axis() { return submodel_axis; }
private:
- std::string submodel_name;
float submodel_scale;
- math::Vector3f submodel_location;
+ std::string submodel_name;
math::Axis submodel_axis;
};