[Add] More landing constraints.
[Fix?] Correct wheel behaviour when landed.
This commit is contained in:
parent
625de2c655
commit
703515dbe0
53
src/ship.cpp
53
src/ship.cpp
@ -29,7 +29,7 @@ Ship::Ship(ShipType::Type shipType) : DynamicBody() {
|
||||
m_wheelTransition = 0;
|
||||
m_wheelState = 0;
|
||||
m_dockedWith = 0;
|
||||
dockingTimer = 0;
|
||||
m_dockingTimer = 0;
|
||||
m_navTarget = 0;
|
||||
m_combatTarget = 0;
|
||||
m_shipType = shipType;
|
||||
@ -139,38 +139,45 @@ void Ship::TestLanded(void) {
|
||||
const double planetRadius = GetFrame()->m_astroBody->GetRadius();
|
||||
|
||||
if(speed < 20) {
|
||||
printf("Landed!\n");
|
||||
|
||||
/* Orient the damn thing right! */
|
||||
/* Orient the damn thing right!
|
||||
* Why is the inverse of the body rot matrix being used?!?!
|
||||
* *shrugs* it just works this way.
|
||||
*/
|
||||
matrix4x4d rot;
|
||||
GetRotMatrix(rot);
|
||||
matrix4x4d invRot = rot.InverseOf();
|
||||
|
||||
vector3d up = vector3d::Normalize(GetPosition());
|
||||
|
||||
/* Position at zero altitude. */
|
||||
SetPosition(up * planetRadius);
|
||||
/* Check player is sortof sensibly oriented for landing. */
|
||||
const double dot = vector3d::Dot(vector3d::Normalize(vector3d(invRot[1], invRot[5], invRot[9])), up);
|
||||
if(dot > 0.99) {
|
||||
/* Position at zero altitude. */
|
||||
SetPosition(up * planetRadius);
|
||||
|
||||
vector3d forward = rot * vector3d(0, 0, 1);
|
||||
vector3d other = vector3d::Normalize(vector3d::Cross(up, forward));
|
||||
vector3d forward = rot * vector3d(0,0,1);
|
||||
vector3d other = vector3d::Normalize(vector3d::Cross(up, forward));
|
||||
forward = vector3d::Cross(other, up);
|
||||
|
||||
rot = matrix4x4d::MakeRotMatrix(other, up, forward);
|
||||
rot = rot.InverseOf();
|
||||
SetRotMatrix(rot);
|
||||
rot = matrix4x4d::MakeRotMatrix(other, up, forward);
|
||||
rot = rot.InverseOf();
|
||||
SetRotMatrix(rot);
|
||||
|
||||
/*
|
||||
* We don'tuse DynamicBody::Disable because that also disables the geom
|
||||
* and that must still get collisions.
|
||||
*/
|
||||
dBodyDisable(m_body);
|
||||
ClearThrusterState();
|
||||
m_flightState = LANDED;
|
||||
m_testLanded = false;
|
||||
/*
|
||||
* We don't use DynamicBody::Disable because that also disables
|
||||
* the geom, and that must still get collisions.
|
||||
*/
|
||||
dBodyDisable(m_body);
|
||||
ClearThrusterState();
|
||||
m_flightState = LANDED;
|
||||
m_testLanded = false;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void Ship::TimeStepUpdate(const float timeStep) {
|
||||
dockingTimer = (dockingTimer-timeStep > 0 ? dockingTimer-timeStep : 0);
|
||||
m_dockingTimer = (m_dockingTimer-timeStep > 0 ? m_dockingTimer-timeStep : 0);
|
||||
/* ODE tri mesh likes to know our old position. */
|
||||
TriMeshUpdateLastPos();
|
||||
|
||||
@ -255,7 +262,7 @@ void Ship::SetDockedWith(SpaceStation* s) {
|
||||
m_dockedWith = 0;
|
||||
} else {
|
||||
m_dockedWith = s;
|
||||
dockingTimer = 0.0f;
|
||||
m_dockingTimer = 0.0f;
|
||||
SetVelocity(vector3d(0, 0, 0));
|
||||
SetAngVelocity(vector3d(0, 0, 0));
|
||||
Disable();
|
||||
@ -266,9 +273,11 @@ void Ship::SetGunState(int idx, int state) {
|
||||
m_gunState[idx] = state;
|
||||
}
|
||||
|
||||
void Ship::SetWheelState(bool down) {
|
||||
bool Ship::SetWheelState(bool down) {
|
||||
if(m_flightState != FLYING) return false;
|
||||
if(down) m_wheelTransition = 1;
|
||||
else m_wheelTransition = -1;
|
||||
return true;
|
||||
}
|
||||
|
||||
void Ship::SetNavTarget(Body* const target) {
|
||||
|
@ -33,10 +33,10 @@ public:
|
||||
void CalcStats(shipstats_t* stats);
|
||||
void UpdateMass(void);
|
||||
vector3d CalcRotDamping();
|
||||
void SetWheelState(bool down);
|
||||
bool SetWheelState(bool down); /* Returns success of state change, NOT state itself. */
|
||||
void Blastoff(void);
|
||||
float GetDockingTimer(void) { return dockingTimer; }
|
||||
void SetDockingTimer(float t) { dockingTimer = t; }
|
||||
float GetDockingTimer(void) { return m_dockingTimer; }
|
||||
void SetDockingTimer(float t) { m_dockingTimer = t; }
|
||||
virtual void TimeStepUpdate(const float timeStep);
|
||||
virtual void NotifyDeath(const Body* const dyingBody);
|
||||
virtual bool OnCollision(Body* b, Uint32 flags);
|
||||
@ -68,7 +68,7 @@ private:
|
||||
|
||||
float m_thrusters[ShipType::THRUSTER_MAX];
|
||||
float m_angThrusters[3];
|
||||
float dockingTimer;
|
||||
float m_dockingTimer;
|
||||
dGeomID m_tempLaserGeom[ShipType::GUNMOUNT_MAX];
|
||||
|
||||
LaserObj m_laserCollisionObj;
|
||||
|
@ -72,7 +72,9 @@ WorldView::WorldView(void): View() {
|
||||
}
|
||||
|
||||
void WorldView::OnChangeWheelsState(Gui::MultiStateImageButton* b) {
|
||||
L3D::player->SetWheelState(b->GetState());
|
||||
if(!L3D::player->SetWheelState(b->GetState())) {
|
||||
b->StatePrev();
|
||||
}
|
||||
}
|
||||
|
||||
void WorldView::OnChangeLabelsState(Gui::MultiStateImageButton* b) {
|
||||
|
Loading…
Reference in New Issue
Block a user