public void AddBreakPoint(Camera sceneCamera) { float closestPoint = 0; float closestDistance = 0; if (sceneCamera != null) { for (float i = 0; i <= 1; i = i + 0.01f) { float splinePoint = i; Vector3 point = sceneCamera.WorldToViewportPoint(this.GetPoint(i)); if (point.x >= 0 && point.x <= 1 && point.y >= 0 && point.y <= 1) { float distance = Mathf.Pow((point.x - 0.5f), 2) + Mathf.Pow((point.y - 0.5f), 2); if (closestDistance == 0 || distance < closestDistance) { closestDistance = distance; closestPoint = splinePoint; } } } if (closestPoint != 0) { BreakInterval interval = ScriptableObject.CreateInstance <BreakInterval> (); interval._ProgressA = closestPoint - 0.01f; interval._ProgressB = closestPoint + 0.01f; interval.Calculate(this); BreakIntervals.Add(interval); } } }
private void adjustBreakInterval(BreakInterval breakInterval, Vector3 newPosition, BreakInterval.Points pointToHandle) { BezierSpline spline = (BezierSpline)target; Vector3 pointToChange = pointToHandle == BreakInterval.Points.PointA ? breakInterval._PointA : breakInterval._PointB; float directionChange = (pointToChange - newPosition).x / spline.Length; if (pointToHandle == BreakInterval.Points.PointA) { breakInterval._ProgressA = breakInterval._ProgressA - directionChange; if (breakInterval._ProgressA > breakInterval._ProgressB) { breakInterval._ProgressA = breakInterval._ProgressB; } } else { breakInterval._ProgressB = breakInterval._ProgressB - directionChange; if (breakInterval._ProgressB < breakInterval._ProgressA) { breakInterval._ProgressB = breakInterval._ProgressA; } } breakInterval.Calculate(spline); }