public void DrawInternalSpringsGUI() { EditorGUILayout.BeginHorizontal(); EditorGUI.BeginChangeCheck(); EditorGUILayout.PropertyField(eInternalSprings, internalSpringsContent); if (EditorGUI.EndChangeCheck()) { if (eInternalSprings.isExpanded) { eEdgeSprings.isExpanded = false; eCustomSprings.isExpanded = false; } drawIndex = -1; editIndex = -1; SceneView.RepaintAll(); } if (GUILayout.Button(buildSpringsContent, EditorStyles.miniButton)) //TODO make sure this plays well with serialized object... { springBody.clearInternalSprings(); springBody.BuildInternalSprings(); EditorUtility.SetDirty(springBody); } EditorGUILayout.EndHorizontal(); if (eInternalSprings.isExpanded) { EditorGUI.indentLevel++; EditorGUILayout.BeginHorizontal(); GUIStyle foldoutStyle = new GUIStyle(EditorStyles.foldout); if (eInternalSpringK.prefabOverride || eInternalSpringDamp.prefabOverride) { foldoutStyle.fontStyle = FontStyle.Bold; } showInternalDefaultsFoldout = EditorGUILayout.Foldout(showInternalDefaultsFoldout, internalDefaultsContent, foldoutStyle); if (GUILayout.Button(setDefaultInternalContent, EditorStyles.miniButton)) { for (int i = 0; i < springBodyEditor.serializedObject.targetObjects.Length; i++) { JelloSpringBody t = (JelloSpringBody)springBodyEditor.serializedObject.targetObjects[i]; t.setInternalSpringConstants(t.DefaultInternalSpringStiffness, t.DefaultInternalSpringDamping); } EditorUtility.SetDirty(springBody); } EditorGUILayout.EndHorizontal(); if (showInternalDefaultsFoldout) { EditorGUI.showMixedValue = eInternalSpringK.hasMultipleDifferentValues; EditorGUI.BeginChangeCheck(); EditorGUILayout.PropertyField(eInternalSpringK, stiffnessContent); if (EditorGUI.EndChangeCheck()) { for (int i = 0; i < springBodyEditor.serializedObject.targetObjects.Length; i++) { JelloSpringBody sb = (JelloSpringBody)springBodyEditor.serializedObject.targetObjects[i]; sb.DefaultInternalSpringStiffness = eInternalSpringK.floatValue; } EditorUtility.SetDirty(springBody); } EditorGUI.showMixedValue = false; EditorGUI.showMixedValue = eInternalSpringDamp.hasMultipleDifferentValues; EditorGUI.BeginChangeCheck(); EditorGUILayout.PropertyField(eInternalSpringDamp, dampingContent); if (EditorGUI.EndChangeCheck()) { for (int i = 0; i < springBodyEditor.serializedObject.targetObjects.Length; i++) { JelloSpringBody sb = (JelloSpringBody)springBodyEditor.serializedObject.targetObjects[i]; sb.DefaultInternalSpringDamping = eInternalSpringDamp.floatValue; } EditorUtility.SetDirty(springBody); } EditorGUI.showMixedValue = false; } EditorGUILayout.Separator(); if (multiEditing) { EditorGUILayout.HelpBox("Springs may not be edited when multiple GameObjects are selected", MessageType.Info); EditorGUI.indentLevel--; return; } int offset = springBody.EdgeSpringCount; // internal springs come after edge springs. scrollPos = EditorGUILayout.BeginScrollView(scrollPos, false, false, GUILayout.MinHeight(minScrollViewHeight)); for (int i = 0; i < springBody.InternalSpringCount; i++) { EditorGUILayout.BeginHorizontal(); string text = "Spring # " + (i + offset); string tooltip = "PMA: " + springBody.getInternalSpring(i).pointMassA + " \nPMB: " + springBody.getInternalSpring(i).pointMassB + "\nRest Length: " + springBody.getInternalSpring(i).length + "\nSpring K: " + springBody.getInternalSpring(i).stiffness + "\nDamping: " + springBody.getInternalSpring(i).damping; SerializedProperty eSpring = eInternalSprings.GetArrayElementAtIndex(i); eSpring.isExpanded = editIndex == i + offset; EditorGUI.BeginChangeCheck(); EditorGUILayout.PropertyField(eSpring, new GUIContent(text, tooltip)); if (EditorGUI.EndChangeCheck()) { if (!eSpring.isExpanded) { editIndex = -1; } else if (eSpring.isExpanded) { editIndex = i + offset; handlePositions[0] = springBody.Shape.getVertex(springBody.getInternalSpring(i).pointMassA); handlePositions[1] = springBody.Shape.getVertex(springBody.getInternalSpring(i).pointMassB); } SceneView.RepaintAll(); } if (Event.current.type == EventType.Repaint && GUI.tooltip != prevTooltip) { //mouse out if (prevTooltip != "") { drawIndex = -1; } //mouse over if (GUI.tooltip != "") { drawIndex = i + offset; //offset this in internal springs and in custom springs... } prevTooltip = GUI.tooltip; SceneView.RepaintAll(); } if (GUILayout.Button(deleteSpringContent, EditorStyles.miniButton, GUILayout.Width(20f))) { springBody.RemoveSpring(springBody.getInternalSpring(i)); if (editIndex > i + offset) { editIndex--; } else if (editIndex == i + offset) { editIndex = -1; } if (drawIndex > i + offset) { drawIndex--; } else if (editIndex == i + offset) { drawIndex = -1; } EditorUtility.SetDirty(springBody); break; } EditorGUILayout.EndHorizontal(); if (editIndex == i + offset) //offset this in internal and custom { DrawEditSpringGUI(eInternalSprings, i); } } EditorGUILayout.EndScrollView(); EditorGUI.indentLevel--; } }