No Description
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

Light2DEditorUtility.cs 4.5KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124
  1. using UnityEngine;
  2. using UnityEngine.Rendering;
  3. using UnityEngine.Rendering.Universal;
  4. namespace UnityEditor.Rendering.Universal
  5. {
  6. internal static class Light2DEditorUtility
  7. {
  8. static Material s_TexCapMaterial = CoreUtils.CreateEngineMaterial(Shader.Find("Hidden/Internal-GUITexture"));
  9. static Mesh k_MeshQuad_Cache;
  10. static Mesh k_MeshQuad => k_MeshQuad_Cache == null || k_MeshQuad_Cache.Equals(null) ? (k_MeshQuad_Cache = Resources.GetBuiltinResource<Mesh>("Quad.fbx")) : k_MeshQuad_Cache;
  11. static internal void GUITextureCap(int controlID, Texture texture, Vector3 position, Quaternion rotation, float size, EventType eventType, bool isAngleHandle)
  12. {
  13. switch (eventType)
  14. {
  15. case (EventType.Layout):
  16. {
  17. Vector2 size2 = Vector2.one * size * 0.5f;
  18. if (isAngleHandle)
  19. size2.x = 0.0f;
  20. HandleUtility.AddControl(controlID, DistanceToRectangle(position, rotation, size2));
  21. break;
  22. }
  23. case (EventType.Repaint):
  24. {
  25. s_TexCapMaterial.mainTexture = texture;
  26. s_TexCapMaterial.SetPass(0);
  27. float w = texture.width;
  28. float h = texture.height;
  29. float max = Mathf.Max(w, h);
  30. Vector3 scale = new Vector2(w / max, h / max) * size * 0.5f;
  31. if (Camera.current == null)
  32. scale.y *= -1f;
  33. Matrix4x4 matrix = new Matrix4x4();
  34. matrix.SetTRS(position, rotation, scale);
  35. Graphics.DrawMeshNow(k_MeshQuad, matrix);
  36. }
  37. break;
  38. }
  39. }
  40. static float DistanceToRectangle(Vector3 position, Quaternion rotation, Vector2 size)
  41. {
  42. Vector3[] points = { Vector3.zero, Vector3.zero, Vector3.zero, Vector3.zero, Vector3.zero };
  43. Vector3 sideways = rotation * new Vector3(size.x, 0, 0);
  44. Vector3 up = rotation * new Vector3(0, size.y, 0);
  45. points[0] = HandleUtility.WorldToGUIPoint(position + sideways + up);
  46. points[1] = HandleUtility.WorldToGUIPoint(position + sideways - up);
  47. points[2] = HandleUtility.WorldToGUIPoint(position - sideways - up);
  48. points[3] = HandleUtility.WorldToGUIPoint(position - sideways + up);
  49. points[4] = points[0];
  50. Vector2 pos = Event.current.mousePosition;
  51. bool oddNodes = false;
  52. int j = 4;
  53. for (int i = 0; i < 5; ++i)
  54. {
  55. if ((points[i].y > pos.y) != (points[j].y > pos.y))
  56. {
  57. if (pos.x < (points[j].x - points[i].x) * (pos.y - points[i].y) / (points[j].y - points[i].y) + points[i].x)
  58. oddNodes = !oddNodes;
  59. }
  60. j = i;
  61. }
  62. if (!oddNodes)
  63. {
  64. // Distance to closest edge (not so fast)
  65. float dist, closestDist = -1f;
  66. j = 1;
  67. for (int i = 0; i < 4; ++i)
  68. {
  69. dist = HandleUtility.DistancePointToLineSegment(pos, points[i], points[j++]);
  70. if (dist < closestDist || closestDist < 0)
  71. closestDist = dist;
  72. }
  73. return closestDist;
  74. }
  75. else
  76. return 0;
  77. }
  78. public static Renderer2DData GetRenderer2DData()
  79. {
  80. UniversalRenderPipelineAsset pipelineAsset = UniversalRenderPipeline.asset;
  81. if (pipelineAsset == null)
  82. return null;
  83. // try get the default
  84. Renderer2DData rendererData = pipelineAsset.scriptableRendererData as Renderer2DData;
  85. if (rendererData == null)
  86. {
  87. foreach (Camera camera in Camera.allCameras)
  88. {
  89. UniversalAdditionalCameraData additionalCameraData = camera.GetComponent<UniversalAdditionalCameraData>();
  90. ScriptableRenderer renderer = additionalCameraData?.scriptableRenderer;
  91. Renderer2D renderer2D = renderer as Renderer2D;
  92. if (renderer2D != null)
  93. return renderer2D.GetRenderer2DData();
  94. }
  95. }
  96. return rendererData;
  97. }
  98. public static bool IsUsing2DRenderer()
  99. {
  100. return GetRenderer2DData() != null;
  101. }
  102. }
  103. }