From eae9fc36e5797beeb2294de1a50a436780eead40 Mon Sep 17 00:00:00 2001 From: Daniel Buckmaster Date: Tue, 2 Oct 2012 20:45:25 +1000 Subject: [PATCH 1/3] Added steering centre members to VehicleData. steeringReturn is the main control for the amount of return in the steering. Setting it to 0 (the default) disables steering return completely. steeringReturnSpeedScale is a multiplier on the amount of effect that the vehicle's velocity has on its steering return. powerSteering can be set to eliminate the effect of steering return on user input. Without this flag set, the user will have a harder time steering, because the wheels try to return as they steer. If this flag is set, steering return will not be applied while the user is actually steering, only when they release. --- Engine/source/T3D/vehicles/vehicle.cpp | 19 +++++++++++++++++++ Engine/source/T3D/vehicles/vehicle.h | 4 ++++ 2 files changed, 23 insertions(+) diff --git a/Engine/source/T3D/vehicles/vehicle.cpp b/Engine/source/T3D/vehicles/vehicle.cpp index 9496a8148..803ffaf37 100644 --- a/Engine/source/T3D/vehicles/vehicle.cpp +++ b/Engine/source/T3D/vehicles/vehicle.cpp @@ -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->write(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), diff --git a/Engine/source/T3D/vehicles/vehicle.h b/Engine/source/T3D/vehicles/vehicle.h index e8f42acd9..da3b62eeb 100644 --- a/Engine/source/T3D/vehicles/vehicle.h +++ b/Engine/source/T3D/vehicles/vehicle.h @@ -107,6 +107,10 @@ struct VehicleData: public ShapeBaseData F32 jetEnergyDrain; ///< Energy drain/tick F32 minJetEnergy; + F32 steeringReturn; + F32 steeringReturnSpeedScale; + bool powerSteering; + ParticleEmitterData * dustEmitter; S32 dustID; F32 triggerDustHeight; ///< height vehicle has to be under to kick up dust From e3cb30bb1d8cffdfb3e7dd2f72f4d6b631124f08 Mon Sep 17 00:00:00 2001 From: Daniel Buckmaster Date: Wed, 3 Oct 2012 07:23:47 +1000 Subject: [PATCH 2/3] Added steering return to Vehicle. It happens in Vehicle::updateMove so it can apply to all vehicle subclasses. It is applied to both x and y steering. --- Engine/source/T3D/vehicles/vehicle.cpp | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) diff --git a/Engine/source/T3D/vehicles/vehicle.cpp b/Engine/source/T3D/vehicles/vehicle.cpp index 803ffaf37..283b66302 100644 --- a/Engine/source/T3D/vehicles/vehicle.cpp +++ b/Engine/source/T3D/vehicles/vehicle.cpp @@ -1104,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) From b097c76eda12ed615f6d560b82bd30f330216f14 Mon Sep 17 00:00:00 2001 From: Daniel Buckmaster Date: Wed, 3 Oct 2012 07:32:06 +1000 Subject: [PATCH 3/3] Fixed stream read/write mismatch bug. It was causing Vehicles to roll forwards with a constant velocity when stationary, and ignore move->y. --- Engine/source/T3D/vehicles/vehicle.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Engine/source/T3D/vehicles/vehicle.cpp b/Engine/source/T3D/vehicles/vehicle.cpp index 283b66302..f4b58ac61 100644 --- a/Engine/source/T3D/vehicles/vehicle.cpp +++ b/Engine/source/T3D/vehicles/vehicle.cpp @@ -298,7 +298,7 @@ void VehicleData::packData(BitStream* stream) stream->write(steeringReturn); stream->write(steeringReturnSpeedScale); - stream->write(powerSteering); + stream->writeFlag(powerSteering); stream->writeFlag(cameraRoll); stream->write(cameraLag);