Ei kuvausta
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.

MeshGizmo.cs 3.7KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105
  1. using UnityEngine;
  2. using System.Collections.Generic;
  3. using System.Reflection;
  4. using System;
  5. namespace UnityEngine.Rendering
  6. {
  7. /// <summary>
  8. /// Helper to build and render a mesh for Gizmos, it is a lot more faster than drawing a ton of gizmos separately
  9. /// </summary>
  10. class MeshGizmo : IDisposable
  11. {
  12. public static readonly int vertexCountPerCube = 24;
  13. public Mesh mesh;
  14. List<Vector3> vertices;
  15. List<int> indices;
  16. List<Color> colors;
  17. Material wireMaterial;
  18. Material dottedWireMaterial;
  19. Material solidMaterial;
  20. public MeshGizmo(int capacity = 0)
  21. {
  22. vertices = new List<Vector3>(capacity);
  23. indices = new List<int>(capacity);
  24. colors = new List<Color>(capacity);
  25. mesh = new Mesh { indexFormat = IndexFormat.UInt32, hideFlags = HideFlags.HideAndDontSave };
  26. #if UNITY_EDITOR
  27. wireMaterial = (Material)UnityEditor.EditorGUIUtility.LoadRequired("SceneView/HandleLines.mat");
  28. dottedWireMaterial = (Material)UnityEditor.EditorGUIUtility.LoadRequired("SceneView/HandleDottedLines.mat");
  29. solidMaterial = UnityEditor.HandleUtility.handleMaterial;
  30. #endif
  31. }
  32. public void Clear()
  33. {
  34. vertices.Clear();
  35. indices.Clear();
  36. colors.Clear();
  37. }
  38. public void AddWireCube(Vector3 center, Vector3 size, Color color)
  39. {
  40. var halfSize = size / 2.0f;
  41. Vector3 p0 = new Vector3(halfSize.x, halfSize.y, halfSize.z);
  42. Vector3 p1 = new Vector3(-halfSize.x, halfSize.y, halfSize.z);
  43. Vector3 p2 = new Vector3(-halfSize.x, -halfSize.y, halfSize.z);
  44. Vector3 p3 = new Vector3(halfSize.x, -halfSize.y, halfSize.z);
  45. Vector3 p4 = new Vector3(halfSize.x, halfSize.y, -halfSize.z);
  46. Vector3 p5 = new Vector3(-halfSize.x, halfSize.y, -halfSize.z);
  47. Vector3 p6 = new Vector3(-halfSize.x, -halfSize.y, -halfSize.z);
  48. Vector3 p7 = new Vector3(halfSize.x, -halfSize.y, -halfSize.z);
  49. AddEdge(center + p0, center + p1);
  50. AddEdge(center + p1, center + p2);
  51. AddEdge(center + p2, center + p3);
  52. AddEdge(center + p3, center + p0);
  53. AddEdge(center + p4, center + p5);
  54. AddEdge(center + p5, center + p6);
  55. AddEdge(center + p6, center + p7);
  56. AddEdge(center + p7, center + p4);
  57. AddEdge(center + p0, center + p4);
  58. AddEdge(center + p1, center + p5);
  59. AddEdge(center + p2, center + p6);
  60. AddEdge(center + p3, center + p7);
  61. void AddEdge(Vector3 p1, Vector3 p2)
  62. {
  63. vertices.Add(p1);
  64. vertices.Add(p2);
  65. indices.Add(indices.Count);
  66. indices.Add(indices.Count);
  67. colors.Add(color);
  68. colors.Add(color);
  69. }
  70. }
  71. void DrawMesh(Matrix4x4 trs, Material mat, MeshTopology topology, CompareFunction depthTest, string gizmoName)
  72. {
  73. mesh.Clear();
  74. mesh.SetVertices(vertices);
  75. mesh.SetColors(colors);
  76. mesh.SetIndices(indices, topology, 0);
  77. mat.SetFloat("_HandleZTest", (int)depthTest);
  78. var cmd = CommandBufferPool.Get(gizmoName ?? "Mesh Gizmo Rendering");
  79. cmd.DrawMesh(mesh, trs, mat, 0, 0);
  80. Graphics.ExecuteCommandBuffer(cmd);
  81. }
  82. public void RenderWireframe(Matrix4x4 trs, CompareFunction depthTest = CompareFunction.LessEqual, string gizmoName = null)
  83. => DrawMesh(trs, wireMaterial, MeshTopology.Lines, depthTest, gizmoName);
  84. public void Dispose()
  85. {
  86. CoreUtils.Destroy(mesh);
  87. }
  88. }
  89. }