rabidus-test/Assets/Dreamteck/Splines/Editor/Components/MeshGenEditor.cs

230 lines
11 KiB
C#
Raw Permalink Normal View History

2023-07-24 16:38:13 +03:00
namespace Dreamteck.Splines.Editor
{
using UnityEngine;
using System.Collections;
using UnityEditor;
[CustomEditor(typeof(MeshGenerator))]
[CanEditMultipleObjects]
public class MeshGenEditor : SplineUserEditor
{
protected bool showSize = true;
protected bool showColor = true;
protected bool showDoubleSided = true;
protected bool showFlipFaces = true;
protected bool showRotation = true;
protected bool showInfo = false;
protected bool showOffset = true;
protected bool showTangents = true;
protected bool showNormalMethod = true;
private int _framesPassed = 0;
private bool _commonFoldout = false;
MeshGenerator[] generators = new MeshGenerator[0];
BakeMeshWindow bakeWindow = null;
protected override void DuringSceneGUI(SceneView currentSceneView)
{
base.DuringSceneGUI(currentSceneView);
MeshGenerator generator = (MeshGenerator)target;
if (Application.isPlaying) return;
_framesPassed++;
if(_framesPassed >= 100)
{
_framesPassed = 0;
if (generator != null && generator.GetComponent<MeshCollider>() != null) generator.UpdateCollider();
}
}
protected override void OnEnable()
{
base.OnEnable();
generators = new MeshGenerator[targets.Length];
for (int i = 0; i < targets.Length; i++)
{
generators[i] = (MeshGenerator)targets[i];
}
MeshGenerator user = (MeshGenerator)target;
}
public override void OnInspectorGUI()
{
MeshGenerator generator = (MeshGenerator)target;
if (generator.baked)
{
SplineEditorGUI.SetHighlightColors(SplinePrefs.highlightColor, SplinePrefs.highlightContentColor);
if (SplineEditorGUI.EditorLayoutSelectableButton(new GUIContent("Revert Bake", "Makes the mesh dynamic again and allows editing"), true, true))
{
for (int i = 0; i < generators.Length; i++)
{
generators[i].Unbake();
EditorUtility.SetDirty(generators[i]);
}
}
return;
}
base.OnInspectorGUI();
}
protected override void BodyGUI()
{
base.BodyGUI();
MeshGenerator generator = (MeshGenerator)target;
serializedObject.Update();
SerializedProperty calculateTangents = serializedObject.FindProperty("_calculateTangents");
SerializedProperty markDynamic = serializedObject.FindProperty("_markDynamic");
SerializedProperty size = serializedObject.FindProperty("_size");
SerializedProperty color = serializedObject.FindProperty("_color");
SerializedProperty normalMethod = serializedObject.FindProperty("_normalMethod");
SerializedProperty useSplineSize = serializedObject.FindProperty("_useSplineSize");
SerializedProperty useSplineColor = serializedObject.FindProperty("_useSplineColor");
SerializedProperty offset = serializedObject.FindProperty("_offset");
SerializedProperty rotation = serializedObject.FindProperty("_rotation");
SerializedProperty flipFaces = serializedObject.FindProperty("_flipFaces");
SerializedProperty doubleSided = serializedObject.FindProperty("_doubleSided");
SerializedProperty meshIndexFormat = serializedObject.FindProperty("_meshIndexFormat");
EditorGUI.BeginChangeCheck();
EditorGUILayout.Space();
_commonFoldout = EditorGUILayout.Foldout(_commonFoldout, "Common", foldoutHeaderStyle);
if (_commonFoldout)
{
EditorGUI.indentLevel++;
if (showSize) EditorGUILayout.PropertyField(size, new GUIContent("Size"));
if (showColor) EditorGUILayout.PropertyField(color, new GUIContent("Color"));
if (showNormalMethod) EditorGUILayout.PropertyField(normalMethod, new GUIContent("Normal Method"));
if (showOffset) EditorGUILayout.PropertyField(offset, new GUIContent("Offset"));
if (showRotation) EditorGUILayout.PropertyField(rotation, new GUIContent("Rotation"));
if (showTangents) EditorGUILayout.PropertyField(calculateTangents, new GUIContent("Calculate Tangents"));
EditorGUILayout.PropertyField(useSplineSize, new GUIContent("Use Spline Size"));
EditorGUILayout.PropertyField(useSplineColor, new GUIContent("Use Spline Color"));
EditorGUILayout.PropertyField(markDynamic, new GUIContent("Mark Dynamic", "Improves performance in situations where the mesh changes frequently"));
EditorGUILayout.PropertyField(meshIndexFormat, new GUIContent("Index Format", "Format of the mesh index buffer data. Index buffer can either be 16 bit(supports up to 65535 vertices in a mesh), or 32 bit(supports up to 4 billion vertices).Default index format is 16 bit, since that takes less memory and bandwidth."));
if(meshIndexFormat.enumValueIndex > 0)
{
EditorGUILayout.HelpBox("Note that GPU support for 32 bit indices is not guaranteed on all platforms; for example Android devices with Mali-400 GPU do not support them.", MessageType.Warning);
}
EditorGUI.indentLevel--;
}
if (showDoubleSided || showFlipFaces)
{
EditorGUILayout.Space();
EditorGUILayout.LabelField("Faces", EditorStyles.boldLabel);
if (showDoubleSided) EditorGUILayout.PropertyField(doubleSided, new GUIContent("Double-sided"));
if (!generator.doubleSided && showFlipFaces) EditorGUILayout.PropertyField(flipFaces, new GUIContent("Flip Faces"));
}
if (generator.GetComponent<MeshCollider>() != null)
{
EditorGUILayout.Space();
EditorGUILayout.LabelField("Mesh Collider", EditorStyles.boldLabel);
generator.colliderUpdateRate = EditorGUILayout.FloatField("Collider Update Iterval", generator.colliderUpdateRate);
}
if (EditorGUI.EndChangeCheck())
{
serializedObject.ApplyModifiedProperties();
for (int i = 0; i < generators.Length; i++)
{
generators[i].Rebuild();
}
}
}
protected override void FooterGUI()
{
base.FooterGUI();
showInfo = EditorGUILayout.Foldout(showInfo, "Info & Components");
if (showInfo)
{
MeshGenerator generator = (MeshGenerator)target;
MeshFilter filter = generator.GetComponent<MeshFilter>();
if (filter == null) return;
MeshRenderer renderer = generator.GetComponent<MeshRenderer>();
string str = "";
if (filter.sharedMesh != null) str = "Vertices: " + filter.sharedMesh.vertexCount + "\r\nTriangles: " + (filter.sharedMesh.triangles.Length / 3);
else str = "No info available";
EditorGUILayout.HelpBox(str, MessageType.Info);
bool showFilter = filter.hideFlags == HideFlags.None;
bool last = showFilter;
showFilter = EditorGUILayout.Toggle("Show Mesh Filter", showFilter);
if (last != showFilter)
{
if (showFilter) filter.hideFlags = HideFlags.None;
else filter.hideFlags = HideFlags.HideInInspector;
}
bool showRenderer = renderer.hideFlags == HideFlags.None;
last = showRenderer;
showRenderer = EditorGUILayout.Toggle("Show Mesh Renderer", showRenderer);
if (last != showRenderer)
{
if (showRenderer) renderer.hideFlags = HideFlags.None;
else renderer.hideFlags = HideFlags.HideInInspector;
}
}
if (generators.Length == 1)
{
if (GUILayout.Button("Bake Mesh"))
{
MeshGenerator generator = (MeshGenerator)target;
bakeWindow = EditorWindow.GetWindow<BakeMeshWindow>();
bakeWindow.Init(generator);
}
}
}
protected override void Awake()
{
MeshGenerator generator = (MeshGenerator)target;
MeshRenderer rend = generator.GetComponent<MeshRenderer>();
if (rend == null) return;
base.Awake();
}
protected override void OnDestroy()
{
MeshGenerator generator = (MeshGenerator)target;
base.OnDestroy();
MeshGenerator gen = (MeshGenerator)target;
if (gen == null) return;
if (gen.GetComponent<MeshCollider>() != null) generator.UpdateCollider();
if (bakeWindow != null) bakeWindow.Close();
}
protected override void OnDelete()
{
base.OnDelete();
MeshGenerator generator = (MeshGenerator)target;
if (generator == null) return;
MeshFilter filter = generator.GetComponent<MeshFilter>();
if (filter != null) filter.hideFlags = HideFlags.None;
MeshRenderer renderer = generator.GetComponent<MeshRenderer>();
if (renderer != null) renderer.hideFlags = HideFlags.None;
}
protected virtual void UVControls(MeshGenerator generator)
{
serializedObject.Update();
SerializedProperty uvMode = serializedObject.FindProperty("_uvMode");
SerializedProperty uvOffset = serializedObject.FindProperty("_uvOffset");
SerializedProperty uvRotation = serializedObject.FindProperty("_uvRotation");
SerializedProperty uvScale = serializedObject.FindProperty("_uvScale");
EditorGUILayout.Space();
EditorGUILayout.LabelField("Uv Coordinates", EditorStyles.boldLabel);
EditorGUI.BeginChangeCheck();
EditorGUILayout.PropertyField(uvMode, new GUIContent("UV Mode"));
EditorGUILayout.PropertyField(uvOffset, new GUIContent("UV Offset"));
EditorGUILayout.PropertyField(uvRotation, new GUIContent("UV Rotation"));
EditorGUILayout.PropertyField(uvScale, new GUIContent("UV Scale"));
if (EditorGUI.EndChangeCheck()) serializedObject.ApplyModifiedProperties();
}
}
}