Esempio n. 1
0
    bool IsRecordedTerrainVertsEquals(RecordedTerrainVerts rtv1, RecordedTerrainVerts rtv2)
    {
        if (rtv1.TerrainVerts.Length != rtv2.TerrainVerts.Length)
        {
            return(false);
        }

        for (int i = 0; i < rtv1.TerrainVerts.Length; i++)
        {
            if (rtv1.TerrainVerts[i] != rtv2.TerrainVerts[i])
            {
                return(false);
            }
        }
        return(true);
    }
    void OnSceneGUI()
    {
        if (PrefabUtility.GetPrefabType(_myTerrainEditor2D.gameObject) == PrefabType.Prefab || _myTerrainEditor2D == null)
            return;

        #region Scene view events
        //Switch tab
        if (Event.current.type == EventType.KeyUp)
        {
            if (Event.current.keyCode == _hotKeys["ShowEditTab"])
                SwitchTab("Edit settings");
            if (Event.current.keyCode == _hotKeys["ShowCapTab"])
                SwitchTab("Cap settings");
            if (Event.current.keyCode == _hotKeys["ShowMainTab"])
                SwitchTab("Main settings");
        }

        if (Event.current.Equals(Event.KeyboardEvent("#" + _hotKeys["SwitchEditMode"])))
            SwitchEditMode();

        //Undo & redo (values)
        if (Event.current.commandName == "UndoRedoPerformed")
        {
            if (!EditorApplication.isPlaying)
                _myTerrainEditor2D.EditTerrain(_myTerrainEditor2D.GetVertsPos(), true);
            else _myTerrainEditor2D.EditTerrain(_myTerrainEditor2D.GetVertsPos(), false);
        }

        #endregion

        if (!_editMode)
            return;

        #region Draw handles
        if (GetSceneViewCamera() != null)
        {
            _mousePos = Camera.current.ScreenToWorldPoint(new Vector2(Event.current.mousePosition.x, (Camera.current.pixelHeight - Event.current.mousePosition.y)));
            _handleLocalPos = _mousePos - new Vector2(_myTerrainEditor2D.transform.position.x, _myTerrainEditor2D.transform.position.y);
            if (_brushLockMode)
                _handleLocalPos.y = _brushHandleLockPos.y;

            Vector2 finalHandlePos = _handleLocalPos + (Vector2)_myTerrainEditor2D.transform.position;
            Handles.color = Color.green;
            Handles.CircleCap(0, finalHandlePos, Quaternion.identity, BrushSize);

            if (_brushLockMode)
            {
                Handles.DrawLine(finalHandlePos + new Vector2(-BrushSize, BrushSize), finalHandlePos + new Vector2(BrushSize, BrushSize));
                Handles.DrawLine(finalHandlePos + new Vector2(-BrushSize, -BrushSize), finalHandlePos + new Vector2(BrushSize, -BrushSize));
            }

            //Draw cap tile errors
            if (_myTerrainEditor2D.GenerateCap && _myTerrainEditor2D.SmartCap)
            {
                if (_myTerrainEditor2D.SmartCapAreas != null)
                {
                    foreach (var smartCapArea in _myTerrainEditor2D.SmartCapAreas)
                    {
                        Handles.color = Color.red;
                        if (smartCapArea.CorruptedTilesVertsPoints.Count >= 2)
                        {
                            Handles.DrawLine(smartCapArea.CorruptedTilesVertsPoints[0] + _myTerrainEditor2D.transform.position, smartCapArea.CorruptedTilesVertsPoints[1] + _myTerrainEditor2D.transform.position);
                        }

                        Handles.color = Color.green;
                    }
                }
            }

        }
        #endregion

        #region Draw terrain borders
        Vector3 terrainPos = _myTerrainEditor2D.transform.position;
        Handles.color = new Color(1, 1, 1, 0.5f);
        Handles.DrawLine(terrainPos, terrainPos + new Vector3(0, _myTerrainEditor2D.Height));
        Handles.DrawLine(terrainPos, terrainPos + new Vector3(_myTerrainEditor2D.Width, 0));
        Handles.DrawLine(terrainPos + new Vector3(0, _myTerrainEditor2D.Height), terrainPos + new Vector3(0, _myTerrainEditor2D.Height) + new Vector3(_myTerrainEditor2D.Width, 0));
        Handles.DrawLine(terrainPos + new Vector3(_myTerrainEditor2D.Width, 0), terrainPos + new Vector3(0, _myTerrainEditor2D.Height) + new Vector3(_myTerrainEditor2D.Width, 0));

        if (_myTerrainEditor2D.FixSides)
        {
            Vector3 leftFixedPoint = terrainPos + new Vector3(0, _myTerrainEditor2D.LeftFixedPoint);
            Vector3 rightFixedPoint = terrainPos + new Vector3(_myTerrainEditor2D.Width, _myTerrainEditor2D.RightFixedPoint);
            Handles.DrawLine(leftFixedPoint, leftFixedPoint - new Vector3(1, 0));
            Handles.DrawLine(rightFixedPoint, rightFixedPoint + new Vector3(1, 0));
        }

        #endregion

        #region Edit mode events
        //Start edit
        if (Event.current.type == EventType.MouseDown && Event.current.button == 0)
            _startEdit = true;

        //End edit
        if (Event.current.type == EventType.MouseUp)
        {
            _startEdit = false;

            //Register custom undo
            _lastRecordedVerts = new RecordedTerrainVerts(_myTerrainEditor2D.GetVertsPos());
            if (_recordedVerts.Count > 0)
            {
                if (!IsRecordedTerrainVertsEquals(_recordedVerts[_recordedVerts.Count - 1], _lastRecordedVerts))
                {
                    if (_curUndoRecordedVertsId < _recordedVerts.Count - 1)
                        _recordedVerts.RemoveRange(_curUndoRecordedVertsId + 1, (_recordedVerts.Count - _curUndoRecordedVertsId - 1));

                    if (_recordedVerts.Count > 75)
                        _recordedVerts.RemoveAt(0);

                    _recordedVerts.Add(_lastRecordedVerts);
                    _curUndoRecordedVertsId = _recordedVerts.Count - 1;
                }
            }
            else _recordedVerts.Add(_lastRecordedVerts);
        }

        //Dig mode
        if (Event.current.keyCode == _hotKeys["DigMode"])
        {
            if (Event.current.type == EventType.KeyDown)
                _digMode = true;
            if (Event.current.type == EventType.keyUp)
                _digMode = false;
        }

        //Brush lock
        if (Event.current.shift)
        {
            if (!_brushLockMode)
            {
                _brushHandleLockPos = _handleLocalPos;
                _brushLockMode = true;
            }
        }
        else _brushLockMode = false;

        //Brush size
        if (Event.current.alt)
        {
            if (Event.current.type == EventType.ScrollWheel)
            {
                float sizeDelta = 0.2f;
                if (Event.current.control)
                    sizeDelta += 0.8f;

                if (Event.current.delta.y > 0)
                    BrushSize -= sizeDelta;
                if (Event.current.delta.y < 0)
                    BrushSize += sizeDelta;

                Event.current.Use();
            }
            if (BrushSize <= 0.1f)
                BrushSize = 0.1f;
        }

        //Undo & redo (edit Mode)
        if (Event.current.shift)
        {
            if (Event.current.type == EventType.KeyUp)
            {
                //Undo
                if (Event.current.keyCode == _hotKeys["EditModeUndo"])
                {
                    if (_recordedVerts.Count > 0 && _curUndoRecordedVertsId > 0)
                    {
                        _curUndoRecordedVertsId--;
                        _myTerrainEditor2D.EditTerrain(_recordedVerts[_curUndoRecordedVertsId].TerrainVerts, true);
                    }
                }

                //Redo
                if (Event.current.keyCode == _hotKeys["EditModeRedo"])
                {
                    if (_curUndoRecordedVertsId < _recordedVerts.Count - 1)
                    {
                        _curUndoRecordedVertsId++;
                        _myTerrainEditor2D.EditTerrain(_recordedVerts[_curUndoRecordedVertsId].TerrainVerts, true);
                    }
                }
            }
        }

        #endregion

        #region Start edit mesh
        if (_startEdit)
        {
            Vector3[] vertsPos = _myTerrainEditor2D.GetVertsPos();

            for (int i = 0; i < vertsPos.Length; i += 2)
            {
                if (Vector2.Distance(vertsPos[i], _handleLocalPos) <= BrushSize)
                {
                    float vertOffset = BrushSize - Vector2.Distance(vertsPos[i], _handleLocalPos);

                    if (_digMode)
                        vertsPos[i] -= new Vector3(0, vertOffset * (BrushHardness * 0.1f));
                    else vertsPos[i] += new Vector3(0, vertOffset * (BrushHardness * 0.1f));

                    if (BrushNoise > 0f)
                        vertsPos[i] += new Vector3(0, Random.Range(-BrushNoise * 0.25f, BrushNoise * 0.25f));

                    if (BrushHeightLimitEnabled)
                        if (vertsPos[i].y > BrushHeightLimit)
                            vertsPos[i].y = BrushHeightLimit;

                    if (vertsPos[i].y < 0)
                        vertsPos[i].y = 0;
                    if (vertsPos[i].y > _myTerrainEditor2D.Height)
                        vertsPos[i].y = _myTerrainEditor2D.Height;

                }
            }

            if (!EditorApplication.isPlaying)
                _myTerrainEditor2D.EditTerrain(vertsPos, true);
            else _myTerrainEditor2D.EditTerrain(vertsPos, false);

            Selection.activeGameObject = _myTerrainEditor2D.gameObject;
        }
        #endregion

        #region Configure handles

        HandleUtility.AddDefaultControl(GUIUtility.GetControlID(FocusType.Passive));
        if (_myTerrainEditor2D.GetComponent<Renderer>() != null)
            EditorUtility.SetSelectedWireframeHidden(_myTerrainEditor2D.GetComponent<Renderer>(), true);
        if (_myTerrainEditor2D.CapObj != null)
        {
            if (_myTerrainEditor2D.CapObj.GetComponent<Renderer>() != null)
                EditorUtility.SetSelectedWireframeHidden(_myTerrainEditor2D.CapObj.GetComponent<Renderer>(), true);
        }

        #endregion

        SceneView.RepaintAll();
        EditorUtility.SetDirty(_myTerrainEditor2D);
    }
    bool IsRecordedTerrainVertsEquals(RecordedTerrainVerts rtv1, RecordedTerrainVerts rtv2)
    {
        if (rtv1.TerrainVerts.Length != rtv2.TerrainVerts.Length)
            return false;

        for (int i = 0; i < rtv1.TerrainVerts.Length; i++)
        {
            if (rtv1.TerrainVerts[i] != rtv2.TerrainVerts[i])
                return false;
        }
        return true;
    }
Esempio n. 4
0
    void OnSceneGUI()
    {
        if (PrefabUtility.GetPrefabType(_myTerrainEditor2D.gameObject) == PrefabType.Prefab || _myTerrainEditor2D == null)
        {
            return;
        }

        #region Scene view events
        //Switch tab
        if (Event.current.type == EventType.KeyUp)
        {
            if (Event.current.keyCode == _hotKeys["ShowEditTab"])
            {
                SwitchTab("Edit settings");
            }
            if (Event.current.keyCode == _hotKeys["ShowCapTab"])
            {
                SwitchTab("Cap settings");
            }
            if (Event.current.keyCode == _hotKeys["ShowMainTab"])
            {
                SwitchTab("Main settings");
            }
        }


        if (Event.current.Equals(Event.KeyboardEvent("#" + _hotKeys["SwitchEditMode"])))
        {
            SwitchEditMode();
        }

        //Undo & redo (values)
        if (Event.current.commandName == "UndoRedoPerformed")
        {
            if (!EditorApplication.isPlaying)
            {
                _myTerrainEditor2D.EditTerrain(_myTerrainEditor2D.GetVertsPos(), true);
            }
            else
            {
                _myTerrainEditor2D.EditTerrain(_myTerrainEditor2D.GetVertsPos(), false);
            }
        }

        #endregion

        if (!_editMode)
        {
            return;
        }

        #region Draw handles
        if (GetSceneViewCamera() != null)
        {
            _mousePos       = Camera.current.ScreenToWorldPoint(new Vector2(Event.current.mousePosition.x, (Camera.current.pixelHeight - Event.current.mousePosition.y)));
            _handleLocalPos = _mousePos - new Vector2(_myTerrainEditor2D.transform.position.x, _myTerrainEditor2D.transform.position.y);
            if (_brushLockMode)
            {
                _handleLocalPos.y = _brushHandleLockPos.y;
            }

            Vector2 finalHandlePos = _handleLocalPos + (Vector2)_myTerrainEditor2D.transform.position;
            Handles.color = Color.green;
            Handles.CircleCap(0, finalHandlePos, Quaternion.identity, BrushSize);

            if (_brushLockMode)
            {
                Handles.DrawLine(finalHandlePos + new Vector2(-BrushSize, BrushSize), finalHandlePos + new Vector2(BrushSize, BrushSize));
                Handles.DrawLine(finalHandlePos + new Vector2(-BrushSize, -BrushSize), finalHandlePos + new Vector2(BrushSize, -BrushSize));
            }

            //Draw cap tile errors
            if (_myTerrainEditor2D.GenerateCap && _myTerrainEditor2D.SmartCap)
            {
                if (_myTerrainEditor2D.SmartCapAreas != null)
                {
                    foreach (var smartCapArea in _myTerrainEditor2D.SmartCapAreas)
                    {
                        Handles.color = Color.red;
                        if (smartCapArea.CorruptedTilesVertsPoints.Count >= 2)
                        {
                            Handles.DrawLine(smartCapArea.CorruptedTilesVertsPoints[0] + _myTerrainEditor2D.transform.position, smartCapArea.CorruptedTilesVertsPoints[1] + _myTerrainEditor2D.transform.position);
                        }

                        Handles.color = Color.green;
                    }
                }
            }
        }
        #endregion

        #region Draw terrain borders
        Vector3 terrainPos = _myTerrainEditor2D.transform.position;
        Handles.color = new Color(1, 1, 1, 0.5f);
        Handles.DrawLine(terrainPos, terrainPos + new Vector3(0, _myTerrainEditor2D.Height));
        Handles.DrawLine(terrainPos, terrainPos + new Vector3(_myTerrainEditor2D.Width, 0));
        Handles.DrawLine(terrainPos + new Vector3(0, _myTerrainEditor2D.Height), terrainPos + new Vector3(0, _myTerrainEditor2D.Height) + new Vector3(_myTerrainEditor2D.Width, 0));
        Handles.DrawLine(terrainPos + new Vector3(_myTerrainEditor2D.Width, 0), terrainPos + new Vector3(0, _myTerrainEditor2D.Height) + new Vector3(_myTerrainEditor2D.Width, 0));

        if (_myTerrainEditor2D.FixSides)
        {
            Vector3 leftFixedPoint  = terrainPos + new Vector3(0, _myTerrainEditor2D.LeftFixedPoint);
            Vector3 rightFixedPoint = terrainPos + new Vector3(_myTerrainEditor2D.Width, _myTerrainEditor2D.RightFixedPoint);
            Handles.DrawLine(leftFixedPoint, leftFixedPoint - new Vector3(1, 0));
            Handles.DrawLine(rightFixedPoint, rightFixedPoint + new Vector3(1, 0));
        }

        #endregion

        #region Edit mode events
        //Start edit
        if (Event.current.type == EventType.MouseDown && Event.current.button == 0)
        {
            _startEdit = true;
        }

        //End edit
        if (Event.current.type == EventType.MouseUp)
        {
            _startEdit = false;

            //Register custom undo
            _lastRecordedVerts = new RecordedTerrainVerts(_myTerrainEditor2D.GetVertsPos());
            if (_recordedVerts.Count > 0)
            {
                if (!IsRecordedTerrainVertsEquals(_recordedVerts[_recordedVerts.Count - 1], _lastRecordedVerts))
                {
                    if (_curUndoRecordedVertsId < _recordedVerts.Count - 1)
                    {
                        _recordedVerts.RemoveRange(_curUndoRecordedVertsId + 1, (_recordedVerts.Count - _curUndoRecordedVertsId - 1));
                    }

                    if (_recordedVerts.Count > 75)
                    {
                        _recordedVerts.RemoveAt(0);
                    }

                    _recordedVerts.Add(_lastRecordedVerts);
                    _curUndoRecordedVertsId = _recordedVerts.Count - 1;
                }
            }
            else
            {
                _recordedVerts.Add(_lastRecordedVerts);
            }
        }

        //Dig mode
        if (Event.current.keyCode == _hotKeys["DigMode"])
        {
            if (Event.current.type == EventType.KeyDown)
            {
                _digMode = true;
            }
            if (Event.current.type == EventType.KeyUp)
            {
                _digMode = false;
            }
        }

        //Brush lock
        if (Event.current.shift)
        {
            if (!_brushLockMode)
            {
                _brushHandleLockPos = _handleLocalPos;
                _brushLockMode      = true;
            }
        }
        else
        {
            _brushLockMode = false;
        }

        //Brush size
        if (Event.current.alt)
        {
            if (Event.current.type == EventType.ScrollWheel)
            {
                float sizeDelta = 0.2f;
                if (Event.current.control)
                {
                    sizeDelta += 0.8f;
                }

                if (Event.current.delta.y > 0)
                {
                    BrushSize -= sizeDelta;
                }
                if (Event.current.delta.y < 0)
                {
                    BrushSize += sizeDelta;
                }

                Event.current.Use();
            }
            if (BrushSize <= 0.1f)
            {
                BrushSize = 0.1f;
            }
        }

        //Undo & redo (edit Mode)
        if (Event.current.shift)
        {
            if (Event.current.type == EventType.KeyUp)
            {
                //Undo
                if (Event.current.keyCode == _hotKeys["EditModeUndo"])
                {
                    if (_recordedVerts.Count > 0 && _curUndoRecordedVertsId > 0)
                    {
                        _curUndoRecordedVertsId--;
                        _myTerrainEditor2D.EditTerrain(_recordedVerts[_curUndoRecordedVertsId].TerrainVerts, true);
                    }
                }

                //Redo
                if (Event.current.keyCode == _hotKeys["EditModeRedo"])
                {
                    if (_curUndoRecordedVertsId < _recordedVerts.Count - 1)
                    {
                        _curUndoRecordedVertsId++;
                        _myTerrainEditor2D.EditTerrain(_recordedVerts[_curUndoRecordedVertsId].TerrainVerts, true);
                    }
                }
            }
        }

        #endregion

        #region Start edit mesh
        if (_startEdit)
        {
            Vector3[] vertsPos = _myTerrainEditor2D.GetVertsPos();

            for (int i = 0; i < vertsPos.Length; i += 2)
            {
                if (Vector2.Distance(vertsPos[i], _handleLocalPos) <= BrushSize)
                {
                    float vertOffset = BrushSize - Vector2.Distance(vertsPos[i], _handleLocalPos);

                    if (_digMode)
                    {
                        vertsPos[i] -= new Vector3(0, vertOffset * (BrushHardness * 0.1f));
                    }
                    else
                    {
                        vertsPos[i] += new Vector3(0, vertOffset * (BrushHardness * 0.1f));
                    }

                    if (BrushNoise > 0f)
                    {
                        vertsPos[i] += new Vector3(0, Random.Range(-BrushNoise * 0.25f, BrushNoise * 0.25f));
                    }

                    if (BrushHeightLimitEnabled)
                    {
                        if (vertsPos[i].y > BrushHeightLimit)
                        {
                            vertsPos[i].y = BrushHeightLimit;
                        }
                    }

                    if (vertsPos[i].y < 0)
                    {
                        vertsPos[i].y = 0;
                    }
                    if (vertsPos[i].y > _myTerrainEditor2D.Height)
                    {
                        vertsPos[i].y = _myTerrainEditor2D.Height;
                    }
                }
            }

            if (!EditorApplication.isPlaying)
            {
                _myTerrainEditor2D.EditTerrain(vertsPos, true);
            }
            else
            {
                _myTerrainEditor2D.EditTerrain(vertsPos, false);
            }

            Selection.activeGameObject = _myTerrainEditor2D.gameObject;
        }
        #endregion

        #region Configure handles

        HandleUtility.AddDefaultControl(GUIUtility.GetControlID(FocusType.Passive));
        if (_myTerrainEditor2D.GetComponent <Renderer>() != null)
        {
            EditorUtility.SetSelectedWireframeHidden(_myTerrainEditor2D.GetComponent <Renderer>(), true);
        }
        if (_myTerrainEditor2D.CapObj != null)
        {
            if (_myTerrainEditor2D.CapObj.GetComponent <Renderer>() != null)
            {
                EditorUtility.SetSelectedWireframeHidden(_myTerrainEditor2D.CapObj.GetComponent <Renderer>(), true);
            }
        }

        #endregion

        SceneView.RepaintAll();
        EditorUtility.SetDirty(_myTerrainEditor2D);
    }