You cannot select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
105 lines
5.0 KiB
C#
105 lines
5.0 KiB
C#
using UnityEditor;
|
|
using UnityEngine;
|
|
|
|
namespace FluffyGroomingTool {
|
|
public class ClumpModifierUI {
|
|
private bool isExpanded = true;
|
|
private GUIStyle headerText;
|
|
private GUIStyle panelStyle;
|
|
|
|
private void createStyles() {
|
|
if (panelStyle == null) {
|
|
headerText = new GUIStyle(GUI.skin.label) {
|
|
fontStyle = FontStyle.Bold, fontSize = 12, normal = {textColor = new Color(1, 1, 1, 0.8f)}
|
|
};
|
|
panelStyle = new GUIStyle(GUI.skin.label) {
|
|
border = new RectOffset(20, 20, 20, 20),
|
|
padding = new RectOffset(15, 16, 10, 17),
|
|
normal = {background = Resources.Load<Texture2D>("bg_box")}
|
|
};
|
|
headerText.alignment = TextAnchor.MiddleLeft;
|
|
}
|
|
}
|
|
|
|
|
|
public void drawClumpingUI(FurCreator furCreator, GUIStyle brushPropertiesPanelStyle, PainterLayersUI painterLayersUI) {
|
|
isExpanded = EditorGUILayout.Foldout(isExpanded, "Clumps");
|
|
if (isExpanded) {
|
|
createStyles();
|
|
EditorGUILayout.Space(PainterResetAndSmoothUI.DEFAULT_CHILD_VERTICAL_MARGIN);
|
|
GUILayout.BeginVertical(brushPropertiesPanelStyle);
|
|
for (int j = 0; j < furCreator.groomContainer.getActiveLayer().clumpModifiers.Length; j++) {
|
|
GUILayout.BeginVertical(panelStyle);
|
|
EditorGUILayout.LabelField("Clump Modifier " + (j + 1), headerText);
|
|
|
|
var rect = GUILayoutUtility.GetLastRect();
|
|
rect = new Rect(rect.width + 42, rect.y - 6, 29, 29);
|
|
|
|
|
|
if (GUI.Button(rect, new GUIContent("", "Delete the Clump Modifier"), painterLayersUI.trashButtonStyle)) {
|
|
furCreator.removeClumpModifier(j);
|
|
}
|
|
|
|
EditorGUILayout.Space(6);
|
|
|
|
var clumpGroomModifier = furCreator.groomContainer.getActiveLayer().clumpModifiers[j];
|
|
var clumpsSpacing = furCreator.groomContainer.undoSlider(
|
|
new GUIContent("Clump Spacing:", "Sets the approximate distance between each clump."),
|
|
clumpGroomModifier.clumpsSpacing,
|
|
0.01f,
|
|
0.15f
|
|
);
|
|
|
|
EditorGUI.BeginChangeCheck();
|
|
var curve = EditorGUILayout.CurveField(
|
|
new GUIContent("Attraction Curve", "Sets the attraction intensity of the clump from root to tip."),
|
|
clumpGroomModifier.attractionCurve,
|
|
painterLayersUI.colors[furCreator.groomContainer.activeLayerIndex % 5], new Rect(0, -1, 1, 3));
|
|
if (EditorGUI.EndChangeCheck()) {
|
|
//FluffyUndo.safelyUndo(furCreator.groomContainer, furCreator.FurRenderer.furContainer);
|
|
}
|
|
|
|
var clumpModifierLayers =
|
|
furCreator.FurRenderer.furContainer.layerStrandsList[furCreator.groomContainer.activeLayerIndex].clumpsModifiers;
|
|
if (j < clumpModifierLayers.Length) {
|
|
var clumpModifierLayer = clumpModifierLayers[j];
|
|
clumpGroomModifier.attractionCurve = curve;
|
|
clumpModifierLayer.attractionCurve = curve;
|
|
var isSameCurve = clumpGroomModifier.isSameCurve(curve.getCurveSum());
|
|
if (!isSameCurve) {
|
|
furCreator.FurRenderer.furContainer.updateClumpAttrationCurveBuffer();
|
|
}
|
|
}
|
|
|
|
// ReSharper disable once CompareOfFloatsByEqualityOperator
|
|
if (clumpsSpacing != clumpGroomModifier.clumpsSpacing || clumpGroomModifier.isDistanceBetweenClumpsUndoPerformed()) {
|
|
clumpGroomModifier.clumpsSpacing = clumpsSpacing;
|
|
clumpGroomModifier.TempClumpSpacing = clumpsSpacing;
|
|
furCreator.addStrands();
|
|
}
|
|
|
|
GUILayout.EndVertical();
|
|
}
|
|
|
|
var normalTextColor = Color.white;
|
|
if (!EditorGUIUtility.isProSkin) {
|
|
normalTextColor = Color.black;
|
|
}
|
|
|
|
normalTextColor.a = 0.9f;
|
|
painterLayersUI.buttonStyle.normal.textColor = normalTextColor;
|
|
painterLayersUI.buttonStyle.hover.textColor = normalTextColor;
|
|
painterLayersUI.buttonStyle.alignment = TextAnchor.MiddleCenter;
|
|
if (GUILayout.Button(
|
|
new GUIContent("Add Clump Modifier", "Adds a clump modifier. This feature works best when using strand based rendering."),
|
|
painterLayersUI.buttonStyle)) {
|
|
furCreator.addClump();
|
|
}
|
|
|
|
GUILayout.EndVertical();
|
|
|
|
EditorGUILayout.Space(PainterResetAndSmoothUI.DEFAULT_MARGIN_TOP);
|
|
}
|
|
}
|
|
}
|
|
} |