Please disclose if any significant portion of your mod was created using AI tools by adding the 'AI Generated' category. Failing to do so may result in the mod being removed from Thunderstore.
Decompiled source of VertexLibrary v1.1.0
plugins/VertexLibrary.dll
Decompiled 2 years agousing System; using System.Buffers; using System.Collections.Generic; using System.Diagnostics; using System.Linq; using System.Reflection; using System.Runtime.CompilerServices; using BepInEx; using Microsoft.CodeAnalysis; using Unity.Collections; using UnityEngine; using UnityEngine.Pool; using UnityEngine.Rendering; using VertexLibrary.Caches; [assembly: CompilationRelaxations(8)] [assembly: RuntimeCompatibility(WrapNonExceptionThrows = true)] [assembly: Debuggable(DebuggableAttribute.DebuggingModes.IgnoreSymbolStoreSequencePoints)] [assembly: AssemblyCompany("com.github.lethalcompanymodding.vertexlibrary")] [assembly: AssemblyConfiguration("Release")] [assembly: AssemblyFileVersion("1.1.0.0")] [assembly: AssemblyInformationalVersion("1.1.0+df55d72b36148206cca3ad5dd776bc2ca74c4b52")] [assembly: AssemblyProduct("VertexLibrary")] [assembly: AssemblyTitle("com.github.lethalcompanymodding.vertexlibrary")] [assembly: AssemblyMetadata("RepositoryUrl", "https://github.com/LethalCompanyModding/UnityVertexLibrary")] [assembly: AssemblyVersion("1.1.0.0")] [module: RefSafetyRules(11)] namespace Microsoft.CodeAnalysis { [CompilerGenerated] [Microsoft.CodeAnalysis.Embedded] internal sealed class EmbeddedAttribute : Attribute { } } namespace System.Runtime.CompilerServices { [CompilerGenerated] [Microsoft.CodeAnalysis.Embedded] [AttributeUsage(AttributeTargets.Class | AttributeTargets.Property | AttributeTargets.Field | AttributeTargets.Event | AttributeTargets.Parameter | AttributeTargets.ReturnValue | AttributeTargets.GenericParameter, AllowMultiple = false, Inherited = false)] internal sealed class NullableAttribute : Attribute { public readonly byte[] NullableFlags; public NullableAttribute(byte P_0) { NullableFlags = new byte[1] { P_0 }; } public NullableAttribute(byte[] P_0) { NullableFlags = P_0; } } [CompilerGenerated] [Microsoft.CodeAnalysis.Embedded] [AttributeUsage(AttributeTargets.Class | AttributeTargets.Struct | AttributeTargets.Method | AttributeTargets.Interface | AttributeTargets.Delegate, AllowMultiple = false, Inherited = false)] internal sealed class NullableContextAttribute : Attribute { public readonly byte Flag; public NullableContextAttribute(byte P_0) { Flag = P_0; } } [CompilerGenerated] [Microsoft.CodeAnalysis.Embedded] [AttributeUsage(AttributeTargets.Module, AllowMultiple = false, Inherited = false)] internal sealed class RefSafetyRulesAttribute : Attribute { public readonly int Version; public RefSafetyRulesAttribute(int P_0) { Version = P_0; } } } internal static class LCMPluginInfo { public const string PLUGIN_GUID = "com.github.lethalcompanymodding.vertexlibrary"; public const string PLUGIN_NAME = "VertexLibrary"; public const string PLUGIN_VERSION = "1.1.0"; } namespace VertexLibrary { public struct ExecutionOptions { public Action<LogType, Func<string>> LogHandler { get; set; } public int CullingMask { get; set; } public ISet<Type>? FilteredComponents { get; set; } public Matrix4x4 OverrideMatrix { get; set; } public IVertexCache VertexCache { get; set; } public ExecutionOptions() { //IL_001a: Unknown result type (might be due to invalid IL or missing references) //IL_001f: Unknown result type (might be due to invalid IL or missing references) LogHandler = null; CullingMask = -1; FilteredComponents = new HashSet<Type>(); OverrideMatrix = Matrix4x4.identity; VertexCache = VertexesExtensions.GlobalPartialCache; } } public enum LogType { None = 0, Fatal = 2, Error = 4, Warning = 8, Info1 = 16, Info2 = 32, Info3 = 64, Info4 = 128, Info = 240, Debug1 = 256, Debug2 = 512, Debug3 = 1024, Debug4 = 2048, Debug = 3840, All = 4094 } [BepInPlugin("com.github.lethalcompanymodding.vertexlibrary", "VertexLibrary", "1.1.0")] public class Plugin : BaseUnityPlugin { } public static class VertexesExtensions { public static IVertexCache GlobalCache { get; } = IVertexCache.CreateCache(partial: false); public static IVertexCache GlobalPartialCache { get; } = GlobalCache.AsPartial(); public static event Action<LogType, Func<string>>? logEvent; public static Bounds? GetBounds(this GameObject target, ExecutionOptions executionOptions = default(ExecutionOptions)) { return target.transform.GetBounds(executionOptions); } public static bool TryGetBounds(this GameObject target, out Bounds bounds, ExecutionOptions executionOptions = default(ExecutionOptions)) { return target.transform.TryGetBounds(out bounds, executionOptions); } public static Bounds? GetWorldBounds(this GameObject target, ExecutionOptions executionOptions = default(ExecutionOptions)) { return target.transform.GetWorldBounds(executionOptions); } public static bool TryGetWorldBounds(this GameObject target, out Bounds bounds, ExecutionOptions executionOptions = default(ExecutionOptions)) { return target.transform.TryGetWorldBounds(out bounds, executionOptions); } public static float GetRadius(this GameObject target, ExecutionOptions executionOptions = default(ExecutionOptions)) { return target.transform.GetRadius(executionOptions); } public static Vector3[] GetVertexes(this GameObject target, ExecutionOptions executionOptions = default(ExecutionOptions)) { return target.transform.GetVertexes(executionOptions); } public static void CacheVertexes(GameObject target, ExecutionOptions executionOptions) { target.transform.CacheVertexes(executionOptions); } public static Bounds? GetBounds(this Transform target, ExecutionOptions executionOptions = default(ExecutionOptions)) { //IL_0014: Unknown result type (might be due to invalid IL or missing references) //IL_001a: Unknown result type (might be due to invalid IL or missing references) //IL_001f: Unknown result type (might be due to invalid IL or missing references) //IL_0024: Unknown result type (might be due to invalid IL or missing references) //IL_0027: Unknown result type (might be due to invalid IL or missing references) logEvent += executionOptions.LogHandler; try { List<Vector3> list = CollectionPool<List<Vector3>, Vector3>.Get(); Matrix4x4 targetMatrix = executionOptions.OverrideMatrix * target.worldToLocalMatrix; target.GetChildVertexes(list, targetMatrix, "", executionOptions, Logfunc); Bounds? bounds = ((IEnumerable<Vector3>)list).GetBounds(); CollectionPool<List<Vector3>, Vector3>.Release(list); return bounds; } finally { logEvent -= executionOptions.LogHandler; } static string Logfunc(List<Vector3> vertexes) { //IL_001d: Unknown result type (might be due to invalid IL or missing references) //IL_0029: Unknown result type (might be due to invalid IL or missing references) //IL_002e: Unknown result type (might be due to invalid IL or missing references) //IL_0031: Unknown result type (might be due to invalid IL or missing references) //IL_003d: Unknown result type (might be due to invalid IL or missing references) //IL_0042: Unknown result type (might be due to invalid IL or missing references) //IL_0045: Unknown result type (might be due to invalid IL or missing references) Bounds? bounds2 = ((IEnumerable<Vector3>)vertexes).GetBounds(); if (!bounds2.HasValue) { return ""; } object arg = bounds2.Value; Bounds value = bounds2.Value; object arg2 = ((Bounds)(ref value)).min; value = bounds2.Value; return $"{arg} Min {arg2} Max {((Bounds)(ref value)).max}"; } } public static bool TryGetBounds(this Transform target, out Bounds bounds, ExecutionOptions executionOptions = default(ExecutionOptions)) { //IL_0001: Unknown result type (might be due to invalid IL or missing references) //IL_001b: Unknown result type (might be due to invalid IL or missing references) //IL_0020: Unknown result type (might be due to invalid IL or missing references) bounds = default(Bounds); Bounds? bounds2 = target.GetBounds(executionOptions); if (bounds2.HasValue) { bounds = bounds2.Value; } return bounds2.HasValue; } public static Bounds? GetWorldBounds(this Transform target, ExecutionOptions executionOptions = default(ExecutionOptions)) { //IL_0012: Unknown result type (might be due to invalid IL or missing references) //IL_0017: Unknown result type (might be due to invalid IL or missing references) //IL_001a: Unknown result type (might be due to invalid IL or missing references) logEvent += executionOptions.LogHandler; try { List<Vector3> list = CollectionPool<List<Vector3>, Vector3>.Get(); Matrix4x4 identity = Matrix4x4.identity; target.GetChildVertexes(list, identity, "", executionOptions, Logfunc); Bounds? bounds = ((IEnumerable<Vector3>)list).GetBounds(); CollectionPool<List<Vector3>, Vector3>.Release(list); return bounds; } finally { logEvent -= executionOptions.LogHandler; } static string Logfunc(List<Vector3> vertexes) { //IL_001d: Unknown result type (might be due to invalid IL or missing references) //IL_0029: Unknown result type (might be due to invalid IL or missing references) //IL_002e: Unknown result type (might be due to invalid IL or missing references) //IL_0031: Unknown result type (might be due to invalid IL or missing references) //IL_003d: Unknown result type (might be due to invalid IL or missing references) //IL_0042: Unknown result type (might be due to invalid IL or missing references) //IL_0045: Unknown result type (might be due to invalid IL or missing references) Bounds? bounds2 = ((IEnumerable<Vector3>)vertexes).GetBounds(); if (!bounds2.HasValue) { return ""; } object arg = bounds2.Value; Bounds value = bounds2.Value; object arg2 = ((Bounds)(ref value)).min; value = bounds2.Value; return $"{arg} Min {arg2} Max {((Bounds)(ref value)).max}"; } } public static bool TryGetWorldBounds(this Transform target, out Bounds bounds, ExecutionOptions executionOptions = default(ExecutionOptions)) { //IL_0001: Unknown result type (might be due to invalid IL or missing references) //IL_001b: Unknown result type (might be due to invalid IL or missing references) //IL_0020: Unknown result type (might be due to invalid IL or missing references) bounds = default(Bounds); Bounds? worldBounds = target.GetWorldBounds(executionOptions); if (worldBounds.HasValue) { bounds = worldBounds.Value; } return worldBounds.HasValue; } public static float GetRadius(this Transform target, ExecutionOptions executionOptions = default(ExecutionOptions)) { //IL_0012: Unknown result type (might be due to invalid IL or missing references) //IL_0017: Unknown result type (might be due to invalid IL or missing references) //IL_001a: Unknown result type (might be due to invalid IL or missing references) //IL_004c: Unknown result type (might be due to invalid IL or missing references) //IL_0051: Unknown result type (might be due to invalid IL or missing references) //IL_0055: Unknown result type (might be due to invalid IL or missing references) //IL_0043: Unknown result type (might be due to invalid IL or missing references) logEvent += executionOptions.LogHandler; try { List<Vector3> list = CollectionPool<List<Vector3>, Vector3>.Get(); Matrix4x4 identity = Matrix4x4.identity; target.GetChildVertexes(list, identity, "", executionOptions, Logfunc); Bounds? bounds = ((IEnumerable<Vector3>)list).GetBounds(); Vector3 origin; if (!bounds.HasValue) { origin = Vector3.zero; } else { Bounds valueOrDefault = bounds.GetValueOrDefault(); origin = ((Bounds)(ref valueOrDefault)).center; } float item = list.GetFarthestPoint(origin).distance; CollectionPool<List<Vector3>, Vector3>.Release(list); return item; } finally { logEvent -= executionOptions.LogHandler; } static string Logfunc(List<Vector3> vertexes) { //IL_0025: Unknown result type (might be due to invalid IL or missing references) //IL_0034: Unknown result type (might be due to invalid IL or missing references) //IL_0039: Unknown result type (might be due to invalid IL or missing references) //IL_003c: Unknown result type (might be due to invalid IL or missing references) //IL_004b: Unknown result type (might be due to invalid IL or missing references) //IL_0050: Unknown result type (might be due to invalid IL or missing references) //IL_0053: Unknown result type (might be due to invalid IL or missing references) //IL_0063: Unknown result type (might be due to invalid IL or missing references) //IL_0068: Unknown result type (might be due to invalid IL or missing references) //IL_006b: Unknown result type (might be due to invalid IL or missing references) Bounds? bounds2 = ((IEnumerable<Vector3>)vertexes).GetBounds(); if (!bounds2.HasValue) { return "Radius: 0"; } object[] obj = new object[4] { bounds2.Value, null, null, null }; Bounds value = bounds2.Value; obj[1] = ((Bounds)(ref value)).min; value = bounds2.Value; obj[2] = ((Bounds)(ref value)).max; value = bounds2.Value; obj[3] = vertexes.GetFarthestPoint(((Bounds)(ref value)).center); return string.Format("{0} Min {1} Max {2} Radius: {3}", obj); } } public static Vector3[] GetVertexes(this Transform target, ExecutionOptions executionOptions = default(ExecutionOptions)) { //IL_0014: Unknown result type (might be due to invalid IL or missing references) //IL_001a: Unknown result type (might be due to invalid IL or missing references) //IL_001f: Unknown result type (might be due to invalid IL or missing references) //IL_0024: Unknown result type (might be due to invalid IL or missing references) //IL_0027: Unknown result type (might be due to invalid IL or missing references) logEvent += executionOptions.LogHandler; try { List<Vector3> list = CollectionPool<List<Vector3>, Vector3>.Get(); Matrix4x4 targetMatrix = executionOptions.OverrideMatrix * target.worldToLocalMatrix; target.GetChildVertexes(list, targetMatrix, "", executionOptions, Logfunc); Vector3[] result = list.ToArray(); CollectionPool<List<Vector3>, Vector3>.Release(list); return result; } finally { logEvent -= executionOptions.LogHandler; } static string Logfunc(List<Vector3> vertexes) { //IL_001d: Unknown result type (might be due to invalid IL or missing references) //IL_0029: Unknown result type (might be due to invalid IL or missing references) //IL_002e: Unknown result type (might be due to invalid IL or missing references) //IL_0031: Unknown result type (might be due to invalid IL or missing references) //IL_003d: Unknown result type (might be due to invalid IL or missing references) //IL_0042: Unknown result type (might be due to invalid IL or missing references) //IL_0045: Unknown result type (might be due to invalid IL or missing references) Bounds? bounds = ((IEnumerable<Vector3>)vertexes).GetBounds(); if (!bounds.HasValue) { return ""; } object arg = bounds.Value; Bounds value = bounds.Value; object arg2 = ((Bounds)(ref value)).min; value = bounds.Value; return $"{arg} Min {arg2} Max {((Bounds)(ref value)).max}"; } } public static void CacheVertexes(this Transform target, ExecutionOptions executionOptions = default(ExecutionOptions)) { if (executionOptions.VertexCache == null) { throw new ArgumentNullException("executionOptions.VertexCache"); } target.CacheChildVertexes("", executionOptions); } public static Bounds? GetBounds(this IEnumerable<Vector3> vertexes) { //IL_001c: Unknown result type (might be due to invalid IL or missing references) //IL_0021: Unknown result type (might be due to invalid IL or missing references) //IL_0026: Unknown result type (might be due to invalid IL or missing references) //IL_002b: Unknown result type (might be due to invalid IL or missing references) //IL_0031: Unknown result type (might be due to invalid IL or missing references) //IL_0043: Unknown result type (might be due to invalid IL or missing references) using IEnumerator<Vector3> enumerator = vertexes.GetEnumerator(); if (!enumerator.MoveNext()) { return null; } Bounds value = new Bounds(enumerator.Current, Vector3.zero); while (enumerator.MoveNext()) { ((Bounds)(ref value)).Encapsulate(enumerator.Current); } return value; } public static (Vector3? point, float distance) GetFarthestPoint(this IEnumerable<Vector3> vertexes, Vector3 origin = default(Vector3)) { //IL_0018: Unknown result type (might be due to invalid IL or missing references) //IL_001d: Unknown result type (might be due to invalid IL or missing references) //IL_001e: Unknown result type (might be due to invalid IL or missing references) //IL_001f: Unknown result type (might be due to invalid IL or missing references) //IL_002c: Unknown result type (might be due to invalid IL or missing references) Vector3? item = null; float num = float.NegativeInfinity; foreach (Vector3 vertex in vertexes) { float num2 = Vector3.Distance(vertex, origin); if (num2 > num) { item = vertex; num = num2; } } return (item, num); } private static void GetChildVertexes(this Transform target, List<Vector3> outVertices, Matrix4x4 targetMatrix, string path, ExecutionOptions executionOptions, Func<List<Vector3>, string> logFunc) { //IL_0087: Unknown result type (might be due to invalid IL or missing references) //IL_008e: Unknown result type (might be due to invalid IL or missing references) //IL_0093: Unknown result type (might be due to invalid IL or missing references) //IL_0098: Unknown result type (might be due to invalid IL or missing references) //IL_009f: Unknown result type (might be due to invalid IL or missing references) //IL_00a4: Unknown result type (might be due to invalid IL or missing references) //IL_00ef: Unknown result type (might be due to invalid IL or missing references) //IL_00f4: Unknown result type (might be due to invalid IL or missing references) //IL_05ba: Unknown result type (might be due to invalid IL or missing references) //IL_0168: Unknown result type (might be due to invalid IL or missing references) //IL_016d: Unknown result type (might be due to invalid IL or missing references) //IL_0604: Unknown result type (might be due to invalid IL or missing references) //IL_060b: Expected O, but got Unknown //IL_061b: Unknown result type (might be due to invalid IL or missing references) //IL_0620: Unknown result type (might be due to invalid IL or missing references) //IL_0626: Unknown result type (might be due to invalid IL or missing references) //IL_0250: Unknown result type (might be due to invalid IL or missing references) //IL_0257: Expected O, but got Unknown //IL_0415: Unknown result type (might be due to invalid IL or missing references) //IL_041a: Unknown result type (might be due to invalid IL or missing references) //IL_0425: Unknown result type (might be due to invalid IL or missing references) //IL_0438: Unknown result type (might be due to invalid IL or missing references) //IL_0444: Unknown result type (might be due to invalid IL or missing references) //IL_0450: Unknown result type (might be due to invalid IL or missing references) //IL_045a: Unknown result type (might be due to invalid IL or missing references) //IL_046d: Unknown result type (might be due to invalid IL or missing references) //IL_0479: Unknown result type (might be due to invalid IL or missing references) //IL_0485: Unknown result type (might be due to invalid IL or missing references) //IL_048f: Unknown result type (might be due to invalid IL or missing references) //IL_04a2: Unknown result type (might be due to invalid IL or missing references) //IL_04ae: Unknown result type (might be due to invalid IL or missing references) //IL_04ba: Unknown result type (might be due to invalid IL or missing references) //IL_04c4: Unknown result type (might be due to invalid IL or missing references) //IL_04d7: Unknown result type (might be due to invalid IL or missing references) //IL_04e3: Unknown result type (might be due to invalid IL or missing references) //IL_04ef: Unknown result type (might be due to invalid IL or missing references) //IL_04f9: Unknown result type (might be due to invalid IL or missing references) //IL_050c: Unknown result type (might be due to invalid IL or missing references) //IL_0518: Unknown result type (might be due to invalid IL or missing references) //IL_0524: Unknown result type (might be due to invalid IL or missing references) //IL_052e: Unknown result type (might be due to invalid IL or missing references) //IL_0541: Unknown result type (might be due to invalid IL or missing references) string path2 = path; Transform target2 = target; Func<List<Vector3>, string> logFunc2 = logFunc; List<Vector3> outVertices2 = outVertices; VertexesExtensions.logEvent?.Invoke(LogType.Debug1, () => "Processing " + path2 + "/" + ((Object)target2).name); ISet<Type>? filteredComponents = executionOptions.FilteredComponents; Component val8 = default(Component); if (filteredComponents != null && filteredComponents.Any((Type c) => ((Component)target2).TryGetComponent(c, ref val8))) { VertexesExtensions.logEvent?.Invoke(LogType.Debug2, () => "Skipping " + path2 + "/" + ((Object)target2).name + "!"); return; } Matrix4x4 matrix = targetMatrix * target2.localToWorldMatrix; List<Vector3> list = default(List<Vector3>); PooledObject<List<Vector3>> val = CollectionPool<List<Vector3>, Vector3>.Get(ref list); try { if ((executionOptions.CullingMask & (1 << ((Component)target2).gameObject.layer)) == 0) { VertexesExtensions.logEvent?.Invoke(LogType.Debug2, () => $"Ignoring {path2}/{((Object)target2).name} by the culling mask: {((Component)target2).gameObject.layer}"); } else { List<Renderer> list2 = default(List<Renderer>); PooledObject<List<Renderer>> val2 = CollectionPool<List<Renderer>, Renderer>.Get(ref list2); try { ((Component)target2).GetComponents<Renderer>(list2); List<Vector3> rVertices = default(List<Vector3>); foreach (Renderer renderer in list2.Where((Renderer r) => r.enabled)) { PooledObject<List<Vector3>> val3 = CollectionPool<List<Vector3>, Vector3>.Get(ref rVertices); try { Renderer obj = renderer; SkinnedMeshRenderer val4 = (SkinnedMeshRenderer)(object)((obj is SkinnedMeshRenderer) ? obj : null); if (val4 == null) { if (!(renderer is MeshRenderer)) { if (!(renderer is ParticleSystemRenderer)) { Bounds bounds = renderer.bounds; rVertices.Add(((Bounds)(ref bounds)).min); rVertices.Add(new Vector3(((Bounds)(ref bounds)).min.x, ((Bounds)(ref bounds)).min.y, ((Bounds)(ref bounds)).max.z)); rVertices.Add(new Vector3(((Bounds)(ref bounds)).min.x, ((Bounds)(ref bounds)).max.y, ((Bounds)(ref bounds)).max.z)); rVertices.Add(new Vector3(((Bounds)(ref bounds)).max.x, ((Bounds)(ref bounds)).min.y, ((Bounds)(ref bounds)).max.z)); rVertices.Add(new Vector3(((Bounds)(ref bounds)).max.x, ((Bounds)(ref bounds)).min.y, ((Bounds)(ref bounds)).min.z)); rVertices.Add(new Vector3(((Bounds)(ref bounds)).max.x, ((Bounds)(ref bounds)).max.y, ((Bounds)(ref bounds)).min.z)); rVertices.Add(((Bounds)(ref bounds)).max); } goto IL_054b; } MeshFilter component = ((Component)renderer).GetComponent<MeshFilter>(); if ((Object)(object)component == (Object)null) { VertexesExtensions.logEvent?.Invoke(LogType.Warning, () => $"{((object)renderer).GetType()} in {path2} is missing a MeshFilter"); continue; } Mesh sharedMesh = component.sharedMesh; if ((Object)(object)sharedMesh == (Object)null) { VertexesExtensions.logEvent?.Invoke(LogType.Warning, () => $"{((object)renderer).GetType()} in {path2} is missing a mesh"); continue; } if (executionOptions.VertexCache != null && executionOptions.VertexCache.TryGetValue(sharedMesh, out Vector3[] vertices)) { VertexesExtensions.logEvent?.Invoke(LogType.Debug3, () => "Cache hit " + path2 + "/" + ((Object)target2).name + " renderer " + ((object)renderer).GetType().Name); rVertices.AddRange(vertices); } else { if (sharedMesh.isReadable) { sharedMesh.GetVertices(rVertices); } else { sharedMesh.GetNonReadableVertices(rVertices); } if (executionOptions.VertexCache != null) { executionOptions.VertexCache[sharedMesh] = rVertices.ToArray(); } } goto IL_054b; } Mesh sharedMesh2 = val4.sharedMesh; if ((Object)(object)sharedMesh2 == (Object)null) { VertexesExtensions.logEvent?.Invoke(LogType.Warning, () => $"{((object)renderer).GetType()} in {path2} is missing a mesh"); continue; } IVertexCache vertexCache = executionOptions.VertexCache; if (vertexCache != null && !vertexCache.IgnoreSkinnedRenders && executionOptions.VertexCache.TryGetValue(sharedMesh2, out Vector3[] vertices2)) { VertexesExtensions.logEvent?.Invoke(LogType.Warning, () => "Cache hit " + path2 + "/" + ((Object)target2).name + " renderer " + ((object)renderer).GetType().Name); rVertices.AddRange(vertices2); } else { Mesh val5 = new Mesh(); val4.BakeMesh(val5, true); if (val5.isReadable) { val5.GetVertices(rVertices); } else { val5.GetNonReadableVertices(rVertices); } Object.Destroy((Object)(object)val5); if (executionOptions.VertexCache != null) { executionOptions.VertexCache[sharedMesh2] = rVertices.ToArray(); } } VertexesExtensions.logEvent?.Invoke(LogType.Debug1, () => "Processing " + path2 + "/" + ((Object)target2).name + " renderer " + ((object)renderer).GetType().Name + " " + logFunc2?.Invoke(rVertices.ToList())); goto IL_054b; IL_054b: VertexesExtensions.logEvent?.Invoke(LogType.Debug1, () => "Processing " + path2 + "/" + ((Object)target2).name + " renderer " + ((object)renderer).GetType().Name + " " + logFunc2?.Invoke(((IEnumerable<Vector3>)rVertices).Select((Func<Vector3, Vector3>)((Matrix4x4)(object)matrix).MultiplyPoint3x4).ToList())); list.AddRange(rVertices); } finally { ((IDisposable)val3).Dispose(); } } } finally { ((IDisposable)val2).Dispose(); } } outVertices2.AddRange(((IEnumerable<Vector3>)list).Select((Func<Vector3, Vector3>)((Matrix4x4)(object)matrix).MultiplyPoint3x4)); } finally { ((IDisposable)val).Dispose(); } List<Vector3> list3 = default(List<Vector3>); foreach (Transform item in ((Component)target2).transform) { Transform val6 = item; if (((Component)val6).gameObject.activeSelf) { PooledObject<List<Vector3>> val7 = CollectionPool<List<Vector3>, Vector3>.Get(ref list3); try { val6.GetChildVertexes(list3, targetMatrix, path2 + "/" + ((Object)target2).name, executionOptions, logFunc2); outVertices2.AddRange(list3); } finally { ((IDisposable)val7).Dispose(); } } } VertexesExtensions.logEvent?.Invoke(LogType.Debug1, () => "Completed " + path2 + "/" + ((Object)target2).name + " " + logFunc2?.Invoke(outVertices2)); } private static void CacheChildVertexes(this Transform target, string path, ExecutionOptions executionOptions) { //IL_0079: Unknown result type (might be due to invalid IL or missing references) //IL_007e: Unknown result type (might be due to invalid IL or missing references) //IL_0161: Unknown result type (might be due to invalid IL or missing references) //IL_0168: Expected O, but got Unknown //IL_0289: Unknown result type (might be due to invalid IL or missing references) //IL_0290: Expected O, but got Unknown string path2 = path; Transform target2 = target; VertexesExtensions.logEvent?.Invoke(LogType.Debug1, () => "Caching " + path2 + "/" + ((Object)target2).name); ISet<Type>? filteredComponents = executionOptions.FilteredComponents; Component val4 = default(Component); if (filteredComponents != null && filteredComponents.Any((Type c) => ((Component)target2).TryGetComponent(c, ref val4))) { VertexesExtensions.logEvent?.Invoke(LogType.Debug2, () => "Skipping " + path2 + "/" + ((Object)target2).name + "!"); return; } List<Renderer> list = default(List<Renderer>); PooledObject<List<Renderer>> val = CollectionPool<List<Renderer>, Renderer>.Get(ref list); try { ((Component)target2).GetComponents<Renderer>(list); foreach (Renderer renderer in list.Where((Renderer r) => r.enabled)) { Renderer obj = renderer; SkinnedMeshRenderer val2 = (SkinnedMeshRenderer)(object)((obj is SkinnedMeshRenderer) ? obj : null); if (val2 == null) { if (!(renderer is MeshRenderer)) { if (renderer is ParticleSystemRenderer) { } } else { MeshFilter component = ((Component)renderer).GetComponent<MeshFilter>(); if ((Object)(object)component == (Object)null) { VertexesExtensions.logEvent?.Invoke(LogType.Warning, () => $"{((object)renderer).GetType()} in {path2} is missing a MeshFilter"); continue; } Mesh sharedMesh = component.sharedMesh; if ((Object)(object)sharedMesh == (Object)null) { VertexesExtensions.logEvent?.Invoke(LogType.Warning, () => $"{((object)renderer).GetType()} in {path2} is missing a mesh"); continue; } if (!executionOptions.VertexCache.Cache.ContainsKey(sharedMesh)) { if (sharedMesh.isReadable) { sharedMesh.CacheVertices(executionOptions); } else { sharedMesh.CacheNonReadableVertices(executionOptions); } } } } else { Mesh sharedMesh2 = val2.sharedMesh; if ((Object)(object)sharedMesh2 == (Object)null) { VertexesExtensions.logEvent?.Invoke(LogType.Warning, () => $"{((object)renderer).GetType()} in {path2} is missing a mesh"); continue; } if (!executionOptions.VertexCache.Cache.ContainsKey(sharedMesh2)) { Mesh val3 = new Mesh(); val2.BakeMesh(val3, true); if (val3.isReadable) { val3.CacheVertices(executionOptions, sharedMesh2); } else { val3.CacheNonReadableVertices(executionOptions, sharedMesh2); } Object.Destroy((Object)(object)val3); } } VertexesExtensions.logEvent?.Invoke(LogType.Debug1, () => "Caching " + path2 + "/" + ((Object)target2).name + " renderer " + ((object)renderer).GetType().Name); foreach (Transform item in ((Component)target2).transform) { Transform target3 = item; target3.CacheChildVertexes(path2 + "/" + ((Object)target2).name, executionOptions); } } } finally { ((IDisposable)val).Dispose(); } } private static void GetNonReadableVertices(this Mesh nonReadableMesh, List<Vector3> vertexes) { //IL_0000: Unknown result type (might be due to invalid IL or missing references) //IL_0006: Expected O, but got Unknown //IL_0064: Unknown result type (might be due to invalid IL or missing references) //IL_0081: Unknown result type (might be due to invalid IL or missing references) Mesh val = new Mesh(); nonReadableMesh.vertexBufferTarget = (Target)1; if (nonReadableMesh.vertexBufferCount > 0) { GraphicsBuffer vertexBuffer = nonReadableMesh.GetVertexBuffer(0); int num = vertexBuffer.stride * vertexBuffer.count; byte[] array = ArrayPool<byte>.Shared.Rent(num); vertexBuffer.GetData((Array)array, 0, 0, num); int vertexAttributeCount = nonReadableMesh.vertexAttributeCount; NativeArray<VertexAttributeDescriptor> val2 = default(NativeArray<VertexAttributeDescriptor>); val2..ctor(vertexAttributeCount, (Allocator)2, (NativeArrayOptions)1); for (int i = 0; i < vertexAttributeCount; i++) { val2[i] = nonReadableMesh.GetVertexAttribute(i); } val.SetVertexBufferParams(nonReadableMesh.vertexCount, val2); val.SetVertexBufferData<byte>(array, 0, 0, num, 0, (MeshUpdateFlags)0); ArrayPool<byte>.Shared.Return(array); val2.Dispose(); vertexBuffer.Dispose(); } val.GetVertices(vertexes); Object.Destroy((Object)(object)val); } private static void CacheNonReadableVertices(this Mesh nonReadableMesh, ExecutionOptions executionOptions, Mesh? cacheKey = null) { //IL_0114: Unknown result type (might be due to invalid IL or missing references) Mesh nonReadableMesh2 = nonReadableMesh; Mesh cacheKey2 = cacheKey; if (executionOptions.VertexCache.ContainsKey(nonReadableMesh2)) { return; } nonReadableMesh2.vertexBufferTarget = (Target)1; if (nonReadableMesh2.vertexBufferCount <= 0) { return; } GraphicsBuffer verticesBuffer = nonReadableMesh2.GetVertexBuffer(0); int totalSize = verticesBuffer.stride * verticesBuffer.count; VertexAttributeDescriptor[] attributes = nonReadableMesh2.GetVertexAttributes(); int count = nonReadableMesh2.vertexCount; IDictionary<Mesh, Vector3[]> vertexCache = executionOptions.VertexCache.Cache; VertexesExtensions.logEvent?.Invoke(LogType.Warning, () => $"Requesting vertexes for {nonReadableMesh2} from GPU"); AsyncGPUReadback.Request(verticesBuffer, totalSize, 0, (Action<AsyncGPUReadbackRequest>)delegate(AsyncGPUReadbackRequest request) { //IL_0024: Unknown result type (might be due to invalid IL or missing references) //IL_002a: Expected O, but got Unknown //IL_002d: Unknown result type (might be due to invalid IL or missing references) //IL_0032: Unknown result type (might be due to invalid IL or missing references) //IL_0046: Unknown result type (might be due to invalid IL or missing references) //IL_0069: Unknown result type (might be due to invalid IL or missing references) //IL_006e: Unknown result type (might be due to invalid IL or missing references) verticesBuffer.Release(); if (!vertexCache.ContainsKey(nonReadableMesh2)) { Mesh val = new Mesh(); NativeArray<byte> data = ((AsyncGPUReadbackRequest)(ref request)).GetData<byte>(0); val.SetVertexBufferParams(count, attributes); val.SetVertexBufferData<byte>(data, 0, 0, totalSize, 0, (MeshUpdateFlags)0); List<Vector3> tmp = default(List<Vector3>); PooledObject<List<Vector3>> val2 = CollectionPool<List<Vector3>, Vector3>.Get(ref tmp); try { val.GetVertices(tmp); VertexesExtensions.logEvent?.Invoke(LogType.Debug1, () => $"Cached {tmp.Count} vertexes for {nonReadableMesh2}"); executionOptions.VertexCache[((Object)(object)cacheKey2 != (Object)null) ? cacheKey2 : nonReadableMesh2] = tmp.ToArray(); } finally { ((IDisposable)val2).Dispose(); } Object.Destroy((Object)(object)val); } }); } private static void CacheVertices(this Mesh readableMesh, ExecutionOptions executionOptions, Mesh? cacheKey = null) { //IL_0028: Unknown result type (might be due to invalid IL or missing references) //IL_002d: Unknown result type (might be due to invalid IL or missing references) Mesh readableMesh2 = readableMesh; if (executionOptions.VertexCache.ContainsKey(readableMesh2)) { return; } List<Vector3> tmp = default(List<Vector3>); PooledObject<List<Vector3>> val = CollectionPool<List<Vector3>, Vector3>.Get(ref tmp); try { readableMesh2.GetVertices(tmp); VertexesExtensions.logEvent?.Invoke(LogType.Debug1, () => $"Cached {tmp.Count} vertexes for {readableMesh2}"); executionOptions.VertexCache[(Mesh)(((Object)(object)cacheKey != (Object)null) ? ((object)cacheKey) : ((object)readableMesh2))] = tmp.ToArray(); } finally { ((IDisposable)val).Dispose(); } } } } namespace VertexLibrary.Caches { internal class FullVertexCache : IVertexCache { private IVertexCache? _complementaryCache; public bool IgnoreSkinnedRenders => false; public IDictionary<Mesh, Vector3[]> Cache { get; } = new Dictionary<Mesh, Vector3[]>(); public FullVertexCache() { } public FullVertexCache(PartialVertexCache complementaryCache) { _complementaryCache = complementaryCache; Cache = complementaryCache.Cache; } public IVertexCache AsPartial() { if (_complementaryCache == null) { _complementaryCache = new PartialVertexCache(this); } return _complementaryCache; } public IVertexCache AsFull() { return this; } } public interface IVertexCache { bool IgnoreSkinnedRenders { get; } int CacheSize => Cache.Count; internal IDictionary<Mesh, Vector3[]> Cache { get; } Vector3[] this[Mesh mesh] { get { return Cache[mesh]; } internal set { Cache[mesh] = value; } } bool ContainsKey(Mesh mesh) { return Cache.ContainsKey(mesh); } bool TryGetValue(Mesh mesh, out Vector3[] vertices) { return Cache.TryGetValue(mesh, out vertices); } IVertexCache AsPartial(); IVertexCache AsFull(); static IVertexCache CreateCache(bool partial) { if (partial) { return new PartialVertexCache(); } return new FullVertexCache(); } } internal class PartialVertexCache : IVertexCache { private IVertexCache? _complementaryCache; public bool IgnoreSkinnedRenders => true; public IDictionary<Mesh, Vector3[]> Cache { get; } = new Dictionary<Mesh, Vector3[]>(); public PartialVertexCache() { } public PartialVertexCache(FullVertexCache complementaryCache) { _complementaryCache = complementaryCache; Cache = complementaryCache.Cache; } public IVertexCache AsPartial() { return this; } public IVertexCache AsFull() { if (_complementaryCache == null) { _complementaryCache = new FullVertexCache(this); } return _complementaryCache; } } }