303 lines
10 KiB
C#
303 lines
10 KiB
C#
using System;
|
|
using System.Collections.Generic;
|
|
using System.Runtime.InteropServices;
|
|
using Cpp2IlInjected;
|
|
using Unity.Jobs;
|
|
using UnityEngine;
|
|
|
|
namespace ClusterLOD
|
|
{
|
|
// Token: 0x02000C87 RID: 3207
|
|
[Token(Token = "0x2000C87")]
|
|
[StructLayout(3)]
|
|
public class ClusterMeshAssetCache : IDisposable
|
|
{
|
|
// Token: 0x17000D68 RID: 3432
|
|
// (get) Token: 0x06004D3B RID: 19771 RVA: 0x0011F3F4 File Offset: 0x0011D5F4
|
|
[Token(Token = "0x17000D68")]
|
|
public NativeClusterMesh PrimitiveSrcMesh
|
|
{
|
|
[Token(Token = "0x6004D3B")]
|
|
[Address(RVA = "0x1B313D0", Offset = "0x1B2FDD0", VA = "0x181B313D0")]
|
|
get
|
|
{
|
|
NativeClusterMesh primitiveSrcMesh = this._primitiveSrcMesh;
|
|
if (primitiveSrcMesh == 0)
|
|
{
|
|
NativeClusterMesh nativeClusterMesh = new NativeClusterMesh();
|
|
this._primitiveSrcMesh = nativeClusterMesh;
|
|
int num = 0;
|
|
OAHBIDJKENF oahbidjkenf = EOKPFJPCGMK.MBFEPPCGJCB(num);
|
|
int vertexCount = oahbidjkenf.<DJIGBAMBFKC>k__BackingField.vertexCount;
|
|
Mesh <DJIGBAMBFKC>k__BackingField = oahbidjkenf.<DJIGBAMBFKC>k__BackingField;
|
|
num += vertexCount;
|
|
int num2 = 0;
|
|
uint indexCount = <DJIGBAMBFKC>k__BackingField.GetIndexCount(num2);
|
|
num += (int)indexCount;
|
|
num++;
|
|
NativeClusterMesh primitiveSrcMesh2 = this._primitiveSrcMesh;
|
|
OAHBIDJKENF oahbidjkenf2 = EOKPFJPCGMK.MBFEPPCGJCB(num);
|
|
NativeClusterMesh primitiveSrcMesh3 = this._primitiveSrcMesh;
|
|
Mesh <DJIGBAMBFKC>k__BackingField2 = oahbidjkenf2.<DJIGBAMBFKC>k__BackingField;
|
|
int num3 = 0;
|
|
primitiveSrcMesh3.AppendMesh(<DJIGBAMBFKC>k__BackingField2, num3 != 0);
|
|
num++;
|
|
}
|
|
return primitiveSrcMesh;
|
|
}
|
|
}
|
|
|
|
// Token: 0x06004D3C RID: 19772 RVA: 0x0011F490 File Offset: 0x0011D690
|
|
[Token(Token = "0x6004D3C")]
|
|
[Address(RVA = "0x1B30A60", Offset = "0x1B2F460", VA = "0x181B30A60", Slot = "4")]
|
|
public void Dispose()
|
|
{
|
|
this.createMeshFromClusterJob.Dispose();
|
|
NativeClusterMesh primitiveSrcMesh = this._primitiveSrcMesh;
|
|
if (primitiveSrcMesh != 0)
|
|
{
|
|
primitiveSrcMesh.Dispose();
|
|
this._primitiveSrcMesh = (ulong)0L;
|
|
}
|
|
}
|
|
|
|
// Token: 0x06004D3D RID: 19773 RVA: 0x0011F4C8 File Offset: 0x0011D6C8
|
|
[Token(Token = "0x6004D3D")]
|
|
[Address(RVA = "0x1B309E0", Offset = "0x1B2F3E0", VA = "0x181B309E0")]
|
|
public void Clear()
|
|
{
|
|
CreateMeshFromClusterJob createMeshFromClusterJob = this.createMeshFromClusterJob;
|
|
JobHandle <jobHandle>k__BackingField = createMeshFromClusterJob.<jobHandle>k__BackingField;
|
|
createMeshFromClusterJob.<cluster>k__BackingField = (ulong)0L;
|
|
this.createQueue.Clear();
|
|
}
|
|
|
|
// Token: 0x06004D3E RID: 19774 RVA: 0x0011F500 File Offset: 0x0011D700
|
|
[Token(Token = "0x6004D3E")]
|
|
[Address(RVA = "0x1B30940", Offset = "0x1B2F340", VA = "0x181B30940")]
|
|
public void Add(ClusterMesh.ClusterInfo cluster, Transform root)
|
|
{
|
|
List<IClusterLODComponent> components = cluster.components;
|
|
cluster.root = root;
|
|
if (!this.createQueue.Contains(cluster))
|
|
{
|
|
this.createQueue.Enqueue(cluster);
|
|
}
|
|
}
|
|
|
|
// Token: 0x06004D3F RID: 19775 RVA: 0x0011F53C File Offset: 0x0011D73C
|
|
[Token(Token = "0x6004D3F")]
|
|
[Address(RVA = "0x1B30F00", Offset = "0x1B2F900", VA = "0x181B30F00")]
|
|
public void Remove(ClusterMesh.ClusterInfo cluster)
|
|
{
|
|
if (this.createQueue.Contains(cluster))
|
|
{
|
|
Queue<ClusterMesh.ClusterInfo> queue = new Queue();
|
|
ClusterMesh.ClusterInfo clusterInfo = this.createQueue.Dequeue();
|
|
if (clusterInfo != cluster)
|
|
{
|
|
queue.Enqueue(clusterInfo);
|
|
}
|
|
Queue<ClusterMesh.ClusterInfo> queue2 = this.createQueue;
|
|
this.createQueue = queue;
|
|
}
|
|
CreateMeshFromClusterJob createMeshFromClusterJob = this.createMeshFromClusterJob;
|
|
ClusterMesh.ClusterInfo <cluster>k__BackingField = createMeshFromClusterJob.<cluster>k__BackingField;
|
|
JobHandle <jobHandle>k__BackingField = createMeshFromClusterJob.<jobHandle>k__BackingField;
|
|
createMeshFromClusterJob.<cluster>k__BackingField = (ulong)0L;
|
|
if (this.activeClusters.Contains(cluster))
|
|
{
|
|
bool flag = this.activeClusters.Remove(cluster);
|
|
int numLOD0Verts = cluster.numLOD0Verts;
|
|
}
|
|
}
|
|
|
|
// Token: 0x06004D40 RID: 19776 RVA: 0x0011F5D0 File Offset: 0x0011D7D0
|
|
[Token(Token = "0x6004D40")]
|
|
[Address(RVA = "0x1B30B00", Offset = "0x1B2F500", VA = "0x181B30B00")]
|
|
private ClusterMesh.ClusterInfo GetWorstActiveCluster()
|
|
{
|
|
int num;
|
|
do
|
|
{
|
|
num = 0;
|
|
List<ClusterMesh.ClusterInfo> list = this.activeClusters;
|
|
List.Enumerator enumerator;
|
|
if (enumerator != 0)
|
|
{
|
|
}
|
|
if (num != -1)
|
|
{
|
|
}
|
|
}
|
|
while (num != 0);
|
|
throw new NullReferenceException();
|
|
}
|
|
|
|
// Token: 0x06004D41 RID: 19777 RVA: 0x0011F600 File Offset: 0x0011D800
|
|
[Token(Token = "0x6004D41")]
|
|
[Address(RVA = "0x1B30DD0", Offset = "0x1B2F7D0", VA = "0x181B30DD0")]
|
|
private bool IsClusterActive(ClusterMesh.ClusterInfo cluster)
|
|
{
|
|
return this.activeClusters.Contains(cluster);
|
|
}
|
|
|
|
// Token: 0x06004D42 RID: 19778 RVA: 0x0011F620 File Offset: 0x0011D820
|
|
[Token(Token = "0x6004D42")]
|
|
[Address(RVA = "0x1B30E70", Offset = "0x1B2F870", VA = "0x181B30E70")]
|
|
private bool RemoveActiveCluster(ClusterMesh.ClusterInfo cluster)
|
|
{
|
|
bool flag = this.activeClusters.Contains(cluster);
|
|
if (!flag)
|
|
{
|
|
return flag;
|
|
}
|
|
bool flag2 = this.activeClusters.Remove(cluster);
|
|
throw new NullReferenceException();
|
|
}
|
|
|
|
// Token: 0x06004D43 RID: 19779 RVA: 0x0011F654 File Offset: 0x0011D854
|
|
[Token(Token = "0x6004D43")]
|
|
[Address(RVA = "0x1B308E0", Offset = "0x1B2F2E0", VA = "0x181B308E0")]
|
|
private void AddActiveCluster(ClusterMesh.ClusterInfo cluster)
|
|
{
|
|
this.activeClusters.Add(cluster);
|
|
int numLOD0Verts = cluster.numLOD0Verts;
|
|
}
|
|
|
|
// Token: 0x06004D44 RID: 19780 RVA: 0x0011F67C File Offset: 0x0011D87C
|
|
[Token(Token = "0x6004D44")]
|
|
[Address(RVA = "0x1B30C60", Offset = "0x1B2F660", VA = "0x181B30C60")]
|
|
private void InitPrimitiveSrcMesh()
|
|
{
|
|
NativeClusterMesh nativeClusterMesh = new NativeClusterMesh();
|
|
this._primitiveSrcMesh = nativeClusterMesh;
|
|
int num = 0;
|
|
OAHBIDJKENF oahbidjkenf = EOKPFJPCGMK.MBFEPPCGJCB(num);
|
|
int vertexCount = oahbidjkenf.<DJIGBAMBFKC>k__BackingField.vertexCount;
|
|
Mesh <DJIGBAMBFKC>k__BackingField = oahbidjkenf.<DJIGBAMBFKC>k__BackingField;
|
|
num += vertexCount;
|
|
int num2 = 0;
|
|
uint indexCount = <DJIGBAMBFKC>k__BackingField.GetIndexCount(num2);
|
|
num += (int)indexCount;
|
|
num++;
|
|
NativeClusterMesh primitiveSrcMesh = this._primitiveSrcMesh;
|
|
OAHBIDJKENF oahbidjkenf2 = EOKPFJPCGMK.MBFEPPCGJCB(num);
|
|
NativeClusterMesh primitiveSrcMesh2 = this._primitiveSrcMesh;
|
|
Mesh <DJIGBAMBFKC>k__BackingField2 = oahbidjkenf2.<DJIGBAMBFKC>k__BackingField;
|
|
int num3 = 0;
|
|
primitiveSrcMesh2.AppendMesh(<DJIGBAMBFKC>k__BackingField2, num3 != 0);
|
|
num++;
|
|
}
|
|
|
|
// Token: 0x06004D45 RID: 19781 RVA: 0x0011F708 File Offset: 0x0011D908
|
|
[Token(Token = "0x6004D45")]
|
|
[Address(RVA = "0x1B30E30", Offset = "0x1B2F830", VA = "0x181B30E30")]
|
|
public bool IsProcessing(ClusterMesh.ClusterInfo cluster)
|
|
{
|
|
ClusterMesh.ClusterInfo <cluster>k__BackingField = this.createMeshFromClusterJob.<cluster>k__BackingField;
|
|
bool flag;
|
|
return flag;
|
|
}
|
|
|
|
// Token: 0x06004D46 RID: 19782 RVA: 0x0011F72C File Offset: 0x0011D92C
|
|
[Token(Token = "0x6004D46")]
|
|
[Address(RVA = "0x1B31090", Offset = "0x1B2FA90", VA = "0x181B31090")]
|
|
public bool Update()
|
|
{
|
|
ClusterMesh.ClusterInfo clusterInfo;
|
|
ClusterMesh.ClusterInfo worstActiveCluster;
|
|
do
|
|
{
|
|
CreateMeshFromClusterJob createMeshFromClusterJob = this.createMeshFromClusterJob;
|
|
if (createMeshFromClusterJob.<cluster>k__BackingField > (ulong)0L)
|
|
{
|
|
if (!JobHandle.ScheduleBatchedJobsAndIsCompleted(createMeshFromClusterJob.<jobHandle>k__BackingField))
|
|
{
|
|
}
|
|
ClusterMesh.ClusterInfo <cluster>k__BackingField = this.createMeshFromClusterJob.<cluster>k__BackingField;
|
|
bool flag = this.RemoveActiveCluster(<cluster>k__BackingField);
|
|
this.createMeshFromClusterJob.CreateMesh();
|
|
this.activeClusters.Add(<cluster>k__BackingField);
|
|
}
|
|
clusterInfo = this.createQueue.Dequeue();
|
|
while (clusterInfo == 0)
|
|
{
|
|
}
|
|
int num = this.numActiveVerts;
|
|
int maxDynamicNearVerts = ClusterLODManager._instance.<Config>k__BackingField.maxDynamicNearVerts;
|
|
if (num <= maxDynamicNearVerts)
|
|
{
|
|
goto IL_B2;
|
|
}
|
|
worstActiveCluster = this.GetWorstActiveCluster();
|
|
if (worstActiveCluster == 0)
|
|
{
|
|
goto IL_B2;
|
|
}
|
|
}
|
|
while (clusterInfo.closestDist > worstActiveCluster.closestDist);
|
|
bool flag2 = this.RemoveActiveCluster(worstActiveCluster);
|
|
worstActiveCluster.RequestRemoveMesh();
|
|
IL_B2:
|
|
CreateMeshFromClusterJob createMeshFromClusterJob2 = this.createMeshFromClusterJob;
|
|
if (createMeshFromClusterJob2.<cluster>k__BackingField <= (ulong)0L)
|
|
{
|
|
List<IClusterLODComponent> components = clusterInfo.components;
|
|
Transform root = clusterInfo.root;
|
|
int num2 = 0;
|
|
createMeshFromClusterJob2.Init(clusterInfo, root, num2);
|
|
JobHandle.ScheduleBatchedJobs();
|
|
}
|
|
throw new NullReferenceException();
|
|
}
|
|
|
|
// Token: 0x06004D47 RID: 19783 RVA: 0x0011F830 File Offset: 0x0011DA30
|
|
[Token(Token = "0x6004D47")]
|
|
[Address(RVA = "0x1B30AA0", Offset = "0x1B2F4A0", VA = "0x181B30AA0")]
|
|
private ClusterMesh.ClusterInfo GetClusterToCreate()
|
|
{
|
|
return this.createQueue.Dequeue();
|
|
}
|
|
|
|
// Token: 0x06004D48 RID: 19784 RVA: 0x0011F850 File Offset: 0x0011DA50
|
|
[Token(Token = "0x6004D48")]
|
|
[Address(RVA = "0x1B31330", Offset = "0x1B2FD30", VA = "0x181B31330")]
|
|
public ClusterMeshAssetCache()
|
|
{
|
|
Queue<ClusterMesh.ClusterInfo> queue = new Queue();
|
|
this.createQueue = queue;
|
|
CreateMeshFromClusterJob createMeshFromClusterJob = new CreateMeshFromClusterJob();
|
|
this.createMeshFromClusterJob = createMeshFromClusterJob;
|
|
List<ClusterMesh.ClusterInfo> list = new List();
|
|
this.activeClusters = list;
|
|
base..ctor();
|
|
}
|
|
|
|
// Token: 0x0400393D RID: 14653
|
|
[global::Cpp2IlInjected.FieldOffset(Offset = "0x10")]
|
|
[Token(Token = "0x400393D")]
|
|
private Queue<ClusterMesh.ClusterInfo> createQueue;
|
|
|
|
// Token: 0x0400393E RID: 14654
|
|
[global::Cpp2IlInjected.FieldOffset(Offset = "0x18")]
|
|
[Token(Token = "0x400393E")]
|
|
private CreateMeshFromClusterJob createMeshFromClusterJob;
|
|
|
|
// Token: 0x0400393F RID: 14655
|
|
[global::Cpp2IlInjected.FieldOffset(Offset = "0x20")]
|
|
[Token(Token = "0x400393F")]
|
|
private readonly List<ClusterMesh.ClusterInfo> activeClusters;
|
|
|
|
// Token: 0x04003940 RID: 14656
|
|
[global::Cpp2IlInjected.FieldOffset(Offset = "0x28")]
|
|
[Token(Token = "0x4003940")]
|
|
private int numActiveVerts;
|
|
|
|
// Token: 0x04003941 RID: 14657
|
|
[global::Cpp2IlInjected.FieldOffset(Offset = "0x30")]
|
|
[Token(Token = "0x4003941")]
|
|
private NativeClusterMesh _primitiveSrcMesh;
|
|
}
|
|
}
|