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; } }
private void DrawGuides(SineDeformer sine) { var direction = sine.Axis.forward; var size = HandleUtility.GetHandleSize(sine.Axis.position) * 5f; var baseA = sine.Axis.position - direction * size; var baseB = sine.Axis.position + direction * size; DeformHandles.Line(baseA, baseB, DeformHandles.LineMode.LightDotted); DeformHandles.Line(baseA + sine.Axis.up * sine.Amplitude, baseB + sine.Axis.up * sine.Amplitude, DeformHandles.LineMode.LightDotted); DeformHandles.Line(baseA - sine.Axis.up * sine.Amplitude, baseB - sine.Axis.up * sine.Amplitude, DeformHandles.LineMode.LightDotted); }
private void DrawMagnitudeHandle(SineDeformer sine) { var direction = sine.Axis.up; var magnitudeHandleWorldPosition = sine.Axis.position + direction * sine.Amplitude * sine.Axis.lossyScale.y; using (var check = new EditorGUI.ChangeCheckScope()) { var newMagnitudeWorldPosition = DeformHandles.Slider(magnitudeHandleWorldPosition, direction); if (check.changed) { Undo.RecordObject(sine, "Changed Magnitude"); var newMagnitude = DeformHandlesUtility.DistanceAlongAxis(sine.Axis, sine.Axis.position, newMagnitudeWorldPosition, Axis.Y) / sine.Axis.lossyScale.y; sine.Amplitude = newMagnitude; } } }
private void DrawFrequencyHandle(SineDeformer sine) { var direction = sine.Axis.forward; var frequencyHandleWorldPosition = sine.Axis.position + direction * (1f / sine.Frequency * sine.Axis.lossyScale.z); using (var check = new EditorGUI.ChangeCheckScope()) { var newFrequencyWorldPosition = DeformHandles.Slider(frequencyHandleWorldPosition, direction); if (check.changed) { Undo.RecordObject(sine, "Changed Frequency"); var newFrequency = sine.Axis.lossyScale.z / DeformHandlesUtility.DistanceAlongAxis(sine.Axis, sine.Axis.position, newFrequencyWorldPosition, Axis.Z); sine.Frequency = newFrequency; } } }
void Start() { sine = GetComponentInChildren <SineDeformer>(); }