public void Execute(int index) { var range = RoadSplineRanges[index]; var roadEntity = RoadEntities[index]; RoadCenterLineDataComponents[roadEntity] = new RoadCenterLineData { StreetId = range.StreetId, StartIntersection = range.StartIntersectionEntity, EndIntersection = range.EndIntersectionEntity }; var splineBuffer = RoadSplineSampleBuffers[range.SplineEntity].Reinterpret <RigidTransform>(); var roadBuffer = RoadCenterLineSampleBuffers[roadEntity].Reinterpret <RigidTransform>(); // Get nearest integer spline indices var firstIntegerIdx = (int)math.floor(range.StartIndex + 1f); var lastIntegerIdx = (int)math.ceil(range.EndIndex - 1f); // Add first point if between spline indices if (!Utilities.GeometryUtility.ApproximatelyEqual(range.StartIndex, firstIntegerIdx)) { roadBuffer.Add(SplineUtility.LerpTransform( splineBuffer[firstIntegerIdx - 1], splineBuffer[firstIntegerIdx], range.StartIndex - (firstIntegerIdx - 1))); } // Intermediate points for (var i = firstIntegerIdx; i <= lastIntegerIdx; i++) { roadBuffer.Add(splineBuffer[i]); } // Add last point if between spline indices if (!Utilities.GeometryUtility.ApproximatelyEqual(range.EndIndex, lastIntegerIdx)) { roadBuffer.Add(SplineUtility.LerpTransform( splineBuffer[lastIntegerIdx], splineBuffer[lastIntegerIdx + 1], range.EndIndex - lastIntegerIdx)); } }
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(); }