// Update is called once per frame protected void Update() { if (!VCEditor.DocumentOpen() || VCEditor.SelectedVoxelType < 0) { m_Phase = EPhase.Free; m_GizmoCube.gameObject.SetActive(false); return; } float voxel_size = VCEditor.s_Scene.m_Setting.m_VoxelSize; m_GizmoCube.m_VoxelSize = voxel_size; ExtraAdjust(); if (m_Phase == EPhase.Free) { if (!VCEInput.s_MouseOnUI) { // Cancel if (VCEInput.s_Cancel) { ResetDrawing(); Cancel(); } VCEMath.RayCastDrawTarget(VCEInput.s_PickRay, out m_Target, VCEMath.MC_ISO_VALUE); if (VCEditor.s_Scene.m_IsoData.IsPointIn(m_Target.cursor)) { m_GizmoCube.CubeSize = IntVector3.One; m_GizmoCube.transform.position = m_Target.cursor.ToVector3() * voxel_size; m_GizmoCube.gameObject.SetActive(true); if (Input.GetMouseButtonDown(0)) { m_Begin = new IntVector3(m_Target.cursor); m_End = new IntVector3(m_Target.cursor); m_Phase = EPhase.DragPlane; VCEditor.Instance.m_UI.DisableFunctions(); VCEditor.s_ProtectLock0 = true; VCEStatusBar.ShowText("Drag an area".ToLocalizationString(), 2); } } else { m_GizmoCube.gameObject.SetActive(false); } } else { m_GizmoCube.gameObject.SetActive(false); } VCEditor.Instance.m_NearVoxelIndicator.enabled = true; } else if (m_Phase == EPhase.DragPlane) { // Cancel if (VCEInput.s_Cancel) { ResetDrawing(); } RaycastHit rch; if (VCEMath.RayCastCoordPlane(VCEInput.s_PickRay, ECoordPlane.XZ, m_Begin.y, out rch)) { m_End = new IntVector3(Mathf.FloorToInt(rch.point.x), m_Begin.y, Mathf.FloorToInt(rch.point.z)); VCEditor.s_Scene.m_IsoData.ClampPointI(m_End, m_Begin.x < 0.5f * VCEditor.s_Scene.m_IsoData.m_HeadInfo.xSize); m_PointBeforeAdjustHeight = rch.point; VCEditor.s_Scene.m_IsoData.ClampPointI(m_End, m_Begin.x < 0.5f * VCEditor.s_Scene.m_IsoData.m_HeadInfo.xSize); m_GizmoCube.CubeSize = Size; m_GizmoCube.transform.position = Min.ToVector3() * voxel_size; } else { ResetDrawing(); } if (Input.GetMouseButtonUp(0)) { m_Phase = EPhase.AdjustHeight; VCEStatusBar.ShowText("Adjust height".ToLocalizationString(), 2); } VCEditor.Instance.m_NearVoxelIndicator.enabled = false; } else if (m_Phase == EPhase.AdjustHeight) { // Cancel if (VCEInput.s_Cancel) { ResetDrawing(); } float height = m_PointBeforeAdjustHeight.y; VCEMath.RayAdjustHeight(VCEInput.s_PickRay, m_PointBeforeAdjustHeight, out height); m_End.y = Mathf.FloorToInt(height + 0.3f); VCEditor.s_Scene.m_IsoData.ClampPointI(m_End); m_GizmoCube.CubeSize = Size; m_GizmoCube.transform.position = Min.ToVector3() * voxel_size; // Do the brush if (Input.GetMouseButtonDown(0)) { m_Phase = EPhase.Drawing; Do(); VCEStatusBar.ShowText("Done".ToLocalizationString(), 2); } VCEditor.Instance.m_NearVoxelIndicator.enabled = false; } }
public override void MainMethod() { if (VCEInput.s_Increase && !VCEInput.s_Shift) { if (m_Depth < 300) { m_Depth++; } m_GUIAlpha = 5; } else if (VCEInput.s_Decrease && !VCEInput.s_Shift) { if (m_Depth > 1) { m_Depth--; } m_GUIAlpha = 5; } // // Selecting, mouse dragging // if (m_Selecting) { if (VCEInput.s_Cancel) { ExitSelecting(); return; } RaycastHit rch; // ray cast coord plane if (VCEMath.RayCastCoordPlane(VCEInput.s_PickRay, m_Coord, m_PlanePos, out rch)) { m_End.x = Mathf.FloorToInt(rch.point.x); m_End.y = Mathf.FloorToInt(rch.point.y); m_End.z = Mathf.FloorToInt(rch.point.z); switch (m_Coord) { case ECoordPlane.XY: m_End.z = m_Begin.z + (m_Depth - 1) * m_NormalSign; break; case ECoordPlane.XZ: m_End.y = m_Begin.y == 0 && VCEditor.s_Scene.m_IsoData.GetVoxel(VCIsoData.IPosToKey(m_Begin)).Volume < 128 ? VCEditor.s_Scene.m_Setting.m_EditorSize.y - 1 : m_Begin.y + (m_Depth - 1) * m_NormalSign; break; case ECoordPlane.ZY: m_End.x = m_Begin.x + (m_Depth - 1) * m_NormalSign; break; default: ExitSelecting(); return; } } else { ExitSelecting(); return; } m_Iso.ClampPointI(m_Begin); m_Iso.ClampPointI(m_End); // Submit this selecting action ! if (Input.GetMouseButtonUp(0) && m_Selecting) { Submit(); m_Selecting = false; m_NeedUpdate = true; } } // End selecting // // Free mouse, prepare to select // else { // Mouse not on GUI if (!VCEInput.s_MouseOnUI) { // Click left mouse button if (Input.GetMouseButtonDown(0)) { // has draw target if (m_Parent.m_Target.snapto != null && m_Parent.m_Target.cursor != null) { VCEMath.DrawTarget dtar = m_Parent.m_Target; // snapto has voxel if (m_Iso.GetVoxel(VCIsoData.IPosToKey(dtar.snapto)).Volume > 0) { m_Begin.x = dtar.snapto.x; m_Begin.y = dtar.snapto.y; m_Begin.z = dtar.snapto.z; } // snapto don't has voxel else { m_Begin.x = dtar.cursor.x; m_Begin.y = dtar.cursor.y; m_Begin.z = dtar.cursor.z; dtar.rch.normal = -dtar.rch.normal; } // Assgin end m_End.x = m_Begin.x; m_End.y = m_Begin.y; m_End.z = m_Begin.z; // Assgin coord and position // zy plane if (Mathf.Abs(dtar.rch.normal.x) > 0.9f) { m_Coord = ECoordPlane.ZY; m_PlanePos = dtar.rch.point.x; m_Selecting = true; m_NormalSign = -Mathf.RoundToInt(Mathf.Sign(dtar.rch.normal.x)); } // xz plane else if (Mathf.Abs(dtar.rch.normal.y) > 0.9f) { m_Coord = ECoordPlane.XZ; m_PlanePos = dtar.rch.point.y; m_Selecting = true; m_NormalSign = -Mathf.RoundToInt(Mathf.Sign(dtar.rch.normal.y)); } // xy plane else if (Mathf.Abs(dtar.rch.normal.z) > 0.9f) { m_Coord = ECoordPlane.XY; m_PlanePos = dtar.rch.point.z; m_Selecting = true; m_NormalSign = -Mathf.RoundToInt(Mathf.Sign(dtar.rch.normal.z)); } // it's impossible !!! else { Debug.LogError("It's impossible !!"); ExitSelecting(); } } // Don't have draw target else { // Select if (!VCEInput.s_Shift && !VCEInput.s_Alt && !VCEInput.s_Control) { m_Selection.Clear(); } m_NeedUpdate = true; } } } if (m_MaterialSelectChange) { Submit(); m_Selecting = false; m_NeedUpdate = true; } } // End free mouse }