Fixed #1109 by adding a proper constructor to the Settings class

(which will make sure all fields are initialised).


git-svn-id: svn+ssh://svn.code.sf.net/p/supertuxkart/code/main/trunk@14576 178a84e3-b1eb-0310-8ba1-8eac791a3b58
This commit is contained in:
hikerstk 2013-11-25 06:01:16 +00:00
parent 7797e1cbc3
commit c136bc2bd0
3 changed files with 100 additions and 67 deletions

View File

@ -300,7 +300,7 @@ void ThreeStrikesBattle::update(float dt)
std::string tire; std::string tire;
float scale = 0.5f; float scale = 0.5f;
float radius = 0.5f; float radius = 0.5f;
PhysicalObject::bodyTypes body_shape; PhysicalObject::BodyTypes body_shape;
// insert blown away tire(s) now if was requested // insert blown away tire(s) now if was requested
while (m_insert_tire > 0) while (m_insert_tire > 0)
@ -332,16 +332,11 @@ void ThreeStrikesBattle::update(float dt)
core::vector3df tire_xyz = m_tire_position + tire_offset; core::vector3df tire_xyz = m_tire_position + tire_offset;
core::vector3df tire_hpr = core::vector3df(800.0f,0, core::vector3df tire_hpr = core::vector3df(800.0f,0,
m_tire_rotation / M_PI * 180 + 180); m_tire_rotation *RAD_TO_DEGREE + 180);
core::vector3df tire_scale(scale,scale,scale); core::vector3df tire_scale(scale,scale,scale);
PhysicalObject::Settings physicsSettings; PhysicalObject::Settings physics_settings(PhysicalObject::MP_CYLINDER_Y,
physicsSettings.body_type = PhysicalObject::MP_CYLINDER_Y; radius, /*mass*/15.0f);
physicsSettings.crash_reset = false;
physicsSettings.knock_kart = false;
physicsSettings.mass = 15.0f;
physicsSettings.radius = radius;
physicsSettings.reset_when_too_low = false;
TrackObjectPresentationMesh* tire_presentation = TrackObjectPresentationMesh* tire_presentation =
new TrackObjectPresentationMesh(tire, tire_xyz, tire_hpr, tire_scale); new TrackObjectPresentationMesh(tire, tire_xyz, tire_hpr, tire_scale);
@ -349,7 +344,7 @@ void ThreeStrikesBattle::update(float dt)
TrackObject* tire = new TrackObject(tire_xyz, tire_hpr, tire_scale, TrackObject* tire = new TrackObject(tire_xyz, tire_hpr, tire_scale,
"movable", tire_presentation, "movable", tire_presentation,
true /* is_dynamic */, true /* is_dynamic */,
&physicsSettings); &physics_settings);
getTrack()->getTrackObjectManager()->insertObject(tire); getTrack()->getTrackObjectManager()->insertObject(tire);
// FIXME: orient the force relative to kart orientation // FIXME: orient the force relative to kart orientation

View File

@ -38,48 +38,70 @@ using namespace irr;
#include <ISceneManager.h> #include <ISceneManager.h>
#include <IMeshSceneNode.h> #include <IMeshSceneNode.h>
// ---------------------------------------------------------------------------- /** Creates a physical Settings object with the given type, radius and mass.
*/
PhysicalObject::Settings::Settings(BodyTypes type, float radius, float mass)
{
init();
m_mass = mass;
m_radius = radius;
} // Settings
// ----------------------------------------------------------------------------
/** Reads the physical settings values from a given XML node.
*/
PhysicalObject::Settings::Settings(const XMLNode &xml_node)
{
init();
std::string shape;
xml_node.get("mass", &m_mass );
xml_node.get("radius", &m_radius );
xml_node.get("shape", &shape );
xml_node.get("reset", &m_crash_reset );
xml_node.get("explode", &m_knock_kart );
xml_node.get("flatten", &m_flatten_kart);
m_reset_when_too_low =
xml_node.get("reset-when-below", &m_reset_height) == 1;
m_body_type = MP_NONE;
if (shape=="cone" ||
shape=="coneY" ) m_body_type = MP_CONE_Y;
else if(shape=="coneX" ) m_body_type = MP_CONE_X;
else if(shape=="coneZ" ) m_body_type = MP_CONE_Z;
else if(shape=="cylinder"||
shape=="cylinderY") m_body_type = MP_CYLINDER_Y;
else if(shape=="cylinderX") m_body_type = MP_CYLINDER_X;
else if(shape=="cylinderZ") m_body_type = MP_CYLINDER_Z;
else if(shape=="box" ) m_body_type = MP_BOX;
else if(shape=="sphere" ) m_body_type = MP_SPHERE;
else if(shape=="exact" ) m_body_type = MP_EXACT;
else
Log::error("PhysicalObject", "Unknown shape type : %s.",
shape.c_str());
} // Settings(XMLNode)
// ----------------------------------------------------------------------------
/** Initialises a Settings object.
*/
void PhysicalObject::Settings::init()
{
m_body_type = PhysicalObject::MP_NONE;
m_crash_reset = false;
m_knock_kart = false;
m_mass = -1.0f;
m_radius = -1.0f;
m_reset_when_too_low = false;
m_flatten_kart = false;
} // Settings
// ============================================================================
PhysicalObject* PhysicalObject::fromXML(bool is_dynamic, PhysicalObject* PhysicalObject::fromXML(bool is_dynamic,
const XMLNode &xml_node, const XMLNode &xml_node,
TrackObject* object) TrackObject* object)
{ {
PhysicalObject::Settings settings; PhysicalObject::Settings settings(xml_node);
settings.reset_height = 0;
settings.mass = 1;
settings.radius = -1;
settings.crash_reset = false;
settings.knock_kart = false;
settings.flatten_kart = false;
std::string shape;
xml_node.get("mass", &settings.mass );
xml_node.get("radius", &settings.radius );
xml_node.get("shape", &shape );
xml_node.get("reset", &settings.crash_reset );
xml_node.get("explode", &settings.knock_kart );
xml_node.get("flatten", &settings.flatten_kart);
settings.reset_when_too_low =
xml_node.get("reset-when-below", &settings.reset_height) == 1;
settings.body_type = MP_NONE;
if (shape=="cone" ||
shape=="coneY" ) settings.body_type = MP_CONE_Y;
else if(shape=="coneX" ) settings.body_type = MP_CONE_X;
else if(shape=="coneZ" ) settings.body_type = MP_CONE_Z;
else if(shape=="cylinder"||
shape=="cylinderY") settings.body_type = MP_CYLINDER_Y;
else if(shape=="cylinderX") settings.body_type = MP_CYLINDER_X;
else if(shape=="cylinderZ") settings.body_type = MP_CYLINDER_Z;
else if(shape=="box" ) settings.body_type = MP_BOX;
else if(shape=="sphere" ) settings.body_type = MP_SPHERE;
else if(shape=="exact") settings.body_type = MP_EXACT;
else fprintf(stderr, "Unknown shape type : %s\n", shape.c_str());
return new PhysicalObject(is_dynamic, settings, object); return new PhysicalObject(is_dynamic, settings, object);
} // fromXML } // fromXML
@ -107,14 +129,14 @@ PhysicalObject::PhysicalObject(bool is_dynamic,
m_init_hpr = object->getRotation(); m_init_hpr = object->getRotation();
m_init_scale = object->getScale(); m_init_scale = object->getScale();
m_mass = settings.mass; m_mass = settings.m_mass;
m_radius = settings.radius; m_radius = settings.m_radius;
m_body_type = settings.body_type; m_body_type = settings.m_body_type;
m_crash_reset = settings.crash_reset; m_crash_reset = settings.m_crash_reset;
m_explode_kart = settings.knock_kart; m_explode_kart = settings.m_knock_kart;
m_flatten_kart = settings.flatten_kart; m_flatten_kart = settings.m_flatten_kart;
m_reset_when_too_low = settings.reset_when_too_low; m_reset_when_too_low = settings.m_reset_when_too_low;
m_reset_height = settings.reset_height; m_reset_height = settings.m_reset_height;
m_init_pos.setIdentity(); m_init_pos.setIdentity();
Vec3 radHpr(m_init_hpr); Vec3 radHpr(m_init_hpr);

View File

@ -39,22 +39,38 @@ class PhysicalObject
{ {
public: public:
/** The supported collision shapes. */ /** The supported collision shapes. */
enum bodyTypes {MP_NONE, enum BodyTypes {MP_NONE,
MP_CONE_Y, MP_CONE_X, MP_CONE_Z, MP_CONE_Y, MP_CONE_X, MP_CONE_Z,
MP_CYLINDER_Y, MP_CYLINDER_X, MP_CYLINDER_Z, MP_CYLINDER_Y, MP_CYLINDER_X, MP_CYLINDER_Z,
MP_BOX, MP_SPHERE, MP_EXACT}; MP_BOX, MP_SPHERE, MP_EXACT};
struct Settings class Settings
{ {
float mass; public:
float radius; /** Mass of the object. */
PhysicalObject::bodyTypes body_type; float m_mass;
bool crash_reset; /** Radius of the object. */
bool knock_kart; float m_radius;
bool flatten_kart; /** Shape of the object. */
bool reset_when_too_low; PhysicalObject::BodyTypes m_body_type;
float reset_height; /** Trigger a reset in karts touching it? */
}; bool m_crash_reset;
/** Knock the kart around. */
bool m_knock_kart;
/** Flatten the kart when this object is touched. */
bool m_flatten_kart;
/** Reset the object when it falls under the track (useful
* e.g. for a boulder rolling down a hill). */
bool m_reset_when_too_low;
/** If the item is below that height, it is reset (when
* m_reset_when_too_low is true). */
float m_reset_height;
private:
void init();
public:
Settings(BodyTypes type, float radius, float mass);
Settings(const XMLNode &xml_node);
}; // Settings
private: private:
@ -70,7 +86,7 @@ private:
TrackObject *m_object; TrackObject *m_object;
/** The shape of this object. */ /** The shape of this object. */
bodyTypes m_body_type; BodyTypes m_body_type;
/** The bullet collision shape. */ /** The bullet collision shape. */
btCollisionShape *m_shape; btCollisionShape *m_shape;