68 lines
1.5 KiB
C#
68 lines
1.5 KiB
C#
using Sandbox;
|
|
using System;
|
|
|
|
namespace VeloX;
|
|
|
|
public partial class WheelPowertrain : PowertrainComponent
|
|
{
|
|
protected override void OnAwake()
|
|
{
|
|
base.OnAwake();
|
|
Name ??= Wheel.ToString();
|
|
}
|
|
[Property] public VeloXWheel Wheel { get; set; }
|
|
|
|
protected override void OnStart()
|
|
{
|
|
_initialRollingResistance = Wheel.RollingResistanceTorque;
|
|
}
|
|
private float _initialRollingResistance;
|
|
|
|
public override float QueryAngularVelocity( float angularVelocity, float dt )
|
|
{
|
|
InputAngularVelocity = OutputAngularVelocity = Wheel.AngularVelocity;
|
|
|
|
return OutputAngularVelocity;
|
|
}
|
|
|
|
public override float QueryInertia()
|
|
{
|
|
// Calculate the base inertia of the wheel and scale it by the inverse of the dt.
|
|
float dtScale = Math.Clamp( Time.Delta, 0.01f, 0.05f ) / 0.005f;
|
|
float radius = Wheel.Radius;
|
|
return 0.5f * Wheel.Mass * radius * radius * dtScale;
|
|
}
|
|
|
|
public void ApplyRollingResistanceMultiplier( float multiplier )
|
|
{
|
|
|
|
Wheel.RollingResistanceTorque = _initialRollingResistance * multiplier;
|
|
}
|
|
public override float ForwardStep( float torque, float inertiaSum, float dt )
|
|
{
|
|
InputTorque = torque;
|
|
InputInertia = inertiaSum;
|
|
|
|
OutputTorque = InputTorque;
|
|
OutputInertia = Wheel.BaseInertia + inertiaSum;
|
|
|
|
Wheel.DriveTorque = OutputTorque;
|
|
Wheel.Inertia = OutputInertia;
|
|
|
|
Wheel.AutoSimulate = false;
|
|
Wheel.StepPhys( Controller, dt );
|
|
|
|
return Math.Abs( Wheel.CounterTorque );
|
|
}
|
|
|
|
protected override void DrawGizmos()
|
|
{
|
|
|
|
if ( !Gizmo.IsSelected )
|
|
return;
|
|
Gizmo.Transform = Wheel.WorldTransform;
|
|
Wheel?.GizmoDraw();
|
|
|
|
}
|
|
}
|