127 lines
		
	
	
		
			4.2 KiB
		
	
	
	
		
			C#
		
	
	
	
	
	
		
		
			
		
	
	
			127 lines
		
	
	
		
			4.2 KiB
		
	
	
	
		
			C#
		
	
	
	
	
	
|  | using System; | ||
|  | using Unity.Collections; | ||
|  | 
 | ||
|  | namespace UnityEngine.Rendering.Universal | ||
|  | { | ||
|  |     /// <summary> | ||
|  |     /// Contains culling results. | ||
|  |     /// </summary> | ||
|  |     internal class DecalCulledChunk : DecalChunk | ||
|  |     { | ||
|  |         public Vector3 cameraPosition; | ||
|  |         public ulong sceneCullingMask; | ||
|  |         public int cullingMask; | ||
|  | 
 | ||
|  |         public CullingGroup cullingGroups; | ||
|  |         public int[] visibleDecalIndexArray; | ||
|  |         public NativeArray<int> visibleDecalIndices; | ||
|  |         public int visibleDecalCount; | ||
|  | 
 | ||
|  |         public override void RemoveAtSwapBack(int entityIndex) | ||
|  |         { | ||
|  |             RemoveAtSwapBack(ref visibleDecalIndexArray, entityIndex, count); | ||
|  |             RemoveAtSwapBack(ref visibleDecalIndices, entityIndex, count); | ||
|  |             count--; | ||
|  |         } | ||
|  | 
 | ||
|  |         public override void SetCapacity(int newCapacity) | ||
|  |         { | ||
|  |             ArrayExtensions.ResizeArray(ref visibleDecalIndexArray, newCapacity); | ||
|  |             visibleDecalIndices.ResizeArray(newCapacity); | ||
|  |             if (cullingGroups == null) | ||
|  |                 cullingGroups = new CullingGroup(); | ||
|  |             capacity = newCapacity; | ||
|  |         } | ||
|  | 
 | ||
|  |         public override void Dispose() | ||
|  |         { | ||
|  |             if (capacity == 0) | ||
|  |                 return; | ||
|  | 
 | ||
|  |             visibleDecalIndices.Dispose(); | ||
|  |             visibleDecalIndexArray = null; | ||
|  |             count = 0; | ||
|  |             capacity = 0; | ||
|  |             cullingGroups.Dispose(); | ||
|  |             cullingGroups = null; | ||
|  |         } | ||
|  |     } | ||
|  | 
 | ||
|  |     /// <summary> | ||
|  |     /// Issues culling job with <see cref="CullingGroup"/>. | ||
|  |     /// </summary> | ||
|  |     internal class DecalUpdateCullingGroupSystem | ||
|  |     { | ||
|  |         /// <summary> | ||
|  |         /// Provides acces to the bounding distance. | ||
|  |         /// </summary> | ||
|  |         public float boundingDistance | ||
|  |         { | ||
|  |             get { return m_BoundingDistance[0]; } | ||
|  |             set { m_BoundingDistance[0] = value; } | ||
|  |         } | ||
|  | 
 | ||
|  |         private float[] m_BoundingDistance = new float[1]; | ||
|  |         private Camera m_Camera; | ||
|  |         private DecalEntityManager m_EntityManager; | ||
|  |         private ProfilingSampler m_Sampler; | ||
|  | 
 | ||
|  |         public DecalUpdateCullingGroupSystem(DecalEntityManager entityManager, float drawDistance) | ||
|  |         { | ||
|  |             m_EntityManager = entityManager; | ||
|  |             m_BoundingDistance[0] = drawDistance; | ||
|  |             m_Sampler = new ProfilingSampler("DecalUpdateCullingGroupsSystem.Execute"); | ||
|  |         } | ||
|  | 
 | ||
|  |         public void Execute(Camera camera) | ||
|  |         { | ||
|  |             using (new ProfilingScope(m_Sampler)) | ||
|  |             { | ||
|  |                 m_Camera = camera; | ||
|  |                 for (int i = 0; i < m_EntityManager.chunkCount; ++i) | ||
|  |                     Execute(m_EntityManager.cachedChunks[i], m_EntityManager.culledChunks[i], m_EntityManager.culledChunks[i].count); | ||
|  |             } | ||
|  |         } | ||
|  | 
 | ||
|  |         public void Execute(DecalCachedChunk cachedChunk, DecalCulledChunk culledChunk, int count) | ||
|  |         { | ||
|  |             cachedChunk.currentJobHandle.Complete(); | ||
|  | 
 | ||
|  |             CullingGroup cullingGroup = culledChunk.cullingGroups; | ||
|  |             cullingGroup.targetCamera = m_Camera; | ||
|  |             cullingGroup.SetDistanceReferencePoint(m_Camera.transform.position); | ||
|  |             cullingGroup.SetBoundingDistances(m_BoundingDistance); | ||
|  |             cachedChunk.boundingSpheres.CopyTo(cachedChunk.boundingSphereArray); | ||
|  |             cullingGroup.SetBoundingSpheres(cachedChunk.boundingSphereArray); | ||
|  |             cullingGroup.SetBoundingSphereCount(count); | ||
|  | 
 | ||
|  |             culledChunk.cameraPosition = m_Camera.transform.position; | ||
|  |             culledChunk.cullingMask = m_Camera.cullingMask; | ||
|  | #if UNITY_EDITOR | ||
|  |             culledChunk.sceneCullingMask = GetSceneCullingMaskFromCamera(m_Camera); | ||
|  | #endif | ||
|  |         } | ||
|  | 
 | ||
|  |         internal static UInt64 GetSceneCullingMaskFromCamera(Camera camera) | ||
|  |         { | ||
|  | #if UNITY_EDITOR | ||
|  |             if (camera.overrideSceneCullingMask != 0) | ||
|  |                 return camera.overrideSceneCullingMask; | ||
|  | 
 | ||
|  |             if (camera.scene.IsValid()) | ||
|  |                 return UnityEditor.SceneManagement.EditorSceneManager.GetSceneCullingMask(camera.scene); | ||
|  | 
 | ||
|  |             switch (camera.cameraType) | ||
|  |             { | ||
|  |                 case CameraType.SceneView: | ||
|  |                     return UnityEditor.SceneManagement.SceneCullingMasks.MainStageSceneViewObjects; | ||
|  |                 default: | ||
|  |                     return UnityEditor.SceneManagement.SceneCullingMasks.GameViewObjects; | ||
|  |             } | ||
|  | #else | ||
|  |             return 0; | ||
|  | #endif | ||
|  |         } | ||
|  |     } | ||
|  | } |