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.
95 lines
4.2 KiB
C#
95 lines
4.2 KiB
C#
using System.Linq;
|
|
using UnityEditor;
|
|
using UnityEngine;
|
|
|
|
namespace FluffyGroomingTool {
|
|
[CustomEditor(typeof(SDFCollider))]
|
|
public class SDFColliderObjectEditor : Editor {
|
|
private SerializedProperty isStatic;
|
|
private SerializedProperty colliderSkinWidth;
|
|
private SerializedProperty sdfColliderResolution;
|
|
private SerializedProperty useForwardCollision;
|
|
private GUIStyle buttonStyle;
|
|
private SDFCollider sdfCollider;
|
|
|
|
public override void OnInspectorGUI() {
|
|
GUILayout.BeginVertical();
|
|
initialize();
|
|
if (EditorUserBuildSettings.activeBuildTarget == BuildTarget.Android) {
|
|
EditorGUILayout.LabelField("SDF Colliders are currently not supported on Android.");
|
|
sdfCollider.verletSimulationSettings.isUnsupportedSDFPlatform = true;
|
|
}
|
|
else {
|
|
sdfCollider.verletSimulationSettings.isUnsupportedSDFPlatform = false;
|
|
EditorGUILayout.PropertyField(isStatic);
|
|
EditorGUILayout.Space(5);
|
|
EditorGUILayout.PropertyField(colliderSkinWidth);
|
|
EditorGUI.BeginChangeCheck();
|
|
EditorGUILayout.PropertyField(sdfColliderResolution);
|
|
EditorGUILayout.Space(5);
|
|
EditorGUILayout.PropertyField(useForwardCollision);
|
|
|
|
if (EditorGUI.EndChangeCheck()) {
|
|
sdfCollider.recreateSDF();
|
|
}
|
|
|
|
EditorGUILayout.Space(5);
|
|
if (GUILayout.Button(new GUIContent("Attach To Fur/Hair-Renderers",
|
|
"This will add the SDF Collider to all FurRenderers in the scene."))) {
|
|
attachToFurRenderers();
|
|
}
|
|
|
|
serializedObject.ApplyModifiedProperties();
|
|
}
|
|
|
|
GUILayout.EndVertical();
|
|
}
|
|
|
|
private void attachToFurRenderers() {
|
|
var furRenderers = FindObjectsOfType<FurRenderer>();
|
|
var hairRenderers = FindObjectsOfType<HairRenderer>();
|
|
var colliderWasAddedToFurRenderer = false;
|
|
foreach (var fr in furRenderers) {
|
|
if (!fr.sdfColliders.Contains(sdfCollider)) {
|
|
colliderWasAddedToFurRenderer = true;
|
|
addToRenderer(fr);
|
|
}
|
|
}
|
|
foreach (var hr in hairRenderers) {
|
|
if (!hr.sdfColliders.Contains(sdfCollider)) {
|
|
colliderWasAddedToFurRenderer = true;
|
|
addToRenderer(hr);
|
|
}
|
|
}
|
|
if (furRenderers.Length == 0) {
|
|
Debug.LogWarning("Fluffy did not find any Fur/Hair-Renderers in this scene.");
|
|
}
|
|
else if (!colliderWasAddedToFurRenderer) {
|
|
Debug.LogWarning("The collider has already been added to all Fur/Hair-Renderers in this scene.");
|
|
}
|
|
}
|
|
|
|
private void addToRenderer(Object renderer) {
|
|
var so = new SerializedObject(renderer);
|
|
so.ApplyModifiedProperties();
|
|
var serializedProperty = so.FindProperty("sdfColliders");
|
|
var serializedPropertyArraySize = serializedProperty.arraySize;
|
|
serializedProperty.InsertArrayElementAtIndex(serializedPropertyArraySize);
|
|
serializedProperty.GetArrayElementAtIndex(serializedPropertyArraySize).objectReferenceValue = sdfCollider;
|
|
so.ApplyModifiedProperties();
|
|
Debug.Log("Collider was added to: " + renderer.name);
|
|
}
|
|
|
|
private void initialize() {
|
|
if (isStatic == null) {
|
|
sdfCollider ??= (SDFCollider) serializedObject.targetObject;
|
|
isStatic = serializedObject.FindProperty("isStatic");
|
|
colliderSkinWidth = serializedObject.FindProperty("verletSimulationSettings.colliderSkinWidth");
|
|
sdfColliderResolution = serializedObject.FindProperty("verletSimulationSettings.sdfColliderResolution");
|
|
useForwardCollision = serializedObject.FindProperty("verletSimulationSettings.useForwardCollision");
|
|
buttonStyle = PainterLayersUI.createButtonStyle("bg_button", "bg_button_hover");
|
|
buttonStyle.alignment = TextAnchor.MiddleCenter;
|
|
}
|
|
}
|
|
}
|
|
} |