Пример #1
0
        public void Bind(List <Vector3> positions, BGCcMath math, Config config, List <BGCcSplitterPolyline.PolylinePoint> points)
        {
            positions.Clear();
            points.Clear();

            var tangentCalculated = math.IsCalculated(BGCurveBaseMath.Field.Tangent);
            var baseMath          = math.Math;
            var sectionsCount     = baseMath.SectionsCount;

            //count number of straight lines
            var straightLinesCount = 0;

            if (!config.DoNotOptimizeStraightLines)
            {
                //resize only if length < sectionsCount to reduce GC
                if (straightBits == null || straightBits.Length < sectionsCount)
                {
                    Array.Resize(ref straightBits, sectionsCount);
                }
                straightLinesCount = CountStraightLines(baseMath, straightBits);
            }


            //recalculate points
            InitProvider(ref positionsProvider, math, config).Build(positions, straightLinesCount, straightBits, points);

            if (!config.UseLocal)
            {
                return;
            }

            //slow convertion (world->local)
            var matrix = config.Transform.worldToLocalMatrix;
            var count  = positions.Count;

            for (var i = 0; i < count; i++)
            {
                var localPos = matrix.MultiplyPoint(positions[i]);
                positions[i] = localPos;

                var point = points[i];
                points[i] = new BGCcSplitterPolyline.PolylinePoint(localPos, point.Distance, tangentCalculated ? config.Transform.InverseTransformDirection(point.Tangent) : Vector3.zero);
            }
        }
Пример #2
0
            private void Add(BGCurveBaseMath.SectionInfo section, List <Vector3> positions, List <BGCcSplitterPolyline.PolylinePoint> points, BGCcSplitterPolyline.PolylinePoint previousPoint,
                             BGCurveBaseMath.SectionPointInfo nextPoint, float ratio)
            {
                var pos = Vector3.Lerp(previousPoint.Position, nextPoint.Position, ratio);

                positions.Add(pos);
                points.Add(new BGCcSplitterPolyline.PolylinePoint(
                               pos,
                               Mathf.Lerp(previousPoint.Distance, section.DistanceFromStartToOrigin + nextPoint.DistanceToSectionStart, ratio),
                               calculatingTangents ? Vector3.Lerp(previousPoint.Tangent, nextPoint.Tangent, ratio) : Vector3.zero
                               ));
            }