|
@@ -172,6 +172,10 @@ VehicleData::VehicleData()
|
|
|
jetEnergyDrain = 0.8f;
|
|
|
minJetEnergy = 1;
|
|
|
|
|
|
+ steeringReturn = 0.0f;
|
|
|
+ steeringReturnSpeedScale = 0.01f;
|
|
|
+ powerSteering = false;
|
|
|
+
|
|
|
for (S32 i = 0; i < Body::MaxSounds; i++)
|
|
|
body.sound[i] = 0;
|
|
|
|
|
@@ -292,6 +296,10 @@ void VehicleData::packData(BitStream* stream)
|
|
|
stream->write(jetEnergyDrain);
|
|
|
stream->write(minJetEnergy);
|
|
|
|
|
|
+ stream->write(steeringReturn);
|
|
|
+ stream->write(steeringReturnSpeedScale);
|
|
|
+ stream->writeFlag(powerSteering);
|
|
|
+
|
|
|
stream->writeFlag(cameraRoll);
|
|
|
stream->write(cameraLag);
|
|
|
stream->write(cameraDecay);
|
|
@@ -384,6 +392,10 @@ void VehicleData::unpackData(BitStream* stream)
|
|
|
stream->read(&jetEnergyDrain);
|
|
|
stream->read(&minJetEnergy);
|
|
|
|
|
|
+ stream->read(&steeringReturn);
|
|
|
+ stream->read(&steeringReturnSpeedScale);
|
|
|
+ powerSteering = stream->readFlag();
|
|
|
+
|
|
|
cameraRoll = stream->readFlag();
|
|
|
stream->read(&cameraLag);
|
|
|
stream->read(&cameraDecay);
|
|
@@ -462,6 +474,13 @@ void VehicleData::initPersistFields()
|
|
|
addField( "minJetEnergy", TypeF32, Offset(minJetEnergy, VehicleData),
|
|
|
"Minimum vehicle energy level to begin jetting." );
|
|
|
|
|
|
+ addField( "steeringReturn", TypeF32, Offset(steeringReturn, VehicleData),
|
|
|
+ "Rate at which the vehicle's steering returns to forwards when it is moving." );
|
|
|
+ addField( "steeringReturnSpeedScale", TypeF32, Offset(steeringReturnSpeedScale, VehicleData),
|
|
|
+ "Amount of effect the vehicle's speed has on its rate of steering return." );
|
|
|
+ addField( "powerSteering", TypeBool, Offset(powerSteering, VehicleData),
|
|
|
+ "If true, steering does not auto-centre while the vehicle is being steered by its driver." );
|
|
|
+
|
|
|
addField( "massCenter", TypePoint3F, Offset(massCenter, VehicleData),
|
|
|
"Defines the vehicle's center of mass (offset from the origin of the model)." );
|
|
|
addField( "massBox", TypePoint3F, Offset(massBox, VehicleData),
|
|
@@ -1085,6 +1104,22 @@ void Vehicle::updateMove(const Move* move)
|
|
|
mSteering.y = 0;
|
|
|
}
|
|
|
|
|
|
+ // Steering return
|
|
|
+ if(mDataBlock->steeringReturn > 0.0f &&
|
|
|
+ (!mDataBlock->powerSteering || (move->yaw == 0.0f && move->pitch == 0.0f)))
|
|
|
+ {
|
|
|
+ Point2F returnAmount(mSteering.x * mDataBlock->steeringReturn * TickSec,
|
|
|
+ mSteering.y * mDataBlock->steeringReturn * TickSec);
|
|
|
+ if(mDataBlock->steeringReturnSpeedScale > 0.0f)
|
|
|
+ {
|
|
|
+ Point3F vel;
|
|
|
+ mWorldToObj.mulV(getVelocity(), &vel);
|
|
|
+ returnAmount += Point2F(mSteering.x * vel.y * mDataBlock->steeringReturnSpeedScale * TickSec,
|
|
|
+ mSteering.y * vel.y * mDataBlock->steeringReturnSpeedScale * TickSec);
|
|
|
+ }
|
|
|
+ mSteering -= returnAmount;
|
|
|
+ }
|
|
|
+
|
|
|
// Jetting flag
|
|
|
if (move->trigger[3]) {
|
|
|
if (!mJetting && getEnergyLevel() >= mDataBlock->minJetEnergy)
|