Пример #1
0
        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();
        }