Compare commits

...

3 Commits

Author SHA1 Message Date
b978b821fa peak long drag 2025-11-21 20:21:36 +07:00
562750107a fix aboba 2025-11-21 17:52:48 +07:00
6cb8f716b3 new cars and maps 2025-11-21 17:52:25 +07:00
9 changed files with 50 additions and 12 deletions

View File

@ -117,10 +117,10 @@ public partial class Clutch : PowertrainComponent
ClutchInput = 1f; ClutchInput = 1f;
} }
if ( Controller.SwappedBrakes > 0 ) //if ( Controller.SwappedBrakes > 0 )
{ //{
ClutchInput = 0; // ClutchInput = 0;
} //}
} }
if ( Controller.IsClutching > 0 ) if ( Controller.IsClutching > 0 )
{ {
@ -173,7 +173,7 @@ public partial class Clutch : PowertrainComponent
OutputInertia = (inertiaSum + halfClutchInertia) * _clutchEngagement + halfClutchInertia; OutputInertia = (inertiaSum + halfClutchInertia) * _clutchEngagement + halfClutchInertia;
// Allow the torque output to be only up to the slip torque valu // Allow the torque output to be only up to the slip torque valu
float outputTorqueClamp = SlipTorque * _clutchEngagement; float outputTorqueClamp = Controller.Engine.EstimatedPeakTorque * 1.5f * _clutchEngagement;
OutputTorque = InputTorque; OutputTorque = InputTorque;
OutputTorque = Math.Clamp( OutputTorque, 0, outputTorqueClamp ); OutputTorque = Math.Clamp( OutputTorque, 0, outputTorqueClamp );

View File

@ -34,6 +34,8 @@ public abstract partial class VeloXBase
public float SwappedBrakes => IsInputSwapped ? Throttle : Brakes; public float SwappedBrakes => IsInputSwapped ? Throttle : Brakes;
public bool AnyInput => Throttle > 0 || Brakes > 0;
[Sync] [Sync]
public float VerticalInput public float VerticalInput
{ {
@ -106,7 +108,11 @@ public abstract partial class VeloXBase
} }
protected void UpdateInput() protected void UpdateInput()
{ {
VerticalInput = Input.AnalogMove.x; //VerticalInput = Input.AnalogMove.x;
Brakes = Input.Brake;
Throttle = Input.Throttle;
Handbrake = Input.Down( "Handbrake" ) ? 1 : 0; Handbrake = Input.Down( "Handbrake" ) ? 1 : 0;
SteeringAngle = Input.AnalogMove.y; SteeringAngle = Input.AnalogMove.y;

View File

@ -42,12 +42,12 @@ public abstract partial class VeloXBase
} }
else else
{ {
v.BrakeTorque = SwappedBrakes * BrakeForce * 0.7f; v.BrakeTorque = SwappedBrakes * BrakeForce * 0.2f;
v.BrakeTorque += Handbrake * HandbrakeForce; v.BrakeTorque += Handbrake * HandbrakeForce;
} }
if ( TotalSpeed < 1 && Input.AnalogMove.x == 0 ) if ( TotalSpeed < 1 && !AnyInput )
{ {
v.BrakeTorque = HandbrakeForce; v.BrakeTorque = HandbrakeForce;
} }

View File

@ -249,11 +249,14 @@ public partial class VeloXWheel
{ {
lowSpeedReferenceIsSet = false; lowSpeedReferenceIsSet = false;
} }
ForwardFriction.Force = Math.Clamp( ForwardFriction.Force, -peakForwardFrictionForce, peakForwardFrictionForce ); ForwardFriction.Force = Math.Clamp( ForwardFriction.Force, -peakForwardFrictionForce, peakForwardFrictionForce );
SidewayFriction.Force = Math.Clamp( SidewayFriction.Force, -peakSideFrictionForce, peakSideFrictionForce ); SidewayFriction.Force = Math.Clamp( SidewayFriction.Force, -peakSideFrictionForce, peakSideFrictionForce );
if ( absForwardSpeed > 2f || absAngularVelocity > 4f )
if ( absForwardSpeed > 0.01f || absAngularVelocity > 0.01f )
{ {
float forwardSlipPercent = ForwardFriction.Slip / Tire.GetPeakSlip(); float forwardSlipPercent = ForwardFriction.Slip / Tire.GetPeakSlip();
@ -261,7 +264,7 @@ public partial class VeloXWheel
float slipCircleLimit = MathF.Sqrt( forwardSlipPercent * forwardSlipPercent + sideSlipPercent * sideSlipPercent ); float slipCircleLimit = MathF.Sqrt( forwardSlipPercent * forwardSlipPercent + sideSlipPercent * sideSlipPercent );
if ( slipCircleLimit > 1f ) if ( slipCircleLimit > 1f )
{ {
float beta = MathF.Atan2( sideSlipPercent, forwardSlipPercent * 0.9f ); float beta = MathF.Atan2( sideSlipPercent, forwardSlipPercent * 1.05f );
float sinBeta = MathF.Sin( beta ); float sinBeta = MathF.Sin( beta );
float cosBeta = MathF.Cos( beta ); float cosBeta = MathF.Cos( beta );

View File

@ -1,4 +1,5 @@
using Sandbox; using Sandbox;
using System;
namespace VeloX; namespace VeloX;

View File

@ -61,6 +61,7 @@ public partial class VeloXWheel : Component
internal void Update( VeloXBase vehicle, in float dt ) internal void Update( VeloXBase vehicle, in float dt )
{ {
UpdateVisuals( vehicle, dt ); UpdateVisuals( vehicle, dt );
} }
private void UpdateVisuals( VeloXBase vehicle, in float dt ) private void UpdateVisuals( VeloXBase vehicle, in float dt )

View File

@ -40,7 +40,7 @@ public partial class VeloXCar
_sideArea = Dimensions.y * Dimensions.z * 0.8f; _sideArea = Dimensions.y * Dimensions.z * 0.8f;
_forwardSpeed = LocalVelocity.x.InchToMeter(); _forwardSpeed = LocalVelocity.x.InchToMeter();
_sideSpeed = LocalVelocity.y.InchToMeter(); _sideSpeed = LocalVelocity.y.InchToMeter();
longitudinalDragForce = 0.5f * RHO * _frontalArea * FrontalCd * (_forwardSpeed * _forwardSpeed) * (_forwardSpeed > 0 ? -1f : 1f); longitudinalDragForce = 2 * RHO * _frontalArea * FrontalCd * (_forwardSpeed * _forwardSpeed) * (_forwardSpeed > 0 ? -1f : 1f);
lateralDragForce = 0.5f * RHO * _sideArea * SideCd * (_sideSpeed * _sideSpeed) * (_sideSpeed > 0 ? -1f : 1f); lateralDragForce = 0.5f * RHO * _sideArea * SideCd * (_sideSpeed * _sideSpeed) * (_sideSpeed > 0 ? -1f : 1f);
var force = new Vector3( longitudinalDragForce.MeterToInch(), lateralDragForce.MeterToInch(), 0 ).RotateAround( Vector3.Zero, WorldRotation ); var force = new Vector3( longitudinalDragForce.MeterToInch(), lateralDragForce.MeterToInch(), 0 ).RotateAround( Vector3.Zero, WorldRotation );
Body.ApplyForce( force ); Body.ApplyForce( force );

View File

@ -1,6 +1,7 @@
using Sandbox; using Sandbox;
namespace VeloX; namespace VeloX;
public class InputResolver public class InputResolver
{ {
public Connection Driver { get; internal set; } public Connection Driver { get; internal set; }
@ -30,6 +31,27 @@ public class InputResolver
return IsDriverActive && Input.Down( action ); return IsDriverActive && Input.Down( action );
} }
public float Brake
{
get
{
if ( Input.UsingController )
return Input.GetAnalog( InputAnalog.LeftTrigger );
return Input.Down( "Brake" ) ? 1 : 0;
}
}
public float Throttle
{
get
{
if ( Input.UsingController )
return Input.GetAnalog( InputAnalog.RightTrigger );
return Input.Down( "Throttle" ) ? 1 : 0;
}
}
public bool Pressed( string action ) public bool Pressed( string action )
{ {
return IsDriverActive && Input.Pressed( action ); return IsDriverActive && Input.Pressed( action );
@ -40,6 +62,11 @@ public class InputResolver
return IsDriverActive && Input.Released( action ); return IsDriverActive && Input.Released( action );
} }
public float GetAnalog( InputAnalog analog )
{
return IsDriverActive ? Input.GetAnalog( analog ) : 0f;
}
public void TriggerHaptics( float leftMotor, float rightMotor, float leftTrigger = 0f, float rightTrigger = 0f, int duration = 500 ) public void TriggerHaptics( float leftMotor, float rightMotor, float leftTrigger = 0f, float rightTrigger = 0f, int duration = 500 )
{ {
if ( IsDriverActive ) if ( IsDriverActive )