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.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.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 k__BackingField = createMeshFromClusterJob.k__BackingField; int num = 0; createMeshFromClusterJob.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.d__45 d__; d__.System.IDisposable.Dispose(); d__.<>1__state = num; d__.<>4__this = this; Coroutine coroutine3 = base.StartCoroutine(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[] array = this.worldClusterMeshRenderers; List list = new List(); if (list != 0) { } array[0] = list; List[] array2 = this.clusterInfos; List 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.d__45 d__; d__.System.IDisposable.Dispose(); d__.<>1__state = (int)((ulong)0L); d__.<>4__this = this; Coroutine coroutine = base.StartCoroutine(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('d__45'::System.IDisposable.Dispose, ldloc:'d__45'(var_0)) stfld:int32('d__45'::<>1__state, ldloc:'d__45'(var_0), conv.u8:uint64[exp:int32](ldc.i8:int64[exp:uint64](0))) stfld:ClusterLODManager('d__45'::<>4__this, ldloc:'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.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[] array = this.worldClusterMeshRenderers; int num = 0; int num2 = 0; List list = array[num2]; num2++; uint num3; if (num != 0 && num3 > (uint)0) { int num4 = this.clusterIndex; num4++; List[] 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[] array3 = this.worldClusterMeshRenderers; List 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 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 GenerateMeshRenderers(List components, Transform root, ClusterLODManager.RenderLayer layer, bool dynamic) { List list; do { list = new List(); ClusterLODConfig clusterLODConfig = this.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 list2 = new List(); ClusterTree clusterTree; clusterTree.Nodes = list2; int num3 = 0; clusterTree.FieldGetter(num3, num, layer); clusterTree.k__BackingField = num3; clusterTree.Nodes.Add(num3); clusterTreeGenerator.k__BackingField = clusterTree; Stack stack = new Stack(); clusterTreeGenerator.unProcessedClusters = stack; ClusterNode k__BackingField = clusterTreeGenerator.k__BackingField.k__BackingField; stack.Push(k__BackingField); ClusterNode clusterNode2 = clusterTreeGenerator.unProcessedClusters.Pop(); int num4 = 0; bool flag = clusterTreeGenerator.SplitCluster(clusterNode2); Stack unProcessedClusters = clusterTreeGenerator.unProcessedClusters; ClusterLODConfig.LODSettings far = this.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 k__BackingField = clusterTreeGenerator.k__BackingField; List list3 = new List(); clusterMeshGenerator.k__BackingField = list3; ClusterNode k__BackingField2 = k__BackingField.k__BackingField; int num6 = clusterMeshGenerator.UpdateVertexCount(k__BackingField2); ClusterNode k__BackingField3 = k__BackingField.k__BackingField; clusterMeshGenerator.CreateClusterMeshInstances(k__BackingField3); List k__BackingField = clusterMeshGenerator.k__BackingField; List.Enumerator enumerator; if (enumerator != 0) { ClusterMeshRenderer clusterMeshRenderer = this.clusterMeshRendererPrefab; ClusterMeshRenderer clusterMeshRenderer2; MeshRenderer component = clusterMeshRenderer2.GetComponent(); Material meshMaterial = ClusterLODManager._instance.GetMeshMaterial(); component.SetMaterial(meshMaterial); clusterMeshRenderer2.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.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 list = this.clusterInfos[(int)layer]; Comparison <>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 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('d__59'::System.IDisposable.Dispose, ldloc:'d__59'(var_0)) stfld:int32('d__59'::<>1__state, ldloc:'d__59'(var_0), conv.u8:uint64[exp:int32](ldc.i8:int64[exp:uint64](0))) stfld:ClusterLODManager('d__59'::<>4__this, ldloc:'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 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.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.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 queue = new Queue(); clusterMeshAssetCache.createQueue = queue; CreateMeshFromClusterJob createMeshFromClusterJob = new CreateMeshFromClusterJob(); clusterMeshAssetCache.createMeshFromClusterJob = createMeshFromClusterJob; List list = new List(); clusterMeshAssetCache.activeClusters = list; this.ClusterMeshAssetCache = clusterMeshAssetCache; List list2 = new List(); this.newAddedStaticComponents = list2; List list3 = new List(); this.newAddedWorldComponents = list3; List list4 = new List(); this.newAddedDetailComponents = list4; List[] array = new List[3]; this.worldClusterMeshRenderers = array; List[] array2 = new List[3]; this.clusterInfos = array2; List 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 newAddedStaticComponents; // Token: 0x040038BF RID: 14527 [global::Cpp2IlInjected.FieldOffset(Offset = "0x70")] [Token(Token = "0x40038BF")] public List newAddedWorldComponents; // Token: 0x040038C0 RID: 14528 [global::Cpp2IlInjected.FieldOffset(Offset = "0x78")] [Token(Token = "0x40038C0")] public List 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[] worldClusterMeshRenderers; // Token: 0x040038C5 RID: 14533 [global::Cpp2IlInjected.FieldOffset(Offset = "0xA0")] [Token(Token = "0x40038C5")] private List[] 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 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 } } }