void DashSamples( NativeArray <RigidTransform> samples, RoadMarking marking, out NativeList <RigidTransform> dashSamples, out NativeList <DashPoint> dashPoints) { var sampleDistances = SplineUtility.SplineDistanceArray(samples, Allocator.Temp); var totalDist = sampleDistances[sampleDistances.Length - 1]; marking.BeginningOffset %= marking.DashLength; var patternDist = marking.DashLength + marking.SeparationDistance; var numPatterns = (int)(totalDist / patternDist) + 2; var patternPoints = new NativeArray <DashPoint>(numPatterns * 2, Allocator.Temp); var accumulatedDist = marking.BeginningOffset; for (var i = 0; i < patternPoints.Length;) { patternPoints[i++] = new DashPoint { Distance = accumulatedDist, Cap = DashCap.Start }; accumulatedDist += marking.DashLength; patternPoints[i++] = new DashPoint { Distance = accumulatedDist, Cap = DashCap.End }; accumulatedDist += marking.SeparationDistance; } dashSamples = new NativeList <RigidTransform>(patternPoints.Length + sampleDistances.Length, Allocator.Temp); dashPoints = new NativeList <DashPoint>(patternPoints.Length + sampleDistances.Length, Allocator.Temp); dashSamples.Add(samples[0]); dashPoints.Add(new DashPoint { Distance = 0f, Cap = DashCap.End }); for (int i = 1, j = 0; i < samples.Length; i++) { var prevSample = samples[i - 1]; var nextSample = samples[i]; var prevDist = sampleDistances[i - 1]; var nextDist = sampleDistances[i]; var betweenDist = nextDist - prevDist; while (patternPoints[j].Distance < nextDist) { var t = (patternPoints[j].Distance - prevDist) / betweenDist; dashSamples.Add(SplineUtility.LerpTransform(prevSample, nextSample, t)); dashPoints.Add(new DashPoint { Distance = i - 1 + t, Cap = patternPoints[j].Cap }); j++; } dashSamples.Add(nextSample); dashPoints.Add(new DashPoint { Distance = i, Cap = dashPoints[dashPoints.Length - 1].Cap }); } sampleDistances.Dispose(); patternPoints.Dispose(); }