318 lines
9.3 KiB
C#
318 lines
9.3 KiB
C#
using System;
|
|
using System.Collections.Generic;
|
|
using Cpp2IlInjected;
|
|
using UnityEngine;
|
|
|
|
namespace ClusterLOD
|
|
{
|
|
// Token: 0x02001359 RID: 4953
|
|
[Token(Token = "0x2001359")]
|
|
public class ClusterTreeGenerator
|
|
{
|
|
// Token: 0x06006F2D RID: 28461 RVA: 0x00186AD8 File Offset: 0x00184CD8
|
|
[Token(Token = "0x6006F2D")]
|
|
[Address(RVA = "0x1F467E0", Offset = "0x1F457E0", VA = "0x181F467E0")]
|
|
public ClusterTreeGenerator(int minNumVerts, int maxNumVerts, float maxRadius, int minNumObjectPerCluster, float distributeVSminimize = 0.5f)
|
|
{
|
|
this.maxRadius = maxRadius;
|
|
this.minNumVerts = minNumVerts;
|
|
this.distributeVSminimize = (float)0;
|
|
this.maxNumVerts = maxNumVerts;
|
|
this.minNumObjectPerCluster = 0;
|
|
}
|
|
|
|
// Token: 0x170011E6 RID: 4582
|
|
// (get) Token: 0x06006F2E RID: 28462 RVA: 0x00186B10 File Offset: 0x00184D10
|
|
// (set) Token: 0x06006F2F RID: 28463 RVA: 0x00186B24 File Offset: 0x00184D24
|
|
[Token(Token = "0x170011E6")]
|
|
public ClusterTree Tree
|
|
{
|
|
[Token(Token = "0x6006F2E")]
|
|
[Address(RVA = "0x4157C0", Offset = "0x4147C0", VA = "0x1804157C0")]
|
|
get;
|
|
[Token(Token = "0x6006F2F")]
|
|
[Address(RVA = "0x415810", Offset = "0x414810", VA = "0x180415810")]
|
|
private set;
|
|
}
|
|
|
|
// Token: 0x06006F30 RID: 28464 RVA: 0x00186B38 File Offset: 0x00184D38
|
|
[Token(Token = "0x6006F30")]
|
|
[Address(RVA = "0x1F459B0", Offset = "0x1F449B0", VA = "0x181F459B0")]
|
|
public void InitTree(List<IClusterLODComponent> components)
|
|
{
|
|
int num = 0;
|
|
ClusterNode clusterNode;
|
|
clusterNode.components = components;
|
|
int vertexCount = ClusterUtil.GetVertexCount(components, (NPBPPKDLKDN)num);
|
|
clusterNode.vertexCount = vertexCount;
|
|
List<ClusterNode> list = new List();
|
|
ClusterTree clusterTree;
|
|
clusterTree.Nodes = list;
|
|
List<ClusterNode> nodes = clusterTree.Nodes;
|
|
clusterTree.<Root>k__BackingField = clusterNode;
|
|
nodes.Add(clusterNode);
|
|
this.<Tree>k__BackingField = clusterTree;
|
|
Stack<ClusterNode> stack = new Stack();
|
|
ClusterTree clusterTree2 = this.<Tree>k__BackingField;
|
|
this.unProcessedClusters = stack;
|
|
ClusterNode <Root>k__BackingField = clusterTree2.<Root>k__BackingField;
|
|
stack.Push(<Root>k__BackingField);
|
|
}
|
|
|
|
// Token: 0x06006F31 RID: 28465 RVA: 0x00186BC0 File Offset: 0x00184DC0
|
|
[Token(Token = "0x6006F31")]
|
|
[Address(RVA = "0x1F44C60", Offset = "0x1F43C60", VA = "0x181F44C60")]
|
|
public bool GenerateTreeCluster()
|
|
{
|
|
ClusterNode clusterNode = this.unProcessedClusters.Pop();
|
|
bool flag = this.SplitCluster(clusterNode);
|
|
Stack<ClusterNode> stack = this.unProcessedClusters;
|
|
bool flag2;
|
|
return flag2;
|
|
}
|
|
|
|
// Token: 0x06006F32 RID: 28466 RVA: 0x00186BF0 File Offset: 0x00184DF0
|
|
[Token(Token = "0x6006F32")]
|
|
[Address(RVA = "0x1F458A0", Offset = "0x1F448A0", VA = "0x181F458A0")]
|
|
private float GetVolume(Vector3 min, Vector3 max)
|
|
{
|
|
float z = min.z;
|
|
float z2 = max.z;
|
|
Vector3 vector;
|
|
float num = vector.z;
|
|
float num2;
|
|
num = num2;
|
|
num2 = num;
|
|
return num2;
|
|
}
|
|
|
|
// Token: 0x06006F33 RID: 28467 RVA: 0x00186C20 File Offset: 0x00184E20
|
|
[Token(Token = "0x6006F33")]
|
|
[Address(RVA = "0x1F45800", Offset = "0x1F44800", VA = "0x181F45800")]
|
|
private float GetVolume(Vector3 size)
|
|
{
|
|
float num = size.z;
|
|
float num2;
|
|
num = num2;
|
|
num2 = num;
|
|
return num2;
|
|
}
|
|
|
|
// Token: 0x06006F34 RID: 28468 RVA: 0x00186C3C File Offset: 0x00184E3C
|
|
[Token(Token = "0x6006F34")]
|
|
[Address(RVA = "0x1F45EA0", Offset = "0x1F44EA0", VA = "0x181F45EA0")]
|
|
private bool SplitCluster(ClusterNode cluster)
|
|
{
|
|
int num;
|
|
List<IClusterLODComponent> list;
|
|
int num8;
|
|
do
|
|
{
|
|
num = 0;
|
|
List<IClusterLODComponent> components = cluster.components;
|
|
int num2 = this.minNumObjectPerCluster;
|
|
num2 += num2;
|
|
float num3;
|
|
if (cluster.vertexCount < this.maxNumVerts && this.maxRadius > num3)
|
|
{
|
|
goto IL_20D;
|
|
}
|
|
list = new List();
|
|
float num5;
|
|
float num4 = Mathf.Max(num5, num5) * 0.3f;
|
|
List<IClusterLODComponent> components2 = cluster.components;
|
|
bool flag;
|
|
if (flag)
|
|
{
|
|
num += num;
|
|
num++;
|
|
Vector3 vector;
|
|
float num6 = vector.z;
|
|
float num7;
|
|
num5 = num7;
|
|
num5 = Mathf.Max(num7, num5);
|
|
while (num5 <= num4)
|
|
{
|
|
}
|
|
num6 += 2.7E-44f;
|
|
}
|
|
if (num != 0)
|
|
{
|
|
goto IL_21F;
|
|
}
|
|
if (num != -1)
|
|
{
|
|
}
|
|
if (list._size <= 0)
|
|
{
|
|
goto IL_EA;
|
|
}
|
|
bool flag2;
|
|
if (flag2)
|
|
{
|
|
}
|
|
num8 = 0;
|
|
}
|
|
while (num != 0);
|
|
ClusterNode clusterNode = new ClusterNode(num, cluster);
|
|
cluster.child1 = clusterNode;
|
|
this.<Tree>k__BackingField.Nodes.Add(clusterNode);
|
|
ClusterNode clusterNode2 = new ClusterNode(list, cluster);
|
|
cluster.child2 = clusterNode2;
|
|
List<ClusterNode> nodes = this.<Tree>k__BackingField.Nodes;
|
|
IL_EA:
|
|
ClusterTreeGenerator.SplitResult splitResult;
|
|
int bestIndex = splitResult.bestIndex;
|
|
int num9 = 0;
|
|
List<IClusterLODComponent> range = list.GetRange(num9, bestIndex);
|
|
ClusterNode clusterNode3;
|
|
clusterNode3.parent = cluster;
|
|
clusterNode3.components = range;
|
|
int num10 = 0;
|
|
int vertexCount = ClusterUtil.GetVertexCount(range, (NPBPPKDLKDN)num10);
|
|
clusterNode3.vertexCount = vertexCount;
|
|
cluster.child1 = clusterNode3;
|
|
this.<Tree>k__BackingField.Nodes.Add(clusterNode3);
|
|
int num11 = list._size;
|
|
num11 -= clusterNode3;
|
|
ClusterNode clusterNode4;
|
|
clusterNode4.parent = cluster;
|
|
List<IClusterLODComponent> list2;
|
|
clusterNode4.components = list2;
|
|
int num12 = 0;
|
|
int vertexCount2 = ClusterUtil.GetVertexCount(list2, (NPBPPKDLKDN)num12);
|
|
clusterNode4.vertexCount = vertexCount2;
|
|
cluster.child2 = clusterNode4;
|
|
this.<Tree>k__BackingField.Nodes.Add(clusterNode4);
|
|
Stack<ClusterNode> stack = this.unProcessedClusters;
|
|
ClusterNode child = cluster.child1;
|
|
stack.Push(child);
|
|
Stack<ClusterNode> stack2 = this.unProcessedClusters;
|
|
ClusterNode child2 = cluster.child2;
|
|
stack2.Push(child2);
|
|
List<ClusterNode> nodes2 = this.<Tree>k__BackingField.Nodes;
|
|
ClusterNode child3 = cluster.child1;
|
|
nodes2.Add(child3);
|
|
List<ClusterNode> nodes3 = this.<Tree>k__BackingField.Nodes;
|
|
ClusterNode child4 = cluster.child2;
|
|
nodes3.Add(child4);
|
|
cluster.components = num8;
|
|
IL_20D:
|
|
throw new NullReferenceException();
|
|
IL_21F:
|
|
throw new NullReferenceException();
|
|
}
|
|
|
|
// Token: 0x06006F35 RID: 28469 RVA: 0x0000220F File Offset: 0x0000040F
|
|
[Token(Token = "0x6006F35")]
|
|
[Address(RVA = "0x1F44CD0", Offset = "0x1F43CD0", VA = "0x181F44CD0")]
|
|
private ClusterTreeGenerator.SplitResult GetSplitResult(List<IClusterLODComponent> rawComponents, ClusterTreeGenerator.Axis axis)
|
|
{
|
|
throw new AnalysisFailedException("CPP2IL failed to recover any usable IL for this method.");
|
|
}
|
|
|
|
// Token: 0x06006F36 RID: 28470 RVA: 0x0000220F File Offset: 0x0000040F
|
|
[Token(Token = "0x6006F36")]
|
|
[Address(RVA = "0x1F45B10", Offset = "0x1F44B10", VA = "0x181F45B10")]
|
|
private void SetupMinMaxBuffers(List<IClusterLODComponent> components, Vector3[] minValues, Vector3[] maxValues)
|
|
{
|
|
throw new AnalysisFailedException("CPP2IL failed to recover any usable IL for this method.");
|
|
}
|
|
|
|
// Token: 0x0400499D RID: 18845
|
|
[FieldOffset(Offset = "0x10")]
|
|
[Token(Token = "0x400499D")]
|
|
private ClusterTreeGenerator.Stats stats;
|
|
|
|
// Token: 0x0400499F RID: 18847
|
|
[FieldOffset(Offset = "0x28")]
|
|
[Token(Token = "0x400499F")]
|
|
private int minNumObjectPerCluster;
|
|
|
|
// Token: 0x040049A0 RID: 18848
|
|
[FieldOffset(Offset = "0x2C")]
|
|
[Token(Token = "0x40049A0")]
|
|
private int minNumVerts;
|
|
|
|
// Token: 0x040049A1 RID: 18849
|
|
[FieldOffset(Offset = "0x30")]
|
|
[Token(Token = "0x40049A1")]
|
|
private int maxNumVerts;
|
|
|
|
// Token: 0x040049A2 RID: 18850
|
|
[FieldOffset(Offset = "0x34")]
|
|
[Token(Token = "0x40049A2")]
|
|
private float maxRadius;
|
|
|
|
// Token: 0x040049A3 RID: 18851
|
|
[FieldOffset(Offset = "0x38")]
|
|
[Token(Token = "0x40049A3")]
|
|
private float distributeVSminimize;
|
|
|
|
// Token: 0x040049A4 RID: 18852
|
|
[FieldOffset(Offset = "0x40")]
|
|
[Token(Token = "0x40049A4")]
|
|
private Stack<ClusterNode> unProcessedClusters;
|
|
|
|
// Token: 0x0200135A RID: 4954
|
|
[Token(Token = "0x200135A")]
|
|
private struct Stats
|
|
{
|
|
// Token: 0x040049A5 RID: 18853
|
|
[FieldOffset(Offset = "0x0")]
|
|
[Token(Token = "0x40049A5")]
|
|
public int numOverSized;
|
|
|
|
// Token: 0x040049A6 RID: 18854
|
|
[FieldOffset(Offset = "0x4")]
|
|
[Token(Token = "0x40049A6")]
|
|
public int xSplits;
|
|
|
|
// Token: 0x040049A7 RID: 18855
|
|
[FieldOffset(Offset = "0x8")]
|
|
[Token(Token = "0x40049A7")]
|
|
public int ySplits;
|
|
|
|
// Token: 0x040049A8 RID: 18856
|
|
[FieldOffset(Offset = "0xC")]
|
|
[Token(Token = "0x40049A8")]
|
|
public int zSplits;
|
|
}
|
|
|
|
// Token: 0x0200135B RID: 4955
|
|
[Token(Token = "0x200135B")]
|
|
private struct SplitResult
|
|
{
|
|
// Token: 0x040049A9 RID: 18857
|
|
[FieldOffset(Offset = "0x0")]
|
|
[Token(Token = "0x40049A9")]
|
|
public int bestIndex;
|
|
|
|
// Token: 0x040049AA RID: 18858
|
|
[FieldOffset(Offset = "0x4")]
|
|
[Token(Token = "0x40049AA")]
|
|
public float bestVolume;
|
|
|
|
// Token: 0x040049AB RID: 18859
|
|
[FieldOffset(Offset = "0x8")]
|
|
[Token(Token = "0x40049AB")]
|
|
public List<IClusterLODComponent> components;
|
|
}
|
|
|
|
// Token: 0x0200135C RID: 4956
|
|
[Token(Token = "0x200135C")]
|
|
private enum Axis
|
|
{
|
|
// Token: 0x040049AD RID: 18861
|
|
[Token(Token = "0x40049AD")]
|
|
X_AXIS,
|
|
// Token: 0x040049AE RID: 18862
|
|
[Token(Token = "0x40049AE")]
|
|
Y_AXIS,
|
|
// Token: 0x040049AF RID: 18863
|
|
[Token(Token = "0x40049AF")]
|
|
Z_AXIS
|
|
}
|
|
}
|
|
}
|