#if GLEY_TRAFFIC_SYSTEM using Unity.Burst; using Unity.Collections; using Unity.Jobs; using Unity.Mathematics; using UnityEngine; namespace Gley.TrafficSystem.Internal { /// /// Compotes the suspension force for each wheel /// [BurstCompile] public struct WheelJob : IJobParallelFor { public NativeArray WheelSuspensionForce; public NativeArray WheelSideForce; [ReadOnly] public NativeArray WheelNormalDirection; [ReadOnly] public NativeArray WheelRightDirection; [ReadOnly] public NativeArray WheelVelocity; [ReadOnly] public NativeArray SpringForces; [ReadOnly] public NativeArray WheelRayCastDistance; [ReadOnly] public NativeArray WheelRadius; [ReadOnly] public NativeArray WheelMaxSuspension; [ReadOnly] public NativeArray SpringStiffness; [ReadOnly] public NativeArray StartWheelIndex; [ReadOnly] public NativeArray NrOfVehicleWheels; [ReadOnly] public NativeArray WheelAssociatedVehicle; [ReadOnly] public NativeArray VehicleNrOfWheels; [ReadOnly] public NativeArray ExcludedWheels; public void Execute(int i) { if (ExcludedWheels[i] == true) return; float compression; if (WheelMaxSuspension[i] != 0) { if (WheelRayCastDistance[i] == 0) { compression = 0; } else { compression = 1f - (WheelRayCastDistance[i] - WheelRadius[i]) / WheelMaxSuspension[i]; } WheelSuspensionForce[i] = ComputeSuspensionForce(SpringForces[i], compression, WheelNormalDirection[i], i); } else { compression = 1; WheelSuspensionForce[i] = ComputeSuspensionForce(SpringForces[i], 1, WheelNormalDirection[i], i); } WheelSideForce[i] = -WheelRightDirection[i] * Vector3.Dot(WheelVelocity[i], WheelRightDirection[i]) / VehicleNrOfWheels[WheelAssociatedVehicle[i]]; } float3 ComputeSuspensionForce(float springForce, float compression, float3 normalPoint, int index) { float damping = WheelVelocity[index].y * springForce / 2; float displacement = 0.5f - compression; if (displacement > -0.2f) { displacement = 0; } float force = ((springForce * (compression / 0.5f) - springForce * SpringStiffness[index] * displacement) * normalPoint).y - damping; return new float3(0, force, 0); } } } #endif