Exemple #1
0
        void OnSceneGUI()
        {
            ClampTo cp = (ClampTo)target;

            if (!cp.ShowGizmos)
            {
                return;
            }

            BaseSplineBehaviour be = cp.Spline;

            if (be == null)
            {
                return;
            }

            if (m_splineEditor == null || m_splineEditor.target != be)
            {
                m_splineEditor = Editor.CreateEditor(be);
            }

            ISplineEditor ed = m_splineEditor as ISplineEditor;

            if (ed == null)
            {
                return;
            }

            EditorGUI.BeginChangeCheck();
            ed.OnSceneGUI();
            if (EditorGUI.EndChangeCheck())
            {
                EditorUtility.SetDirty(be); //without this, when dragging spline control points, the object will not follow the changed spline
            }
        }
Exemple #2
0
        public override void OnInspectorGUI()
        {
            ClampTo cp = (ClampTo)target;

            EditorGUI.BeginChangeCheck();

            EConUtil.DrawActiveLine(cp);

            //constraint target
            cp.Spline = (BaseSplineBehaviour)EditorGUILayout.ObjectField("Target Spline", cp.Spline, typeof(BaseSplineBehaviour), true);

            EUtil.DrawSplitter();

            EUtil.PushGUIEnable(cp.IsActiveConstraint && cp.Spline);
            {
                //axis and offset
                m_foldoutAxis = EditorGUILayout.Foldout(m_foldoutAxis, "Affect");
                if (m_foldoutAxis)
                {
                    cp.MainAxis = (EAxis)EConUtil.DrawEnumBtns(AllAxis, AllAxisStr, cp.MainAxis, "Main Axis", "Choose the axis used to decide the parameter t for evaluate spline");

                    // offset
                    cp.UseOffset = EditorGUILayout.Toggle(new GUIContent("Use Offset", "Add offset onto the result"), cp.UseOffset);
                    if (cp.UseOffset)
                    {
                        cp.Offset = EUtil.DrawV3P(new GUIContent("Offset", "Offset in world space"), cp.Offset);
                    }

                    cp.Cyclic = EditorGUILayout.Toggle(new GUIContent("Cyclic", "the object will revert to the beginning of spline when exceed the dimension"), cp.Cyclic);

                    GUILayout.Space(5f);
                }

                // dimension and startVal
                m_foldoutPos = EditorGUILayout.Foldout(m_foldoutPos, "Pos Define");
                if (m_foldoutPos)
                {
                    cp.Dimension = EditorGUILayout.FloatField(new GUIContent("Dimension", "the projection length on mainAxis"), cp.Dimension);
                    cp.StartVal  = EditorGUILayout.FloatField(new GUIContent("StartVal", "the low value on mainAxis"), cp.StartVal);
                    if (GUILayout.Button(new GUIContent("Recalculate Dimension", "Recalculate dimension & startVal based on spline")))
                    {
                        var    behaviour = cp.Spline;
                        Bounds bd        = behaviour.CalculateTransformedBounds();
                        _SetDimensionByBounds(cp, bd);
                    }
                }

                // influence
                cp.Influence = EUtil.ProgressBar(cp.Influence, 0, 1f, "Influence: {0:F2}");
            }
            EUtil.PopGUIEnable();

            if (EditorGUI.EndChangeCheck())
            {
                EditorUtility.SetDirty(cp); //so ConstraintStack.Update can be called in edit-mode
            }
        }
Exemple #3
0
        private void _SetDimensionByBounds(ClampTo cp, Bounds bd)
        {
            switch (cp.MainAxis)
            {
            case EAxis.X: cp.Dimension = bd.size.x; cp.StartVal = bd.min.x; break;

            case EAxis.Y: cp.Dimension = bd.size.y; cp.StartVal = bd.min.y; break;

            case EAxis.Z: cp.Dimension = bd.size.z; cp.StartVal = bd.min.z; break;

            default: Dbg.LogErr("ClampToEditor._SetDimensionByBounds: unexpected mainAxis: {0}", cp.MainAxis); break;
            }
        }