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:
parent
7797e1cbc3
commit
c136bc2bd0
@ -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
|
||||||
|
@ -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);
|
||||||
|
@ -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;
|
||||||
|
Loading…
Reference in New Issue
Block a user