public static void DrawBlendshapeSlidersWithLabels(ref List <PumkinsRendererBlendshapesHolder> rendererHolders, GameObject avatar, int indentLevel = 0, float labelWidthOverride = 0)
        {
            if (rendererHolders == null || avatar == null)
            {
                return;
            }

            EditorGUI.indentLevel += indentLevel;

            bool[] rendererShapeChanged = new bool[rendererHolders.Count];  //record changes in holder to apply to renderer later

            for (int i = 0; i < rendererHolders.Count; i++)
            {
                Transform renderTransform = avatar.transform.Find(rendererHolders[i].rendererPath);

                if (!renderTransform)
                {
                    continue;
                }

                SkinnedMeshRenderer renderer = renderTransform.GetComponent <SkinnedMeshRenderer>();

                if (!renderer)
                {
                    continue;
                }

                EditorGUILayout.Space();
                //Draw renderer dropdown toggle
                EditorGUILayout.BeginHorizontal(GUILayout.ExpandWidth(true));
                {
                    float oldLabelWidth = EditorGUIUtility.labelWidth;
                    EditorGUIUtility.labelWidth     = 0;
                    rendererHolders[i].expandedInUI = EditorGUILayout.Toggle(rendererHolders[i].expandedInUI, Styles.Foldout, GUILayout.MaxWidth(10));
                    EditorGUIUtility.labelWidth     = oldLabelWidth;

                    EditorGUILayout.LabelField(rendererHolders[i].rendererPath);
                }
                EditorGUILayout.EndHorizontal();

                //Draw renderer dropdown
                if (rendererHolders[i].expandedInUI)
                {
                    EditorGUILayout.Space();
                    EditorGUILayout.BeginHorizontal();
                    {
                        EditorGUILayout.BeginVertical();
                        for (int j = 0; j < rendererHolders[i].blendshapes.Count; j++)
                        {
                            EditorGUI.BeginChangeCheck();
                            {
                                rendererHolders[i].blendshapes[j].weight = EditorGUILayout.Slider(new GUIContent(rendererHolders[i].blendshapes[j].name), rendererHolders[i].blendshapes[j].weight, 0, 100);
                            }
                            if (EditorGUI.EndChangeCheck())
                            {
                                rendererShapeChanged[i] = true;
                            }
                        }
                        EditorGUILayout.EndVertical();
                    }
                    EditorGUILayout.EndHorizontal();

                    EditorGUILayout.Space();

                    EditorGUILayout.BeginHorizontal();
                    {
                        if (!EditorApplication.isPlaying && GUILayout.Button(Strings.Buttons.revertRenderer) && renderer)
                        {
                            bool expanded = rendererHolders[i].expandedInUI;
                            PumkinsAvatarTools.ResetRendererBlendshapes(renderer, true);
                            rendererHolders[i] = (PumkinsRendererBlendshapesHolder)renderer;
                            rendererHolders[i].expandedInUI = expanded;
                        }
                        if (GUILayout.Button(Strings.Buttons.resetRenderer))
                        {
                            bool expanded = rendererHolders[i].expandedInUI;
                            PumkinsAvatarTools.ResetRendererBlendshapes(renderer, false);
                            rendererHolders[i] = (PumkinsRendererBlendshapesHolder)renderer;
                            rendererHolders[i].expandedInUI = expanded;
                        }
                    }
                    EditorGUILayout.EndHorizontal();

                    EditorGUILayout.Space();
                }
            }

            //Apply changes from holder to actual skinned mesh renderer
            for (int i = 0; i < rendererShapeChanged.Length; i++)
            {
                if (!rendererShapeChanged[i])
                {
                    continue;
                }

                SkinnedMeshRenderer ren;
                Transform           tRen = avatar.transform.Find(rendererHolders[i].rendererPath);
                if (!tRen)
                {
                    continue;
                }

                ren = tRen.GetComponent <SkinnedMeshRenderer>();

                if (!ren)
                {
                    continue;
                }

                foreach (PumkinsBlendshape blendshape in rendererHolders[i].blendshapes)
                {
                    string name  = blendshape.name;
                    int    index = ren.sharedMesh.GetBlendShapeIndex(name);

                    if (index == -1 && blendshape.otherNames.Count > 0)
                    {
                        for (int z = 0; z < blendshape.otherNames.Count; z++)
                        {
                            index = ren.sharedMesh.GetBlendShapeIndex(blendshape.otherNames[z]);
                            if (index != -1)
                            {
                                break;
                            }
                        }
                    }

                    if (index != -1)
                    {
                        ren.SetBlendShapeWeight(index, blendshape.weight);
                    }
                }
            }

            if (rendererHolders.Count > 0)
            {
                Helpers.DrawGUILine();
            }

            EditorGUI.indentLevel -= indentLevel;
        }