void PlayerShipController::StaticUpdate(const float timeStep) { vector3d v; matrix4x4d m; if (m_ship->GetFlightState() == Ship::FLYING) { switch (m_flightControlState) { case CONTROL_FIXSPEED: PollControls(timeStep, true); if (IsAnyLinearThrusterKeyDown()) break; v = -m_ship->GetOrient().VectorZ() * m_setSpeed; if (m_setSpeedTarget) { v += m_setSpeedTarget->GetVelocityRelTo(m_ship->GetFrame()); } m_ship->AIMatchVel(v); break; case CONTROL_FIXHEADING_FORWARD: case CONTROL_FIXHEADING_BACKWARD: PollControls(timeStep, true); if (IsAnyAngularThrusterKeyDown()) break; v = m_ship->GetVelocity().NormalizedSafe(); if (m_flightControlState == CONTROL_FIXHEADING_BACKWARD) v = -v; m_ship->AIFaceDirection(v); break; case CONTROL_MANUAL: PollControls(timeStep, false); break; case CONTROL_AUTOPILOT: if (m_ship->AIIsActive()) break; Pi::game->RequestTimeAccel(Game::TIMEACCEL_1X); // AIMatchVel(vector3d(0.0)); // just in case autopilot doesn't... // actually this breaks last timestep slightly in non-relative target cases m_ship->AIMatchAngVelObjSpace(vector3d(0.0)); if (m_ship->GetFrame()->IsRotFrame()) SetFlightControlState(CONTROL_FIXSPEED); else SetFlightControlState(CONTROL_MANUAL); m_setSpeed = 0.0; break; default: assert(0); break; } } else SetFlightControlState(CONTROL_MANUAL); //call autopilot AI, if active (also applies to set speed and heading lock modes) OS::EnableFPE(); m_ship->AITimeStep(timeStep); OS::DisableFPE(); }
void PlayerShipController::StaticUpdate(const float timeStep) { vector3d v; matrix4x4d m; int mouseMotion[2]; SDL_GetRelativeMouseState (mouseMotion+0, mouseMotion+1); // call to flush // external camera mouselook if (Pi::MouseButtonState(SDL_BUTTON_MIDDLE)) { // not internal camera if (Pi::worldView->GetCamType() != Pi::worldView->CAM_INTERNAL) { MoveableCameraController *mcc = static_cast<MoveableCameraController*>(Pi::worldView->GetCameraController()); const double accel = 0.01; // XXX configurable? mcc->RotateLeft(mouseMotion[0] * accel); mcc->RotateUp( mouseMotion[1] * accel); // only mouselook if the player presses both mmb and rmb mouseMotion[0] = 0; mouseMotion[1] = 0; } } if (m_ship->GetFlightState() == Ship::FLYING) { switch (m_flightControlState) { case CONTROL_FIXSPEED: PollControls(timeStep, true, mouseMotion); if (IsAnyLinearThrusterKeyDown()) break; v = -m_ship->GetOrient().VectorZ() * m_setSpeed; if (m_setSpeedTarget) { v += m_setSpeedTarget->GetVelocityRelTo(m_ship->GetFrame()); } m_ship->AIMatchVel(v); break; case CONTROL_FIXHEADING_FORWARD: case CONTROL_FIXHEADING_BACKWARD: case CONTROL_FIXHEADING_NORMAL: case CONTROL_FIXHEADING_ANTINORMAL: case CONTROL_FIXHEADING_RADIALLY_INWARD: case CONTROL_FIXHEADING_RADIALLY_OUTWARD: case CONTROL_FIXHEADING_KILLROT: PollControls(timeStep, true, mouseMotion); if (IsAnyAngularThrusterKeyDown()) break; v = m_ship->GetVelocity().NormalizedSafe(); if (m_flightControlState == CONTROL_FIXHEADING_BACKWARD || m_flightControlState == CONTROL_FIXHEADING_ANTINORMAL) v = -v; if (m_flightControlState == CONTROL_FIXHEADING_NORMAL || m_flightControlState == CONTROL_FIXHEADING_ANTINORMAL) v = v.Cross(m_ship->GetPosition().NormalizedSafe()); if (m_flightControlState == CONTROL_FIXHEADING_RADIALLY_INWARD) v = -m_ship->GetPosition().NormalizedSafe(); if (m_flightControlState == CONTROL_FIXHEADING_RADIALLY_OUTWARD) v = m_ship->GetPosition().NormalizedSafe(); if (m_flightControlState == CONTROL_FIXHEADING_KILLROT) { v = -m_ship->GetOrient().VectorZ(); if (m_ship->GetAngVelocity().Length() < 0.0001) // fixme magic number SetFlightControlState(CONTROL_MANUAL); } m_ship->AIFaceDirection(v); break; case CONTROL_MANUAL: PollControls(timeStep, false, mouseMotion); break; case CONTROL_AUTOPILOT: if (m_ship->AIIsActive()) break; Pi::game->RequestTimeAccel(Game::TIMEACCEL_1X); // AIMatchVel(vector3d(0.0)); // just in case autopilot doesn't... // actually this breaks last timestep slightly in non-relative target cases m_ship->AIMatchAngVelObjSpace(vector3d(0.0)); if (m_ship->GetFrame()->IsRotFrame()) SetFlightControlState(CONTROL_FIXSPEED); else SetFlightControlState(CONTROL_MANUAL); m_setSpeed = 0.0; break; default: assert(0); break; } } else SetFlightControlState(CONTROL_MANUAL); //call autopilot AI, if active (also applies to set speed and heading lock modes) OS::EnableFPE(); m_ship->AITimeStep(timeStep); OS::DisableFPE(); }