diff --git a/Engine.cc b/Engine.cc index ee0b75e..066831f 100644 --- a/Engine.cc +++ b/Engine.cc @@ -1101,6 +1101,9 @@ Engine::Object::Object(bool is_static, bool is_reference, m_scale = scale; m_is_scaled = ! (fabs(scale - 1.0) < 0.0001); m_is_managed = false; + m_mass = 0.0; + m_mass_is_set = false; + m_gravity_mode = true; } /* used for "managed" objects with one geom */ @@ -1133,6 +1136,9 @@ Engine::Object::Object(bool is_static, bool is_reference, OdeWorld & world, m_texture_scale = 1.0f; createManagedObject(); render(); + m_mass = 0.0; + m_mass_is_set = false; + m_gravity_mode = true; } /* used to clone objects */ @@ -1173,6 +1179,14 @@ Engine::Object::Object(const Engine::Object & orig) createManagedObject(); render(); } + m_mass = orig.m_mass; + m_mass_is_set = orig.m_mass_is_set; + if (m_mass_is_set) + { + setMass(orig.getMass()); + } + m_gravity_mode = orig.m_gravity_mode; + setGravityMode(m_gravity_mode); } Engine::Object::~Object() @@ -1459,6 +1473,20 @@ void Engine::Object::render() checkGLError(); } +void Engine::Object::setPosition(double x, double y, double z) +{ + if (m_ode_object != NULL) + m_ode_object->setPosition(x, y, z); +} + +void Engine::Object::getPosition(double * x, double * y, double * z) +{ + if (m_ode_object != NULL) + m_ode_object->getPosition(x, y, z); + else + *x = *y = *z = 0.0; +} + void Engine::Object::loadPhy(FileLoader * fl, const FileLoader::Path & path) { m_phy = new PhyObj(); @@ -1542,6 +1570,21 @@ void Engine::Object::draw() } } +dReal Engine::Object::getMass() const +{ + return (m_ode_object != NULL) ? m_ode_object->getMass() : m_mass; +} + +void Engine::Object::setMass(dReal mass) +{ + m_mass = mass; + m_mass_is_set = true; + if (m_ode_object != NULL) + { + m_ode_object->setMass(mass); + } +} + /******** Engine::EngineFileLoader functions ********/ diff --git a/Engine.h b/Engine.h index ee0c108..e0679cc 100644 --- a/Engine.h +++ b/Engine.h @@ -30,37 +30,36 @@ class Engine Object(const Object & orig); ~Object(); - void setPosition(double x, double y, double z) - { - m_ode_object->setPosition(x, y, z); - } - void getPosition(double * x, double * y, double * z) - { - m_ode_object->getPosition(x, y, z); - } + void setPosition(double x, double y, double z); + void getPosition(double * x, double * y, double * z); void loadPhy(FileLoader * fl, const FileLoader::Path & path); void instantiatePhy(); void setVisible(bool visible) { m_is_visible = visible; } bool getVisible() { return m_is_visible; } void addForce(dReal fx, dReal fy, dReal fz) { - m_ode_object->addForce(fx, fy, fz); + if (m_ode_object != NULL) + m_ode_object->addForce(fx, fy, fz); } void addForceRel(dReal fx, dReal fy, dReal fz) { - m_ode_object->addForceRel(fx, fy, fz); + if (m_ode_object != NULL) + m_ode_object->addForceRel(fx, fy, fz); } void addTorque(dReal fx, dReal fy, dReal fz) { - m_ode_object->addTorque(fx, fy, fz); + if (m_ode_object != NULL) + m_ode_object->addTorque(fx, fy, fz); } void addTorqueRel(dReal fx, dReal fy, dReal fz) { - m_ode_object->addTorqueRel(fx, fy, fz); + if (m_ode_object != NULL) + m_ode_object->addTorqueRel(fx, fy, fz); } void setRotation(dReal x, dReal y, dReal z) { - m_ode_object->setRotation(x, y, z); + if (m_ode_object != NULL) + m_ode_object->setRotation(x, y, z); } void setColor(float r, float g, float b) { @@ -77,13 +76,18 @@ class Engine render(); } void draw(); - dReal getMass() { return m_ode_object->getMass(); } - void setMass(dReal mass) { m_ode_object->setMass(mass); } + dReal getMass() const; + void setMass(dReal mass); const float * getAABB() { return m_aabb; } - dBodyID getBody() { return m_ode_object->getBody(); } + dBodyID getBody() + { + return (m_ode_object != NULL) ? m_ode_object->getBody() : 0; + } void setGravityMode(bool enabled) { - m_ode_object->setGravityMode(enabled); + m_gravity_mode = enabled; + if (m_ode_object != NULL) + m_ode_object->setGravityMode(enabled); } protected: @@ -101,6 +105,9 @@ class Engine float m_aabb[6]; OdeWorld & m_world; refptr m_phy; + dReal m_mass; + bool m_mass_is_set; + bool m_gravity_mode; /* for "pre-loaded" objects */ int * m_display_list_refcnt; diff --git a/lib/demo/bowling.lua b/lib/demo/bowling.lua index 7b5d52e..39db81e 100644 --- a/lib/demo/bowling.lua +++ b/lib/demo/bowling.lua @@ -68,18 +68,14 @@ function init_event() local lane_bottom = minz local lane_top = maxz pins = {} - reference_pin = ag.loadModel("bowling_pin", {scale = 1.0/4.3}) + reference_pin = ag.loadModel("bowling_pin", + {scale = 1.0/4.3, reference = true}) minx, miny, minz, maxx, maxy, maxz = reference_pin:getAABB() pin_minz = minz pin_maxz = maxz pin_standing_position = lane_top - pin_minz - local box = ag.createBox(1, 10, 0.1, {static = true}) - box:setVisible(false) - box:setPosition(0, 0, lane_bottom - (maxz - minz) - 0.4) - reference_pin:setPosition(0, 0, lane_bottom - maxz - 0.1) - reference_ball = ag.loadModel("bowling_ball") + reference_ball = ag.loadModel("bowling_ball", {reference = true}) reference_ball:setMass(10) - reference_ball:setPosition(0, -2, -1.5) setupStars() game_state = "waiting" mouse_moved = false