/// <summary>
        /// Draw the Text.
        /// </summary>

        protected override void OnFillVBO(List <UIVertex> vbo)
        {
            if (font == null)
            {
                return;
            }

            Vector2 extents = rectTransform.rect.size;
            TextGenerationSettings settings = GetGenerationSettings(extents);

            if (!m_cachedTextSettings.Equals(settings) || m_cachedText != text)
            {
                base.OnFillVBO(vbo);

//				Debug.Log("TextSetting changed, updating verts! vbo.Count : " + vbo.Count);

                // Update caches
                m_cachedVerts        = vbo.GetRange(0, vbo.Count);
                m_cachedTextSettings = settings;
                m_cachedText         = text;

                // Call to update animation letter setups
                m_animation_manager.UpdateText(text, new UGUITextDataHandler(m_cachedVerts), white_space_meshes: true);
            }
            else
            {
                // Use cached vert data
//				Debug.Log("Use cached vert data, m_cachedVerts[" + m_cachedVerts.Count + "] ");

                UIVertex new_vert;

                // Add each cached vert into the VBO buffer. Verts seem to need to be added one by one using Add(), can't just copy the list over
                for (int idx = 0; idx < m_cachedVerts.Count; idx++)
                {
                    vbo.Add(m_cachedVerts[idx]);

                    if (Application.isPlaying && m_animation_manager.Playing && m_animation_manager.MeshVerts != null && idx < m_animation_manager.MeshVerts.Length)
                    {
                        new_vert           = vbo[vbo.Count - 1];
                        new_vert.position  = m_animation_manager.MeshVerts[idx];
                        new_vert.color     = m_animation_manager.MeshColours[idx];
                        vbo[vbo.Count - 1] = new_vert;

                        m_forced_state_verts[idx] = m_animation_manager.MeshVerts[idx];
                        m_forced_state_cols[idx]  = m_animation_manager.MeshColours[idx];
                    }
                    else if (m_forced_state_verts != null && idx < m_forced_state_verts.Length)
                    {
                        //					Debug.Log("UGUI Using forced_state_verts");
                        new_vert           = vbo[vbo.Count - 1];
                        new_vert.position  = m_forced_state_verts[idx];
                        new_vert.color     = m_forced_state_cols[idx];
                        vbo[vbo.Count - 1] = new_vert;
                    }
                }

#if UNITY_EDITOR
                if (m_forced_state_verts != null)
                {
                    // Set object dirty to trigger sceneview redraw/update. Calling SceneView.RepaintAll() doesn't work for some reason.
                    EditorUtility.SetDirty(GameObject);
                }
#endif
            }
        }