public override void OnInspectorGUI() { EditorGUI.BeginChangeCheck(); BezierPoint.HandleMode handleMode = (BezierPoint.HandleMode)EditorGUILayout.EnumPopup("Handle Mode", point.HandleModeType); if (EditorGUI.EndChangeCheck()) { Undo.RecordObject(point, "Change Point Handle Mode"); point.HandleModeType = handleMode; SceneView.RepaintAll(); } EditorGUILayout.Space(); EditorGUI.BeginChangeCheck(); Vector3 position = EditorGUILayout.Vector3Field("Preceding Control Point Local Position", point.PrecedingControlPointLocalPosition); if (EditorGUI.EndChangeCheck()) { Undo.RecordObject(point, "Change Point Position"); point.PrecedingControlPointLocalPosition = position; SceneView.RepaintAll(); } EditorGUI.BeginChangeCheck(); position = EditorGUILayout.Vector3Field("Following Control Point Local Position", point.FollowingControlPointLocalPosition); if (EditorGUI.EndChangeCheck()) { Undo.RecordObject(point, "Change Point Position"); point.FollowingControlPointLocalPosition = position; SceneView.RepaintAll(); } }
public override void OnInspectorGUI() { Color c = GUI.color; if (spline != null && !spline.Equals(null)) { BezierUtils.DrawSplineInspectorGUI(spline); if (point == null || point.Equals(null)) { return; } EditorGUILayout.Space(); DrawSeparator(); GUILayout.BeginHorizontal(); if (GUILayout.Button("<-", GUILayout.Width(45))) { int prevIndex = spline.IndexOf(point) - 1; if (prevIndex < 0) { prevIndex = spline.Count - 1; } Selection.activeTransform = spline[prevIndex].transform; return; } GUILayout.Box("Selected Point: " + (spline.IndexOf(point) + 1) + " / " + spline.Count, GUILayout.ExpandWidth(true)); if (GUILayout.Button("->", GUILayout.Width(45))) { int nextIndex = spline.IndexOf(point) + 1; if (nextIndex >= spline.Count) { nextIndex = 0; } Selection.activeTransform = spline[nextIndex].transform; return; } GUILayout.EndHorizontal(); EditorGUILayout.Space(); if (GUILayout.Button("Decrement Point's Index")) { int index = spline.IndexOf(point); int newIndex = index - 1; if (newIndex < 0) { newIndex = spline.Count - 1; } if (index != newIndex) { Undo.IncrementCurrentGroup(); Undo.RegisterCompleteObjectUndo(point.transform.parent, "Change point index"); spline.SwapPointsAt(index, newIndex); SceneView.RepaintAll(); } } if (GUILayout.Button("Increment Point's Index")) { int index = spline.IndexOf(point); int newIndex = index + 1; if (newIndex >= spline.Count) { newIndex = 0; } if (index != newIndex) { Undo.IncrementCurrentGroup(); Undo.RegisterCompleteObjectUndo(point.transform.parent, "Change point index"); spline.SwapPointsAt(index, newIndex); SceneView.RepaintAll(); } } EditorGUILayout.Space(); if (GUILayout.Button("Insert Point Before")) { InsertNewPointAt(spline.IndexOf(point)); } if (GUILayout.Button("Insert Point After")) { InsertNewPointAt(spline.IndexOf(point) + 1); } EditorGUILayout.Space(); if (GUILayout.Button("Duplicate Point")) { DuplicatePointAt(spline.IndexOf(point)); } EditorGUILayout.Space(); } EditorGUI.BeginChangeCheck(); BezierPoint.HandleMode handleMode = (BezierPoint.HandleMode)EditorGUILayout.EnumPopup("Handle Mode", point.handleMode); if (EditorGUI.EndChangeCheck()) { Undo.RecordObject(point, "Change Point Handle Mode"); point.handleMode = handleMode; SceneView.RepaintAll(); } EditorGUILayout.Space(); EditorGUI.BeginChangeCheck(); Vector3 position = EditorGUILayout.Vector3Field("Preceding Control Point Local Position", point.precedingControlPointLocalPosition); if (EditorGUI.EndChangeCheck()) { Undo.RecordObject(point, "Change Point Position"); point.precedingControlPointLocalPosition = position; SceneView.RepaintAll(); } EditorGUI.BeginChangeCheck(); position = EditorGUILayout.Vector3Field("Following Control Point Local Position", point.followingControlPointLocalPosition); if (EditorGUI.EndChangeCheck()) { Undo.RecordObject(point, "Change Point Position"); point.followingControlPointLocalPosition = position; SceneView.RepaintAll(); } EditorGUILayout.Space(); if (GUILayout.Button("Swap Control Points")) { Undo.RecordObject(point, "Swap Control Points"); Vector3 precedingControlPointLocalPos = point.precedingControlPointLocalPosition; point.precedingControlPointLocalPosition = point.followingControlPointLocalPosition; point.followingControlPointLocalPosition = precedingControlPointLocalPos; SceneView.RepaintAll(); } EditorGUILayout.Space(); DrawSeparator(); if (spline != null && !spline.Equals(null)) { GUI.color = RESET_POINT_BUTTON_COLOR; if (GUILayout.Button("Reset Point")) { ResetEndPointAt(spline.IndexOf(point)); SceneView.RepaintAll(); } EditorGUILayout.Space(); GUI.color = REMOVE_POINT_BUTTON_COLOR; if (spline.Count <= 2) { GUI.enabled = false; } if (GUILayout.Button("Remove Point")) { RemovePointAt(spline.IndexOf(point)); } GUI.enabled = true; } GUI.color = c; }
public override void OnInspectorGUI() { Color c = GUI.color; EditorGUI.BeginChangeCheck(); bool loop = EditorGUILayout.Toggle("Loop", spline.loop); if (EditorGUI.EndChangeCheck()) { Undo.RecordObject(spline, "Toggle Loop"); spline.loop = loop; SceneView.RepaintAll(); } EditorGUILayout.Space(); GUI.color = AUTO_CONSTRUCT_SPLINE_BUTTON_COLOR; if (GUILayout.Button("Auto Construct Spline")) { Undo.RecordObject(spline, "Auto Construct Spline"); spline.AutoConstructSpline(); SceneView.RepaintAll(); } if (GUILayout.Button("Auto Construct Spline (method #2)")) { Undo.RecordObject(spline, "Auto Construct Spline"); spline.AutoConstructSpline2(); SceneView.RepaintAll(); } GUI.color = c; if (selectedEndPointIndex >= spline.Count) { selectedEndPointIndex = spline.Count - 1; } if (selectedEndPointIndex != -1) { EditorGUILayout.Space(); DrawHorizontalSeparator(); GUILayout.BeginHorizontal(); if (GUILayout.Button("<-", GUILayout.Width(45))) { int newIndex = selectedEndPointIndex - 1; if (newIndex < 0) { if (loop) { newIndex = spline.Count - 1; } else { newIndex = 0; } } if (newIndex != selectedEndPointIndex) { Undo.IncrementCurrentGroup(); Undo.RecordObject(spline, "Change Selected Point"); selectedEndPointIndex = newIndex; SceneView.RepaintAll(); } } GUILayout.Box("Selected Point: " + selectedEndPointIndex.index + " / " + (spline.Count - 1), GUILayout.ExpandWidth(true)); if (GUILayout.Button("->", GUILayout.Width(45))) { int newIndex = selectedEndPointIndex + 1; if (newIndex >= spline.Count) { if (loop) { newIndex = 0; } else { newIndex = spline.Count - 1; } } if (newIndex != selectedEndPointIndex) { Undo.IncrementCurrentGroup(); Undo.RecordObject(spline, "Change Selected Point"); selectedEndPointIndex = newIndex; SceneView.RepaintAll(); } } GUILayout.EndHorizontal(); if (GUILayout.Button("Deselect")) { Undo.RecordObject(spline, "Deselect Selected Point"); selectedEndPointIndex = -1; SceneView.RepaintAll(); return; } EditorGUILayout.Space(); if (GUILayout.Button("Decrement Point's Index")) { if (selectedEndPointIndex > 0) { Undo.IncrementCurrentGroup(); Undo.RecordObject(spline, "Change point index"); spline.SwapPointsAt(selectedEndPointIndex, selectedEndPointIndex - 1); selectedEndPointIndex = selectedEndPointIndex - 1; SceneView.RepaintAll(); } } if (GUILayout.Button("Increment Point's Index")) { if (selectedEndPointIndex < spline.Count - 1) { Undo.IncrementCurrentGroup(); Undo.RecordObject(spline, "Change point index"); spline.SwapPointsAt(selectedEndPointIndex, selectedEndPointIndex + 1); selectedEndPointIndex = selectedEndPointIndex + 1; SceneView.RepaintAll(); } } EditorGUILayout.Space(); if (GUILayout.Button("Insert Point Before")) { InsertNewPointAt(selectedEndPointIndex); } if (GUILayout.Button("Insert Point After")) { InsertNewPointAt(selectedEndPointIndex + 1); } EditorGUILayout.Space(); if (GUILayout.Button("Duplicate Point")) { DuplicatePointAt(selectedEndPointIndex); } EditorGUILayout.Space(); BezierPoint selectedEndPoint = spline[selectedEndPointIndex]; EditorGUI.BeginChangeCheck(); BezierPoint.HandleMode handleMode = (BezierPoint.HandleMode)EditorGUILayout.EnumPopup("Handle Mode", selectedEndPoint.handleMode); if (EditorGUI.EndChangeCheck()) { Undo.RecordObject(spline, "Change Point Handle Mode"); selectedEndPoint.handleMode = handleMode; SceneView.RepaintAll(); } EditorGUI.BeginChangeCheck(); Vector3 position = EditorGUILayout.Vector3Field("Local Position", selectedEndPoint.localPosition); if (EditorGUI.EndChangeCheck()) { Undo.RecordObject(spline, "Change Point Position"); selectedEndPoint.localPosition = position; SceneView.RepaintAll(); } EditorGUI.BeginChangeCheck(); Vector3 eulerAngles = EditorGUILayout.Vector3Field("Local Euler Angles", selectedEndPoint.localEulerAngles); if (EditorGUI.EndChangeCheck()) { Undo.RecordObject(spline, "Change Point Rotation"); selectedEndPoint.localEulerAngles = eulerAngles; SceneView.RepaintAll(); } EditorGUI.BeginChangeCheck(); Vector3 scale = EditorGUILayout.Vector3Field("Local Scale", selectedEndPoint.localScale); if (EditorGUI.EndChangeCheck()) { Undo.RecordObject(spline, "Change Point Scale"); selectedEndPoint.localScale = scale; SceneView.RepaintAll(); } EditorGUILayout.Space(); EditorGUI.BeginChangeCheck(); position = EditorGUILayout.Vector3Field("Preceding Control Point Local Position", selectedEndPoint.precedingControlPointLocalPosition); if (EditorGUI.EndChangeCheck()) { Undo.RecordObject(spline, "Change Point Position"); selectedEndPoint.precedingControlPointLocalPosition = position; SceneView.RepaintAll(); } EditorGUI.BeginChangeCheck(); position = EditorGUILayout.Vector3Field("Following Control Point Local Position", selectedEndPoint.followingControlPointLocalPosition); if (EditorGUI.EndChangeCheck()) { Undo.RecordObject(spline, "Change Point Position"); selectedEndPoint.followingControlPointLocalPosition = position; SceneView.RepaintAll(); } EditorGUILayout.Space(); if (GUILayout.Button("Swap Control Points")) { Undo.RecordObject(spline, "Swap Control Points"); Vector3 precedingControlPointLocalPos = selectedEndPoint.precedingControlPointLocalPosition; selectedEndPoint.precedingControlPointLocalPosition = selectedEndPoint.followingControlPointLocalPosition; selectedEndPoint.followingControlPointLocalPosition = precedingControlPointLocalPos; SceneView.RepaintAll(); } EditorGUILayout.Space(); DrawHorizontalSeparator(); GUI.color = RESET_POINT_BUTTON_COLOR; if (GUILayout.Button("Reset Point")) { ResetEndPointAt(selectedEndPointIndex); SceneView.RepaintAll(); } EditorGUILayout.Space(); GUI.color = REMOVE_POINT_BUTTON_COLOR; if (spline.Count <= 2) { GUI.enabled = false; } if (GUILayout.Button("Remove Point")) { RemovePointAt(selectedEndPointIndex); } GUI.enabled = true; GUI.color = c; } }
public override void OnInspectorGUI() { if (CheckCommands()) { GUIUtility.ExitGUI(); } BezierUtils.DrawSplineInspectorGUI(allSplines); EditorGUILayout.Space(); BezierUtils.DrawSeparator(); GUILayout.BeginHorizontal(); if (GUILayout.Button("<-", GUILayout.Width(45))) { Object[] newSelection = new Object[pointCount]; for (int i = 0, index = 0; i < selection.Length; i++) { BezierSpline spline = selection[i].spline; BezierPoint[] points = selection[i].points; if (spline) { for (int j = 0; j < points.Length; j++) { int prevIndex = points[j].Internal_Index - 1; if (prevIndex < 0) { prevIndex = spline.Count - 1; } newSelection[index++] = spline[prevIndex].gameObject; } } else { for (int j = 0; j < points.Length; j++) { newSelection[index++] = points[j].gameObject; } } } Selection.objects = newSelection; GUIUtility.ExitGUI(); } string pointIndex = (pointCount == 1 && selection[0].spline) ? (allPoints[0].Internal_Index + 1).ToString() : "-"; string splineLength = (selection.Length == 1 && selection[0].spline) ? selection[0].spline.Count.ToString() : "-"; GUILayout.Box("Selected Point: " + pointIndex + " / " + splineLength, GUILayout.ExpandWidth(true)); if (GUILayout.Button("->", GUILayout.Width(45))) { Object[] newSelection = new Object[pointCount]; for (int i = 0, index = 0; i < selection.Length; i++) { BezierSpline spline = selection[i].spline; BezierPoint[] points = selection[i].points; if (spline) { for (int j = 0; j < points.Length; j++) { int nextIndex = points[j].Internal_Index + 1; if (nextIndex >= spline.Count) { nextIndex = 0; } newSelection[index++] = spline[nextIndex].gameObject; } } else { for (int j = 0; j < points.Length; j++) { newSelection[index++] = points[j].gameObject; } } } Selection.objects = newSelection; GUIUtility.ExitGUI(); } GUILayout.EndHorizontal(); EditorGUILayout.Space(); if (GUILayout.Button("Decrement Point's Index")) { Undo.IncrementCurrentGroup(); for (int i = 0; i < selection.Length; i++) { BezierSpline spline = selection[i].spline; if (spline) { selection[i].SortPoints(true); BezierPoint[] points = selection[i].points; int[] newIndices = new int[points.Length]; for (int j = 0; j < points.Length; j++) { int index = points[j].Internal_Index; int newIndex = index - 1; if (newIndex < 0) { newIndex = spline.Count - 1; } newIndices[j] = newIndex; } for (int j = 0; j < points.Length; j++) { Undo.RegisterCompleteObjectUndo(points[j].transform.parent, "Change point index"); spline.Internal_MovePoint(points[j].Internal_Index, newIndices[j], "Change point index"); } selection[i].SortPoints(true); } } SceneView.RepaintAll(); } if (GUILayout.Button("Increment Point's Index")) { Undo.IncrementCurrentGroup(); for (int i = 0; i < selection.Length; i++) { BezierSpline spline = selection[i].spline; if (spline) { selection[i].SortPoints(false); BezierPoint[] points = selection[i].points; int[] newIndices = new int[points.Length]; for (int j = 0; j < points.Length; j++) { int index = points[j].Internal_Index; int newIndex = index + 1; if (newIndex >= spline.Count) { newIndex = 0; } newIndices[j] = newIndex; } for (int j = 0; j < points.Length; j++) { Undo.RegisterCompleteObjectUndo(points[j].transform.parent, "Change point index"); spline.Internal_MovePoint(points[j].Internal_Index, newIndices[j], "Change point index"); } selection[i].SortPoints(true); } } SceneView.RepaintAll(); } EditorGUILayout.Space(); if (GUILayout.Button("Insert Point Before")) { InsertNewPoints(false); } if (GUILayout.Button("Insert Point After")) { InsertNewPoints(true); } EditorGUILayout.Space(); if (GUILayout.Button("Duplicate Point")) { DuplicateSelectedPoints(); } EditorGUILayout.Space(); bool hasMultipleDifferentValues = false; BezierPoint.HandleMode handleMode = allPoints[0].handleMode; for (int i = 1; i < allPoints.Length; i++) { if (allPoints[i].handleMode != handleMode) { hasMultipleDifferentValues = true; break; } } EditorGUI.showMixedValue = hasMultipleDifferentValues; EditorGUI.BeginChangeCheck(); handleMode = (BezierPoint.HandleMode)EditorGUILayout.EnumPopup("Handle Mode", handleMode); if (EditorGUI.EndChangeCheck()) { for (int i = 0; i < allPoints.Length; i++) { Undo.RecordObject(allPoints[i], "Change Point Handle Mode"); allPoints[i].handleMode = handleMode; } SceneView.RepaintAll(); } EditorGUILayout.Space(); hasMultipleDifferentValues = false; Vector3 position = allPoints[0].precedingControlPointLocalPosition; for (int i = 1; i < allPoints.Length; i++) { if (allPoints[i].precedingControlPointLocalPosition != position) { hasMultipleDifferentValues = true; break; } } EditorGUI.showMixedValue = hasMultipleDifferentValues; EditorGUI.BeginChangeCheck(); position = EditorGUILayout.Vector3Field("Preceding Control Point Local Position", position); if (EditorGUI.EndChangeCheck()) { for (int i = 0; i < allPoints.Length; i++) { Undo.RecordObject(allPoints[i], "Change Point Position"); allPoints[i].precedingControlPointLocalPosition = position; } SceneView.RepaintAll(); } hasMultipleDifferentValues = false; position = allPoints[0].followingControlPointLocalPosition; for (int i = 1; i < allPoints.Length; i++) { if (allPoints[i].followingControlPointLocalPosition != position) { hasMultipleDifferentValues = true; break; } } EditorGUI.showMixedValue = hasMultipleDifferentValues; EditorGUI.BeginChangeCheck(); position = EditorGUILayout.Vector3Field("Following Control Point Local Position", position); if (EditorGUI.EndChangeCheck()) { for (int i = 0; i < allPoints.Length; i++) { Undo.RecordObject(allPoints[i], "Change Point Position"); allPoints[i].followingControlPointLocalPosition = position; } SceneView.RepaintAll(); } bool showControlPointDistanceWarning = false; for (int i = 0; i < allPoints.Length; i++) { BezierPoint point = allPoints[i]; if ((point.position - point.precedingControlPointPosition).sqrMagnitude < CONTROL_POINTS_MINIMUM_SAFE_DISTANCE_SQR || (point.position - point.followingControlPointPosition).sqrMagnitude < CONTROL_POINTS_MINIMUM_SAFE_DISTANCE_SQR) { showControlPointDistanceWarning = true; break; } } if (showControlPointDistanceWarning) { EditorGUILayout.HelpBox("Positions of control point(s) shouldn't be very close to (0,0,0), this might result in unpredictable behaviour while moving along the spline with constant speed.", MessageType.Warning); } EditorGUILayout.Space(); if (GUILayout.Button("Swap Control Points")) { for (int i = 0; i < allPoints.Length; i++) { Undo.RecordObject(allPoints[i], "Swap Control Points"); Vector3 temp = allPoints[i].precedingControlPointLocalPosition; allPoints[i].precedingControlPointLocalPosition = allPoints[i].followingControlPointLocalPosition; allPoints[i].followingControlPointLocalPosition = temp; } SceneView.RepaintAll(); } EditorGUILayout.Space(); BezierUtils.DrawSeparator(); hasMultipleDifferentValues = false; BezierPoint.ExtraData extraData = allPoints[0].extraData; for (int i = 1; i < allPoints.Length; i++) { if (allPoints[i].extraData != extraData) { hasMultipleDifferentValues = true; break; } } GUILayout.BeginHorizontal(); EditorGUI.showMixedValue = hasMultipleDifferentValues; EditorGUI.BeginChangeCheck(); Rect extraDataRect = EditorGUILayout.GetControlRect(false, EditorGUIUtility.singleLineHeight); // When using GUILayout, button isn't vertically centered extraDataRect.width -= 65f; extraData = EditorGUI.Vector4Field(extraDataRect, "Extra Data", extraData); extraDataRect.x += extraDataRect.width + 5f; extraDataRect.width = 30f; if (GUI.Button(extraDataRect, EXTRA_DATA_SET_AS_CAMERA)) { extraData = SceneView.lastActiveSceneView.camera.transform.rotation; } if (EditorGUI.EndChangeCheck()) { for (int i = 0; i < allPoints.Length; i++) { Undo.RecordObject(allPoints[i], "Change Extra Data"); allPoints[i].extraData = extraData; } SceneView.RepaintAll(); } EditorGUI.showMixedValue = false; extraDataRect.x += 30f; EditorGUI.BeginChangeCheck(); m_visualizeExtraDataAsFrustum = GUI.Toggle(extraDataRect, m_visualizeExtraDataAsFrustum, EXTRA_DATA_VIEW_AS_FRUSTUM, GUI.skin.button); if (EditorGUI.EndChangeCheck()) { VisualizeExtraDataAsFrustum = m_visualizeExtraDataAsFrustum; SceneView.RepaintAll(); } GUILayout.EndHorizontal(); BezierUtils.DrawSeparator(); EditorGUILayout.Space(); Color c = GUI.color; GUI.color = RESET_POINT_BUTTON_COLOR; if (GUILayout.Button("Reset Point")) { for (int i = 0; i < allPoints.Length; i++) { Undo.RecordObject(allPoints[i].transform, "Reset Point"); Undo.RecordObject(allPoints[i], "Reset Point"); allPoints[i].Reset(); } SceneView.RepaintAll(); } EditorGUILayout.Space(); GUI.color = REMOVE_POINT_BUTTON_COLOR; if (GUILayout.Button("Remove Point")) { RemoveSelectedPoints(); GUIUtility.ExitGUI(); } GUI.color = c; for (int i = 0; i < allSplines.Length; i++) { allSplines[i].Internal_CheckDirty(); } }