예제 #1
0
        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);
            }
        }