示例#1
0
        void SetPolyEditMode(PolyShape.PolyEditMode mode)
        {
            if (polygon == null)
            {
                return;
            }

            PolyShape.PolyEditMode old = polygon.polyEditMode;

            if (mode != old)
            {
                GUIUtility.hotControl = 0;

                // Entering edit mode after the shape has been finalized once before, which means
                // possibly reverting manual changes.  Store undo state so that if this was
                // not intentional user can revert.
                if (old == PolyShape.PolyEditMode.None && polygon.m_Points.Count > 2)
                {
                    if (ProBuilderEditor.instance != null)
                    {
                        ProBuilderEditor.instance.ClearElementSelection();
                    }

                    UndoUtility.RecordComponents <ProBuilderMesh, PolyShape>(polygon.GetComponents(typeof(Component)), "Edit Polygon Shape");
                }

                polygon.polyEditMode = mode;

                // If coming from Path -> Height set the mouse / origin offset
                if (old == PolyShape.PolyEditMode.Path && mode == PolyShape.PolyEditMode.Height && Event.current != null)
                {
                    Vector3 up      = polygon.transform.up;
                    Vector3 origin  = polygon.transform.TransformPoint(Math.Average(polygon.m_Points));
                    Ray     r       = HandleUtility.GUIPointToWorldRay(Event.current.mousePosition);
                    Vector3 p       = Math.GetNearestPointRayRay(origin, up, r.origin, r.direction);
                    float   extrude = Vector3.Distance(origin, p) * Mathf.Sign(Vector3.Dot(p - origin, up));
                    s_HeightMouseOffset = polygon.extrude - EditorSnapping.MoveSnap(extrude);
                }
                else if (old == PolyShape.PolyEditMode.Path && mode == PolyShape.PolyEditMode.None)
                {
                    var go = polygon.gameObject;
                    EditorApplication.delayCall += () => DestroyImmediate(go);
                    return;
                }

                RebuildPolyShapeMesh(polygon);

                //Dirty the polygon for serialization (fix for transition between prefab and scene mode)
                if (polygon != null)
                {
                    UnityEditor.EditorUtility.SetDirty(polygon);
                }
            }
        }
示例#2
0
        void SetPolyEditMode(PolyShape.PolyEditMode mode)
        {
            PolyShape.PolyEditMode old = polygon.polyEditMode;

            if (mode != old)
            {
                // Clear the control always
                GUIUtility.hotControl = 0;

                // Entering edit mode after the shape has been finalized once before, which means
                // possibly reverting manual changes.  Store undo state so that if this was
                // not intentional user can revert.
                if (polygon.polyEditMode == PolyShape.PolyEditMode.None && polygon.m_Points.Count > 2)
                {
                    if (ProBuilderEditor.instance != null)
                    {
                        ProBuilderEditor.instance.ClearElementSelection();
                    }

                    UndoUtility.RecordObject(polygon, "Edit Polygon Shape");
                    UndoUtility.RecordObject(polygon.mesh, "Edit Polygon Shape");
                }

                polygon.polyEditMode = mode;

                if (polygon.polyEditMode == PolyShape.PolyEditMode.None)
                {
                    ProBuilderEditor.selectMode = ProBuilderEditor.selectMode & ~(SelectMode.InputTool);
                }
                else
                {
                    ProBuilderEditor.selectMode = ProBuilderEditor.selectMode | SelectMode.InputTool;
                }

                if (polygon.polyEditMode != PolyShape.PolyEditMode.None)
                {
                    Tools.current = Tool.None;
                }

                // If coming from Path -> Height set the mouse / origin offset
                if (old == PolyShape.PolyEditMode.Path && mode == PolyShape.PolyEditMode.Height && Event.current != null)
                {
                    Vector3 up     = polygon.transform.up;
                    Vector3 origin = polygon.transform.TransformPoint(Math.Average(polygon.m_Points));
                    Ray     r      = HandleUtility.GUIPointToWorldRay(Event.current.mousePosition);
                    Vector3 p      = Math.GetNearestPointRayRay(origin, up, r.origin, r.direction);
                    s_HeightMouseOffset = polygon.extrude -
                                          ProGridsInterface.ProGridsSnap(
                        Vector3.Distance(origin, p) * Mathf.Sign(Vector3.Dot(p - origin, up)));
                }

                RebuildPolyShapeMesh(polygon);
            }
        }
示例#3
0
        void OnEnable()
        {
            if (polygon == null)
            {
                DestroyImmediate(this);
                return;
            }

            ProBuilderEditor.selectModeChanged += OnSelectModeChanged;
            m_LineMesh              = new Mesh();
            m_LineMaterial          = CreateHighlightLineMaterial();
            Undo.undoRedoPerformed += UndoRedoPerformed;
            DrawPolyLine(polygon.m_Points);
            EditorApplication.update += Update;

            PolyShape.PolyEditMode mode = polygon.polyEditMode;
            polygon.polyEditMode = PolyShape.PolyEditMode.None;
            SetPolyEditMode(mode);
        }
        void OnEnable()
        {
            if (polygon == null)
            {
                DestroyImmediate(this);
                return;
            }

            ProBuilderEditor.selectModeChanged += OnSelectModeChanged;
            m_LineMesh              = new Mesh();
            m_LineMaterial          = CreateHighlightLineMaterial();
            Undo.undoRedoPerformed += UndoRedoPerformed;
#if UNITY_2019_1_OR_NEWER
            SceneView.duringSceneGui += DuringSceneGUI;
#else
            SceneView.onSceneGUIDelegate += DuringSceneGUI;
#endif
            DrawPolyLine(polygon.m_Points);
            EditorApplication.update += Update;

            PolyShape.PolyEditMode mode = polygon.polyEditMode;
            polygon.polyEditMode = PolyShape.PolyEditMode.None;
            SetPolyEditMode(mode);
        }