public override void DrawScene() { if (selectedPoints.Count == 0) { return; } if (rotateNormals) { Handles.color = new Color(Color.yellow.r, Color.yellow.g, Color.yellow.b, 0.4f); for (int i = 0; i < selectedPoints.Count; i++) { Vector3 normal = points[selectedPoints[i]].normal; normal *= HandleUtility.GetHandleSize(points[selectedPoints[i]].position); Handles.DrawLine(points[selectedPoints[i]].position, points[selectedPoints[i]].position + normal); SplineEditorHandles.DrawArrowCap(points[selectedPoints[i]].position + normal, Quaternion.LookRotation(normal), HandleUtility.GetHandleSize(points[selectedPoints[i]].position)); } } Handles.color = Color.white; Quaternion lastRotation = rotation; rotation = Handles.RotationHandle(lastRotation, selectionCenter); if (lastRotation != rotation) { RecordUndo("Rotate Points"); PrepareTransform(); for (int i = 0; i < selectedPoints.Count; i++) { points[selectedPoints[i]] = localPoints[selectedPoints[i]]; TransformPoint(ref points[selectedPoints[i]], rotateNormals, rotateTangents); } SetDirty(); } }
protected override void KeyHandles(SplineSampleModifier.Key key, bool edit) { RotationModifier.RotationKey rotationKey = (RotationModifier.RotationKey)key; SplineSample result = new SplineSample(); user.spline.Evaluate(rotationKey.position, result); if (rotationKey.useLookTarget) { if (rotationKey.target != null) { Handles.DrawDottedLine(result.position, rotationKey.target.position, 5f); if (edit) { Vector3 lastPos = rotationKey.target.position; rotationKey.target.position = Handles.PositionHandle(rotationKey.target.position, Quaternion.identity); if (lastPos != rotationKey.target.position) { user.Rebuild(); } } } } else { Quaternion directionRot = Quaternion.LookRotation(result.forward, result.up); Quaternion rot = directionRot * Quaternion.Euler(rotationKey.rotation); SplineEditorHandles.DrawArrowCap(result.position, rot, HandleUtility.GetHandleSize(result.position)); if (edit) { Vector3 lastEuler = rot.eulerAngles; rot = Handles.RotationHandle(rot, result.position); rot = Quaternion.Inverse(directionRot) * rot; rotationKey.rotation = rot.eulerAngles; if (rot.eulerAngles != lastEuler) { user.Rebuild(); } } } base.KeyHandles(key, edit); }