// 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
    }