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; }
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); }