private void DrawCurve(SineDeformer sine) { var forward = sine.Axis.forward; var size = HandleUtility.GetHandleSize(sine.Axis.position) * 5f; var a = sine.Axis.position - (forward * size); var b = sine.Axis.position + (forward * size); var pointSet = false; var lastPointOnCurve = Vector3.zero; for (int i = 0; i <= DeformHandles.DEF_CURVE_SEGMENTS; i++) { var pointOnLine = sine.Axis.worldToLocalMatrix.MultiplyPoint3x4(Vector3.Lerp(a, b, i / (float)DeformHandles.DEF_CURVE_SEGMENTS)); var newPointOnCurve = pointOnLine + Vector3.up * Mathf.Sin((pointOnLine.z * sine.Frequency + sine.GetTotalOffset()) * Mathf.PI * 2f); newPointOnCurve.y *= sine.Amplitude; newPointOnCurve.y *= Mathf.Exp(-sine.Falloff * Mathf.Abs(newPointOnCurve.z)); newPointOnCurve = sine.Axis.localToWorldMatrix.MultiplyPoint3x4(newPointOnCurve); if (pointSet) { DeformHandles.Line(lastPointOnCurve, newPointOnCurve, DeformHandles.LineMode.Solid); } lastPointOnCurve = newPointOnCurve; pointSet = true; } }