Нема описа
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.

DecalUpdateCullingGroupSystem.cs 4.2KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126
  1. using System;
  2. using Unity.Collections;
  3. namespace UnityEngine.Rendering.Universal
  4. {
  5. /// <summary>
  6. /// Contains culling results.
  7. /// </summary>
  8. internal class DecalCulledChunk : DecalChunk
  9. {
  10. public Vector3 cameraPosition;
  11. public ulong sceneCullingMask;
  12. public int cullingMask;
  13. public CullingGroup cullingGroups;
  14. public int[] visibleDecalIndexArray;
  15. public NativeArray<int> visibleDecalIndices;
  16. public int visibleDecalCount;
  17. public override void RemoveAtSwapBack(int entityIndex)
  18. {
  19. RemoveAtSwapBack(ref visibleDecalIndexArray, entityIndex, count);
  20. RemoveAtSwapBack(ref visibleDecalIndices, entityIndex, count);
  21. count--;
  22. }
  23. public override void SetCapacity(int newCapacity)
  24. {
  25. ArrayExtensions.ResizeArray(ref visibleDecalIndexArray, newCapacity);
  26. visibleDecalIndices.ResizeArray(newCapacity);
  27. if (cullingGroups == null)
  28. cullingGroups = new CullingGroup();
  29. capacity = newCapacity;
  30. }
  31. public override void Dispose()
  32. {
  33. if (capacity == 0)
  34. return;
  35. visibleDecalIndices.Dispose();
  36. visibleDecalIndexArray = null;
  37. count = 0;
  38. capacity = 0;
  39. cullingGroups.Dispose();
  40. cullingGroups = null;
  41. }
  42. }
  43. /// <summary>
  44. /// Issues culling job with <see cref="CullingGroup"/>.
  45. /// </summary>
  46. internal class DecalUpdateCullingGroupSystem
  47. {
  48. /// <summary>
  49. /// Provides acces to the bounding distance.
  50. /// </summary>
  51. public float boundingDistance
  52. {
  53. get { return m_BoundingDistance[0]; }
  54. set { m_BoundingDistance[0] = value; }
  55. }
  56. private float[] m_BoundingDistance = new float[1];
  57. private Camera m_Camera;
  58. private DecalEntityManager m_EntityManager;
  59. private ProfilingSampler m_Sampler;
  60. public DecalUpdateCullingGroupSystem(DecalEntityManager entityManager, float drawDistance)
  61. {
  62. m_EntityManager = entityManager;
  63. m_BoundingDistance[0] = drawDistance;
  64. m_Sampler = new ProfilingSampler("DecalUpdateCullingGroupsSystem.Execute");
  65. }
  66. public void Execute(Camera camera)
  67. {
  68. using (new ProfilingScope(m_Sampler))
  69. {
  70. m_Camera = camera;
  71. for (int i = 0; i < m_EntityManager.chunkCount; ++i)
  72. Execute(m_EntityManager.cachedChunks[i], m_EntityManager.culledChunks[i], m_EntityManager.culledChunks[i].count);
  73. }
  74. }
  75. public void Execute(DecalCachedChunk cachedChunk, DecalCulledChunk culledChunk, int count)
  76. {
  77. cachedChunk.currentJobHandle.Complete();
  78. CullingGroup cullingGroup = culledChunk.cullingGroups;
  79. cullingGroup.targetCamera = m_Camera;
  80. cullingGroup.SetDistanceReferencePoint(m_Camera.transform.position);
  81. cullingGroup.SetBoundingDistances(m_BoundingDistance);
  82. cachedChunk.boundingSpheres.CopyTo(cachedChunk.boundingSphereArray);
  83. cullingGroup.SetBoundingSpheres(cachedChunk.boundingSphereArray);
  84. cullingGroup.SetBoundingSphereCount(count);
  85. culledChunk.cameraPosition = m_Camera.transform.position;
  86. culledChunk.cullingMask = m_Camera.cullingMask;
  87. #if UNITY_EDITOR
  88. culledChunk.sceneCullingMask = GetSceneCullingMaskFromCamera(m_Camera);
  89. #endif
  90. }
  91. internal static UInt64 GetSceneCullingMaskFromCamera(Camera camera)
  92. {
  93. #if UNITY_EDITOR
  94. if (camera.overrideSceneCullingMask != 0)
  95. return camera.overrideSceneCullingMask;
  96. if (camera.scene.IsValid())
  97. return UnityEditor.SceneManagement.EditorSceneManager.GetSceneCullingMask(camera.scene);
  98. switch (camera.cameraType)
  99. {
  100. case CameraType.SceneView:
  101. return UnityEditor.SceneManagement.SceneCullingMasks.MainStageSceneViewObjects;
  102. default:
  103. return UnityEditor.SceneManagement.SceneCullingMasks.GameViewObjects;
  104. }
  105. #else
  106. return 0;
  107. #endif
  108. }
  109. }
  110. }