void DrawGUI()
        {
            GUILayout.Label("Character Animation", EditorStyles.boldLabel);

            //*** TODO:
            // - Zoom with mouse wheel or enum 2x, 4x, 8x
            // - Anim frames
            // - Set Pivot or sprite offset
            //

            EditorGUI.BeginChangeCheck();
            m_animCtrl.SpriteCharSet = (Sprite)EditorGUILayout.ObjectField("CharacterSet", m_animCtrl.SpriteCharSet, typeof(Sprite), false);
            if (EditorGUI.EndChangeCheck())
            {
                m_animCtrl.CreateSpriteFrames();
            }

            if (m_animCtrl.SpriteCharSet == null)
            {
                return;
            }

            GUIStyle styleFoldout = new GUIStyle(EditorStyles.foldout);

            styleFoldout.fontStyle = FontStyle.Bold;

            m_animCtrl.CharsetType    = (CharAnimationController.eCharSetType)EditorGUILayout.EnumPopup("Charset Type", m_animCtrl.CharsetType);
            m_animCtrl.AnimSpeed      = EditorGUILayout.FloatField("Anim Speed", m_animCtrl.AnimSpeed);
            m_animCtrl.IsPingPongAnim = EditorGUILayout.ToggleLeft("Ping-Pong Anim", m_animCtrl.IsPingPongAnim);

            GUILayout.Box("", new GUILayoutOption[] { GUILayout.ExpandWidth(true), GUILayout.Height(1) });
            EditorGUI.BeginChangeCheck();
            m_viewMode = (eCharAnimEditMode)EditorGUILayout.EnumPopup("View Mode", m_viewMode);
            if (EditorGUI.EndChangeCheck())
            {
                m_vTrans = Vector2.zero;
                m_zoom   = 1f;
            }

            EditorGUI.indentLevel += 1;
            if (m_viewMode == eCharAnimEditMode.EditPivot)
            {
                m_animCtrl.CurrentDir = (CharAnimationController.eDir)EditorGUILayout.EnumPopup("View Direction", m_animCtrl.CurrentDir);
                EditorGUI.BeginChangeCheck();
                m_animCtrl.Pivot[(int)m_animCtrl.CurrentDir] = EditorGUILayout.Vector2Field("Sprite Pivot (" + m_animCtrl.CurrentDir + ")", m_animCtrl.Pivot[(int)m_animCtrl.CurrentDir]);
                if (EditorGUI.EndChangeCheck())
                {
                    m_animCtrl.CreateSpriteFrames();
                }
            }
            else if (m_viewMode == eCharAnimEditMode.MoveInCircles)
            {
                m_walkSpeed = EditorGUILayout.FloatField("Walk Speed", m_walkSpeed);
            }
            EditorGUI.indentLevel -= 1;

            GUILayout.Label("View Zoom:" + m_zoom);
            m_showGrid = EditorGUILayout.Foldout(m_showGrid, "Grid Settings:", styleFoldout);
            if (m_showGrid)
            {
                m_gridColor0 = EditorGUILayout.ColorField("Grid Color0", m_gridColor0);
                m_gridColor1 = EditorGUILayout.ColorField("Grid Color1", m_gridColor1);
                m_gridSize   = EditorGUILayout.FloatField("Grid Size", m_gridSize);
            }

            // +++ Draw Animation Grid +++ ///

            Rect r = GUILayoutUtility.GetRect(1, 1, GUILayout.ExpandWidth(true), GUILayout.ExpandHeight(true));

            GUI.BeginGroup(r, s_gridTex);

            if (Event.current.type == EventType.Repaint)
            {
                m_rGridView = r;
            }
            r.position = Vector2.zero;

            // Draw grid
            Rect rGrid = r;

            rGrid.position *= m_zoom;
            rGrid.width    *= m_zoom;
            rGrid.height   *= m_zoom;
            GUI.DrawTextureWithTexCoords(rGrid, s_gridTex, new Rect(0, 0, r.width / (m_gridSize * s_gridTex.width), r.height / (m_gridSize * s_gridTex.height)));

            float fWalkDistX = 2 * m_animCtrl.GetSpriteFrames()[0].rect.width;
            float fWalkDistY = 2 * m_animCtrl.GetSpriteFrames()[0].rect.height;
            float fWalkProg  = (1 - m_walkAnimTimer);

            foreach (CharAnimationController.eDir dir in System.Enum.GetValues(typeof(CharAnimationController.eDir)))
            {
                Sprite sprFrame = m_animCtrl.GetCurrentSprite(dir);
                Rect   r2       = new Rect();
                if (m_viewMode == eCharAnimEditMode.EditPivot)
                {
                    if (m_animCtrl.CurrentDir != dir)
                    {
                        continue;
                    }
                    r2 = new Rect(r.x, r.y, sprFrame.rect.width, sprFrame.rect.height);
                }
                else if (m_viewMode == eCharAnimEditMode.Row)
                {
                    r2 = new Rect(r.x + (int)dir * sprFrame.rect.width * 1.2f, r.y, sprFrame.rect.width, sprFrame.rect.height);
                }
                else if (m_viewMode == eCharAnimEditMode.Column)
                {
                    r2 = new Rect(r.x, r.y + (int)dir * sprFrame.rect.height * 1.2f, sprFrame.rect.width, sprFrame.rect.height);
                }
                else if (m_viewMode == eCharAnimEditMode.MoveInCircles)
                {
                    switch (dir)
                    {
                    case CharAnimationController.eDir.DOWN: r2 = new Rect(r.x, r.y + fWalkProg * fWalkDistY, sprFrame.rect.width, sprFrame.rect.height); break;

                    case CharAnimationController.eDir.LEFT: r2 = new Rect(r.x + (1 - fWalkProg) * fWalkDistX, r.y, sprFrame.rect.width, sprFrame.rect.height); break;

                    case CharAnimationController.eDir.RIGHT: r2 = new Rect(r.x + fWalkProg * fWalkDistX, r.y + fWalkDistY, sprFrame.rect.width, sprFrame.rect.height); break;

                    case CharAnimationController.eDir.UP: r2 = new Rect(r.x + fWalkDistX, r.y + (1f - fWalkProg) * fWalkDistY, sprFrame.rect.width, sprFrame.rect.height); break;
                    }
                }

                DrawSprite(r2, sprFrame);

                // draw pivot
                if (m_viewMode == eCharAnimEditMode.EditPivot)
                {
                    Vector2 pivot     = m_animCtrl.Pivot[(int)m_animCtrl.CurrentDir];
                    Vector2 vPivotPos = r2.position + new Vector2(pivot.x * r2.width, r2.height - pivot.y * r2.height);
                    DrawLine(new Vector2(vPivotPos.x, r2.yMin), new Vector2(vPivotPos.x, r2.yMax), Color.red);
                    DrawLine(new Vector2(r2.xMin, vPivotPos.y), new Vector2(r2.xMax, vPivotPos.y), Color.green);
                }
            }
            GUI.matrix = Matrix4x4.identity;

            GUI.EndGroup();
            EditorGUILayout.HelpBox("Use mouse scroll wheel to change the View Zoom level\nDrag mouse over grid to drag sprites", MessageType.Info);
        }
        void DrawGUI()
        {
            GUILayout.Label("Character Animation", EditorStyles.boldLabel);

            //*** TODO:
            // - Zoom with mouse wheel or enum 2x, 4x, 8x
            // - Anim frames
            // - Set Pivot or sprite offset
            //

            EditorGUI.BeginChangeCheck();
            m_animCtrl.SpriteCharSet = (Sprite)EditorGUILayout.ObjectField("CharacterSet", m_animCtrl.SpriteCharSet, typeof(Sprite), false);
            if (EditorGUI.EndChangeCheck())
            {
                m_animCtrl.CreateSpriteFrames();
            }

            if (m_animCtrl.SpriteCharSet == null)
            {
                return;
            }

            GUIStyle styleFoldout = new GUIStyle(EditorStyles.foldout);
            styleFoldout.fontStyle = FontStyle.Bold;

            m_animCtrl.CharsetType = (CharAnimationController.eCharSetType)EditorGUILayout.EnumPopup("Charset Type", m_animCtrl.CharsetType);
            m_animCtrl.AnimSpeed = EditorGUILayout.FloatField("Anim Speed", m_animCtrl.AnimSpeed);
            m_animCtrl.IsPingPongAnim = EditorGUILayout.ToggleLeft("Ping-Pong Anim", m_animCtrl.IsPingPongAnim);

            GUILayout.Box("", new GUILayoutOption[] { GUILayout.ExpandWidth(true), GUILayout.Height(1) });
            EditorGUI.BeginChangeCheck();
            m_viewMode = (eCharAnimEditMode)EditorGUILayout.EnumPopup("View Mode", m_viewMode);
            if(EditorGUI.EndChangeCheck())
            {
                m_vTrans = Vector2.zero;
                m_zoom = 1f;
            }

            EditorGUI.indentLevel += 1;
            if (m_viewMode == eCharAnimEditMode.EditPivot)
            {
                m_animCtrl.CurrentDir = (CharAnimationController.eDir)EditorGUILayout.EnumPopup("View Direction", m_animCtrl.CurrentDir);
                EditorGUI.BeginChangeCheck();
                m_animCtrl.Pivot[(int)m_animCtrl.CurrentDir] = EditorGUILayout.Vector2Field("Sprite Pivot (" + m_animCtrl.CurrentDir + ")", m_animCtrl.Pivot[(int)m_animCtrl.CurrentDir]);
                if (EditorGUI.EndChangeCheck())
                {
                    m_animCtrl.CreateSpriteFrames();
                }
            }
            else if (m_viewMode == eCharAnimEditMode.MoveInCircles)
            {
                m_walkSpeed = EditorGUILayout.FloatField("Walk Speed", m_walkSpeed);
            }
            EditorGUI.indentLevel -= 1;

            GUILayout.Label("View Zoom:" + m_zoom);
            m_showGrid = EditorGUILayout.Foldout(m_showGrid, "Grid Settings:", styleFoldout);
            if (m_showGrid)
            {
                m_gridColor0 = EditorGUILayout.ColorField("Grid Color0", m_gridColor0);
                m_gridColor1 = EditorGUILayout.ColorField("Grid Color1", m_gridColor1);
                m_gridSize = EditorGUILayout.FloatField("Grid Size", m_gridSize);
            }

            // +++ Draw Animation Grid +++ ///

            Rect r = GUILayoutUtility.GetRect(1, 1, GUILayout.ExpandWidth(true), GUILayout.ExpandHeight(true));
            GUI.BeginGroup(r, s_gridTex);

            if( Event.current.type == EventType.Repaint)
            {
                m_rGridView = r;
            }
            r.position = Vector2.zero;

            // Draw grid
            Rect rGrid = r;
            rGrid.position *= m_zoom;
            rGrid.width *= m_zoom;
            rGrid.height *= m_zoom;
            GUI.DrawTextureWithTexCoords(rGrid, s_gridTex, new Rect(0, 0, r.width / (m_gridSize * s_gridTex.width), r.height / (m_gridSize * s_gridTex.height)));

            float fWalkDistX = 2 * m_animCtrl.GetSpriteFrames()[0].rect.width;
            float fWalkDistY = 2 * m_animCtrl.GetSpriteFrames()[0].rect.height;
            float fWalkProg = (1 - m_walkAnimTimer);
            foreach (CharAnimationController.eDir dir in System.Enum.GetValues(typeof(CharAnimationController.eDir)))
            {
                Sprite sprFrame = m_animCtrl.GetCurrentSprite(dir);
                Rect r2 = new Rect();
                if (m_viewMode == eCharAnimEditMode.EditPivot)
                {
                    if (m_animCtrl.CurrentDir != dir) continue;
                    r2 = new Rect(r.x, r.y, sprFrame.rect.width, sprFrame.rect.height);
                }
                else if (m_viewMode == eCharAnimEditMode.Row)
                {
                    r2 = new Rect(r.x + (int)dir * sprFrame.rect.width * 1.2f, r.y, sprFrame.rect.width, sprFrame.rect.height);
                }
                else if (m_viewMode == eCharAnimEditMode.Column)
                {
                    r2 = new Rect(r.x, r.y + (int)dir * sprFrame.rect.height * 1.2f, sprFrame.rect.width, sprFrame.rect.height);
                }
                else if (m_viewMode == eCharAnimEditMode.MoveInCircles)
                {
                    switch (dir)
                    {
                        case CharAnimationController.eDir.DOWN: r2 = new Rect(r.x, r.y + fWalkProg * fWalkDistY, sprFrame.rect.width, sprFrame.rect.height); break;
                        case CharAnimationController.eDir.LEFT: r2 = new Rect(r.x + (1 - fWalkProg) * fWalkDistX, r.y, sprFrame.rect.width, sprFrame.rect.height); break;
                        case CharAnimationController.eDir.RIGHT: r2 = new Rect(r.x + fWalkProg * fWalkDistX, r.y + fWalkDistY, sprFrame.rect.width, sprFrame.rect.height); break;
                        case CharAnimationController.eDir.UP: r2 = new Rect(r.x + fWalkDistX, r.y + (1f - fWalkProg) * fWalkDistY, sprFrame.rect.width, sprFrame.rect.height); break;
                    }
                }

                DrawSprite(r2, sprFrame);

                // draw pivot
                if (m_viewMode == eCharAnimEditMode.EditPivot)
                {
                    Vector2 pivot = m_animCtrl.Pivot[(int)m_animCtrl.CurrentDir];
                    Vector2 vPivotPos = r2.position + new Vector2(pivot.x * r2.width, r2.height - pivot.y * r2.height);
                    DrawLine(new Vector2(vPivotPos.x, r2.yMin), new Vector2(vPivotPos.x, r2.yMax), Color.red);
                    DrawLine(new Vector2(r2.xMin, vPivotPos.y), new Vector2(r2.xMax, vPivotPos.y), Color.green);
                }
            }
            GUI.matrix = Matrix4x4.identity;

            GUI.EndGroup();
            EditorGUILayout.HelpBox("Use mouse scroll wheel to change the View Zoom level\nDrag mouse over grid to drag sprites", MessageType.Info);
        }