/// <summary>
    /// hooks up the component object as the inspector target
    /// </summary>
    public virtual void OnEnable()
    {
        m_Component = (vp_SurfaceManager)target;

        for (int i = 0; i < m_Component.ObjectSurfaces.Count; i++)
        {
            vp_SurfaceManager.ObjectSurface surface = m_Component.ObjectSurfaces[i];
            for (int x = 0; x < surface.UVTextures.Count; x++)
            {
                surface.UVTextures[x].ShowUV = false;
            }
        }
    }
    /// <summary>
    ///
    /// </summary>
    public virtual void DoTextureFallbacksFoldout()
    {
        GUILayout.BeginHorizontal();
        GUILayout.Space(10);

        m_TextureFallbacksFoldout = EditorGUILayout.Foldout(m_TextureFallbacksFoldout, "Texture Fallbacks");

        GUILayout.Space(10);
        GUILayout.EndHorizontal();

        if (m_TextureFallbacksFoldout)
        {
            GUILayout.Space(0);

            if (m_Component.ObjectSurfaces != null)
            {
                for (int i = 0; i < m_Component.ObjectSurfaces.Count; i++)
                {
                    vp_SurfaceManager.ObjectSurface surface = m_Component.ObjectSurfaces[i];

                    if (surface.UVTextures.Count == 0)
                    {
                        vp_SurfaceManager.UVTexture texture = new vp_SurfaceManager.UVTexture(true);
                        surface.UVTextures.Add(texture);
                    }

                    GUILayout.BeginHorizontal();
                    GUILayout.Space(20);
                    surface.Foldout = EditorGUILayout.Foldout(surface.Foldout, surface.Name);

                    if (GUILayout.Button("Remove", vp_EditorGUIUtility.SmallButtonStyle, GUILayout.MinWidth(50), GUILayout.MaxWidth(50), GUILayout.MinHeight(15)))
                    {
                        m_Component.ObjectSurfaces.RemoveAt(i);
                        i--;
                    }
                    GUI.backgroundColor = Color.white;

                    GUILayout.Space(20);

                    GUILayout.EndHorizontal();

                    GUILayout.Space(5);

                    if (surface.Foldout)
                    {
                        GUILayout.BeginHorizontal();
                        GUILayout.Space(35);
                        vp_SurfaceType s = surface.SurfaceType;
                        surface.SurfaceType = (vp_SurfaceType)EditorGUILayout.ObjectField("SurfaceType", surface.SurfaceType, typeof(vp_SurfaceType), false);

                        if ((s != surface.SurfaceType))
                        {
                            for (int ii = 0; ii < m_Component.ObjectSurfaces.Count; ii++)
                            {
                                if (i != ii)
                                {
                                    if (m_Component.ObjectSurfaces[ii].SurfaceType == m_Component.ObjectSurfaces[i].SurfaceType)
                                    {
                                        EditorUtility.DisplayDialog("Ooops!", "The SurfaceType '" + surface.SurfaceType.name + "' has already been added. Please choose a different SurfaceType.", "OK");
                                        surface.SurfaceType = s;
                                    }
                                }
                            }
                        }

                        if ((surface.SurfaceType != null) && (s != surface.SurfaceType))
                        {
                            surface.Name = surface.SurfaceType.name;
                        }
                        if ((surface.SurfaceType != null) && GUILayout.Button("X", vp_EditorGUIUtility.SmallButtonStyle, GUILayout.MinWidth(12), GUILayout.MaxWidth(12), GUILayout.MinHeight(12)))
                        {
                            surface.SurfaceType = null;
                        }
                        GUILayout.Space(20);
                        GUILayout.EndHorizontal();

                        if (surface.SurfaceType == null)
                        {
                            surface.Name = "Please assign a SurfaceType";
                        }

                        GUILayout.BeginHorizontal();
                        GUILayout.Space(38);

                        if (surface.TexturesFoldout)
                        {
                            surface.TexturesFoldout = EditorGUILayout.Foldout(surface.TexturesFoldout, "Textures", HeaderStyleSelected);
                        }
                        else
                        {
                            surface.TexturesFoldout = EditorGUILayout.Foldout(surface.TexturesFoldout, "Textures");
                        }

                        GUILayout.EndHorizontal();

                        if (surface.TexturesFoldout)
                        {
                            if (surface.UVTextures != null)
                            {
                                if (surface.UVTextures.Count > 0)
                                {
                                    int counter = 0;

                                    for (int x = 0; x < surface.UVTextures.Count; x++)
                                    {
                                        if (counter == 0)
                                        {
                                            GUILayout.BeginHorizontal(GUILayout.MinHeight(100));
                                            GUILayout.Space(50);
                                        }

                                        GUILayout.BeginVertical(GUILayout.MinHeight(90));
                                        GUILayout.Space(12);                                            // moves everything vertically

                                        GUILayout.BeginHorizontal(GUILayout.MaxWidth(75), GUILayout.MinWidth(75));

                                        // --- uv editor closed ---
                                        GUILayout.Space(8);                                             // left margin for lower buttons
                                        if (!surface.UVTextures[x].ShowUV)
                                        {
                                            GUILayout.FlexibleSpace();
                                            if (GUILayout.Button("X", vp_EditorGUIUtility.SmallButtonStyle, GUILayout.MinWidth(12), GUILayout.MaxWidth(12), GUILayout.MinHeight(12)))
                                            {
                                                if (((x > 0) || ((x == 0) && (surface.UVTextures[0].Texture != null) || (surface.UVTextures.Count > 1))))
                                                {
                                                    if (surface.UVTextures[x].Texture != null)
                                                    {
                                                        surface.UVTextures[x].Texture = null;
                                                        vp_SurfaceManager.Instance.Reset();
                                                    }
                                                    else
                                                    {
                                                        surface.UVTextures.RemoveAt(x);
                                                        x = Mathf.Max(0, x - 1);
                                                        GUI.FocusControl(null);
                                                    }
                                                }
                                                //m_Component.SetDirty(true);
                                            }
                                            GUILayout.Space(-4);                                                // right margin for upper buttons
                                        }

                                        // --- uv editor open ---

                                        GUILayout.EndHorizontal();

                                        if (surface.UVTextures[x].Texture != null)
                                        {
                                            GUILayout.Space(44);
                                        }
                                        else
                                        {
                                            GUILayout.Space(63);
                                        }

                                        GUILayout.BeginHorizontal(GUILayout.MaxWidth(75), GUILayout.MinWidth(75));
                                        GUILayout.Space(4);                                             // left margin for upper buttons

                                        if (surface.UVTextures[x].Texture == null)
                                        {
                                            surface.UVTextures[x].ShowUV = false;
                                        }
                                        else if (!surface.UVTextures[x].ShowUV)
                                        {
                                            if (GUILayout.Button(("UV" + (surface.UVTextures[x].UV != m_Component.DefaultUV ? " *" : "")), vp_EditorGUIUtility.SmallButtonStyle, GUILayout.MinWidth(25), GUILayout.MaxWidth(25), GUILayout.MinHeight(13)))
                                            {
                                                surface.UVTextures[x].ShowUV = true;
                                            }
                                        }
                                        GUILayout.FlexibleSpace();

                                        GUILayout.Space(-4);                                            // right margin for upper buttons
                                        GUILayout.EndHorizontal();
                                        if (!surface.UVTextures[x].ShowUV)
                                        {
                                            GUILayout.Space(-63);
                                        }
                                        else
                                        {
                                            GUILayout.Space(-25);
                                        }

                                        GUILayout.Space(-17);                                           // moves texture + upper buttons vertically
                                        if (!surface.UVTextures[x].ShowUV)
                                        {
                                            surface.UVTextures[x].Texture = (Texture)EditorGUILayout.ObjectField(surface.UVTextures[x].Texture, typeof(Texture), false, GUILayout.MinWidth(75), GUILayout.MaxWidth(75), GUILayout.MinHeight(75), GUILayout.MaxHeight((surface.UVTextures[x].ShowUV ? 75 : 75)));
                                        }
                                        if (surface.UVTextures[x].ShowUV)
                                        {
                                            Rect v = surface.UVTextures[x].UV;
                                            GUILayout.BeginVertical(GUILayout.MaxWidth(75), (GUILayout.MinWidth(75)));
                                            GUILayout.BeginHorizontal();
                                            GUILayout.FlexibleSpace();
                                            GUI.SetNextControlName("reset");
                                            if (GUILayout.Button("Reset UV", vp_EditorGUIUtility.SmallButtonStyle, GUILayout.MinHeight(15), GUILayout.MaxWidth(75)))
                                            {
                                                surface.UVTextures[x].UV = m_Component.DefaultUV;
                                                // focus the reset button to get rid of possible textfield focus
                                                // or the textfields won't update properly when resetting
                                                GUI.FocusControl("reset");
                                                GUI.FocusControl(null);                                                 // unfocus or button highlight may go weird
                                            }
                                            GUILayout.FlexibleSpace();
                                            GUILayout.EndHorizontal();
                                            GUILayout.Space(4);
                                            GUILayout.BeginHorizontal(GUILayout.MaxWidth(75), GUILayout.MinWidth(75));

                                            surface.UVTextures[x].UV = EditorGUILayout.RectField(surface.UVTextures[x].UV, GUILayout.MinWidth(95), GUILayout.MaxWidth(95));
                                            if (v != surface.UVTextures[x].UV)
                                            {
                                                surface.UVTextures[x].UV = new Rect(
                                                    Mathf.Clamp(surface.UVTextures[x].UV.xMin, 0, 1),
                                                    Mathf.Clamp(surface.UVTextures[x].UV.yMin, 0, 1),
                                                    Mathf.Clamp(surface.UVTextures[x].UV.width, 0, 1),
                                                    Mathf.Clamp(surface.UVTextures[x].UV.height, 0, 1)
                                                    );
                                            }
                                            GUILayout.EndHorizontal();

                                            GUILayout.BeginHorizontal();
                                            GUILayout.FlexibleSpace();

                                            if (GUILayout.Button("Show Texture", vp_EditorGUIUtility.SmallButtonStyle, GUILayout.MinWidth(75), GUILayout.MaxWidth(75), GUILayout.MinHeight(15)))
                                            {
                                                surface.UVTextures[x].ShowUV = !surface.UVTextures[x].ShowUV;
                                            }
                                            GUILayout.FlexibleSpace();
                                            GUILayout.EndHorizontal();
                                            GUILayout.EndVertical();
                                        }

                                        GUILayout.Space(-80);                                           // top margin for upper buttons

                                        GUILayout.BeginHorizontal(GUILayout.MaxWidth(75), GUILayout.MinWidth(75));
                                        GUILayout.Space(8);                                             // left margin for upper buttons

                                        // --- uv 2 ---
                                        if (!surface.UVTextures[x].ShowUV)
                                        {
                                            if ((x == 0) && ((surface.UVTextures[0].Texture == null) && (surface.UVTextures.Count == 1)))
                                            {
                                                GUI.color = Color.clear;
                                            }
                                            GUILayout.FlexibleSpace();
                                            GUILayout.Button("X", vp_EditorGUIUtility.SmallButtonStyle, GUILayout.MinWidth(12), GUILayout.MaxWidth(12), GUILayout.MinHeight(12));
                                            GUILayout.Space(-4);                                                // right margin for lower buttons
                                            GUI.color = Color.white;
                                        }

                                        GUI.backgroundColor = Color.white;

                                        GUILayout.EndHorizontal();
                                        GUILayout.Space(43);

                                        GUILayout.BeginHorizontal(GUILayout.MaxWidth(75), GUILayout.MinWidth(75));
                                        GUILayout.Space(4);                                             // left margin for upper buttons

                                        if (surface.UVTextures[x].Texture == null)
                                        {
                                            surface.UVTextures[x].ShowUV = false;
                                        }
                                        else if (!surface.UVTextures[x].ShowUV)
                                        {
                                            GUILayout.Button(("UV" + (surface.UVTextures[x].UV != m_Component.DefaultUV ? " *" : "")), vp_EditorGUIUtility.SmallButtonStyle, GUILayout.MinWidth(25), GUILayout.MaxWidth(25), GUILayout.MinHeight(13));
                                        }
                                        GUILayout.FlexibleSpace();
                                        if (!surface.UVTextures[x].ShowUV)
                                        {
                                            GUILayout.Button("Select", vp_EditorGUIUtility.SmallButtonStyle, GUILayout.MinWidth(35), GUILayout.MaxWidth(35), GUILayout.MinHeight(13));
                                        }

                                        GUILayout.Space(-4);                                            // right margin for upper buttons
                                        GUILayout.EndHorizontal();

                                        GUILayout.EndVertical();

                                        counter++;

                                        if (counter == 4 || x == surface.UVTextures.Count - 1)
                                        {
                                            GUILayout.Space(20);

                                            GUILayout.EndHorizontal();
                                            counter = 0;
                                        }
                                    }
                                }
                            }

                            GUILayout.BeginHorizontal();
                            GUILayout.FlexibleSpace();
                            if (GUILayout.Button("Add Texture Slot", GUILayout.MinWidth(120), GUILayout.MaxWidth(120)))
                            {
                                vp_SurfaceManager.UVTexture texture = new vp_SurfaceManager.UVTexture(true);
                                surface.UVTextures.Add(texture);
                            }
                            GUILayout.Space(20);
                            GUI.backgroundColor = Color.white;
                            GUILayout.EndHorizontal();
                        }

                        vp_EditorGUIUtility.Separator();

                        GUILayout.Space(5);
                    }
                }
            }

            if (m_Component.m_ShowHelp && (m_Component.ObjectSurfaces.Count == 0))
            {
                GUILayout.BeginHorizontal();
                GUILayout.Space(50);
                EditorGUILayout.HelpBox("There are no Texture Groups. Click the \"Add Texture Groups\" button to add one.", MessageType.Info);
                GUILayout.Space(20);
                GUILayout.EndHorizontal();
            }

            GUILayout.Space(8);

            GUILayout.BeginHorizontal();

            GUILayout.Space(10);

            if (GUILayout.Button("Add Texture Group", GUILayout.MinWidth(150), GUILayout.MinHeight(25)))
            {
                vp_SurfaceManager.ObjectSurface surface = new vp_SurfaceManager.ObjectSurface();
                m_Component.ObjectSurfaces.Add(surface);
            }
            GUI.backgroundColor = Color.white;
            GUILayout.Space(20);
            GUILayout.EndHorizontal();

            GUILayout.Space(10);

            if (m_Component.m_ShowHelp)
            {
                GUILayout.BeginHorizontal();
                GUILayout.Space(10);
                GUI.enabled = false;
                EditorGUILayout.HelpBox("• To create a new SurfaceType fallback for a texture set, click 'Add Texture Group' and assign the vp_SurfaceType. Then, add all the textures you want associated with that particular surface type.\n\n• You can click the 'UV' button to restrict the surface inside a texture. Note that if you want to have several surfaces inside a single texture, you need to add the texture once for every UV region.\n", MessageType.None);
                GUI.enabled = true;
                GUILayout.Space(20);
                GUILayout.EndHorizontal();
            }

            vp_EditorGUIUtility.Separator();
        }
    }