Files
2026-04-08 23:40:05 +02:00

889 lines
34 KiB
C#

using System;
using System.Collections;
using System.Collections.Generic;
using System.Runtime.CompilerServices;
using System.Runtime.InteropServices;
using Cpp2IlInjected;
using RecRoom;
using RecRoom.Core.Creation.Shapes;
using RecRoom.Persistence;
using Unity.Jobs;
using UnityEngine;
namespace ClusterLOD
{
// Token: 0x02000C76 RID: 3190
[Token(Token = "0x2000C76")]
[StructLayout(3)]
public class ClusterLODManager : MonoBehaviour
{
// Token: 0x17000D5A RID: 3418
// (get) Token: 0x06004CCD RID: 19661 RVA: 0x0011DC58 File Offset: 0x0011BE58
// (set) Token: 0x06004CCE RID: 19662 RVA: 0x0011DC6C File Offset: 0x0011BE6C
[Token(Token = "0x17000D5A")]
public ClusterLODConfig Config
{
[Token(Token = "0x6004CCD")]
[Address(RVA = "0x3EE8E0", Offset = "0x3ED2E0", VA = "0x1803EE8E0")]
get;
[Token(Token = "0x6004CCE")]
[Address(RVA = "0x421E00", Offset = "0x420800", VA = "0x180421E00")]
private set;
}
// Token: 0x17000D5B RID: 3419
// (get) Token: 0x06004CCF RID: 19663 RVA: 0x0000220F File Offset: 0x0000040F
// (set) Token: 0x06004CD0 RID: 19664 RVA: 0x0011DC80 File Offset: 0x0011BE80
[Token(Token = "0x17000D5B")]
public Vector3 EyePos
{
[Token(Token = "0x6004CCF")]
[Address(RVA = "0x10D4400", Offset = "0x10D2E00", VA = "0x1810D4400")]
[CompilerGenerated]
get
{
throw new AnalysisFailedException("CPP2IL failed to recover any usable IL for this method.");
}
[Token(Token = "0x6004CD0")]
[Address(RVA = "0x162FC40", Offset = "0x162E640", VA = "0x18162FC40")]
[CompilerGenerated]
private set
{
float z = value.z;
this.<EyePos>k__BackingField.z = z;
}
}
// Token: 0x17000D5C RID: 3420
// (get) Token: 0x06004CD1 RID: 19665 RVA: 0x0011DCA0 File Offset: 0x0011BEA0
[Token(Token = "0x17000D5C")]
public static ClusterLODManager Instance
{
[Token(Token = "0x6004CD1")]
[Address(RVA = "0x1B2FFC0", Offset = "0x1B2E9C0", VA = "0x181B2FFC0")]
get
{
return ClusterLODManager._instance;
}
}
// Token: 0x06004CD2 RID: 19666 RVA: 0x0011DCB4 File Offset: 0x0011BEB4
[Token(Token = "0x6004CD2")]
[Address(RVA = "0x1B2E750", Offset = "0x1B2D150", VA = "0x181B2E750")]
private void OnDestroy()
{
int num = 0;
ClusterLODManager._instance = num;
ClusterMeshAssetCache clusterMeshAssetCache = this.ClusterMeshAssetCache;
clusterMeshAssetCache.createMeshFromClusterJob.Dispose();
NativeClusterMesh primitiveSrcMesh = clusterMeshAssetCache._primitiveSrcMesh;
if (primitiveSrcMesh != 0)
{
primitiveSrcMesh.Dispose();
clusterMeshAssetCache._primitiveSrcMesh = num;
}
if (NetworkedSingletonMonoBehaviour.ONCPNMDGGKG)
{
RoomPersistenceManager instance = NetworkedSingletonMonoBehaviour.ONCPNMDGGKG;
Action action = new Action(this.OnRoomStartLoad);
instance.OEEEEIDBCDJ -= action;
RoomPersistenceManager instance2 = NetworkedSingletonMonoBehaviour.ONCPNMDGGKG;
Action action2 = new Action(this.OnRoomStartLoad);
instance2.NNKFGEALMHJ -= action2;
}
}
// Token: 0x06004CD3 RID: 19667 RVA: 0x0011DD40 File Offset: 0x0011BF40
[Token(Token = "0x6004CD3")]
[Address(RVA = "0x1B2F040", Offset = "0x1B2DA40", VA = "0x181B2F040")]
public static void SetSpawnPosition(Vector3 spawnPos)
{
ClusterLODManager instance = ClusterLODManager._instance;
int num = 0;
if (instance != num)
{
ClusterLODManager instance2 = ClusterLODManager._instance;
float z = spawnPos.z;
instance2.<EyePos>k__BackingField.z = z;
}
}
// Token: 0x17000D5D RID: 3421
// (get) Token: 0x06004CD4 RID: 19668 RVA: 0x0011DD80 File Offset: 0x0011BF80
[Token(Token = "0x17000D5D")]
public static bool WorldCreated
{
[Token(Token = "0x6004CD4")]
[Address(RVA = "0x1B30020", Offset = "0x1B2EA20", VA = "0x181B30020")]
get
{
ClusterLODManager instance = ClusterLODManager._instance;
int num = 0;
return instance == num || ClusterLODManager._instance.CurrentState == ClusterLODManager.State.Running;
}
}
// Token: 0x17000D5E RID: 3422
// (get) Token: 0x06004CD5 RID: 19669 RVA: 0x0011DDB4 File Offset: 0x0011BFB4
[Token(Token = "0x17000D5E")]
public static bool ComponentCollectionEnabled
{
[Token(Token = "0x6004CD5")]
[Address(RVA = "0x1B2FEB0", Offset = "0x1B2E8B0", VA = "0x181B2FEB0")]
get
{
ClusterLODManager instance = ClusterLODManager._instance;
int num = 0;
bool flag = instance != num;
if (!flag)
{
return flag;
}
return ClusterLODManager._instance.CurrentState == ClusterLODManager.State.Waiting || ClusterLODManager._instance.CurrentState == ClusterLODManager.State.Collecting;
}
}
// Token: 0x06004CD6 RID: 19670 RVA: 0x0011DDFC File Offset: 0x0011BFFC
[Token(Token = "0x6004CD6")]
[Address(RVA = "0x1B2DC80", Offset = "0x1B2C680", VA = "0x181B2DC80")]
private void Awake()
{
int num = 0;
this.SetEnabled(num != 0);
}
// Token: 0x06004CD7 RID: 19671 RVA: 0x0011DE28 File Offset: 0x0011C028
[Token(Token = "0x6004CD7")]
[Address(RVA = "0x1B2F6F0", Offset = "0x1B2E0F0", VA = "0x181B2F6F0")]
private void StopCreateWorld()
{
Coroutine coroutine = this.createWorldCoroutine;
if (coroutine != 0)
{
base.StopCoroutine(coroutine);
this.createWorldCoroutine = (ulong)0L;
}
Coroutine coroutine2 = this.assignLODsCoroutine;
if (coroutine2 != 0)
{
base.StopCoroutine(coroutine2);
this.assignLODsCoroutine = (ulong)0L;
}
}
// Token: 0x06004CD8 RID: 19672 RVA: 0x0011DE6C File Offset: 0x0011C06C
[Token(Token = "0x6004CD8")]
[Address(RVA = "0x1B2E900", Offset = "0x1B2D300", VA = "0x181B2E900")]
private void OnRoomStartLoad()
{
ClusterMeshAssetCache clusterMeshAssetCache = this.ClusterMeshAssetCache;
CreateMeshFromClusterJob createMeshFromClusterJob = clusterMeshAssetCache.createMeshFromClusterJob;
JobHandle <jobHandle>k__BackingField = createMeshFromClusterJob.<jobHandle>k__BackingField;
int num = 0;
createMeshFromClusterJob.<cluster>k__BackingField = num;
clusterMeshAssetCache.createQueue.Clear();
SafeDestroy.GameObject(this.detailRoot);
SafeDestroy.GameObject(this.worldRoot);
GameObject gameObject = new GameObject("DetailRoot");
this.detailRoot = gameObject;
Transform transform = gameObject.transform;
Transform transform2 = base.transform;
transform.parent = transform2;
GameObject gameObject2 = new GameObject("WorldRoot");
this.worldRoot = gameObject2;
Transform transform3 = gameObject2.transform;
Transform transform4 = base.transform;
transform3.parent = transform4;
this.worldClusterMeshRenderers[num].Clear();
this.clusterInfos[num].Clear();
num++;
this.newAddedStaticComponents.Clear();
this.newAddedWorldComponents.Clear();
this.newAddedDetailComponents.Clear();
this.newShapeContainers.Clear();
Coroutine coroutine = this.createWorldCoroutine;
if (coroutine != 0)
{
base.StopCoroutine(coroutine);
this.createWorldCoroutine = num;
}
Coroutine coroutine2 = this.assignLODsCoroutine;
if (coroutine2 != 0)
{
base.StopCoroutine(coroutine2);
this.assignLODsCoroutine = num;
}
this.CurrentState = (ClusterLODManager.State)num;
ClusterLODManager.<CreateWorld>d__45 <CreateWorld>d__;
<CreateWorld>d__.System.IDisposable.Dispose();
<CreateWorld>d__.<>1__state = num;
<CreateWorld>d__.<>4__this = this;
Coroutine coroutine3 = base.StartCoroutine(<CreateWorld>d__);
this.createWorldCoroutine = coroutine3;
}
// Token: 0x06004CD9 RID: 19673 RVA: 0x0011DFD4 File Offset: 0x0011C1D4
[Token(Token = "0x6004CD9")]
[Address(RVA = "0x1B2F310", Offset = "0x1B2DD10", VA = "0x181B2F310")]
private void Start()
{
Transform transform = base.transform;
float z = Vector3.zero.z;
Transform transform2 = base.transform;
Quaternion identity = Quaternion.identity;
GameObject gameObject = new GameObject("DetailRoot");
this.detailRoot = gameObject;
Transform transform3 = gameObject.transform;
Transform transform4 = base.transform;
transform3.parent = transform4;
GameObject gameObject2 = new GameObject("WorldRoot");
this.worldRoot = gameObject2;
Transform transform5 = gameObject2.transform;
Transform transform6 = base.transform;
transform5.parent = transform6;
int num = 0;
List<ClusterMeshRenderer>[] array = this.worldClusterMeshRenderers;
List<ClusterMeshRenderer> list = new List();
if (list != 0)
{
}
array[0] = list;
List<ClusterMesh.ClusterInfo>[] array2 = this.clusterInfos;
List<ClusterMesh.ClusterInfo> list2 = new List();
if (list2 != 0)
{
}
num++;
array2[0] = list2;
RoomPersistenceManager instance = NetworkedSingletonMonoBehaviour.ONCPNMDGGKG;
Action action = new Action(this.OnRoomStartLoad);
instance.OEEEEIDBCDJ += action;
RoomPersistenceManager instance2 = NetworkedSingletonMonoBehaviour.ONCPNMDGGKG;
Action action2 = new Action(this.OnRoomStartLoad);
instance2.NNKFGEALMHJ += action2;
ClusterLODManager.<CreateWorld>d__45 <CreateWorld>d__;
<CreateWorld>d__.System.IDisposable.Dispose();
<CreateWorld>d__.<>1__state = (int)((ulong)0L);
<CreateWorld>d__.<>4__this = this;
Coroutine coroutine = base.StartCoroutine(<CreateWorld>d__);
this.createWorldCoroutine = coroutine;
}
// Token: 0x06004CDA RID: 19674 RVA: 0x0011E110 File Offset: 0x0011C310
[Token(Token = "0x6004CDA")]
[Address(RVA = "0x1B2FCD0", Offset = "0x1B2E6D0", VA = "0x181B2FCD0")]
private void Update()
{
if (this.CurrentState == ClusterLODManager.State.Running)
{
this.UpdateLODs();
bool flag = this.ClusterMeshAssetCache.Update();
return;
}
}
// Token: 0x06004CDB RID: 19675 RVA: 0x0011E140 File Offset: 0x0011C340
[Token(Token = "0x6004CDB")]
[Address(RVA = "0x1B2DD60", Offset = "0x1B2C760", VA = "0x181B2DD60")]
private IEnumerator CreateWorld()
{
/*
An exception occurred when decompiling this method (06004CDB)
ICSharpCode.Decompiler.DecompilerException: Error decompiling System.Collections.IEnumerator ClusterLOD.ClusterLODManager::CreateWorld()
---> System.Exception: Basic block has to end with unconditional control flow.
{
Block_0:
call:void('<CreateWorld>d__45'::System.IDisposable.Dispose, ldloc:'<CreateWorld>d__45'(var_0))
stfld:int32('<CreateWorld>d__45'::<>1__state, ldloc:'<CreateWorld>d__45'(var_0), conv.u8:uint64[exp:int32](ldc.i8:int64[exp:uint64](0)))
stfld:ClusterLODManager('<CreateWorld>d__45'::<>4__this, ldloc:'<CreateWorld>d__45'(var_0), ldloc:ClusterLODManager(this))
}
at ICSharpCode.Decompiler.ILAst.ILAstOptimizer.FlattenBasicBlocks(ILNode node) in D:\a\dnSpy\dnSpy\Extensions\ILSpy.Decompiler\ICSharpCode.Decompiler\ICSharpCode.Decompiler\ILAst\ILAstOptimizer.cs:line 1852
at ICSharpCode.Decompiler.ILAst.ILAstOptimizer.Optimize(DecompilerContext context, ILBlock method, AutoPropertyProvider autoPropertyProvider, StateMachineKind& stateMachineKind, MethodDef& inlinedMethod, AsyncMethodDebugInfo& asyncInfo, ILAstOptimizationStep abortBeforeStep) in D:\a\dnSpy\dnSpy\Extensions\ILSpy.Decompiler\ICSharpCode.Decompiler\ICSharpCode.Decompiler\ILAst\ILAstOptimizer.cs:line 355
at ICSharpCode.Decompiler.Ast.AstMethodBodyBuilder.CreateMethodBody(IEnumerable`1 parameters, MethodDebugInfoBuilder& builder) in D:\a\dnSpy\dnSpy\Extensions\ILSpy.Decompiler\ICSharpCode.Decompiler\ICSharpCode.Decompiler\Ast\AstMethodBodyBuilder.cs:line 123
at ICSharpCode.Decompiler.Ast.AstMethodBodyBuilder.CreateMethodBody(MethodDef methodDef, DecompilerContext context, AutoPropertyProvider autoPropertyProvider, IEnumerable`1 parameters, Boolean valueParameterIsKeyword, StringBuilder sb, MethodDebugInfoBuilder& stmtsBuilder) in D:\a\dnSpy\dnSpy\Extensions\ILSpy.Decompiler\ICSharpCode.Decompiler\ICSharpCode.Decompiler\Ast\AstMethodBodyBuilder.cs:line 88
--- End of inner exception stack trace ---
at ICSharpCode.Decompiler.Ast.AstMethodBodyBuilder.CreateMethodBody(MethodDef methodDef, DecompilerContext context, AutoPropertyProvider autoPropertyProvider, IEnumerable`1 parameters, Boolean valueParameterIsKeyword, StringBuilder sb, MethodDebugInfoBuilder& stmtsBuilder) in D:\a\dnSpy\dnSpy\Extensions\ILSpy.Decompiler\ICSharpCode.Decompiler\ICSharpCode.Decompiler\Ast\AstMethodBodyBuilder.cs:line 92
at ICSharpCode.Decompiler.Ast.AstBuilder.AddMethodBody(EntityDeclaration methodNode, EntityDeclaration& updatedNode, MethodDef method, IEnumerable`1 parameters, Boolean valueParameterIsKeyword, MethodKind methodKind) in D:\a\dnSpy\dnSpy\Extensions\ILSpy.Decompiler\ICSharpCode.Decompiler\ICSharpCode.Decompiler\Ast\AstBuilder.cs:line 1663
*/;
}
// Token: 0x06004CDC RID: 19676 RVA: 0x0011E164 File Offset: 0x0011C364
[Token(Token = "0x6004CDC")]
[Address(RVA = "0x1B2E520", Offset = "0x1B2CF20", VA = "0x181B2E520")]
public int GetDetailFromSize(bool near, Vector3 extents)
{
ClusterLODConfig clusterLODConfig = this.<Config>k__BackingField;
if (near)
{
}
ClusterLODConfig.LODSettings far = clusterLODConfig.far;
float useHighestDetailAtGreaterRadius = far.useHighestDetailAtGreaterRadius;
int num = 0;
float useLowestDetailAtSmallerRadius = far.useLowestDetailAtSmallerRadius;
return num + 1;
}
// Token: 0x06004CDD RID: 19677 RVA: 0x0011E1A0 File Offset: 0x0011C3A0
[Token(Token = "0x6004CDD")]
[Address(RVA = "0x1B2F930", Offset = "0x1B2E330", VA = "0x181B2F930")]
public void UpdateLODs()
{
List<ClusterMeshRenderer>[] array = this.worldClusterMeshRenderers;
int num = 0;
int num2 = 0;
List<ClusterMeshRenderer> list = array[num2];
num2++;
uint num3;
if (num != 0 && num3 > (uint)0)
{
int num4 = this.clusterIndex;
num4++;
List<ClusterMeshRenderer>[] array2 = this.worldClusterMeshRenderers;
int num5 = 0;
this.clusterIndex = num2;
int size = array2[num5]._size;
num2 -= size;
num5++;
if (num5 < 3)
{
bool flag;
bool flag2;
if (flag || !flag2)
{
bool flag3;
if (flag3)
{
GameObject gameObject;
global::UnityEngine.Object.Destroy(gameObject);
}
List<ClusterMeshRenderer>[] array3 = this.worldClusterMeshRenderers;
List<ClusterMeshRenderer> list2;
while (list2 != 0)
{
}
throw new NullReferenceException();
}
if (array2[0] != 0)
{
uint num6;
int num7;
num6 -= (uint)num7;
}
}
}
}
// Token: 0x06004CDE RID: 19678 RVA: 0x0011E24C File Offset: 0x0011C44C
[Token(Token = "0x6004CDE")]
[Address(RVA = "0x1B2DB90", Offset = "0x1B2C590", VA = "0x181B2DB90")]
public void AddClusterMeshRenderers(List<ClusterMeshRenderer> newClusters, ClusterLODManager.RenderLayer layer)
{
this.worldClusterMeshRenderers[(int)layer].AddRange(newClusters);
}
// Token: 0x06004CDF RID: 19679 RVA: 0x0011E274 File Offset: 0x0011C474
[Token(Token = "0x6004CDF")]
[Address(RVA = "0x1B2DDC0", Offset = "0x1B2C7C0", VA = "0x181B2DDC0")]
public List<ClusterMeshRenderer> GenerateMeshRenderers(List<IClusterLODComponent> components, Transform root, ClusterLODManager.RenderLayer layer, bool dynamic)
{
List<ClusterMeshRenderer> list;
do
{
list = new List();
ClusterLODConfig clusterLODConfig = this.<Config>k__BackingField;
ClusterLODConfig.LODSettings near = clusterLODConfig.near;
int maxNumVertsInCluster = near.maxNumVertsInCluster;
float maxRadiusOfCluster = near.maxRadiusOfCluster;
int minNumObjectPerCluster = clusterLODConfig.minNumObjectPerCluster;
float distributeVSminimize = clusterLODConfig.distributeVSminimize;
ClusterTreeGenerator clusterTreeGenerator;
clusterTreeGenerator.minNumVerts = clusterTreeGenerator;
clusterTreeGenerator.maxNumVerts = maxNumVertsInCluster;
clusterTreeGenerator.maxRadius = maxRadiusOfCluster;
clusterTreeGenerator.minNumObjectPerCluster = minNumObjectPerCluster;
clusterTreeGenerator.distributeVSminimize = distributeVSminimize;
ClusterNode clusterNode;
clusterNode.parent = (ulong)0L;
clusterNode.components = components;
int num = 0;
int num2 = 0;
int vertexCount = ClusterUtil.GetVertexCount(components, num2);
clusterNode.vertexCount = vertexCount;
List<ClusterNode> list2 = new List();
ClusterTree clusterTree;
clusterTree.Nodes = list2;
int num3 = 0;
clusterTree.FieldGetter(num3, num, layer);
clusterTree.<Root>k__BackingField = num3;
clusterTree.Nodes.Add(num3);
clusterTreeGenerator.<Tree>k__BackingField = clusterTree;
Stack<ClusterNode> stack = new Stack();
clusterTreeGenerator.unProcessedClusters = stack;
ClusterNode <Root>k__BackingField = clusterTreeGenerator.<Tree>k__BackingField.<Root>k__BackingField;
stack.Push(<Root>k__BackingField);
ClusterNode clusterNode2 = clusterTreeGenerator.unProcessedClusters.Pop();
int num4 = 0;
bool flag = clusterTreeGenerator.SplitCluster(clusterNode2);
Stack<ClusterNode> unProcessedClusters = clusterTreeGenerator.unProcessedClusters;
ClusterLODConfig.LODSettings far = this.<Config>k__BackingField.far;
int minNumVertsInCluster = far.minNumVertsInCluster;
int maxNumVertsInCluster2 = far.maxNumVertsInCluster;
float maxRadiusOfCluster2 = far.maxRadiusOfCluster;
int num5 = 0;
ClusterMeshGenerator clusterMeshGenerator;
clusterMeshGenerator.FieldGetter(num5, num4, layer);
clusterMeshGenerator.minNumVerts = minNumVertsInCluster;
clusterMeshGenerator.maxNumVerts = maxNumVertsInCluster2;
clusterMeshGenerator.maxDiameterSq = maxRadiusOfCluster2;
ClusterTree <Tree>k__BackingField = clusterTreeGenerator.<Tree>k__BackingField;
List<ClusterMesh> list3 = new List();
clusterMeshGenerator.<Meshes>k__BackingField = list3;
ClusterNode <Root>k__BackingField2 = <Tree>k__BackingField.<Root>k__BackingField;
int num6 = clusterMeshGenerator.UpdateVertexCount(<Root>k__BackingField2);
ClusterNode <Root>k__BackingField3 = <Tree>k__BackingField.<Root>k__BackingField;
clusterMeshGenerator.CreateClusterMeshInstances(<Root>k__BackingField3);
List<ClusterMesh> <Meshes>k__BackingField = clusterMeshGenerator.<Meshes>k__BackingField;
List.Enumerator enumerator;
if (enumerator != 0)
{
ClusterMeshRenderer clusterMeshRenderer = this.clusterMeshRendererPrefab;
ClusterMeshRenderer clusterMeshRenderer2;
MeshRenderer component = clusterMeshRenderer2.GetComponent<MeshRenderer>();
Material meshMaterial = ClusterLODManager._instance.GetMeshMaterial();
component.SetMaterial(meshMaterial);
clusterMeshRenderer2.<Dynamic>k__BackingField = meshMaterial != null;
clusterMeshRenderer2.GenerateLOD();
List.Enumerator enumerator2;
if (enumerator2 != 0)
{
}
if ((ulong)((uint)(-1)) != (ulong)(-1L))
{
}
if (component != 0)
{
goto IL_211;
}
}
if ((ulong)((uint)(-1)) != (ulong)(-1L))
{
}
}
while (this != 0);
return list;
IL_211:
throw new NullReferenceException();
}
// Token: 0x06004CE0 RID: 19680 RVA: 0x0011E4B8 File Offset: 0x0011C6B8
[Token(Token = "0x6004CE0")]
[Address(RVA = "0x1B2E710", Offset = "0x1B2D110", VA = "0x181B2E710")]
public ClusterLODManager.RenderLayer GetRenderLayer(Vector3 extents)
{
float maxRadiusForDetailObjects = this.<Config>k__BackingField.maxRadiusForDetailObjects;
throw new NullReferenceException();
}
// Token: 0x06004CE1 RID: 19681 RVA: 0x0011E4D8 File Offset: 0x0011C6D8
[Token(Token = "0x6004CE1")]
[Address(RVA = "0x1B2EC90", Offset = "0x1B2D690", VA = "0x181B2EC90")]
public void RegisterShapeContainer(ShapeContainer newShapeContainer)
{
this.newShapeContainers.Add(newShapeContainer);
}
// Token: 0x06004CE2 RID: 19682 RVA: 0x0011E4F8 File Offset: 0x0011C6F8
[Token(Token = "0x6004CE2")]
[Address(RVA = "0x1B2F740", Offset = "0x1B2E140", VA = "0x181B2F740")]
public bool TryDeRegisterShapeContainer(ShapeContainer newShapeContainer)
{
return this.newShapeContainers.Remove(newShapeContainer);
}
// Token: 0x06004CE3 RID: 19683 RVA: 0x0011E518 File Offset: 0x0011C718
[Token(Token = "0x6004CE3")]
[Address(RVA = "0x1B2EC30", Offset = "0x1B2D630", VA = "0x181B2EC30")]
public void RegisterComponent(IClusterLODComponent newComponent)
{
this.newAddedStaticComponents.Add(newComponent);
}
// Token: 0x06004CE4 RID: 19684 RVA: 0x0011E538 File Offset: 0x0011C738
[Token(Token = "0x6004CE4")]
[Address(RVA = "0x1B2DB00", Offset = "0x1B2C500", VA = "0x181B2DB00")]
private void AddClusterMeshClusterInfo(ClusterMesh.ClusterInfo info, int layer)
{
this.clusterInfos[layer].Add(info);
}
// Token: 0x06004CE5 RID: 19685 RVA: 0x0011E560 File Offset: 0x0011C760
[Token(Token = "0x6004CE5")]
[Address(RVA = "0x1B2ECF0", Offset = "0x1B2D6F0", VA = "0x181B2ECF0")]
public void RemoveClusterMeshClusterInfo(ClusterMesh.ClusterInfo info)
{
int num = 0;
int num2 = this.clusterInfos[num].IndexOf(info);
this.clusterInfos[num].RemoveAt(num2);
num++;
}
// Token: 0x06004CE6 RID: 19686 RVA: 0x0011E5A0 File Offset: 0x0011C7A0
[Token(Token = "0x6004CE6")]
[Address(RVA = "0x1B2F1F0", Offset = "0x1B2DBF0", VA = "0x181B2F1F0")]
private void SortClusterInfos(Vector3 pos, ClusterLODManager.RenderLayer layer)
{
List<ClusterMesh.ClusterInfo> list = this.clusterInfos[(int)layer];
Comparison<ClusterMesh.ClusterInfo> <>9__57_ = ClusterLODManager.<>c.<>9__57_0;
if (<>9__57_ == 0)
{
ClusterLODManager.<>c.<>9__57_0 = delegate(ClusterMesh.ClusterInfo a, ClusterMesh.ClusterInfo b)
{
byte requestedLod = b.requestedLod;
throw new NullReferenceException();
};
}
list.Sort(<>9__57_);
}
// Token: 0x06004CE7 RID: 19687 RVA: 0x0011E5E8 File Offset: 0x0011C7E8
[Token(Token = "0x6004CE7")]
[Address(RVA = "0x1B2F7A0", Offset = "0x1B2E1A0", VA = "0x181B2F7A0")]
private void UpdateClusterDistances(Vector3 pos, ClusterLODManager.RenderLayer layer)
{
int num;
do
{
num = 0;
List<ClusterMeshRenderer> list = this.worldClusterMeshRenderers[(int)layer];
List.Enumerator enumerator;
if (enumerator != 0)
{
}
if (num != -1)
{
}
}
while (num != 0);
}
// Token: 0x06004CE8 RID: 19688 RVA: 0x0011E620 File Offset: 0x0011C820
[Token(Token = "0x6004CE8")]
[Address(RVA = "0x1B2DC20", Offset = "0x1B2C620", VA = "0x181B2DC20")]
private IEnumerator AssignLODs()
{
/*
An exception occurred when decompiling this method (06004CE8)
ICSharpCode.Decompiler.DecompilerException: Error decompiling System.Collections.IEnumerator ClusterLOD.ClusterLODManager::AssignLODs()
---> System.Exception: Basic block has to end with unconditional control flow.
{
Block_0:
call:void('<AssignLODs>d__59'::System.IDisposable.Dispose, ldloc:'<AssignLODs>d__59'(var_0))
stfld:int32('<AssignLODs>d__59'::<>1__state, ldloc:'<AssignLODs>d__59'(var_0), conv.u8:uint64[exp:int32](ldc.i8:int64[exp:uint64](0)))
stfld:ClusterLODManager('<AssignLODs>d__59'::<>4__this, ldloc:'<AssignLODs>d__59'(var_0), ldloc:ClusterLODManager(this))
}
at ICSharpCode.Decompiler.ILAst.ILAstOptimizer.FlattenBasicBlocks(ILNode node) in D:\a\dnSpy\dnSpy\Extensions\ILSpy.Decompiler\ICSharpCode.Decompiler\ICSharpCode.Decompiler\ILAst\ILAstOptimizer.cs:line 1852
at ICSharpCode.Decompiler.ILAst.ILAstOptimizer.Optimize(DecompilerContext context, ILBlock method, AutoPropertyProvider autoPropertyProvider, StateMachineKind& stateMachineKind, MethodDef& inlinedMethod, AsyncMethodDebugInfo& asyncInfo, ILAstOptimizationStep abortBeforeStep) in D:\a\dnSpy\dnSpy\Extensions\ILSpy.Decompiler\ICSharpCode.Decompiler\ICSharpCode.Decompiler\ILAst\ILAstOptimizer.cs:line 355
at ICSharpCode.Decompiler.Ast.AstMethodBodyBuilder.CreateMethodBody(IEnumerable`1 parameters, MethodDebugInfoBuilder& builder) in D:\a\dnSpy\dnSpy\Extensions\ILSpy.Decompiler\ICSharpCode.Decompiler\ICSharpCode.Decompiler\Ast\AstMethodBodyBuilder.cs:line 123
at ICSharpCode.Decompiler.Ast.AstMethodBodyBuilder.CreateMethodBody(MethodDef methodDef, DecompilerContext context, AutoPropertyProvider autoPropertyProvider, IEnumerable`1 parameters, Boolean valueParameterIsKeyword, StringBuilder sb, MethodDebugInfoBuilder& stmtsBuilder) in D:\a\dnSpy\dnSpy\Extensions\ILSpy.Decompiler\ICSharpCode.Decompiler\ICSharpCode.Decompiler\Ast\AstMethodBodyBuilder.cs:line 88
--- End of inner exception stack trace ---
at ICSharpCode.Decompiler.Ast.AstMethodBodyBuilder.CreateMethodBody(MethodDef methodDef, DecompilerContext context, AutoPropertyProvider autoPropertyProvider, IEnumerable`1 parameters, Boolean valueParameterIsKeyword, StringBuilder sb, MethodDebugInfoBuilder& stmtsBuilder) in D:\a\dnSpy\dnSpy\Extensions\ILSpy.Decompiler\ICSharpCode.Decompiler\ICSharpCode.Decompiler\Ast\AstMethodBodyBuilder.cs:line 92
at ICSharpCode.Decompiler.Ast.AstBuilder.AddMethodBody(EntityDeclaration methodNode, EntityDeclaration& updatedNode, MethodDef method, IEnumerable`1 parameters, Boolean valueParameterIsKeyword, MethodKind methodKind) in D:\a\dnSpy\dnSpy\Extensions\ILSpy.Decompiler\ICSharpCode.Decompiler\ICSharpCode.Decompiler\Ast\AstBuilder.cs:line 1663
*/;
}
// Token: 0x06004CE9 RID: 19689 RVA: 0x0000220F File Offset: 0x0000040F
[Token(Token = "0x6004CE9")]
[Address(RVA = "0x1B2FBD0", Offset = "0x1B2E5D0", VA = "0x181B2FBD0")]
private int UpdateLodRequest(int index, int budget, List<ClusterMesh.ClusterInfo> clusters, byte lod, ref int numVertsToSpare, float minDist = 0f)
{
throw new AnalysisFailedException("CPP2IL failed to recover any usable IL for this method.");
}
// Token: 0x06004CEA RID: 19690 RVA: 0x0011E644 File Offset: 0x0011C844
[Token(Token = "0x6004CEA")]
[Address(RVA = "0x1B2EDD0", Offset = "0x1B2D7D0", VA = "0x181B2EDD0")]
public void Remove(IClusterLODComponent component)
{
int num;
do
{
num = 0;
if (num >= 3)
{
break;
}
List.Enumerator enumerator;
if (enumerator != 0)
{
while (enumerator == 0)
{
}
bool flag;
while (!flag)
{
}
}
if ((ulong)((uint)(-1)) != (ulong)(-1L))
{
if (0UL == (ulong)104L)
{
break;
}
if (0UL == (ulong)96L)
{
num++;
}
}
}
while (num != 0);
}
// Token: 0x06004CEB RID: 19691 RVA: 0x0011E6A0 File Offset: 0x0011C8A0
[Token(Token = "0x6004CEB")]
[Address(RVA = "0x1B2F1B0", Offset = "0x1B2DBB0", VA = "0x181B2F1B0")]
public bool ShouldUpdateDetailMeshes()
{
ClusterLODConfig.LODSettings near = this.<Config>k__BackingField.near;
float maxSubDivideEdgeSize = near.maxSubDivideEdgeSize;
int num = 0;
if (maxSubDivideEdgeSize <= (float)num)
{
}
float maxSubDivideDistance = near.maxSubDivideDistance;
throw new NullReferenceException();
}
// Token: 0x06004CEC RID: 19692 RVA: 0x0011E6D8 File Offset: 0x0011C8D8
[Token(Token = "0x6004CEC")]
[Address(RVA = "0x1B2EC20", Offset = "0x1B2D620", VA = "0x181B2EC20")]
public void RegisterAdditionalVertsChange(int change)
{
}
// Token: 0x06004CED RID: 19693 RVA: 0x0011E6E8 File Offset: 0x0011C8E8
[Token(Token = "0x6004CED")]
[Address(RVA = "0x1B2E670", Offset = "0x1B2D070", VA = "0x181B2E670")]
public Material GetMeshMaterial()
{
Material material = this.sharedMeshMaterial;
int num = 0;
if (material == num)
{
Material material2 = EOKPFJPCGMK.OAEGHKNCLCN(ACBDPBHGKJL.Box);
this.sharedMeshMaterial = material2;
}
return this.sharedMeshMaterial;
}
// Token: 0x06004CEE RID: 19694 RVA: 0x0011E71C File Offset: 0x0011C91C
[Token(Token = "0x6004CEE")]
[Address(RVA = "0x1B2E630", Offset = "0x1B2D030", VA = "0x181B2E630")]
public int GetMaxNumActiveLOD0Verts()
{
return this.<Config>k__BackingField.maxDynamicNearVerts;
}
// Token: 0x06004CEF RID: 19695 RVA: 0x0011E73C File Offset: 0x0011C93C
[Token(Token = "0x6004CEF")]
[Address(RVA = "0x1B2FD10", Offset = "0x1B2E710", VA = "0x181B2FD10")]
public ClusterLODManager()
{
ClusterMeshAssetCache clusterMeshAssetCache = new ClusterMeshAssetCache();
Queue<ClusterMesh.ClusterInfo> queue = new Queue();
clusterMeshAssetCache.createQueue = queue;
CreateMeshFromClusterJob createMeshFromClusterJob = new CreateMeshFromClusterJob();
clusterMeshAssetCache.createMeshFromClusterJob = createMeshFromClusterJob;
List<ClusterMesh.ClusterInfo> list = new List();
clusterMeshAssetCache.activeClusters = list;
this.ClusterMeshAssetCache = clusterMeshAssetCache;
List<IClusterLODComponent> list2 = new List();
this.newAddedStaticComponents = list2;
List<IClusterLODComponent> list3 = new List();
this.newAddedWorldComponents = list3;
List<IClusterLODComponent> list4 = new List();
this.newAddedDetailComponents = list4;
List<ClusterMeshRenderer>[] array = new List<ClusterMeshRenderer>[3];
this.worldClusterMeshRenderers = array;
List<ClusterMesh.ClusterInfo>[] array2 = new List<ClusterMesh.ClusterInfo>[3];
this.clusterInfos = array2;
List<ShapeContainer> list5 = new List();
this.newShapeContainers = list5;
base..ctor();
}
// Token: 0x06004CF0 RID: 19696 RVA: 0x0000220F File Offset: 0x0000040F
// Note: this type is marked as 'beforefieldinit'.
[Token(Token = "0x6004CF0")]
[Address(RVA = "0x3C9F60", Offset = "0x3C8960", VA = "0x1803C9F60")]
static ClusterLODManager()
{
throw new AnalysisFailedException("CPP2IL failed to recover any usable IL for this method.");
}
// Token: 0x040038B3 RID: 14515
[Token(Token = "0x40038B3")]
public const int NUM_RENDER_LAYERS = 3;
// Token: 0x040038B4 RID: 14516
[global::Cpp2IlInjected.FieldOffset(Offset = "0x18")]
[Token(Token = "0x40038B4")]
public ClusterLODConfig questConfig;
// Token: 0x040038B5 RID: 14517
[global::Cpp2IlInjected.FieldOffset(Offset = "0x20")]
[Token(Token = "0x40038B5")]
public ClusterLODConfig ps4Config;
// Token: 0x040038B6 RID: 14518
[global::Cpp2IlInjected.FieldOffset(Offset = "0x28")]
[Token(Token = "0x40038B6")]
public ClusterLODConfig iOSConfig;
// Token: 0x040038B7 RID: 14519
[global::Cpp2IlInjected.FieldOffset(Offset = "0x30")]
[Token(Token = "0x40038B7")]
public ClusterLODConfig iOSLowConfig;
// Token: 0x040038B9 RID: 14521
[global::Cpp2IlInjected.FieldOffset(Offset = "0x40")]
[Token(Token = "0x40038B9")]
public ClusterMeshRenderer clusterMeshRendererPrefab;
// Token: 0x040038BA RID: 14522
[global::Cpp2IlInjected.FieldOffset(Offset = "0x48")]
[Token(Token = "0x40038BA")]
public MeshFilter clusterPrefab;
// Token: 0x040038BB RID: 14523
[global::Cpp2IlInjected.FieldOffset(Offset = "0x50")]
[Token(Token = "0x40038BB")]
private GameObject detailRoot;
// Token: 0x040038BC RID: 14524
[global::Cpp2IlInjected.FieldOffset(Offset = "0x58")]
[Token(Token = "0x40038BC")]
private GameObject worldRoot;
// Token: 0x040038BD RID: 14525
[global::Cpp2IlInjected.FieldOffset(Offset = "0x60")]
[Token(Token = "0x40038BD")]
public ClusterMeshAssetCache ClusterMeshAssetCache;
// Token: 0x040038BE RID: 14526
[global::Cpp2IlInjected.FieldOffset(Offset = "0x68")]
[Token(Token = "0x40038BE")]
public List<IClusterLODComponent> newAddedStaticComponents;
// Token: 0x040038BF RID: 14527
[global::Cpp2IlInjected.FieldOffset(Offset = "0x70")]
[Token(Token = "0x40038BF")]
public List<IClusterLODComponent> newAddedWorldComponents;
// Token: 0x040038C0 RID: 14528
[global::Cpp2IlInjected.FieldOffset(Offset = "0x78")]
[Token(Token = "0x40038C0")]
public List<IClusterLODComponent> newAddedDetailComponents;
// Token: 0x040038C1 RID: 14529
[global::Cpp2IlInjected.FieldOffset(Offset = "0x80")]
[Token(Token = "0x40038C1")]
private int clusterIndex;
// Token: 0x040038C3 RID: 14531
[global::Cpp2IlInjected.FieldOffset(Offset = "0x90")]
[Token(Token = "0x40038C3")]
public ClusterLODManager.State CurrentState;
// Token: 0x040038C4 RID: 14532
[global::Cpp2IlInjected.FieldOffset(Offset = "0x98")]
[Token(Token = "0x40038C4")]
public List<ClusterMeshRenderer>[] worldClusterMeshRenderers;
// Token: 0x040038C5 RID: 14533
[global::Cpp2IlInjected.FieldOffset(Offset = "0xA0")]
[Token(Token = "0x40038C5")]
private List<ClusterMesh.ClusterInfo>[] clusterInfos;
// Token: 0x040038C6 RID: 14534
[global::Cpp2IlInjected.FieldOffset(Offset = "0xA8")]
[Token(Token = "0x40038C6")]
private Coroutine createWorldCoroutine;
// Token: 0x040038C7 RID: 14535
[global::Cpp2IlInjected.FieldOffset(Offset = "0xB0")]
[Token(Token = "0x40038C7")]
private Coroutine assignLODsCoroutine;
// Token: 0x040038C8 RID: 14536
[global::Cpp2IlInjected.FieldOffset(Offset = "0xB8")]
[Token(Token = "0x40038C8")]
public int estimatedNumWorldLODVerts;
// Token: 0x040038C9 RID: 14537
[global::Cpp2IlInjected.FieldOffset(Offset = "0xBC")]
[Token(Token = "0x40038C9")]
public int numWorldLODVerts;
// Token: 0x040038CA RID: 14538
[Token(Token = "0x40038CA")]
private static ClusterLODManager _instance;
// Token: 0x040038CB RID: 14539
[global::Cpp2IlInjected.FieldOffset(Offset = "0xC0")]
[Token(Token = "0x40038CB")]
private List<ShapeContainer> newShapeContainers;
// Token: 0x040038CC RID: 14540
[global::Cpp2IlInjected.FieldOffset(Offset = "0xC8")]
[Token(Token = "0x40038CC")]
public int numAdditionalVerts;
// Token: 0x040038CD RID: 14541
[global::Cpp2IlInjected.FieldOffset(Offset = "0xD0")]
[Token(Token = "0x40038CD")]
private Material sharedMeshMaterial;
// Token: 0x02000C77 RID: 3191
[Token(Token = "0x2000C77")]
public enum RenderLayer
{
// Token: 0x040038CF RID: 14543
[Token(Token = "0x40038CF")]
World,
// Token: 0x040038D0 RID: 14544
[Token(Token = "0x40038D0")]
Detail,
// Token: 0x040038D1 RID: 14545
[Token(Token = "0x40038D1")]
Dynamic,
// Token: 0x040038D2 RID: 14546
[Token(Token = "0x40038D2")]
NumLayers
}
// Token: 0x02000C78 RID: 3192
[Token(Token = "0x2000C78")]
public enum State
{
// Token: 0x040038D4 RID: 14548
[Token(Token = "0x40038D4")]
Waiting,
// Token: 0x040038D5 RID: 14549
[Token(Token = "0x40038D5")]
Collecting,
// Token: 0x040038D6 RID: 14550
[Token(Token = "0x40038D6")]
Generating,
// Token: 0x040038D7 RID: 14551
[Token(Token = "0x40038D7")]
Running
}
}
}