// add points for a split section
            protected override void FillInSplitSection(BGCurveBaseMath.SectionInfo section, List <Vector3> result)
            {
                if (LastPointAdded)
                {
                    return;
                }

                var sectionPoints = section.Points;
                var count         = sectionPoints.Count;

                for (var j = 1; j < count; j++)
                {
                    var point = sectionPoints[j];

                    if (DistanceMinConstrained && result.Count == 0)
                    {
                        AddFirstPointIfNeeded(result, section, point, sectionPoints[j - 1]);
                    }

                    if (DistanceMaxConstrained && AddLastPointIfNeeded(result, section, point, sectionPoints[j - 1]))
                    {
                        break;
                    }

                    result.Add(point.Position);
                }
            }
            //if distanceMin is used, we need to add additional point
            protected bool AddLastPointIfNeeded(List <Vector3> positions, BGCurveBaseMath.SectionInfo section,
                                                BGCurveBaseMath.SectionPointInfo currentPoint, BGCurveBaseMath.SectionPointInfo previousPoint, List <BGCcSplitterPolyline.PolylinePoint> points)
            {
                var currentPointDistance = currentPoint.DistanceToSectionStart + section.DistanceFromStartToOrigin;

                if (!(currentPointDistance > DistanceMax))
                {
                    return(false);
                }

                //there are 2 options: 1) prev point is in the list 2) prevpoint=previousPoint
                //we can determine it by sqrMagnitude
                var lastPointInTheListMagnitude = Vector3.SqrMagnitude(positions[positions.Count - 1] - currentPoint.Position);
                var prevPointMagnitude          = Vector3.SqrMagnitude(previousPoint.Position - currentPoint.Position);

                if (lastPointInTheListMagnitude > prevPointMagnitude)
                {
                    var distanceToAdd = currentPointDistance - DistanceMax;
                    LastPointAdded = true;
                    var ratio = distanceToAdd / (currentPoint.DistanceToSectionStart - previousPoint.DistanceToSectionStart);
                    Add(section, positions, points, previousPoint, currentPoint, ratio);
//                    positions.Add(Vector3.Lerp(previousPoint.Position, currentPoint.Position, ratio));
                }
                else
                {
                    var distanceToLastPoint = Mathf.Sqrt(lastPointInTheListMagnitude);
                    var distanceToMaxPoint  = currentPointDistance - DistanceMax;
                    var ratio = 1 - distanceToMaxPoint / distanceToLastPoint;
                    Add(section, positions, points, points[positions.Count - 1], currentPoint, ratio);
//                    positions.Add(Vector3.Lerp(positions[positions.Count - 1], currentPoint.Position, ratio));
                }

                return(true);
            }
            // add points for a split section
            protected override void FillInSplitSection(BGCurveBaseMath.SectionInfo section, List <Vector3> result, List <BGCcSplitterPolyline.PolylinePoint> points)
            {
                if (LastPointAdded)
                {
                    return;
                }

                var sectionPoints = section.Points;
                var count         = sectionPoints.Count;

                for (var j = 1; j < count; j++)
                {
                    var point = sectionPoints[j];

                    if (DistanceMinConstrained && result.Count == 0)
                    {
                        AddFirstPointIfNeeded(result, section, point, sectionPoints[j - 1], points);
                    }

                    if (DistanceMaxConstrained && AddLastPointIfNeeded(result, section, point, sectionPoints[j - 1], points))
                    {
                        break;
                    }

                    result.Add(point.Position);
                    points.Add(new BGCcSplitterPolyline.PolylinePoint(
                                   point.Position,
                                   section.DistanceFromStartToOrigin + point.DistanceToSectionStart,
                                   calculatingTangents ? point.Tangent : Vector3.zero));
                }
            }
Beispiel #4
0
            protected static void FillIn(BGCurveBaseMath.SectionInfo section, Vector3[] result, ref int cursor, int parts)
            {
                var onePartDistance = section.Distance / parts;

                for (var j = 1; j <= parts; j++)
                {
                    Vector3 tangent;
                    section.CalcByDistance(onePartDistance * j, out result[cursor++], out tangent, true, false);
                }
            }
Beispiel #5
0
            protected override void FillInSplitSection(BGCurveBaseMath.SectionInfo section, Vector3[] result, ref int cursor)
            {
                var sectionPoints = section.Points;
                var count         = sectionPoints.Length;

                for (var j = 1; j < count; j++)
                {
                    result[cursor++] = sectionPoints[j].Position;
                }
            }
            // add points for a split section
            protected override void FillInSplitSection(BGCurveBaseMath.SectionInfo section, List <Vector3> result)
            {
                var sectionPoints = section.Points;
                var count         = sectionPoints.Count;

                for (var j = 1; j < count; j++)
                {
                    result.Add(sectionPoints[j].Position);
                }
            }
            // add points for a section by a given number of points
            protected static void FillIn(BGCurveBaseMath.SectionInfo section, List <Vector3> result, int parts)
            {
                var onePartDistance = section.Distance / parts;

                for (var j = 1; j <= parts; j++)
                {
                    Vector3 tangent;
                    Vector3 pos;
                    section.CalcByDistance(onePartDistance * j, out pos, out tangent, true, false);
                    result.Add(pos);
                }
            }
            //add position and point
            private void Add(BGCurveBaseMath.SectionInfo section, List <Vector3> positions, List <BGCcSplitterPolyline.PolylinePoint> points, BGCurveBaseMath.SectionPointInfo previousPoint,
                             BGCurveBaseMath.SectionPointInfo nextPoint, float ratio)
            {
                var pos = Vector3.Lerp(previousPoint.Position, nextPoint.Position, ratio);

                positions.Add(pos);
                points.Add(new BGCcSplitterPolyline.PolylinePoint(
                               pos,
                               section.DistanceFromStartToOrigin + Mathf.Lerp(previousPoint.DistanceToSectionStart, nextPoint.DistanceToSectionStart, ratio),
                               calculatingTangents ? Vector3.Lerp(previousPoint.Tangent, nextPoint.Tangent, ratio) : Vector3.zero
                               ));
            }
            // add points for a split section
            protected override void FillInSplitSection(BGCurveBaseMath.SectionInfo section, List <Vector3> result)
            {
                //curved
                var partsForSection = partsPerSectionFloor;

                if (reminderForCurved > 0)
                {
                    partsForSection++;
                    reminderForCurved--;
                }

                FillIn(section, result, partsForSection);
            }
            // add points for a split section
            protected override void FillInSplitSection(BGCurveBaseMath.SectionInfo section, List <Vector3> result, List <BGCcSplitterPolyline.PolylinePoint> points)
            {
                //curved
                var partsForSection = partsPerSectionFloor;

                if (reminderForCurved > 0)
                {
                    partsForSection++;
                    reminderForCurved--;
                }

                FillIn(section, result, partsForSection, points);
            }
            // add points for a section by a given number of points
            protected void FillIn(BGCurveBaseMath.SectionInfo section, List <Vector3> result, int parts, List <BGCcSplitterPolyline.PolylinePoint> points)
            {
                var onePartDistance = section.Distance / parts;

                for (var j = 1; j <= parts; j++)
                {
                    Vector3 tangent;
                    Vector3 pos;
                    var     currentDistance = onePartDistance * j;
                    section.CalcByDistance(currentDistance, out pos, out tangent, true, calculatingTangents);
                    result.Add(pos);
                    points.Add(new BGCcSplitterPolyline.PolylinePoint(pos, section.DistanceFromStartToOrigin + currentDistance, tangent));
                }
            }
            //if distanceMin is used, we need to add additional point
            protected void AddFirstPointIfNeeded(List <Vector3> positions, BGCurveBaseMath.SectionInfo section,
                                                 BGCurveBaseMath.SectionPointInfo firstPointInRange, BGCurveBaseMath.SectionPointInfo previousPoint, List <BGCcSplitterPolyline.PolylinePoint> points)
            {
                var firstPointDistance = firstPointInRange.DistanceToSectionStart + section.DistanceFromStartToOrigin;
                var distanceToAdd      = firstPointDistance - DistanceMin;

                if (!(distanceToAdd > BGCurve.Epsilon))
                {
                    return;
                }

                var ratio = 1 - distanceToAdd / (firstPointInRange.DistanceToSectionStart - previousPoint.DistanceToSectionStart);

                Add(section, positions, points, previousPoint, firstPointInRange, ratio);
            }
            //if distanceMin is used, we need to add additional point
            protected void AddFirstPointIfNeeded(List <Vector3> positions, BGCurveBaseMath.SectionInfo section,
                                                 BGCurveBaseMath.SectionPointInfo firstPointInRange, BGCurveBaseMath.SectionPointInfo previousPoint)
            {
                var firstPointDistance = firstPointInRange.DistanceToSectionStart + section.DistanceFromStartToOrigin;
                var distanceToAdd      = firstPointDistance - DistanceMin;

                if (!(distanceToAdd > BGCurve.Epsilon))
                {
                    return;
                }

                var ratio = 1 - distanceToAdd / (firstPointInRange.DistanceToSectionStart - previousPoint.DistanceToSectionStart);

                positions.Add(Vector3.Lerp(previousPoint.Position, firstPointInRange.Position, ratio));
            }
Beispiel #14
0
        protected void DrawSection(BGCurveBaseMath.SectionInfo section)
        {
            if (section.PointsCount < 2)
            {
                return;
            }

            var points    = section.Points;
            var prevPoint = points[0];

            for (var i = 1; i < points.Length; i++)
            {
                var nexPoint = points[i];
                DrawLine(prevPoint.Position, nexPoint.Position);
                prevPoint = nexPoint;
            }
        }
 // add points for a split section
 protected override void FillInSplitSection(BGCurveBaseMath.SectionInfo section, List <Vector3> result, List <BGCcSplitterPolyline.PolylinePoint> points)
 {
     FillIn(section, result, parts, points);
 }
 // add points for a split section
 protected abstract void FillInSplitSection(BGCurveBaseMath.SectionInfo section, List <Vector3> result, List <BGCcSplitterPolyline.PolylinePoint> points);
Beispiel #17
0
 protected abstract void FillInSplitSection(BGCurveBaseMath.SectionInfo section, Vector3[] result, ref int cursor);
Beispiel #18
0
 protected override void FillInSplitSection(BGCurveBaseMath.SectionInfo section, Vector3[] result, ref int cursor)
 {
     FillIn(section, result, ref cursor, parts);
 }
 // add points for a split section
 protected abstract void FillInSplitSection(BGCurveBaseMath.SectionInfo section, List <Vector3> result);
Beispiel #20
0
        //max distance between a point and a section
        private static float MaxDistance(BGCurveBaseMath.SectionInfo section, Vector3 position)
        {
//        var fromDistance = Vector3.SqrMagnitude(section.OriginalFrom - position);
            var deltaX       = section.OriginalFrom.x - position.x;
            var deltaY       = section.OriginalFrom.y - position.y;
            var deltaZ       = section.OriginalFrom.z - position.z;
            var fromDistance = deltaX * deltaX + deltaY * deltaY + deltaZ * deltaZ;


//        var toDistance = Vector3.SqrMagnitude(section.OriginalTo - position);
            deltaX = section.OriginalTo.x - position.x;
            deltaY = section.OriginalTo.y - position.y;
            deltaZ = section.OriginalTo.z - position.z;
            var toDistance = deltaX * deltaX + deltaY * deltaY + deltaZ * deltaZ;


            var   fromControlAbsent = section.OriginalFromControlType == BGCurvePoint.ControlTypeEnum.Absent;
            var   toControlAbsent   = section.OriginalToControlType == BGCurvePoint.ControlTypeEnum.Absent;
            float maxDistance;

            if (fromControlAbsent && toControlAbsent)
            {
                maxDistance = Mathf.Max(fromDistance, toDistance);
            }
            else
            {
                if (fromControlAbsent)
                {
                    //        var toControlDistance = Vector3.SqrMagnitude(section.OriginalToControl - position);
                    deltaX = section.OriginalToControl.x - position.x;
                    deltaY = section.OriginalToControl.y - position.y;
                    deltaZ = section.OriginalToControl.z - position.z;
                    var toControlDistance = deltaX * deltaX + deltaY * deltaY + deltaZ * deltaZ;


                    maxDistance = Mathf.Max(Mathf.Max(fromDistance, toDistance), toControlDistance);
                }
                else if (toControlAbsent)
                {
                    //        var fromControlDistance = Vector3.SqrMagnitude(section.OriginalFromControl - position);
                    deltaX = section.OriginalFromControl.x - position.x;
                    deltaY = section.OriginalFromControl.y - position.y;
                    deltaZ = section.OriginalFromControl.z - position.z;
                    var fromControlDistance = deltaX * deltaX + deltaY * deltaY + deltaZ * deltaZ;


                    maxDistance = Mathf.Max(Mathf.Max(fromDistance, toDistance), fromControlDistance);
                }
                else
                {
                    //        var fromControlDistance = Vector3.SqrMagnitude(section.OriginalFromControl - position);
                    deltaX = section.OriginalFromControl.x - position.x;
                    deltaY = section.OriginalFromControl.y - position.y;
                    deltaZ = section.OriginalFromControl.z - position.z;
                    var fromControlDistance = deltaX * deltaX + deltaY * deltaY + deltaZ * deltaZ;

                    //        var toControlDistance = Vector3.SqrMagnitude(section.OriginalToControl - position);
                    deltaX = section.OriginalToControl.x - position.x;
                    deltaY = section.OriginalToControl.y - position.y;
                    deltaZ = section.OriginalToControl.z - position.z;
                    var toControlDistance = deltaX * deltaX + deltaY * deltaY + deltaZ * deltaZ;

                    maxDistance = Mathf.Max(Mathf.Max(Mathf.Max(fromDistance, toDistance), fromControlDistance), toControlDistance);
                }
            }

            return(maxDistance);
        }
 // add points for a split section
 protected override void FillInSplitSection(BGCurveBaseMath.SectionInfo section, List <Vector3> result)
 {
     FillIn(section, result, parts);
 }