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.
72 lines
3.0 KiB
72 lines
3.0 KiB
using Unity.Collections;
|
|
using Unity.Burst;
|
|
using UnityEngine.Assertions;
|
|
|
|
namespace UnityEngine.Rendering
|
|
{
|
|
[BurstCompile]
|
|
internal static class LODGroupDataPoolBurst
|
|
{
|
|
[BurstCompile(DisableSafetyChecks = true, OptimizeFor = OptimizeFor.Performance)]
|
|
public static int FreeLODGroupData(in NativeArray<EntityId> destroyedLODGroupsID, ref NativeList<LODGroupData> lodGroupsData,
|
|
ref NativeParallelHashMap<int, GPUInstanceIndex> lodGroupDataHash, ref NativeList<GPUInstanceIndex> freeLODGroupDataHandles)
|
|
{
|
|
int removedRendererCount = 0;
|
|
|
|
foreach (int lodGroupID in destroyedLODGroupsID)
|
|
{
|
|
if (lodGroupDataHash.TryGetValue(lodGroupID, out var lodGroupInstance))
|
|
{
|
|
Assert.IsTrue(lodGroupInstance.valid);
|
|
|
|
lodGroupDataHash.Remove(lodGroupID);
|
|
freeLODGroupDataHandles.Add(lodGroupInstance);
|
|
|
|
ref LODGroupData lodGroupData = ref lodGroupsData.ElementAt(lodGroupInstance.index);
|
|
Assert.IsTrue(lodGroupData.valid);
|
|
|
|
removedRendererCount += lodGroupData.rendererCount;
|
|
lodGroupData.valid = false;
|
|
}
|
|
}
|
|
|
|
return removedRendererCount;
|
|
}
|
|
|
|
[BurstCompile(DisableSafetyChecks = true, OptimizeFor = OptimizeFor.Performance)]
|
|
public static int AllocateOrGetLODGroupDataInstances(in NativeArray<EntityId> lodGroupsID, ref NativeList<LODGroupData> lodGroupsData, ref NativeList<LODGroupCullingData> lodGroupCullingData,
|
|
ref NativeParallelHashMap<int, GPUInstanceIndex> lodGroupDataHash, ref NativeList<GPUInstanceIndex> freeLODGroupDataHandles, ref NativeArray<GPUInstanceIndex> lodGroupInstances)
|
|
{
|
|
int freeHandlesCount = freeLODGroupDataHandles.Length;
|
|
int lodDataLength = lodGroupsData.Length;
|
|
int previousRendererCount = 0;
|
|
|
|
for (int i = 0; i < lodGroupsID.Length; ++i)
|
|
{
|
|
int lodGroupID = lodGroupsID[i];
|
|
|
|
if (!lodGroupDataHash.TryGetValue(lodGroupID, out var lodGroupInstance))
|
|
{
|
|
if (freeHandlesCount == 0)
|
|
lodGroupInstance = new GPUInstanceIndex() { index = lodDataLength++ };
|
|
else
|
|
lodGroupInstance = freeLODGroupDataHandles[--freeHandlesCount];
|
|
|
|
lodGroupDataHash.TryAdd(lodGroupID, lodGroupInstance);
|
|
}
|
|
else
|
|
{
|
|
previousRendererCount += lodGroupsData.ElementAt(lodGroupInstance.index).rendererCount;
|
|
}
|
|
|
|
lodGroupInstances[i] = lodGroupInstance;
|
|
}
|
|
|
|
freeLODGroupDataHandles.ResizeUninitialized(freeHandlesCount);
|
|
lodGroupsData.ResizeUninitialized(lodDataLength);
|
|
lodGroupCullingData.ResizeUninitialized(lodDataLength);
|
|
|
|
return previousRendererCount;
|
|
}
|
|
}
|
|
}
|