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; }