trying to use reference objects in lib/demo/bowling.lua but segfaulting

git-svn-id: svn://anubis/anaglym/trunk@242 99a6e188-d820-4881-8870-2d33a10e2619
This commit is contained in:
Josh Holtrop 2010-02-11 01:22:49 +00:00
parent 9058dcfefc
commit 457474b6c1
3 changed files with 70 additions and 24 deletions

View File

@ -1101,6 +1101,9 @@ Engine::Object::Object(bool is_static, bool is_reference,
m_scale = scale; m_scale = scale;
m_is_scaled = ! (fabs(scale - 1.0) < 0.0001); m_is_scaled = ! (fabs(scale - 1.0) < 0.0001);
m_is_managed = false; m_is_managed = false;
m_mass = 0.0;
m_mass_is_set = false;
m_gravity_mode = true;
} }
/* used for "managed" objects with one geom */ /* 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; m_texture_scale = 1.0f;
createManagedObject(); createManagedObject();
render(); render();
m_mass = 0.0;
m_mass_is_set = false;
m_gravity_mode = true;
} }
/* used to clone objects */ /* used to clone objects */
@ -1173,6 +1179,14 @@ Engine::Object::Object(const Engine::Object & orig)
createManagedObject(); createManagedObject();
render(); 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() Engine::Object::~Object()
@ -1459,6 +1473,20 @@ void Engine::Object::render()
checkGLError(); 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) void Engine::Object::loadPhy(FileLoader * fl, const FileLoader::Path & path)
{ {
m_phy = new PhyObj(); 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 ********/ /******** Engine::EngineFileLoader functions ********/

View File

@ -30,37 +30,36 @@ class Engine
Object(const Object & orig); Object(const Object & orig);
~Object(); ~Object();
void setPosition(double x, double y, double z) void setPosition(double x, double y, double z);
{ void getPosition(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 loadPhy(FileLoader * fl, const FileLoader::Path & path); void loadPhy(FileLoader * fl, const FileLoader::Path & path);
void instantiatePhy(); void instantiatePhy();
void setVisible(bool visible) { m_is_visible = visible; } void setVisible(bool visible) { m_is_visible = visible; }
bool getVisible() { return m_is_visible; } bool getVisible() { return m_is_visible; }
void addForce(dReal fx, dReal fy, dReal fz) 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) 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) 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) 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) 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) void setColor(float r, float g, float b)
{ {
@ -77,13 +76,18 @@ class Engine
render(); render();
} }
void draw(); void draw();
dReal getMass() { return m_ode_object->getMass(); } dReal getMass() const;
void setMass(dReal mass) { m_ode_object->setMass(mass); } void setMass(dReal mass);
const float * getAABB() { return m_aabb; } 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) void setGravityMode(bool enabled)
{ {
m_ode_object->setGravityMode(enabled); m_gravity_mode = enabled;
if (m_ode_object != NULL)
m_ode_object->setGravityMode(enabled);
} }
protected: protected:
@ -101,6 +105,9 @@ class Engine
float m_aabb[6]; float m_aabb[6];
OdeWorld & m_world; OdeWorld & m_world;
refptr<PhyObj> m_phy; refptr<PhyObj> m_phy;
dReal m_mass;
bool m_mass_is_set;
bool m_gravity_mode;
/* for "pre-loaded" objects */ /* for "pre-loaded" objects */
int * m_display_list_refcnt; int * m_display_list_refcnt;

View File

@ -68,18 +68,14 @@ function init_event()
local lane_bottom = minz local lane_bottom = minz
local lane_top = maxz local lane_top = maxz
pins = {} 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() minx, miny, minz, maxx, maxy, maxz = reference_pin:getAABB()
pin_minz = minz pin_minz = minz
pin_maxz = maxz pin_maxz = maxz
pin_standing_position = lane_top - pin_minz pin_standing_position = lane_top - pin_minz
local box = ag.createBox(1, 10, 0.1, {static = true}) reference_ball = ag.loadModel("bowling_ball", {reference = 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:setMass(10) reference_ball:setMass(10)
reference_ball:setPosition(0, -2, -1.5)
setupStars() setupStars()
game_state = "waiting" game_state = "waiting"
mouse_moved = false mouse_moved = false