DynamicOcclusionRaycastingEditor.cs 5.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112
  1. #if UNITY_EDITOR
  2. using UnityEngine;
  3. using UnityEditor;
  4. namespace VLB
  5. {
  6. [CustomEditor(typeof(DynamicOcclusionRaycasting))]
  7. [CanEditMultipleObjects]
  8. public class DynamicOcclusionRaycastingEditor : DynamicOcclusionAbstractBaseEditor<DynamicOcclusionRaycasting>
  9. {
  10. SerializedProperty dimensions, layerMask, considerTriggers, minOccluderArea, planeAlignment, maxSurfaceDot, planeOffset, fadeDistanceToSurface, minSurfaceRatio;
  11. public override bool RequiresConstantRepaint() { return Application.isPlaying || DynamicOcclusionRaycasting.editorRaycastAtEachFrame; }
  12. protected override void OnEnable()
  13. {
  14. base.OnEnable();
  15. m_Targets = new TargetList<DynamicOcclusionRaycasting>(targets);
  16. DynamicOcclusionRaycasting.EditorLoadPrefs();
  17. dimensions = FindProperty((DynamicOcclusionRaycasting x) => x.dimensions);
  18. layerMask = FindProperty((DynamicOcclusionRaycasting x) => x.layerMask);
  19. considerTriggers = FindProperty((DynamicOcclusionRaycasting x) => x.considerTriggers);
  20. minOccluderArea = FindProperty((DynamicOcclusionRaycasting x) => x.minOccluderArea);
  21. planeAlignment = FindProperty((DynamicOcclusionRaycasting x) => x.planeAlignment);
  22. planeOffset = FindProperty((DynamicOcclusionRaycasting x) => x.planeOffset);
  23. fadeDistanceToSurface = FindProperty((DynamicOcclusionRaycasting x) => x.fadeDistanceToSurface);
  24. minSurfaceRatio = FindProperty((DynamicOcclusionRaycasting x) => x.minSurfaceRatio);
  25. maxSurfaceDot = FindProperty((DynamicOcclusionRaycasting x) => x.maxSurfaceDot);
  26. }
  27. public override void OnInspectorGUI()
  28. {
  29. base.OnInspectorGUI();
  30. if (FoldableHeader.Begin(this, EditorStrings.DynOcclusion.HeaderRaycasting))
  31. {
  32. dimensions.CustomEnum<Dimensions>(EditorStrings.DynOcclusion.Dimensions, EditorStrings.Common.DimensionsEnumDescriptions);
  33. EditorGUILayout.PropertyField(layerMask, EditorStrings.DynOcclusion.LayerMask);
  34. EditorGUILayout.PropertyField(considerTriggers, EditorStrings.DynOcclusion.ConsiderTriggers);
  35. if (Physics2D.queriesHitTriggers == false)
  36. {
  37. if(m_Targets.HasAtLeastOneTargetWith((DynamicOcclusionRaycasting instance) => { return instance.dimensions == Dimensions.Dim2D && instance.considerTriggers; }))
  38. {
  39. EditorGUILayout.HelpBox(EditorStrings.DynOcclusion.ConsiderTriggersNoPossible, MessageType.Error);
  40. }
  41. }
  42. EditorGUILayout.PropertyField(minOccluderArea, EditorStrings.DynOcclusion.MinOccluderArea);
  43. }
  44. FoldableHeader.End();
  45. DisplayCommonInspector();
  46. if (FoldableHeader.Begin(this, EditorStrings.DynOcclusion.HeaderOccluderSurface))
  47. {
  48. minSurfaceRatio.FloatSlider(
  49. EditorStrings.DynOcclusion.MinSurfaceRatio,
  50. Consts.DynOcclusionRaycastingMinSurfaceRatioMin, Consts.DynOcclusionRaycastingMinSurfaceRatioMax,
  51. (value) => value * 100f, // conversion value to slider
  52. (value) => value / 100f // conversion slider to value
  53. );
  54. maxSurfaceDot.FloatSlider(
  55. EditorStrings.DynOcclusion.MaxSurfaceDot,
  56. Consts.DynOcclusionRaycastingMaxSurfaceAngleMin, Consts.DynOcclusionRaycastingMaxSurfaceAngleMax,
  57. (value) => Mathf.Acos(value) * Mathf.Rad2Deg, // conversion value to slider
  58. (value) => Mathf.Cos(value * Mathf.Deg2Rad) // conversion slider to value
  59. );
  60. }
  61. FoldableHeader.End();
  62. if (FoldableHeader.Begin(this, EditorStrings.DynOcclusion.HeaderClippingPlane))
  63. {
  64. EditorGUILayout.PropertyField(planeAlignment, EditorStrings.DynOcclusion.PlaneAlignment);
  65. EditorGUILayout.PropertyField(planeOffset, EditorStrings.DynOcclusion.PlaneOffset);
  66. EditorGUILayout.PropertyField(fadeDistanceToSurface, EditorStrings.DynOcclusion.FadeDistanceToSurface);
  67. }
  68. FoldableHeader.End();
  69. if (FoldableHeader.Begin(this, EditorStrings.DynOcclusion.HeaderEditorDebug))
  70. {
  71. GlobalToggle(ref DynamicOcclusionRaycasting.editorShowDebugPlane, EditorStrings.DynOcclusion.EditorShowDebugPlane, "VLB_DYNOCCLUSION_SHOWDEBUGPLANE");
  72. GlobalToggle(ref DynamicOcclusionRaycasting.editorRaycastAtEachFrame, EditorStrings.DynOcclusion.EditorRaycastAtEachFrame, "VLB_DYNOCCLUSION_RAYCASTINGEDITOR");
  73. if (Application.isPlaying || DynamicOcclusionRaycasting.editorRaycastAtEachFrame)
  74. {
  75. if (!serializedObject.isEditingMultipleObjects)
  76. {
  77. var instance = (target as DynamicOcclusionRaycasting);
  78. Debug.Assert(instance);
  79. var hit = instance.currentHit;
  80. var lastFrameUpdate = instance.editorDebugData.lastFrameUpdate;
  81. var occluderInfo = string.Format("Last update {0} frame(s) ago\n", Time.frameCount - lastFrameUpdate);
  82. occluderInfo += (hit != null) ? string.Format("Current occluder: '{0}'\nEstimated occluder area: {1} units²", hit.name, hit.bounds.GetMaxArea2D()) : "No occluder found";
  83. EditorGUILayout.HelpBox(occluderInfo, MessageType.Info);
  84. }
  85. }
  86. }
  87. FoldableHeader.End();
  88. serializedObject.ApplyModifiedProperties();
  89. }
  90. }
  91. }
  92. #endif