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); } }
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 )); }