[Change] Abstract dynamic body stuff ready for ODE removal.

This commit is contained in:
Rtch90 2018-04-06 23:23:57 +01:00
parent 3aa74ee0b0
commit 42a3a9b3d0
7 changed files with 71 additions and 35 deletions

View File

@ -13,6 +13,27 @@ DynamicBody::DynamicBody(void) : ModelBody() {
dBodySetMass(m_body, &m_mass); dBodySetMass(m_body, &m_mass);
} }
void DynamicBody::SetForce(const vector3d f) {
dBodySetForce(m_body, f.x, f.y, f.z);
}
void DynamicBody::AddForce(const vector3d f) {
dBodyAddForce(m_body, f.x, f.y, f.z);
}
void DynamicBody::AddForceAtPos(const vector3d force, const vector3d pos) {
dBodyAddForceAtPos(m_body, force.x, force.y, force.z,
pos.x, pos.y, pos.z);
}
void DynamicBody::AddRelForce(const vector3d f) {
dBodyAddRelForce(m_body, f.x, f.y, f.z);
}
void DynamicBody::AddRelTorque(const vector3d t) {
dBodyAddRelTorque(m_body, t.x, t.y, t.z);
}
void DynamicBody::Save(void) { void DynamicBody::Save(void) {
using namespace Serializer::Write; using namespace Serializer::Write;
ModelBody::Save(); ModelBody::Save();
@ -27,6 +48,15 @@ void DynamicBody::Load(void) {
SetVelocity(rd_vector3d()); SetVelocity(rd_vector3d());
} }
void DynamicBody::SetTorque(const vector3d t) {
dBodySetTorque(m_body, t.x, t.y, t.z);
}
void DynamicBody::SetMass(double mass) {
dMassAdjust(&m_mass, mass);
dBodySetMass(m_body, &m_mass);
}
void DynamicBody::SetPosition(vector3d p) { void DynamicBody::SetPosition(vector3d p) {
dBodySetPosition(m_body, p.x, p.y, p.z); dBodySetPosition(m_body, p.x, p.y, p.z);
ModelBody::SetPosition(p); ModelBody::SetPosition(p);

View File

@ -20,17 +20,28 @@ public:
virtual bool OnCollision(Body* b, Uint32 flags) { return true; } virtual bool OnCollision(Body* b, Uint32 flags) { return true; }
vector3d GetAngularMomentum(void); vector3d GetAngularMomentum(void);
void SetMassDistributionFromCollMesh(const CollMesh* m); void SetMassDistributionFromCollMesh(const CollMesh* m);
void DisableBodyOnly(void) { dBodyDisable(m_body); }
bool IsEnabled(void) { return dBodyIsEnabled(m_body); }
virtual void Disable(void); virtual void Disable(void);
virtual void Enable(void); virtual void Enable(void);
virtual double GetMass(void) const { return m_mass.mass; } virtual double GetMass(void) const { return m_mass.mass; }
virtual void TimeStepUpdate(const float timeStep); virtual void TimeStepUpdate(const float timeStep);
void SetMass(double);
void AddForceAtPos(const vector3d force, const vector3d pos);
void AddForce(const vector3d);
void SetForce(const vector3d);
void SetTorque(const vector3d);
/* body-relative forces. */
void AddRelForce(const vector3d);
void AddRelTorque(const vector3d);
dBodyID m_body; dBodyID m_body;
dMass m_mass;
protected: protected:
virtual void Save(void); virtual void Save(void);
virtual void Load(void); virtual void Load(void);
private: private:
dMass m_mass;
}; };

View File

@ -133,7 +133,7 @@ void L3D::SetTimeAccel(float s) {
/* We don't want player spinning like crazy when hitting time accel. */ /* We don't want player spinning like crazy when hitting time accel. */
if(s > 10) { if(s > 10) {
player->SetAngVelocity(vector3d(0,0,0)); player->SetAngVelocity(vector3d(0,0,0));
dBodySetTorque(player->m_body, 0, 0, 0); player->SetTorque(vector3d(0,0,0));
player->SetAngThrusterState(0, 0.0f); player->SetAngThrusterState(0, 0.0f);
player->SetAngThrusterState(1, 0.0f); player->SetAngThrusterState(1, 0.0f);
player->SetAngThrusterState(2, 0.0f); player->SetAngThrusterState(2, 0.0f);

View File

@ -170,8 +170,8 @@ void Player::DrawHUD(const Frame* cam_frame) {
/* Direction indicator. */ /* Direction indicator. */
const float sz = HUD_CROSSHAIR_SIZE; const float sz = HUD_CROSSHAIR_SIZE;
const dReal* vel = dBodyGetLinearVel(m_body); const vector3d vel = GetVelocity();
vector3d loc_v = cam_frame->GetOrientation().InverseOf() * vector3d(vel[0], vel[1], vel[2]); vector3d loc_v = cam_frame->GetOrientation().InverseOf() * vel;
if(loc_v.z < 0) { if(loc_v.z < 0) {
GLdouble pos[3]; GLdouble pos[3];
if(Gui::Screen::Project(loc_v[0], loc_v[1], loc_v[2], modelMatrix, projMatrix, if(Gui::Screen::Project(loc_v[0], loc_v[1], loc_v[2], modelMatrix, projMatrix,

View File

@ -113,8 +113,7 @@ Ship::Ship(ShipType::Type shipType) : DynamicBody() {
void Ship::UpdateMass(void) { void Ship::UpdateMass(void) {
CalcStats(); CalcStats();
dMassAdjust(&m_mass, m_stats.total_mass*1000); SetMass(m_stats.total_mass*1000);
dBodySetMass(m_body, &m_mass);
} }
bool Ship::OnCollision(Body* b, Uint32 flags) { bool Ship::OnCollision(Body* b, Uint32 flags) {
@ -140,8 +139,7 @@ bool Ship::OnCollision(Body* b, Uint32 flags) {
vector3d Ship::CalcRotDamping(void) { vector3d Ship::CalcRotDamping(void) {
/* Rotation damping. */ /* Rotation damping. */
const dReal* _av = dBodyGetAngularVel(m_body); vector3d angVel = GetAngVelocity();
vector3d angVel(_av[0], _av[1], _av[2]);
matrix4x4d rot; matrix4x4d rot;
GetRotMatrix(rot); GetRotMatrix(rot);
angVel = rot.InverseOf() * angVel; angVel = rot.InverseOf() * angVel;
@ -198,10 +196,13 @@ void Ship::Blastoff(void) {
Enable(); Enable();
const double planetRadius = 0.1 + GetFrame()->m_astroBody->GetRadius(); const double planetRadius = 0.1 + GetFrame()->m_astroBody->GetRadius();
vector3d up = vector3d::Normalize(GetPosition()); vector3d up = vector3d::Normalize(GetPosition());
dBodySetLinearVel(m_body, 0, 0, 0); SetVelocity(vector3d(0,0,0));
dBodySetAngularVel(m_body, 0, 0, 0); SetAngVelocity(vector3d(0,0,0));
dBodySetForce(m_body, 0, 0, 0);
dBodySetTorque(m_body, 0, 0, 0); SetVelocity(vector3d(0,0,0));
SetAngVelocity(vector3d(0,0,0));
SetForce(vector3d(0,0,0));
SetTorque(vector3d(0,0,0));
Aabb aabb; Aabb aabb;
GetAabb(aabb); GetAabb(aabb);
@ -214,8 +215,7 @@ void Ship::TestLanded(void) {
m_testLanded = false; m_testLanded = false;
if(m_launchLockTimeout != 0) return; if(m_launchLockTimeout != 0) return;
if(GetFrame()->m_astroBody) { if(GetFrame()->m_astroBody) {
const dReal* vel = dBodyGetLinearVel(m_body); double speed = GetVelocity().Length();
double speed = vector3d(vel[0], vel[1], vel[2]).Length();
const double planetRadius = GetFrame()->m_astroBody->GetRadius(); const double planetRadius = GetFrame()->m_astroBody->GetRadius();
if(speed < MAX_LANDING_SPEED) { if(speed < MAX_LANDING_SPEED) {
@ -246,16 +246,16 @@ void Ship::TestLanded(void) {
rot = rot.InverseOf(); rot = rot.InverseOf();
SetRotMatrix(rot); SetRotMatrix(rot);
dBodySetLinearVel(m_body, 0,0,0); SetVelocity(vector3d(0,0,0));
dBodySetAngularVel(m_body,0,0,0); SetAngVelocity(vector3d(0,0,0));
dBodySetForce(m_body,0,0,0); SetForce(vector3d(0,0,0));
dBodySetTorque(m_body,0,0,0); SetTorque(vector3d(0,0,0));
/* /*
* We don't use DynamicBody::Disable because that also disables * We don't use DynamicBody::Disable because that also disables
* the geom, and that must still get collisions. * the geom, and that must still get collisions.
*/ */
dBodyDisable(m_body); DisableBodyOnly();
ClearThrusterState(); ClearThrusterState();
m_flightState = LANDED; m_flightState = LANDED;
} }
@ -284,18 +284,18 @@ void Ship::TimeStepUpdate(const float timeStep) {
switch(i) { switch(i) {
case ShipType::THRUSTER_REAR: case ShipType::THRUSTER_REAR:
case ShipType::THRUSTER_FRONT: case ShipType::THRUSTER_FRONT:
dBodyAddRelForce(m_body, 0, 0, force); break; AddRelForce(vector3d(0,0,force)); break;
case ShipType::THRUSTER_TOP: case ShipType::THRUSTER_TOP:
case ShipType::THRUSTER_BOTTOM: case ShipType::THRUSTER_BOTTOM:
dBodyAddRelForce(m_body, 0, force, 0); break; AddRelForce(vector3d(0, force, 0)); break;
case ShipType::THRUSTER_LEFT: case ShipType::THRUSTER_LEFT:
case ShipType::THRUSTER_RIGHT: case ShipType::THRUSTER_RIGHT:
dBodyAddRelForce(m_body, force, 0, 0); break; AddRelForce(vector3d(force, 0, 0)); break;
} }
} }
dBodyAddRelTorque(m_body, stype.angThrust*m_angThrusters[0], AddRelTorque(vector3d(stype.angThrust*m_angThrusters[0],
stype.angThrust*m_angThrusters[1], stype.angThrust*m_angThrusters[1],
stype.angThrust*m_angThrusters[2]); stype.angThrust*m_angThrusters[2]));
/* LASERZ!! */ /* LASERZ!! */
for(int i = 0; i < ShipType::GUNMOUNT_MAX; i++) { for(int i = 0; i < ShipType::GUNMOUNT_MAX; i++) {
@ -424,7 +424,7 @@ static void render_coll_mesh(const CollMesh* m) {
} }
void Ship::Render(const Frame* camFrame) { void Ship::Render(const Frame* camFrame) {
if((!dBodyIsEnabled(m_body)) && !m_flightState) return; if((!IsEnabled()) && !m_flightState) return;
const ShipType& stype = GetShipType(); const ShipType& stype = GetShipType();
params.angthrust[0] = m_angThrusters[0]; params.angthrust[0] = m_angThrusters[0];
params.angthrust[1] = m_angThrusters[1]; params.angthrust[1] = m_angThrusters[1];

View File

@ -289,13 +289,8 @@ static bool _OnCollision(dGeomID g1, dGeomID g2, Object* o1, Object* o2,
DynamicBody* rb = (DynamicBody*)o1; DynamicBody* rb = (DynamicBody*)o1;
dVector3 start, dir; dVector3 start, dir;
dGeomRayGet(g2, start, dir); dGeomRayGet(g2, start, dir);
dBodyAddForceAtPos(rb->m_body, rb->AddForceAtPos(vector3d(dir[0], dir[1], dir[2])*100,
100*dir[0], vector3d(contacts[0].geom.pos[0], contacts[0].geom.pos[1], contacts[0].geom.pos[2]));
100*dir[1],
100*dir[2],
contacts[0].geom.pos[0],
contacts[0].geom.pos[1],
contacts[0].geom.pos[2]);
} }
return false; return false;
} else { } else {
@ -464,7 +459,7 @@ void Space::ApplyGravity(void) {
const double force = G*m1m2 / (r*r); const double force = G*m1m2 / (r*r);
b1b2.Normalize(); b1b2.Normalize();
b1b2 = b1b2 * force; b1b2 = b1b2 * force;
dBodyAddForce(L3D::player->m_body, b1b2.x, b1b2.y, b1b2.z); L3D::player->AddForce(b1b2);
} }
} }

View File

@ -182,8 +182,8 @@ bool SpaceStation::OnCollision(Body* b, Uint32 flags) {
/* Hitting docking area of a station. */ /* Hitting docking area of a station. */
if(b->IsType(Object::SHIP)) { if(b->IsType(Object::SHIP)) {
Ship* s = static_cast<Ship*>(b); Ship* s = static_cast<Ship*>(b);
const dReal* vel = dBodyGetLinearVel(s->m_body);
double speed = vector3d(vel[0], vel[1], vel[2]).Length(); double speed = s->GetVelocity().Length();
/* Must be oriented sensibly and have wheels down. */ /* Must be oriented sensibly and have wheels down. */
if(IsGroundStation()) { if(IsGroundStation()) {