void OnUndoRedo() { var splines = DTSelection.GetAllAs <CurvySpline>(); var cps = DTSelection.GetAllAs <CurvySplineSegment>(); foreach (var cp in cps) { if (!splines.Contains(cp.Spline)) { splines.Add(cp.Spline); } } foreach (var spl in splines) { spl.SyncSplineFromHierarchy(); spl.SetDirtyAll(); spl.Refresh(); } }
public override void OnGUI(Rect position, SerializedProperty property, GUIContent label) { var mControlRect = position; CGResourceManagerAttribute A = (CGResourceManagerAttribute)attribute; var lst = this.GetPropertySourceField <ICGResourceCollection>(property); label = EditorGUI.BeginProperty(position, label, property); if (lst != null) { if (lst.Count > 0) { label.text += string.Format("[{0}]", lst.Count); } EditorGUI.PrefixLabel(mControlRect, label); mControlRect.x = (A.ReadOnly) ? mControlRect.xMax - 60 : mControlRect.xMax - 82; mControlRect.width = 60; if (GUI.Button(mControlRect, new GUIContent("Select", CurvyStyles.SelectTexture, "Select"))) { DTSelection.SetGameObjects(lst.ItemsArray); } } }
protected override void OnSceneGUI() { // Bounds if (CurvyGlobalManager.Gizmos.HasFlag(CurvySplineGizmos.Bounds)) { DTHandles.PushHandlesColor(Color.gray); DTHandles.WireCubeCap(Target.Bounds.center, Target.Bounds.size); DTHandles.PopHandlesColor(); } checkHotkeys(); if (Target.Spline.RestrictTo2D && Tools.current == Tool.Move && !SceneView.currentDrawingSceneView.in2DMode) { Tools.hidden = true; Vector3 handlePos = (Tools.handlePosition != Target.transform.position) ? DTSelection.GetPosition() : Tools.handlePosition; Vector3 delta; EditorGUI.BeginChangeCheck(); if (CurvyProject.Instance.UseTiny2DHandles) { delta = DTHandles.TinyHandle2D(GUIUtility.GetControlID(GetHashCode(), FocusType.Passive), handlePos, Target.Spline.transform.rotation, 1) - handlePos; } else { delta = DTHandles.PositionHandle2D(GUIUtility.GetControlID(GetHashCode(), FocusType.Passive), handlePos, Target.Spline.transform.rotation, 1) - handlePos; } if (EditorGUI.EndChangeCheck()) { foreach (var t in Selection.transforms) { Undo.ClearUndo(t); Undo.RecordObject(t, "Move"); t.position += delta; } } } else { Tools.hidden = false; } // Bezier-Handles if (Target.Spline.Interpolation == CurvyInterpolation.Bezier && !Target.AutoHandles) { #region --- Bezier Rotation Handling --- if (Tools.current == Tool.Rotate) { Event e = Event.current; if (e.shift && DTHandles.MouseOverSceneView) { Tools.hidden = true; DTToolbarItem._StatusBar.Set("BezierRotate"); // This looks good, but then diff down below isn't working like intended: //mBezierRot = Quaternion.LookRotation(Vector3.Cross(Target.HandleIn, Target.GetOrientationUpFast(0)), Target.GetOrientationUpFast(0)); Quaternion newRot = Handles.RotationHandle(mBezierRot, Target.transform.position); if (newRot != mBezierRot) { Quaternion diff = Quaternion.Inverse(mBezierRot) * newRot; mBezierRot = newRot; var mode = CurvyProject.Instance.BezierMode | CurvyBezierModeEnum.Direction; Undo.RecordObject(Target, "Rotate Handles"); Target.SetBezierHandleIn(diff * Target.HandleIn, Space.Self, mode); Target.SetDirty(); EditorUtility.SetDirty(Target); } } else { DTToolbarItem._StatusBar.Set("Hold <b>[Shift]</b> to rotate Handles", "BezierRotate"); Tools.hidden = false; } } else { DTToolbarItem._StatusBar.Set("BezierRotate"); } #endregion #region --- Bezier Movement Handling --- //Belongs to Constraint Length: //Vector3 handleOut = Target.HandleOutPosition; //Vector3 handleIn = Target.HandleInPosition; EditorGUI.BeginChangeCheck(); Vector3 pOut; Vector3 pIn; bool chgOut = false; bool chgIn = false; if (Target.Spline.RestrictTo2D) { Quaternion r = (Tools.pivotRotation == PivotRotation.Global) ? Target.Spline.transform.localRotation : Target.Spline.transform.rotation; Handles.color = Color.yellow; pIn = Target.HandleInPosition; pIn = DTHandles.TinyHandle2D(GUIUtility.GetControlID(FocusType.Passive), pIn, r, CurvyGlobalManager.GizmoControlPointSize * 0.7f, Handles.CubeCap); if (!CurvyProject.Instance.UseTiny2DHandles) { pIn = DTHandles.PositionHandle2D(GUIUtility.GetControlID(FocusType.Passive), pIn, r, 1); } chgIn = Target.HandleInPosition != pIn; Handles.color = Color.green; pOut = Target.HandleOutPosition; pOut = DTHandles.TinyHandle2D(GUIUtility.GetControlID(FocusType.Passive), pOut, r, CurvyGlobalManager.GizmoControlPointSize * 0.7f, Handles.CubeCap); if (!CurvyProject.Instance.UseTiny2DHandles) { pOut = DTHandles.PositionHandle2D(GUIUtility.GetControlID(FocusType.Passive), pOut, r, 1); } chgOut = Target.HandleOutPosition != pOut; } else { pIn = Handles.PositionHandle(Target.HandleInPosition, Tools.handleRotation); chgIn = Target.HandleInPosition != pIn; DTHandles.PushHandlesColor(Color.yellow); Handles.CubeCap(0, pIn, Quaternion.identity, HandleUtility.GetHandleSize(pIn) * CurvyGlobalManager.GizmoControlPointSize * 0.7f); DTHandles.PopHandlesColor(); pOut = Handles.PositionHandle(Target.HandleOutPosition, Tools.handleRotation); chgOut = Target.HandleOutPosition != pOut; DTHandles.PushHandlesColor(Color.green); Handles.CubeCap(0, pOut, Quaternion.identity, HandleUtility.GetHandleSize(pOut) * CurvyGlobalManager.GizmoControlPointSize * 0.7f); DTHandles.PopHandlesColor(); } Handles.color = Color.yellow; Handles.DrawLine(pIn, Target.transform.position); Handles.color = Color.green; Handles.DrawLine(pOut, Target.transform.position); if (chgOut || chgIn) { Undo.RecordObject(Target, "Move Handle"); if (chgOut) { Target.SetBezierHandleOut(pOut, Space.World, CurvyProject.Instance.BezierMode); Target.HandleOut = DTMath.SnapPrecision(Target.HandleOut, 3); } else { Target.SetBezierHandleIn(pIn, Space.World, CurvyProject.Instance.BezierMode); Target.HandleIn = DTMath.SnapPrecision(Target.HandleIn, 3); } } if (EditorGUI.EndChangeCheck()) { EditorUtility.SetDirty(Target); Target.SetDirty(); /* * var lcons = CurvyProject.Instance.FindItem<TBCPLengthConstraint>(); * if (lcons.On && Target.Spline.Length > lcons.MaxSplineLength) * { * Target.HandleOutPosition = handleOut; * Target.HandleInPosition = handleIn; * Target.SetDirty(); * } */ } #endregion } if (mConnectionEditor) { mConnectionEditor.OnSceneGUI(); } // Snap Transform if (Target && DT._UseSnapValuePrecision) { Target.transform.localPosition = DTMath.SnapPrecision(Target.transform.localPosition, 3); Target.transform.localEulerAngles = DTMath.SnapPrecision(Target.transform.localEulerAngles, 3); //Target.TTransform.FromTransform(Target.transform); } }