Inheritance: AlloyFieldDrawer
    public AlloyTexCoordDrawer(AlloyInspectorBase editor, MaterialProperty property)
        : base(editor, property)
    {
        m_shaderVarName = Property.name.Replace("_ST", "");
        m_tabGroup      = AlloyTabGroup.GetTabGroup();

        m_tabOpen.value = m_tabGroup.IsOpen(SaveName);

        AlloyTextureFieldDrawer.CacheTextureProps(editor,
                                                  m_shaderVarName,
                                                  out m_scrollProp,
                                                  out m_spinProp,
                                                  out m_uvProp);
    }
    protected override AlloyFieldDrawer GenerateDrawer(AlloyInspectorBase editor)
    {
        var ret = new AlloyTextureFieldDrawer(editor, MaterialProperty);

        foreach (var token in Arguments)
        {
            var argName  = token.ArgumentName;
            var argToken = token.ArgumentToken;

            switch (argName)
            {
            case "Visualize": {
                var container = argToken as AlloyCollectionToken;
                if (container != null)
                {
                    ret.DisplayModes = container.SubTokens.Select(t => (AlloyTextureFieldDrawer.TextureVisualizeMode)Enum.Parse(typeof(AlloyTextureFieldDrawer.TextureVisualizeMode), t.Token)).ToArray();
                }
            }

            break;

            case "Parent": {
                ret.ParentTexture = argToken.Token;
            }

            break;

            case "Controls":
                var valueToken = argToken as AlloyValueToken;
                if (valueToken != null)
                {
                    ret.Controls = valueToken.BoolValue;
                }
                break;

                //				case "Keyword":
                //					ret.Keyword = argToken.Token;
                //					break;
            }
        }

        return(ret);
    }
    protected override AlloyFieldDrawer GenerateDrawer(AlloyInspectorBase editor) {
        var ret = new AlloyTextureFieldDrawer(editor, MaterialProperty);

        foreach (var token in Arguments) {
            var argName = token.ArgumentName;
            var argToken = token.ArgumentToken;

            switch (argName) {
                case "Visualize": {
                        var container = argToken as AlloyCollectionToken;
                        if (container != null) {
                            ret.DisplayModes = container.SubTokens.Select(t => (AlloyTextureFieldDrawer.TextureVisualizeMode)Enum.Parse(typeof(AlloyTextureFieldDrawer.TextureVisualizeMode), t.Token)).ToArray();
                        }
                    }

                    break;

                case "Parent": {
                        ret.ParentTexture = argToken.Token;
                    }

                    break;

                case "Controls":
                    var valueToken = argToken as AlloyValueToken;
                    if (valueToken != null) {
                        ret.Controls = valueToken.BoolValue;
                    }
                    break;

                //				case "Keyword":
                //					ret.Keyword = argToken.Token;
                //					break;
            }
        }

        return ret;
    }
    public override void Draw(AlloyFieldDrawerArgs args)
    {
        m_inst = args.MatInst;

        bool isOpen = m_tabGroup.Foldout(DisplayName, SaveName, GUILayout.Width(10.0f));

        m_tabOpen.target = isOpen;

        if (m_tabOpen.value)
        {
            EditorGUILayout.BeginFadeGroup(m_tabOpen.faded);
            AlloyGUI.Vector2Field(Serialized, "Tiling", true);
            AlloyGUI.Vector2Field(Serialized, "Offset", false);


            AlloyTextureFieldDrawer.DrawTextureControls(m_scrollProp, m_spinProp, m_uvProp);
            EditorGUILayout.EndFadeGroup();
        }

        if (m_tabOpen.isAnimating)
        {
            args.Editor.MatEditor.Repaint();
        }
    }