// 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)); } }
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); } }
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)); }
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);
protected abstract void FillInSplitSection(BGCurveBaseMath.SectionInfo section, Vector3[] result, ref int cursor);
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);
//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); }