Decompiled source of TerrainScanner v1.1.2

plugins/com.github.LIghtJUNction.TerrainScanner.dll

Decompiled 2 months ago
using System;
using System.Collections.Generic;
using System.Diagnostics;
using System.Reflection;
using System.Runtime.CompilerServices;
using System.Runtime.InteropServices;
using System.Runtime.Versioning;
using System.Security;
using System.Security.Permissions;
using System.Threading;
using BepInEx;
using BepInEx.Configuration;
using BepInEx.Logging;
using Cysharp.Threading.Tasks;
using Cysharp.Threading.Tasks.CompilerServices;
using DG.Tweening;
using DG.Tweening.Core;
using DG.Tweening.Plugins.Options;
using Microsoft.CodeAnalysis;
using PEAKLib.Core;
using TerrainScanner.DS;
using UnityEngine;
using UnityEngine.LowLevel;
using UnityEngine.Rendering;
using UnityEngine.Rendering.RenderGraphModule;
using UnityEngine.Rendering.Universal;
using UnityEngine.SceneManagement;

[assembly: CompilationRelaxations(8)]
[assembly: RuntimeCompatibility(WrapNonExceptionThrows = true)]
[assembly: Debuggable(DebuggableAttribute.DebuggingModes.IgnoreSymbolStoreSequencePoints)]
[assembly: IgnoresAccessChecksTo("Assembly-CSharp")]
[assembly: TargetFramework(".NETStandard,Version=v2.1", FrameworkDisplayName = ".NET Standard 2.1")]
[assembly: AssemblyCompany("com.github.LIghtJUNction.TerrainScanner")]
[assembly: AssemblyConfiguration("Release")]
[assembly: AssemblyFileVersion("1.1.2.0")]
[assembly: AssemblyInformationalVersion("1.1.2+c6553f68133a4ee32f6ad976c337cf6ff0bfddb0")]
[assembly: AssemblyProduct("com.github.LIghtJUNction.TerrainScanner")]
[assembly: AssemblyTitle("TerrainScanner")]
[assembly: SecurityPermission(SecurityAction.RequestMinimum, SkipVerification = true)]
[assembly: AssemblyVersion("1.1.2.0")]
[module: UnverifiableCode]
[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;
		}
	}
}
namespace BepInEx
{
	[AttributeUsage(AttributeTargets.Class, Inherited = false, AllowMultiple = false)]
	[Conditional("CodeGeneration")]
	internal sealed class BepInAutoPluginAttribute : Attribute
	{
		public BepInAutoPluginAttribute(string? id = null, string? name = null, string? version = null)
		{
		}
	}
}
namespace BepInEx.Preloader.Core.Patching
{
	[AttributeUsage(AttributeTargets.Class, Inherited = false, AllowMultiple = false)]
	[Conditional("CodeGeneration")]
	internal sealed class PatcherAutoPluginAttribute : Attribute
	{
		public PatcherAutoPluginAttribute(string? id = null, string? name = null, string? version = null)
		{
		}
	}
}
namespace TerrainScanner
{
	public class ScanConfig
	{
		public RenderPassEvent renderEvent = (RenderPassEvent)450;

		public Material scanMaterial;

		public Color scanColorHead = new Color(0.054901965f, 29f / 51f, 0.85098046f, 1f);

		public Color scanColor = new Color(0.38823533f, 0.7372549f, 0.8705883f, 1f);

		public float outlineWidth = 2.48f;

		public float scanLineWidth = 1f;

		public float scanLineInterval = 1f;

		public float headScanLineWidth = 1f;

		public float scanLineBrightness = 2.5f;

		public float scanRange = 5f;

		public float outlineBrightness = 1.32f;

		public float headScanLineDistance = 13.2f;

		public Vector3 scanCenterWS = new Vector3(123.05f, 36.3f, 147.86f);

		public float outlineStarDistance = 30f;

		public Material markMaterial;

		public GameObject markParticle3;

		public GameObject markParticle2;

		public GameObject markParticle1;

		public float steepSpawnProb = 0.1f;

		public float midSpawnProb = 0.3f;

		public float flatSpawnProb = 0.0002f;

		public float sampling_maxDistanceShort = 12f;

		public float sampling_maxDistanceLong = 60f;

		public float sampling_centerShapeExponent = 0.75f;

		public float sampling_centerColumnThreshold = 0.25f;

		public float sampling_forwardOffset = 1f;

		public float sampling_jitterScale = 0.06f;

		public float sampling_rowStepMultiplier = 0.9f;

		public float sampling_originHeightOffset = 10f;

		public int horizontalCount = 40;

		public int verticalCount = 50;

		public float gridStep = 0.5f;

		public KeyCode activeKey = (KeyCode)113;

		public ConfigEntry<string> cfgScanColorHead;

		public ConfigEntry<string> cfgScanColor;

		public ConfigEntry<float> cfgOutlineWidth;

		public ConfigEntry<float> cfgScanLineWidth;

		public ConfigEntry<float> cfgScanLineInterval;

		public ConfigEntry<float> cfgHeadScanLineWidth;

		public ConfigEntry<float> cfgScanLineBrightness;

		public ConfigEntry<float> cfgScanRange;

		public ConfigEntry<float> cfgOutlineBrightness;

		public ConfigEntry<float> cfgHeadScanLineDistance;

		public ConfigEntry<string> cfgScanCenterWS;

		public ConfigEntry<float> cfgOutlineStarDistance;

		public ConfigEntry<float> cfgSteepSpawnProb;

		public ConfigEntry<float> cfgMidSpawnProb;

		public ConfigEntry<float> cfgFlatSpawnProb;

		public ConfigEntry<int> cfgHorizontalCount;

		public ConfigEntry<int> cfgVerticalCount;

		public ConfigEntry<float> cfgGridStep;

		public ConfigEntry<KeyCode> cfgActiveKey;

		private bool _bound;

		public void Bind(BaseUnityPlugin plugin, Action<ScanConfig> onChanged = null)
		{
			//IL_0042: Unknown result type (might be due to invalid IL or missing references)
			if ((Object)(object)plugin == (Object)null || _bound)
			{
				return;
			}
			_bound = true;
			ConfigFile config = plugin.Config;
			cfgActiveKey = config.Bind<KeyCode>("Controls", "ActiveScanKey", activeKey, "Key to trigger an active scan");
			cfgScanColorHead = config.Bind<string>("Style", "ScanColorHead", scanColorHead.r + "," + scanColorHead.g + "," + scanColorHead.b + "," + scanColorHead.a, "Scan head color as r,g,b,a");
			cfgScanColor = config.Bind<string>("Style", "ScanColor", scanColor.r + "," + scanColor.g + "," + scanColor.b + "," + scanColor.a, "Scan body color as r,g,b,a");
			cfgOutlineWidth = config.Bind<float>("Style", "OutlineWidth", outlineWidth, "Outline width");
			cfgScanLineWidth = config.Bind<float>("Style", "ScanLineWidth", scanLineWidth, "Scan line width");
			cfgScanLineInterval = config.Bind<float>("Style", "ScanLineInterval", scanLineInterval, "Scan line interval");
			cfgHeadScanLineWidth = config.Bind<float>("Style", "HeadScanLineWidth", headScanLineWidth, "Head scan line width");
			cfgScanLineBrightness = config.Bind<float>("Style", "ScanLineBrightness", scanLineBrightness, "Scan line brightness");
			cfgScanRange = config.Bind<float>("Style", "ScanRange", scanRange, "Scan range");
			cfgOutlineBrightness = config.Bind<float>("Style", "OutlineBrightness", outlineBrightness, "Outline brightness");
			cfgHeadScanLineDistance = config.Bind<float>("Style", "HeadScanLineDistance", headScanLineDistance, "Head scan line distance");
			cfgScanCenterWS = config.Bind<string>("Style", "ScanCenterWS", scanCenterWS.x + "," + scanCenterWS.y + "," + scanCenterWS.z, "Scan center world-space as x,y,z");
			cfgOutlineStarDistance = config.Bind<float>("Style", "OutlineStarDistance", outlineStarDistance, "Outline star distance");
			cfgSteepSpawnProb = config.Bind<float>("prob", "SteepSpawnProb", steepSpawnProb, "Probability to spawn particle on steep slopes (category 3)");
			cfgMidSpawnProb = config.Bind<float>("prob", "MidSpawnProb", midSpawnProb, "Probability to spawn particle on mid slopes (category 2)");
			cfgFlatSpawnProb = config.Bind<float>("prob", "FlatSpawnProb", flatSpawnProb, "Probability to spawn particle on flat slopes (category 1)");
			cfgHorizontalCount = config.Bind<int>("Performance", "HorizontalCount", horizontalCount, "Number of horizontal samples");
			cfgVerticalCount = config.Bind<int>("Performance", "VerticalCount", verticalCount, "Number of vertical samples");
			cfgGridStep = config.Bind<float>("Performance", "GridStep", gridStep, "Grid step size");
			UpdateFromConfig();
			try
			{
				cfgScanColorHead.SettingChanged += delegate
				{
					UpdateFromConfig();
				};
				cfgScanColor.SettingChanged += delegate
				{
					UpdateFromConfig();
				};
				cfgOutlineWidth.SettingChanged += delegate
				{
					UpdateFromConfig();
				};
				cfgScanLineWidth.SettingChanged += delegate
				{
					UpdateFromConfig();
				};
				cfgScanLineInterval.SettingChanged += delegate
				{
					UpdateFromConfig();
				};
				cfgHeadScanLineWidth.SettingChanged += delegate
				{
					UpdateFromConfig();
				};
				cfgScanLineBrightness.SettingChanged += delegate
				{
					UpdateFromConfig();
				};
				cfgScanRange.SettingChanged += delegate
				{
					UpdateFromConfig();
				};
				cfgOutlineBrightness.SettingChanged += delegate
				{
					UpdateFromConfig();
				};
				cfgHeadScanLineDistance.SettingChanged += delegate
				{
					UpdateFromConfig();
				};
				cfgScanCenterWS.SettingChanged += delegate
				{
					UpdateFromConfig();
				};
				cfgOutlineStarDistance.SettingChanged += delegate
				{
					UpdateFromConfig();
				};
				cfgSteepSpawnProb.SettingChanged += delegate
				{
					UpdateFromConfig();
				};
				cfgMidSpawnProb.SettingChanged += delegate
				{
					UpdateFromConfig();
				};
				cfgFlatSpawnProb.SettingChanged += delegate
				{
					UpdateFromConfig();
				};
			}
			catch
			{
			}
			static Color ParseColor(string s)
			{
				//IL_005a: Unknown result type (might be due to invalid IL or missing references)
				//IL_005f: Unknown result type (might be due to invalid IL or missing references)
				//IL_0010: Unknown result type (might be due to invalid IL or missing references)
				//IL_0015: 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_0050: 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)
				try
				{
					string[] array2 = s.Split(',');
					if (array2.Length < 3)
					{
						return Color.blue;
					}
					float num4 = float.Parse(array2[0]);
					float num5 = float.Parse(array2[1]);
					float num6 = float.Parse(array2[2]);
					float num7 = ((array2.Length >= 4) ? float.Parse(array2[3]) : 1f);
					return new Color(num4, num5, num6, num7);
				}
				catch
				{
					return Color.blue;
				}
			}
			static Vector3 ParseVec3(string s)
			{
				//IL_0041: 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_0037: 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_0010: Unknown result type (might be due to invalid IL or missing references)
				//IL_0015: Unknown result type (might be due to invalid IL or missing references)
				//IL_004a: Unknown result type (might be due to invalid IL or missing references)
				try
				{
					string[] array = s.Split(',');
					if (array.Length < 3)
					{
						return Vector3.zero;
					}
					float num = float.Parse(array[0]);
					float num2 = float.Parse(array[1]);
					float num3 = float.Parse(array[2]);
					return new Vector3(num, num2, num3);
				}
				catch
				{
					return Vector3.zero;
				}
			}
			void UpdateFromConfig()
			{
				//IL_0016: 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_0036: Unknown result type (might be due to invalid IL or missing references)
				//IL_003b: Unknown result type (might be due to invalid IL or missing references)
				//IL_012e: Unknown result type (might be due to invalid IL or missing references)
				//IL_0133: Unknown result type (might be due to invalid IL or missing references)
				try
				{
					scanColorHead = ParseColor(cfgScanColorHead.Value);
					scanColor = ParseColor(cfgScanColor.Value);
					outlineWidth = cfgOutlineWidth.Value;
					scanLineWidth = cfgScanLineWidth.Value;
					scanLineInterval = cfgScanLineInterval.Value;
					headScanLineWidth = cfgHeadScanLineWidth.Value;
					scanLineBrightness = cfgScanLineBrightness.Value;
					scanRange = cfgScanRange.Value;
					outlineBrightness = cfgOutlineBrightness.Value;
					headScanLineDistance = cfgHeadScanLineDistance.Value;
					scanCenterWS = ParseVec3(cfgScanCenterWS.Value);
					outlineStarDistance = cfgOutlineStarDistance.Value;
					steepSpawnProb = cfgSteepSpawnProb.Value;
					midSpawnProb = cfgMidSpawnProb.Value;
					flatSpawnProb = cfgFlatSpawnProb.Value;
				}
				catch
				{
				}
				try
				{
					onChanged?.Invoke(this);
				}
				catch
				{
				}
			}
		}

		public void CopyFrom(ScanConfig other)
		{
			//IL_0006: Unknown result type (might be due to invalid IL or missing references)
			//IL_000b: Unknown result type (might be due to invalid IL or missing references)
			//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_007e: Unknown result type (might be due to invalid IL or missing references)
			//IL_0083: Unknown result type (might be due to invalid IL or missing references)
			if (other != null)
			{
				scanColorHead = other.scanColorHead;
				scanColor = other.scanColor;
				outlineWidth = other.outlineWidth;
				scanLineWidth = other.scanLineWidth;
				scanLineInterval = other.scanLineInterval;
				headScanLineWidth = other.headScanLineWidth;
				scanLineBrightness = other.scanLineBrightness;
				scanRange = other.scanRange;
				outlineBrightness = other.outlineBrightness;
				headScanLineDistance = other.headScanLineDistance;
				scanCenterWS = other.scanCenterWS;
				outlineStarDistance = other.outlineStarDistance;
				steepSpawnProb = other.steepSpawnProb;
				midSpawnProb = other.midSpawnProb;
				flatSpawnProb = other.flatSpawnProb;
			}
		}
	}
	public static class ScanConfigManager
	{
		private static ScanConfig _current;

		private static readonly List<ScanFeature> _registered = new List<ScanFeature>();

		public static ScanConfig Current => _current;

		private static event Action<ScanConfig> _onChanged;

		public static void Initialize(BaseUnityPlugin plugin)
		{
			if ((Object)(object)plugin == (Object)null || _current != null)
			{
				return;
			}
			_current = new ScanConfig();
			try
			{
				_current.Bind(plugin, delegate
				{
					try
					{
						ScanConfigManager._onChanged?.Invoke(_current);
					}
					catch
					{
					}
				});
			}
			catch
			{
			}
			try
			{
				ScanConfigManager._onChanged?.Invoke(_current);
			}
			catch
			{
			}
		}

		public static void RegisterFeature(ScanFeature feature)
		{
			if ((Object)(object)feature == (Object)null || _current == null)
			{
				return;
			}
			if (!_registered.Contains(feature))
			{
				_registered.Add(feature);
			}
			try
			{
				feature.config.CopyFrom(_current);
			}
			catch
			{
			}
			try
			{
				if ((Object)(object)_current.scanMaterial != (Object)null)
				{
					feature.config.scanMaterial = _current.scanMaterial;
				}
				if ((Object)(object)_current.markMaterial != (Object)null)
				{
					try
					{
						_current.markMaterial.enableInstancing = true;
					}
					catch
					{
					}
					feature.config.markMaterial = _current.markMaterial;
				}
				feature.config.markParticle1 = _current.markParticle1;
				feature.config.markParticle2 = _current.markParticle2;
				feature.config.markParticle3 = _current.markParticle3;
			}
			catch
			{
			}
			_onChanged -= feature_OnConfigChanged;
			_onChanged += feature_OnConfigChanged;
		}

		public static void UnregisterFeature(ScanFeature feature)
		{
			if (!((Object)(object)feature == (Object)null))
			{
				_registered.Remove(feature);
				_onChanged -= feature_OnConfigChanged;
			}
		}

		private static void feature_OnConfigChanged(ScanConfig cfg)
		{
			for (int i = 0; i < _registered.Count; i++)
			{
				ScanFeature scanFeature = _registered[i];
				if (!((Object)(object)scanFeature == (Object)null))
				{
					try
					{
						scanFeature.config.CopyFrom(cfg);
					}
					catch
					{
					}
				}
			}
		}
	}
	[BepInDependency(/*Could not decode attribute arguments.*/)]
	[BepInPlugin("com.github.LIghtJUNction.TerrainScanner", "TerrainScanner", "1.1.2")]
	public class TerrainScannerPlugin : BaseUnityPlugin
	{
		public static TerrainScannerPlugin Instance;

		internal static ManualLogSource Logger;

		private ScanFeature activeScanFeature;

		private bool assetsLoaded;

		private bool scanFeatureInitialized;

		public const string Id = "com.github.LIghtJUNction.TerrainScanner";

		public static string Name => "TerrainScanner";

		public static string Version => "1.1.2";

		private void Awake()
		{
			//IL_0046: 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)
			Instance = this;
			Logger = ((BaseUnityPlugin)this).Logger;
			try
			{
				ScanConfigManager.Initialize((BaseUnityPlugin)(object)this);
				Logger.LogInfo((object)"[INFO] ScanConfigManager initialized.");
			}
			catch (Exception ex)
			{
				Logger.LogWarning((object)("[WARN] ScanConfigManager.Initialize failed: " + ex.Message));
			}
			try
			{
				PlayerLoopSystem currentPlayerLoop = PlayerLoop.GetCurrentPlayerLoop();
				PlayerLoopHelper.Initialize(ref currentPlayerLoop, (InjectPlayerLoopTimings)65535);
				Logger.LogInfo((object)"[INFO] UniTask PlayerLoop initialized successfully.");
			}
			catch (Exception ex2)
			{
				Logger.LogWarning((object)("[WARN] UniTask PlayerLoop initialization failed: " + ex2.Message));
			}
			LoadPeakBundle();
			SceneManager.sceneLoaded += OnSceneLoaded;
		}

		public void LoadPeakBundle()
		{
			BundleLoader.LoadBundleWithName((BaseUnityPlugin)(object)this, "TerrainScanner.peakbundle", (Action<PeakBundle>)delegate(PeakBundle peakBundle)
			{
				Material val = peakBundle.LoadAsset<Material>("Assets/Material/Scan.mat");
				Material val2 = peakBundle.LoadAsset<Material>("Assets/Shader/TerrianMarks.mat");
				GameObject val3 = peakBundle.LoadAsset<GameObject>("Assets/Particles/LightParticle1.prefab");
				GameObject val4 = peakBundle.LoadAsset<GameObject>("Assets/Particles/LightParticle2.prefab");
				GameObject val5 = peakBundle.LoadAsset<GameObject>("Assets/Particles/LightParticle3.prefab");
				if ((Object)(object)val == (Object)null)
				{
					Logger.LogError((object)"[ERROR] Scan material failed to load from AssetBundle.");
				}
				else if ((Object)(object)val2 == (Object)null)
				{
					Logger.LogError((object)"[ERROR] TerrianMarks.mat failed to load from AssetBundle.");
				}
				else if ((Object)(object)val3 == (Object)null || (Object)(object)val4 == (Object)null || (Object)(object)val5 == (Object)null)
				{
					Logger.LogError((object)"[ERROR] One or more mark particles failed to load from AssetBundle.");
				}
				else
				{
					Logger.LogInfo((object)"[INFO] All assets loaded successfully from AssetBundle.");
					try
					{
						if (ScanConfigManager.Current != null)
						{
							ScanConfigManager.Current.scanMaterial = val;
							ScanConfigManager.Current.markMaterial = val2;
							ScanConfigManager.Current.markParticle1 = val3;
							ScanConfigManager.Current.markParticle2 = val4;
							ScanConfigManager.Current.markParticle3 = val5;
						}
					}
					catch (Exception ex)
					{
						Logger.LogWarning((object)("[WARN] Failed to assign loaded assets to ScanConfigManager.Current: " + ex.Message));
					}
					assetsLoaded = true;
					try
					{
						if ((Object)(object)val != (Object)null)
						{
							ManualLogSource logger = Logger;
							Shader shader = val.shader;
							logger.LogInfo((object)("[DIAG] scanMaterial shader=" + (((shader != null) ? ((Object)shader).name : null) ?? "null")));
							Logger.LogInfo((object)string.Format("[DIAG] scanMaterial has scanRange? {0}", val.HasProperty("scanRange")));
							Logger.LogInfo((object)string.Format("[DIAG] scanMaterial has scanLineBrightness? {0}", val.HasProperty("scanLineBrightness")));
							Logger.LogInfo((object)$"[DIAG] scanMaterial renderQueue={val.renderQueue} instancing={val.enableInstancing}");
						}
						if ((Object)(object)val2 != (Object)null)
						{
							ManualLogSource logger2 = Logger;
							Shader shader2 = val2.shader;
							logger2.LogInfo((object)("[DIAG] markMaterial shader=" + (((shader2 != null) ? ((Object)shader2).name : null) ?? "null")));
							Logger.LogInfo((object)$"[DIAG] markMaterial instancing={val2.enableInstancing} renderQueue={val2.renderQueue}");
						}
					}
					catch (Exception ex2)
					{
						Logger.LogWarning((object)("[WARN] Material diagnostics failed: " + ex2.Message));
					}
					if ((Object)(object)Camera.main != (Object)null)
					{
						InitializeScanFeature();
					}
				}
			});
		}

		public void OnSceneLoaded(Scene scene, LoadSceneMode mode)
		{
			Camera main = Camera.main;
			if ((Object)(object)main != (Object)null)
			{
				if ((Object)(object)((Component)main).gameObject.GetComponent<ActiveScan>() == (Object)null)
				{
					((Component)main).gameObject.AddComponent<ActiveScan>();
					Logger.LogInfo((object)"[INFO] ActiveScan component added to main camera");
				}
				if (assetsLoaded && !scanFeatureInitialized)
				{
					InitializeScanFeature();
				}
			}
			else
			{
				Logger.LogWarning((object)"[WARN] Main camera not found in scene");
			}
		}

		private void InitializeScanFeature()
		{
			//IL_0035: Unknown result type (might be due to invalid IL or missing references)
			//IL_003b: Expected O, but got Unknown
			if (!assetsLoaded)
			{
				Logger.LogWarning((object)"[WARN] Assets not loaded yet. Waiting for AssetBundle to finish loading...");
				return;
			}
			if (scanFeatureInitialized)
			{
				Logger.LogInfo((object)"[DEBUG] ScanFeature already initialized. Skipping...");
				return;
			}
			UniversalRenderPipelineAsset val = (UniversalRenderPipelineAsset)GraphicsSettings.currentRenderPipeline;
			if ((Object)(object)val == (Object)null)
			{
				Logger.LogError((object)"[ERROR] UniversalRenderPipelineAsset is null!");
				return;
			}
			FieldInfo field = typeof(UniversalRenderPipelineAsset).GetField("m_RendererDataList", BindingFlags.Instance | BindingFlags.NonPublic);
			if (field == null)
			{
				Logger.LogError((object)"[ERROR] Unable to access m_RendererDataList via reflection.");
				return;
			}
			if (!(field.GetValue(val) is ScriptableRendererData[] array) || array.Length == 0)
			{
				Logger.LogError((object)"[ERROR] RendererData array is null or empty.");
				return;
			}
			ScriptableRendererData obj = array[0];
			UniversalRendererData val2 = (UniversalRendererData)(object)((obj is UniversalRendererData) ? obj : null);
			if ((Object)(object)val2 == (Object)null)
			{
				Logger.LogError((object)"[ERROR] First renderer is not UniversalRendererData.");
				return;
			}
			foreach (ScriptableRendererFeature rendererFeature in ((ScriptableRendererData)val2).rendererFeatures)
			{
				if (rendererFeature is ScanFeature feature)
				{
					Logger.LogInfo((object)"[DEBUG] ScanFeature already exists. Configuring...");
					activeScanFeature = feature;
					try
					{
						ScanConfigManager.RegisterFeature(feature);
					}
					catch (Exception ex)
					{
						Logger.LogWarning((object)("[WARN] RegisterFeature failed: " + ex.Message));
					}
					scanFeatureInitialized = true;
					return;
				}
			}
			ScanFeature scanFeature = ScriptableObject.CreateInstance<ScanFeature>();
			((Object)scanFeature).name = "TerrainScanner_ScanFeature";
			((ScriptableRendererData)val2).rendererFeatures.Add((ScriptableRendererFeature)(object)scanFeature);
			Logger.LogInfo((object)"[SUCCESS] ScanFeature created and added to renderer!");
			activeScanFeature = scanFeature;
			try
			{
				ScanConfigManager.RegisterFeature(scanFeature);
			}
			catch (Exception ex2)
			{
				Logger.LogWarning((object)("[WARN] RegisterFeature failed: " + ex2.Message));
			}
			scanFeatureInitialized = true;
			Logger.LogInfo((object)"[SUCCESS] ScanFeature initialized!");
		}
	}
}
namespace TerrainScanner.DS
{
	public class ActiveScan : MonoBehaviour
	{
		public static KeyCode activeKey;

		private void Start()
		{
		}

		private void Update()
		{
			//IL_0000: Unknown result type (might be due to invalid IL or missing references)
			if (Input.GetKeyDown(activeKey))
			{
				ScanFeature.ExecuteScan(((Component)this).transform);
				TerrainScannerPlugin.Logger.LogInfo((object)"TerrainScanner : scan executed");
			}
		}

		static ActiveScan()
		{
			//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)
			ConfigEntry<KeyCode> cfgActiveKey = ScanConfigManager.Current.cfgActiveKey;
			activeKey = (KeyCode)((cfgActiveKey == null) ? 113 : ((int)cfgActiveKey.Value));
		}
	}
	public static class ParticleSpawner
	{
		public static void ShootParticle(Vector3 position, Vector3 normal, int index, ScanConfig config)
		{
			//IL_0052: 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)
			//IL_0074: Unknown result type (might be due to invalid IL or missing references)
			try
			{
				if (config == null)
				{
					return;
				}
				GameObject val = (GameObject)(index switch
				{
					3 => config.markParticle3, 
					2 => config.markParticle2, 
					_ => config.markParticle1, 
				});
				if ((Object)(object)val == (Object)null)
				{
					return;
				}
				GameObject val2 = Object.Instantiate<GameObject>(val);
				if (!((Object)(object)val2 == (Object)null))
				{
					val2.transform.position = position;
					float num = Random.Range(0.5f, 1.5f);
					val2.transform.localScale = Vector3.one * num;
					ParticleSystem componentInChildren = val2.GetComponentInChildren<ParticleSystem>();
					if (componentInChildren != null)
					{
						componentInChildren.Play();
					}
				}
			}
			catch (Exception arg)
			{
				ManualLogSource logger = TerrainScannerPlugin.Logger;
				if (logger != null)
				{
					logger.LogWarning((object)$"[ParticleSpawner] ShootParticle failed: {arg}");
				}
			}
		}
	}
	public class ScanFeature : ScriptableRendererFeature
	{
		private class CustomRenderPass : ScriptableRenderPass
		{
			private class PassData
			{
				public Material scanMaterial;

				public Material markMaterial;

				public bool localShowMark;

				public Marks[] marks;

				public ComputeBuffer computeBuffer;

				public GraphicsBuffer graphicsBuffer;

				public IndirectDrawIndexedArgs[] commandData;

				public Mesh mesh;

				public int localHorizontalCount;

				public int localVerticalCount;

				public TextureHandle depthTarget;
			}

			private GraphicsBuffer _graphicsBuffer;

			private IndirectDrawIndexedArgs[] _commandData;

			private ComputeBuffer _computeBuffer;

			private Mesh mesh;

			private ScanConfig settings;

			private string _passName;

			public CustomRenderPass(ScanConfig settings)
			{
				ScanMarkRenderer.CreateResources(settings, settings.horizontalCount, settings.verticalCount, out mesh, out _computeBuffer, out _graphicsBuffer, out _commandData);
				this.settings = settings;
				_passName = "ScanEffect";
				try
				{
					if ((Object)(object)this.settings?.markMaterial != (Object)null)
					{
						this.settings.markMaterial.enableInstancing = true;
					}
				}
				catch
				{
				}
			}

			public void DisposeResources()
			{
				try
				{
					if (_computeBuffer != null)
					{
						_computeBuffer.Dispose();
						_computeBuffer = null;
					}
				}
				catch
				{
				}
				try
				{
					if (_graphicsBuffer != null)
					{
						_graphicsBuffer.Dispose();
						_graphicsBuffer = null;
					}
				}
				catch
				{
				}
				try
				{
					if ((Object)(object)mesh != (Object)null)
					{
						Object.Destroy((Object)(object)mesh);
						mesh = null;
					}
				}
				catch
				{
				}
			}

			public override void RecordRenderGraph(RenderGraph renderGraph, ContextContainer frameData)
			{
				//IL_0008: Unknown result type (might be due to invalid IL or missing references)
				//IL_000d: Unknown result type (might be due to invalid IL or missing references)
				//IL_000f: Unknown result type (might be due to invalid IL or missing references)
				//IL_0014: Unknown result type (might be due to invalid IL or missing references)
				//IL_00c4: Unknown result type (might be due to invalid IL or missing references)
				//IL_00c5: Unknown result type (might be due to invalid IL or missing references)
				//IL_00cb: Unknown result type (might be due to invalid IL or missing references)
				UniversalResourceData val = frameData.Get<UniversalResourceData>();
				TextureHandle activeColorTexture = val.activeColorTexture;
				TextureHandle activeDepthTexture = val.activeDepthTexture;
				PassData passData = default(PassData);
				IRasterRenderGraphBuilder val2 = renderGraph.AddRasterRenderPass<PassData>(_passName, ref passData, "./src/TerrainScanner/DS/ScanFeature.cs", 160);
				try
				{
					passData.scanMaterial = settings.scanMaterial;
					passData.markMaterial = settings.markMaterial;
					passData.localShowMark = showMark;
					passData.marks = _marksForRender;
					passData.computeBuffer = _computeBuffer;
					passData.graphicsBuffer = _graphicsBuffer;
					passData.commandData = _commandData;
					passData.mesh = mesh;
					passData.localHorizontalCount = settings.horizontalCount;
					passData.localVerticalCount = settings.verticalCount;
					passData.depthTarget = activeDepthTexture;
					val2.SetRenderAttachment(activeColorTexture, 0, (AccessFlags)3);
					((IBaseRenderGraphBuilder)val2).UseTexture(ref activeDepthTexture, (AccessFlags)1);
					val2.SetRenderFunc<PassData>((BaseRenderFunc<PassData, RasterGraphContext>)delegate(PassData data, RasterGraphContext ctx)
					{
						//IL_0001: Unknown result type (might be due to invalid IL or missing references)
						ExecutePass(data, ctx);
					});
				}
				finally
				{
					((IDisposable)val2)?.Dispose();
				}
			}

			private static void ExecutePass(PassData data, RasterGraphContext context)
			{
				//IL_000f: 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_0022: 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)
				//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_0044: Unknown result type (might be due to invalid IL or missing references)
				//IL_0049: 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_0058: Unknown result type (might be due to invalid IL or missing references)
				//IL_0083: Unknown result type (might be due to invalid IL or missing references)
				//IL_0084: Unknown result type (might be due to invalid IL or missing references)
				if ((Object)(object)data.scanMaterial == (Object)null)
				{
					return;
				}
				RasterCommandBuffer cmd = context.cmd;
				RTHandle val = TextureHandle.op_Implicit(data.depthTarget);
				Vector2 val2 = Vector2.one;
				try
				{
					if (val != null && val.useScaling)
					{
						val2 = new Vector2(val.rtHandleProperties.rtHandleScale.x, val.rtHandleProperties.rtHandleScale.y);
					}
				}
				catch (Exception ex)
				{
					ManualLogSource logger = TerrainScannerPlugin.Logger;
					if (logger != null)
					{
						logger.LogWarning((object)("[ScanFeature] depth handle read failed: " + ex.Message));
					}
				}
				if (val != null)
				{
					try
					{
						Blitter.BlitTexture(cmd, val, Vector4.op_Implicit(val2), data.scanMaterial, 0);
					}
					catch (Exception arg)
					{
						TerrainScannerPlugin.Logger.LogError((object)$"[ScanFeature] ExecutePass: BlitTexture failed: {arg}");
					}
				}
				if (!data.localShowMark || !((Object)(object)data.markMaterial != (Object)null))
				{
					return;
				}
				try
				{
					Marks[] marksForRender = _marksForRender;
					ScanMarkRenderer.RenderMarks(cmd, data.markMaterial, data.computeBuffer, data.graphicsBuffer, data.commandData, data.mesh, marksForRender, data.localShowMark);
				}
				catch (Exception arg2)
				{
					ManualLogSource logger2 = TerrainScannerPlugin.Logger;
					if (logger2 != null)
					{
						logger2.LogWarning((object)$"[ScanFeature] RenderMarks failed: {arg2}");
					}
				}
			}
		}

		[Serializable]
		[CompilerGenerated]
		private sealed class <>c
		{
			public static readonly <>c <>9 = new <>c();

			public static TweenCallback <>9__5_0;

			public static TweenCallback <>9__5_1;

			internal void <StartScan>b__5_0()
			{
				canScan = true;
			}

			internal void <StartScan>b__5_1()
			{
				showMark = false;
			}
		}

		[StructLayout(LayoutKind.Auto)]
		[CompilerGenerated]
		private struct <StartScan>d__5 : IAsyncStateMachine
		{
			public int <>1__state;

			public AsyncUniTaskVoidMethodBuilder <>t__builder;

			public Transform player;

			private Awaiter<Marks[]> <>u__1;

			private void MoveNext()
			{
				//IL_041e: Unknown result type (might be due to invalid IL or missing references)
				//IL_0423: Unknown result type (might be due to invalid IL or missing references)
				//IL_042b: Unknown result type (might be due to invalid IL or missing references)
				//IL_03e0: Unknown result type (might be due to invalid IL or missing references)
				//IL_03e5: Unknown result type (might be due to invalid IL or missing references)
				//IL_03e9: Unknown result type (might be due to invalid IL or missing references)
				//IL_03ee: Unknown result type (might be due to invalid IL or missing references)
				//IL_0403: Unknown result type (might be due to invalid IL or missing references)
				//IL_0405: Unknown result type (might be due to invalid IL or missing references)
				//IL_00f0: Unknown result type (might be due to invalid IL or missing references)
				//IL_00fb: Unknown result type (might be due to invalid IL or missing references)
				//IL_0105: Unknown result type (might be due to invalid IL or missing references)
				//IL_010a: Unknown result type (might be due to invalid IL or missing references)
				//IL_010f: Unknown result type (might be due to invalid IL or missing references)
				//IL_0142: Unknown result type (might be due to invalid IL or missing references)
				//IL_0143: Unknown result type (might be due to invalid IL or missing references)
				//IL_01aa: Unknown result type (might be due to invalid IL or missing references)
				//IL_01b4: Expected O, but got Unknown
				//IL_019a: Unknown result type (might be due to invalid IL or missing references)
				//IL_019f: Unknown result type (might be due to invalid IL or missing references)
				//IL_01a5: Expected O, but got Unknown
				//IL_0384: Unknown result type (might be due to invalid IL or missing references)
				//IL_038e: Expected O, but got Unknown
				//IL_0374: Unknown result type (might be due to invalid IL or missing references)
				//IL_0379: Unknown result type (might be due to invalid IL or missing references)
				//IL_037f: Expected O, but got Unknown
				int num = <>1__state;
				try
				{
					if (num == 0)
					{
						goto IL_039e;
					}
					int scanId = default(int);
					if (!Application.isPlaying)
					{
						ManualLogSource logger = TerrainScannerPlugin.Logger;
						if (logger != null)
						{
							logger.LogWarning((object)"[WARN] Cannot scan: not playing");
						}
					}
					else if (!canScan)
					{
						ManualLogSource logger2 = TerrainScannerPlugin.Logger;
						if (logger2 != null)
						{
							logger2.LogInfo((object)"[INFO] Scan already in progress");
						}
					}
					else if ((Object)(object)_instance == (Object)null)
					{
						ManualLogSource logger3 = TerrainScannerPlugin.Logger;
						if (logger3 != null)
						{
							logger3.LogError((object)"[ERROR] ScanFeature instance is null. Ensure it is properly initialized.");
						}
					}
					else if (_instance.config == null)
					{
						ManualLogSource logger4 = TerrainScannerPlugin.Logger;
						if (logger4 != null)
						{
							logger4.LogError((object)"[ERROR] ScanFeature config is null.");
						}
					}
					else
					{
						if (!((Object)(object)_instance.config.scanMaterial == (Object)null))
						{
							canScan = false;
							showMark = true;
							Tween markTween = ScanFeature.markTween;
							if (markTween != null)
							{
								TweenExtensions.Kill(markTween, false);
							}
							Vector3 val = player.position - player.forward * 2f;
							Material scanMaterial = _instance.config.scanMaterial;
							Material markMaterial = _instance.config.markMaterial;
							if ((Object)(object)scanMaterial != (Object)null)
							{
								scanMaterial.SetVector(ScanCenterWs, Vector4.op_Implicit(val));
								scanMaterial.SetFloat(HeadScanLineDistance, 4f);
								TweenerCore<float, float, FloatOptions> val2 = TweenSettingsExtensions.SetEase<TweenerCore<float, float, FloatOptions>>(ShortcutExtensions.DOFloat(scanMaterial, 250f, HeadScanLineDistance, 3.5f), (Ease)2);
								if (val2 != null)
								{
									TweenCallback onComplete = ((Tween)val2).onComplete;
									object obj = <>c.<>9__5_0;
									if (obj == null)
									{
										TweenCallback val3 = delegate
										{
											canScan = true;
										};
										<>c.<>9__5_0 = val3;
										obj = (object)val3;
									}
									((Tween)val2).onComplete = (TweenCallback)Delegate.Combine((Delegate?)(object)onComplete, (Delegate?)obj);
								}
								scanMaterial.SetFloat(ScanRange, 1f);
								TweenSettingsExtensions.SetDelay<TweenerCore<float, float, FloatOptions>>(TweenSettingsExtensions.SetEase<TweenerCore<float, float, FloatOptions>>(ShortcutExtensions.DOFloat(scanMaterial, 5f, ScanRange, 1.5f), (Ease)2), 1f);
								scanMaterial.SetFloat(ScanLineBrightness, 0.3f);
								scanMaterial.SetFloat(HeadScanLineBrightness, 0f);
								TweenSettingsExtensions.SetDelay<TweenerCore<float, float, FloatOptions>>(ShortcutExtensions.DOFloat(scanMaterial, 1f, ScanLineBrightness, 0.2f), 0.25f);
								TweenSettingsExtensions.SetDelay<TweenerCore<float, float, FloatOptions>>(ShortcutExtensions.DOFloat(scanMaterial, 1f, HeadScanLineBrightness, 0.1f), 0.25f);
								TweenSettingsExtensions.SetEase<TweenerCore<float, float, FloatOptions>>(TweenSettingsExtensions.SetDelay<TweenerCore<float, float, FloatOptions>>(ShortcutExtensions.DOFloat(scanMaterial, 0f, ScanLineBrightness, 0.5f), 2.25f), (Ease)1);
								TweenSettingsExtensions.SetEase<TweenerCore<float, float, FloatOptions>>(TweenSettingsExtensions.SetDelay<TweenerCore<float, float, FloatOptions>>(ShortcutExtensions.DOFloat(scanMaterial, 0f, HeadScanLineBrightness, 0.5f), 2.25f), (Ease)1);
								scanMaterial.SetFloat(OutlineBrightness, 1f);
								scanMaterial.SetFloat(OutlineStarDistance, 0f);
								TweenSettingsExtensions.SetEase<TweenerCore<float, float, FloatOptions>>(TweenSettingsExtensions.SetDelay<TweenerCore<float, float, FloatOptions>>(ShortcutExtensions.DOFloat(scanMaterial, 0f, OutlineBrightness, 0.5f), 2.25f), (Ease)1);
								TweenSettingsExtensions.SetEase<TweenerCore<float, float, FloatOptions>>(ShortcutExtensions.DOFloat(scanMaterial, 30f, OutlineStarDistance, 1f), (Ease)8);
							}
							if ((Object)(object)markMaterial != (Object)null)
							{
								markMaterial.SetFloat(ColorAlpha, 0f);
								ShortcutExtensions.DOFloat(markMaterial, 1f, ColorAlpha, 1f);
								ScanFeature.markTween = (Tween)(object)TweenSettingsExtensions.SetDelay<TweenerCore<float, float, FloatOptions>>(ShortcutExtensions.DOFloat(markMaterial, 0f, ColorAlpha, 1f), 7f);
								if (ScanFeature.markTween != null)
								{
									Tween markTween2 = ScanFeature.markTween;
									TweenCallback onComplete2 = markTween2.onComplete;
									object obj2 = <>c.<>9__5_1;
									if (obj2 == null)
									{
										TweenCallback val4 = delegate
										{
											showMark = false;
										};
										<>c.<>9__5_1 = val4;
										obj2 = (object)val4;
									}
									markTween2.onComplete = (TweenCallback)Delegate.Combine((Delegate?)(object)onComplete2, (Delegate?)obj2);
								}
							}
							scanId = ++s_scanCounter;
							goto IL_039e;
						}
						ManualLogSource logger5 = TerrainScannerPlugin.Logger;
						if (logger5 != null)
						{
							logger5.LogError((object)"[ERROR] ScanFeature scanMaterial is null. Assets may not be loaded yet.");
						}
					}
					goto end_IL_0007;
					IL_039e:
					try
					{
						Awaiter<Marks[]> awaiter;
						if (num != 0)
						{
							awaiter = ScanMarkRenderer.GenerateTerrainMarks(player, _instance.config, _instance.config.horizontalCount, _instance.config.verticalCount, _instance.config.gridStep, scanId).GetAwaiter();
							if (!awaiter.IsCompleted)
							{
								num = (<>1__state = 0);
								<>u__1 = awaiter;
								((AsyncUniTaskVoidMethodBuilder)(ref <>t__builder)).AwaitUnsafeOnCompleted<Awaiter<Marks[]>, <StartScan>d__5>(ref awaiter, ref this);
								return;
							}
						}
						else
						{
							awaiter = <>u__1;
							<>u__1 = default(Awaiter<Marks[]>);
							num = (<>1__state = -1);
						}
						Marks[] result = awaiter.GetResult();
						Marks[] marksForRender = result;
						object marksLock = _marksLock;
						bool lockTaken = false;
						try
						{
							Monitor.Enter(marksLock, ref lockTaken);
							_marksForRender = marksForRender;
						}
						finally
						{
							if (num < 0 && lockTaken)
							{
								Monitor.Exit(marksLock);
							}
						}
					}
					catch (Exception arg)
					{
						ManualLogSource logger6 = TerrainScannerPlugin.Logger;
						if (logger6 != null)
						{
							logger6.LogWarning((object)$"[ScanFeature] GenerateTerrainMarks failed: {arg}");
						}
						object marksLock2 = _marksLock;
						bool lockTaken2 = false;
						try
						{
							Monitor.Enter(marksLock2, ref lockTaken2);
							_marksForRender = null;
						}
						finally
						{
							if (num < 0 && lockTaken2)
							{
								Monitor.Exit(marksLock2);
							}
						}
					}
					end_IL_0007:;
				}
				catch (Exception exception)
				{
					<>1__state = -2;
					((AsyncUniTaskVoidMethodBuilder)(ref <>t__builder)).SetException(exception);
					return;
				}
				<>1__state = -2;
				((AsyncUniTaskVoidMethodBuilder)(ref <>t__builder)).SetResult();
			}

			void IAsyncStateMachine.MoveNext()
			{
				//ILSpy generated this explicit interface implementation from .override directive in MoveNext
				this.MoveNext();
			}

			[DebuggerHidden]
			private void SetStateMachine(IAsyncStateMachine stateMachine)
			{
				((AsyncUniTaskVoidMethodBuilder)(ref <>t__builder)).SetStateMachine(stateMachine);
			}

			void IAsyncStateMachine.SetStateMachine(IAsyncStateMachine stateMachine)
			{
				//ILSpy generated this explicit interface implementation from .override directive in SetStateMachine
				this.SetStateMachine(stateMachine);
			}
		}

		public ScanConfig config = new ScanConfig();

		private static ScanFeature _instance;

		private CustomRenderPass _myPass;

		private static int s_scanCounter = 0;

		private static Marks[] _marksForRender;

		private static readonly object _marksLock = new object();

		private static readonly int ScanColorHead = Shader.PropertyToID("scanColorHead");

		private static readonly int ScanColor = Shader.PropertyToID("scanColor");

		private static readonly int OutlineWidth = Shader.PropertyToID("outlineWidth");

		private static readonly int OutlineBrightness = Shader.PropertyToID("outlineBrightness");

		private static readonly int OutlineStarDistance = Shader.PropertyToID("outlineStarDistance");

		private static readonly int ScanLineWidth = Shader.PropertyToID("scanLineWidth");

		private static readonly int ScanLineInterval = Shader.PropertyToID("scanLineInterval");

		private static readonly int ScanLineBrightness = Shader.PropertyToID("scanLineBrightness");

		private static readonly int ScanRange = Shader.PropertyToID("scanRange");

		private static readonly int HeadScanLineDistance = Shader.PropertyToID("headScanLineDistance");

		private static readonly int HeadScanLineWidth = Shader.PropertyToID("headScanLineWidth");

		private static readonly int HeadScanLineBrightness = Shader.PropertyToID("headScanLineBrightness");

		private static readonly int ScanCenterWs = Shader.PropertyToID("scanCenterWS");

		private static readonly int ColorAlpha = Shader.PropertyToID("colorAlpha");

		private static bool canScan = true;

		private static bool showMark = false;

		private static Tween markTween;

		public static void ExecuteScan(Transform player)
		{
			//IL_0001: Unknown result type (might be due to invalid IL or missing references)
			//IL_0006: Unknown result type (might be due to invalid IL or missing references)
			UniTaskVoid val = StartScan(player);
			((UniTaskVoid)(ref val)).Forget();
		}

		[AsyncStateMachine(typeof(<StartScan>d__5))]
		private static UniTaskVoid StartScan(Transform player)
		{
			//IL_0002: Unknown result type (might be due to invalid IL or missing references)
			//IL_0007: 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)
			<StartScan>d__5 <StartScan>d__ = default(<StartScan>d__5);
			<StartScan>d__.<>t__builder = AsyncUniTaskVoidMethodBuilder.Create();
			<StartScan>d__.player = player;
			<StartScan>d__.<>1__state = -1;
			((AsyncUniTaskVoidMethodBuilder)(ref <StartScan>d__.<>t__builder)).Start<<StartScan>d__5>(ref <StartScan>d__);
			return ((AsyncUniTaskVoidMethodBuilder)(ref <StartScan>d__.<>t__builder)).Task;
		}

		public override void Create()
		{
			ManualLogSource logger = TerrainScannerPlugin.Logger;
			if (logger != null)
			{
				logger.LogInfo((object)"[ScanFeature] Create() called");
			}
			if ((Object)(object)config.scanMaterial == (Object)null)
			{
				ManualLogSource logger2 = TerrainScannerPlugin.Logger;
				if (logger2 != null)
				{
					logger2.LogError((object)"[ScanFeature] scanMaterial is not assigned!");
				}
				return;
			}
			if ((Object)(object)config.markMaterial == (Object)null)
			{
				ManualLogSource logger3 = TerrainScannerPlugin.Logger;
				if (logger3 != null)
				{
					logger3.LogError((object)"[ScanFeature] markMaterial is not assigned!");
				}
				return;
			}
			if ((Object)(object)config.markParticle1 == (Object)null || (Object)(object)config.markParticle2 == (Object)null || (Object)(object)config.markParticle3 == (Object)null)
			{
				ManualLogSource logger4 = TerrainScannerPlugin.Logger;
				if (logger4 != null)
				{
					logger4.LogError((object)"[ScanFeature] One or more mark particles are not assigned!");
				}
				return;
			}
			if (!Application.isPlaying)
			{
				ManualLogSource logger5 = TerrainScannerPlugin.Logger;
				if (logger5 != null)
				{
					logger5.LogWarning((object)"[ScanFeature] Not in play mode, skipping Create()");
				}
				return;
			}
			_myPass = new CustomRenderPass(config);
			_instance = this;
			ManualLogSource logger6 = TerrainScannerPlugin.Logger;
			if (logger6 != null)
			{
				logger6.LogInfo((object)"[ScanFeature] Create() completed successfully, _instance set");
			}
		}

		private void OnDisable()
		{
			try
			{
				if (_myPass != null)
				{
					try
					{
						_myPass.DisposeResources();
					}
					catch (Exception arg)
					{
						ManualLogSource logger = TerrainScannerPlugin.Logger;
						if (logger != null)
						{
							logger.LogWarning((object)$"[ScanFeature] DisposeResources failed: {arg}");
						}
					}
					_myPass = null;
				}
			}
			catch (Exception arg2)
			{
				ManualLogSource logger2 = TerrainScannerPlugin.Logger;
				if (logger2 != null)
				{
					logger2.LogWarning((object)$"[ScanFeature] OnDisable cleanup failed: {arg2}");
				}
			}
			try
			{
				ScanConfigManager.UnregisterFeature(this);
			}
			catch (Exception arg3)
			{
				ManualLogSource logger3 = TerrainScannerPlugin.Logger;
				if (logger3 != null)
				{
					logger3.LogWarning((object)$"[ScanFeature] UnregisterFeature failed: {arg3}");
				}
			}
			_instance = null;
		}

		public override void SetupRenderPasses(ScriptableRenderer renderer, in RenderingData renderingData)
		{
			//IL_001d: Unknown result type (might be due to invalid IL or missing references)
			//IL_0022: Unknown result type (might be due to invalid IL or missing references)
			//IL_003a: Unknown result type (might be due to invalid IL or missing references)
			if (!((Object)(object)config.scanMaterial == (Object)null) && Application.isPlaying)
			{
				CameraData cameraData = renderingData.cameraData;
				if ((int)((CameraData)(ref cameraData)).cameraType == 1)
				{
					((ScriptableRenderPass)_myPass).renderPassEvent = config.renderEvent;
					((ScriptableRenderPass)_myPass).ConfigureInput((ScriptableRenderPassInput)4);
					((ScriptableRenderPass)_myPass).ConfigureInput((ScriptableRenderPassInput)2);
					((ScriptableRenderPass)_myPass).ConfigureInput((ScriptableRenderPassInput)1);
				}
			}
		}

		public override void AddRenderPasses(ScriptableRenderer renderer, ref RenderingData renderingData)
		{
			if (!((Object)(object)config.scanMaterial == (Object)null) && Application.isPlaying)
			{
				renderer.EnqueuePass((ScriptableRenderPass)(object)_myPass);
			}
		}
	}
	public struct Marks
	{
		public Vector3 markPosition;

		public ScanRaySampling.RayMarkCategory markCategory;
	}
	public static class ScanMarkRenderer
	{
		[CompilerGenerated]
		private sealed class <>c__DisplayClass0_0
		{
			public int horizCount;

			public Marks[] marks;

			public float steepProb;

			public ScanConfig config;

			public float midProb;

			public float flatProb;

			internal void <GenerateTerrainMarks>b__0(RaycastHit hit, int i, int j)
			{
				//IL_0055: Unknown result type (might be due to invalid IL or missing references)
				//IL_005a: Unknown result type (might be due to invalid IL or missing references)
				//IL_0048: Unknown result type (might be due to invalid IL or missing references)
				//IL_004d: Unknown result type (might be due to invalid IL or missing references)
				//IL_0092: Unknown result type (might be due to invalid IL or missing references)
				//IL_0087: Unknown result type (might be due to invalid IL or missing references)
				//IL_008c: Unknown result type (might be due to invalid IL or missing references)
				//IL_00f3: Unknown result type (might be due to invalid IL or missing references)
				//IL_00c4: Unknown result type (might be due to invalid IL or missing references)
				//IL_00c9: Unknown result type (might be due to invalid IL or missing references)
				//IL_0171: Unknown result type (might be due to invalid IL or missing references)
				//IL_0176: Unknown result type (might be due to invalid IL or missing references)
				//IL_0125: Unknown result type (might be due to invalid IL or missing references)
				//IL_012a: Unknown result type (might be due to invalid IL or missing references)
				//IL_00e0: Unknown result type (might be due to invalid IL or missing references)
				//IL_00e5: Unknown result type (might be due to invalid IL or missing references)
				//IL_018a: Unknown result type (might be due to invalid IL or missing references)
				//IL_018f: Unknown result type (might be due to invalid IL or missing references)
				//IL_013e: Unknown result type (might be due to invalid IL or missing references)
				//IL_0143: Unknown result type (might be due to invalid IL or missing references)
				int num = i * horizCount + j;
				if (num < 0 || num >= marks.Length)
				{
					return;
				}
				if ((Object)(object)((RaycastHit)(ref hit)).collider == (Object)null)
				{
					marks[num].markCategory = ScanRaySampling.RayMarkCategory.Undefined;
					marks[num].markPosition = Vector3.zero;
					return;
				}
				Vector3 normal = ((RaycastHit)(ref hit)).normal;
				if (((RaycastHit)(ref hit)).collider.isTrigger)
				{
					marks[num].markCategory = ScanRaySampling.RayMarkCategory.Road;
					marks[num].markPosition = Vector3.zero;
				}
				else if (normal.y < Mathf.Cos(0.87266463f))
				{
					marks[num].markCategory = ScanRaySampling.RayMarkCategory.Steep;
					marks[num].markPosition = ((RaycastHit)(ref hit)).point;
					if (Random.value < steepProb)
					{
						ParticleSpawner.ShootParticle(((RaycastHit)(ref hit)).point, normal, 3, config);
					}
				}
				else if (normal.y < Mathf.Cos(MathF.PI / 6f))
				{
					marks[num].markCategory = ScanRaySampling.RayMarkCategory.MidSlope;
					marks[num].markPosition = ((RaycastHit)(ref hit)).point;
					if (Random.value < midProb)
					{
						ParticleSpawner.ShootParticle(((RaycastHit)(ref hit)).point, normal, 1, config);
					}
				}
				else
				{
					marks[num].markCategory = ScanRaySampling.RayMarkCategory.Flat;
					marks[num].markPosition = ((RaycastHit)(ref hit)).point;
					if (Random.value < flatProb)
					{
						ParticleSpawner.ShootParticle(((RaycastHit)(ref hit)).point, normal, 1, config);
					}
				}
			}
		}

		[StructLayout(LayoutKind.Auto)]
		[CompilerGenerated]
		private struct <GenerateTerrainMarks>d__0 : IAsyncStateMachine
		{
			public int <>1__state;

			public AsyncUniTaskMethodBuilder<Marks[]> <>t__builder;

			public int horizCount;

			public ScanConfig config;

			public int vertCount;

			public Transform player;

			public float gridStep;

			public int scanId;

			private <>c__DisplayClass0_0 <>8__1;

			private Awaiter <>u__1;

			private void MoveNext()
			{
				//IL_01ea: Unknown result type (might be due to invalid IL or missing references)
				//IL_01ef: Unknown result type (might be due to invalid IL or missing references)
				//IL_01f7: 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_0241: Unknown result type (might be due to invalid IL or missing references)
				//IL_0246: Unknown result type (might be due to invalid IL or missing references)
				//IL_02b8: Unknown result type (might be due to invalid IL or missing references)
				//IL_02bd: Unknown result type (might be due to invalid IL or missing references)
				//IL_01ac: Unknown result type (might be due to invalid IL or missing references)
				//IL_01b1: Unknown result type (might be due to invalid IL or missing references)
				//IL_01b5: Unknown result type (might be due to invalid IL or missing references)
				//IL_01ba: Unknown result type (might be due to invalid IL or missing references)
				//IL_01cf: Unknown result type (might be due to invalid IL or missing references)
				//IL_01d1: Unknown result type (might be due to invalid IL or missing references)
				int num = <>1__state;
				Marks[] result;
				try
				{
					Awaiter awaiter;
					if (num != 0)
					{
						<>8__1 = new <>c__DisplayClass0_0();
						<>8__1.horizCount = horizCount;
						<>8__1.config = config;
						int num2 = Math.Max(1, <>8__1.horizCount * vertCount);
						<>8__1.marks = new Marks[num2];
						for (int k = 0; k < <>8__1.marks.Length; k++)
						{
							<>8__1.marks[k].markCategory = ScanRaySampling.RayMarkCategory.Undefined;
							<>8__1.marks[k].markPosition = Vector3.zero;
						}
						int maxRays = Math.Max(1, <>8__1.horizCount * vertCount * 2);
						int num3 = LayerMask.GetMask(new string[2] { "Scan", "Road" });
						if (num3 == 0)
						{
							num3 = -5;
						}
						<>8__1.steepProb = <>8__1.config?.steepSpawnProb ?? 0.1f;
						<>8__1.midProb = <>8__1.config?.midSpawnProb ?? 0.3f;
						<>8__1.flatProb = <>8__1.config?.flatSpawnProb ?? 0.0002f;
						Action<RaycastHit, int, int> onHit = delegate(RaycastHit hit, int i, int j)
						{
							//IL_0055: Unknown result type (might be due to invalid IL or missing references)
							//IL_005a: Unknown result type (might be due to invalid IL or missing references)
							//IL_0048: Unknown result type (might be due to invalid IL or missing references)
							//IL_004d: Unknown result type (might be due to invalid IL or missing references)
							//IL_0092: Unknown result type (might be due to invalid IL or missing references)
							//IL_0087: Unknown result type (might be due to invalid IL or missing references)
							//IL_008c: Unknown result type (might be due to invalid IL or missing references)
							//IL_00f3: Unknown result type (might be due to invalid IL or missing references)
							//IL_00c4: Unknown result type (might be due to invalid IL or missing references)
							//IL_00c9: Unknown result type (might be due to invalid IL or missing references)
							//IL_0171: Unknown result type (might be due to invalid IL or missing references)
							//IL_0176: Unknown result type (might be due to invalid IL or missing references)
							//IL_0125: Unknown result type (might be due to invalid IL or missing references)
							//IL_012a: Unknown result type (might be due to invalid IL or missing references)
							//IL_00e0: Unknown result type (might be due to invalid IL or missing references)
							//IL_00e5: Unknown result type (might be due to invalid IL or missing references)
							//IL_018a: Unknown result type (might be due to invalid IL or missing references)
							//IL_018f: Unknown result type (might be due to invalid IL or missing references)
							//IL_013e: Unknown result type (might be due to invalid IL or missing references)
							//IL_0143: Unknown result type (might be due to invalid IL or missing references)
							int num6 = i * <>8__1.horizCount + j;
							if (num6 >= 0 && num6 < <>8__1.marks.Length)
							{
								if ((Object)(object)((RaycastHit)(ref hit)).collider == (Object)null)
								{
									<>8__1.marks[num6].markCategory = ScanRaySampling.RayMarkCategory.Undefined;
									<>8__1.marks[num6].markPosition = Vector3.zero;
								}
								else
								{
									Vector3 normal = ((RaycastHit)(ref hit)).normal;
									if (((RaycastHit)(ref hit)).collider.isTrigger)
									{
										<>8__1.marks[num6].markCategory = ScanRaySampling.RayMarkCategory.Road;
										<>8__1.marks[num6].markPosition = Vector3.zero;
									}
									else if (normal.y < Mathf.Cos(0.87266463f))
									{
										<>8__1.marks[num6].markCategory = ScanRaySampling.RayMarkCategory.Steep;
										<>8__1.marks[num6].markPosition = ((RaycastHit)(ref hit)).point;
										if (Random.value < <>8__1.steepProb)
										{
											ParticleSpawner.ShootParticle(((RaycastHit)(ref hit)).point, normal, 3, <>8__1.config);
										}
									}
									else if (normal.y < Mathf.Cos(MathF.PI / 6f))
									{
										<>8__1.marks[num6].markCategory = ScanRaySampling.RayMarkCategory.MidSlope;
										<>8__1.marks[num6].markPosition = ((RaycastHit)(ref hit)).point;
										if (Random.value < <>8__1.midProb)
										{
											ParticleSpawner.ShootParticle(((RaycastHit)(ref hit)).point, normal, 1, <>8__1.config);
										}
									}
									else
									{
										<>8__1.marks[num6].markCategory = ScanRaySampling.RayMarkCategory.Flat;
										<>8__1.marks[num6].markPosition = ((RaycastHit)(ref hit)).point;
										if (Random.value < <>8__1.flatProb)
										{
											ParticleSpawner.ShootParticle(((RaycastHit)(ref hit)).point, normal, 1, <>8__1.config);
										}
									}
								}
							}
						};
						UniTask val = ScanRaySampling.PerformGridSamples(player, <>8__1.config, <>8__1.horizCount, vertCount, gridStep, num3, maxRays, onHit, scanId);
						awaiter = ((UniTask)(ref val)).GetAwaiter();
						if (!((Awaiter)(ref awaiter)).IsCompleted)
						{
							num = (<>1__state = 0);
							<>u__1 = awaiter;
							<>t__builder.AwaitUnsafeOnCompleted<Awaiter, <GenerateTerrainMarks>d__0>(ref awaiter, ref this);
							return;
						}
					}
					else
					{
						awaiter = <>u__1;
						<>u__1 = default(Awaiter);
						num = (<>1__state = -1);
					}
					((Awaiter)(ref awaiter)).GetResult();
					int num4 = 0;
					for (int l = 0; l < <>8__1.marks.Length; l++)
					{
						if (<>8__1.marks[l].markCategory != ScanRaySampling.RayMarkCategory.Undefined || <>8__1.marks[l].markPosition != Vector3.zero)
						{
							num4++;
						}
					}
					if (num4 <= 0)
					{
						result = null;
					}
					else
					{
						Marks[] array = new Marks[num4];
						int num5 = 0;
						for (int m = 0; m < <>8__1.marks.Length; m++)
						{
							if (<>8__1.marks[m].markCategory != ScanRaySampling.RayMarkCategory.Undefined || <>8__1.marks[m].markPosition != Vector3.zero)
							{
								array[num5++] = <>8__1.marks[m];
							}
						}
						result = array;
					}
				}
				catch (Exception exception)
				{
					<>1__state = -2;
					<>8__1 = null;
					<>t__builder.SetException(exception);
					return;
				}
				<>1__state = -2;
				<>8__1 = null;
				<>t__builder.SetResult(result);
			}

			void IAsyncStateMachine.MoveNext()
			{
				//ILSpy generated this explicit interface implementation from .override directive in MoveNext
				this.MoveNext();
			}

			[DebuggerHidden]
			private void SetStateMachine(IAsyncStateMachine stateMachine)
			{
				<>t__builder.SetStateMachine(stateMachine);
			}

			void IAsyncStateMachine.SetStateMachine(IAsyncStateMachine stateMachine)
			{
				//ILSpy generated this explicit interface implementation from .override directive in SetStateMachine
				this.SetStateMachine(stateMachine);
			}
		}

		[StructLayout(LayoutKind.Auto)]
		[CompilerGenerated]
		private struct <GenerateTerrainMarksPlus>d__1 : IAsyncStateMachine
		{
			public int <>1__state;

			public AsyncUniTaskMethodBuilder<Marks[]> <>t__builder;

			private Awaiter <>u__1;

			private void MoveNext()
			{
				//IL_0050: 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_005c: 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_001c: 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)
				//IL_0025: 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_003a: Unknown result type (might be due to invalid IL or missing references)
				int num = <>1__state;
				Marks[] result;
				try
				{
					Awaiter awaiter;
					if (num != 0)
					{
						UniTask val = UniTask.Delay(1, false, (PlayerLoopTiming)8, default(CancellationToken), false);
						awaiter = ((UniTask)(ref val)).GetAwaiter();
						if (!((Awaiter)(ref awaiter)).IsCompleted)
						{
							num = (<>1__state = 0);
							<>u__1 = awaiter;
							<>t__builder.AwaitUnsafeOnCompleted<Awaiter, <GenerateTerrainMarksPlus>d__1>(ref awaiter, ref this);
							return;
						}
					}
					else
					{
						awaiter = <>u__1;
						<>u__1 = default(Awaiter);
						num = (<>1__state = -1);
					}
					((Awaiter)(ref awaiter)).GetResult();
					result = new Marks[0];
				}
				catch (Exception exception)
				{
					<>1__state = -2;
					<>t__builder.SetException(exception);
					return;
				}
				<>1__state = -2;
				<>t__builder.SetResult(result);
			}

			void IAsyncStateMachine.MoveNext()
			{
				//ILSpy generated this explicit interface implementation from .override directive in MoveNext
				this.MoveNext();
			}

			[DebuggerHidden]
			private void SetStateMachine(IAsyncStateMachine stateMachine)
			{
				<>t__builder.SetStateMachine(stateMachine);
			}

			void IAsyncStateMachine.SetStateMachine(IAsyncStateMachine stateMachine)
			{
				//ILSpy generated this explicit interface implementation from .override directive in SetStateMachine
				this.SetStateMachine(stateMachine);
			}
		}

		[AsyncStateMachine(typeof(<GenerateTerrainMarks>d__0))]
		public static UniTask<Marks[]> GenerateTerrainMarks(Transform player, ScanConfig config, int horizCount, int vertCount, float gridStep, int scanId)
		{
			//IL_0002: Unknown result type (might be due to invalid IL or missing references)
			//IL_0007: Unknown result type (might be due to invalid IL or missing references)
			//IL_005b: Unknown result type (might be due to invalid IL or missing references)
			<GenerateTerrainMarks>d__0 <GenerateTerrainMarks>d__ = default(<GenerateTerrainMarks>d__0);
			<GenerateTerrainMarks>d__.<>t__builder = AsyncUniTaskMethodBuilder<Marks[]>.Create();
			<GenerateTerrainMarks>d__.player = player;
			<GenerateTerrainMarks>d__.config = config;
			<GenerateTerrainMarks>d__.horizCount = horizCount;
			<GenerateTerrainMarks>d__.vertCount = vertCount;
			<GenerateTerrainMarks>d__.gridStep = gridStep;
			<GenerateTerrainMarks>d__.scanId = scanId;
			<GenerateTerrainMarks>d__.<>1__state = -1;
			<GenerateTerrainMarks>d__.<>t__builder.Start<<GenerateTerrainMarks>d__0>(ref <GenerateTerrainMarks>d__);
			return <GenerateTerrainMarks>d__.<>t__builder.Task;
		}

		[AsyncStateMachine(typeof(<GenerateTerrainMarksPlus>d__1))]
		public static UniTask<Marks[]> GenerateTerrainMarksPlus(Transform player, ScanConfig config, int horizCount, int vertCount, float gridStep, int scanId)
		{
			//IL_0002: Unknown result type (might be due to invalid IL or missing references)
			//IL_0007: 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)
			<GenerateTerrainMarksPlus>d__1 <GenerateTerrainMarksPlus>d__ = default(<GenerateTerrainMarksPlus>d__1);
			<GenerateTerrainMarksPlus>d__.<>t__builder = AsyncUniTaskMethodBuilder<Marks[]>.Create();
			<GenerateTerrainMarksPlus>d__.<>1__state = -1;
			<GenerateTerrainMarksPlus>d__.<>t__builder.Start<<GenerateTerrainMarksPlus>d__1>(ref <GenerateTerrainMarksPlus>d__);
			return <GenerateTerrainMarksPlus>d__.<>t__builder.Task;
		}

		public static void CreateResources(ScanConfig settings, int horizontalCount, int verticalCount, out Mesh mesh, out ComputeBuffer computeBuffer, out GraphicsBuffer graphicsBuffer, out IndirectDrawIndexedArgs[] commandData)
		{
			//IL_000a: Unknown result type (might be due to invalid IL or missing references)
			//IL_0010: Expected O, but got Unknown
			//IL_0026: Unknown result type (might be due to invalid IL or missing references)
			//IL_002c: Expected O, but got Unknown
			//IL_002d: Unknown result type (might be due to invalid IL or missing references)
			//IL_0033: Expected O, but got Unknown
			//IL_004a: Unknown result type (might be due to invalid IL or missing references)
			//IL_004f: Unknown result type (might be due to invalid IL or missing references)
			//IL_0065: Unknown result type (might be due to invalid IL or missing references)
			//IL_006a: Unknown result type (might be due to invalid IL or missing references)
			//IL_0080: Unknown result type (might be due to invalid IL or missing references)
			//IL_0085: Unknown result type (might be due to invalid IL or missing references)
			//IL_009b: Unknown result type (might be due to invalid IL or missing references)
			//IL_00a0: Unknown result type (might be due to invalid IL or missing references)
			//IL_00b8: Unknown result type (might be due to invalid IL or missing references)
			//IL_00bd: Unknown result type (might be due to invalid IL or missing references)
			//IL_00ce: Unknown result type (might be due to invalid IL or missing references)
			//IL_00d3: Unknown result type (might be due to invalid IL or missing references)
			//IL_00e4: Unknown result type (might be due to invalid IL or missing references)
			//IL_00e9: Unknown result type (might be due to invalid IL or missing references)
			//IL_00fa: Unknown result type (might be due to invalid IL or missing references)
			//IL_00ff: Unknown result type (might be due to invalid IL or missing references)
			//IL_0131: Unknown result type (might be due to invalid IL or missing references)
			//IL_0136: Unknown result type (might be due to invalid IL or missing references)
			//IL_0140: Unknown result type (might be due to invalid IL or missing references)
			//IL_0145: Unknown result type (might be due to invalid IL or missing references)
			graphicsBuffer = new GraphicsBuffer((Target)256, 1, 20);
			commandData = (IndirectDrawIndexedArgs[])(object)new IndirectDrawIndexedArgs[1];
			computeBuffer = new ComputeBuffer(Math.Max(1, horizontalCount * verticalCount), 16);
			mesh = new Mesh();
			Vector3[] vertices = (Vector3[])(object)new Vector3[4]
			{
				new Vector3(-0.5f, 0f, -0.5f),
				new Vector3(0.5f, 0f, -0.5f),
				new Vector3(0.5f, 0f, 0.5f),
				new Vector3(-0.5f, 0f, 0.5f)
			};
			Vector2[] uv = (Vector2[])(object)new Vector2[4]
			{
				new Vector2(0f, 0f),
				new Vector2(1f, 0f),
				new Vector2(1f, 1f),
				new Vector2(0f, 1f)
			};
			int[] array = new int[6] { 0, 1, 2, 0, 2, 3 };
			mesh.vertices = vertices;
			mesh.uv = uv;
			mesh.triangles = array;
			mesh.bounds = new Bounds(Vector3.zero, Vector3.one * 100000f);
			try
			{
				if ((Object)(object)settings?.markMaterial != (Object)null)
				{
					settings.markMaterial.enableInstancing = true;
				}
			}
			catch
			{
			}
			((IndirectDrawIndexedArgs)(ref commandData[0])).indexCountPerInstance = (uint)array.Length;
			((IndirectDrawIndexedArgs)(ref commandData[0])).instanceCount = 0u;
			((IndirectDrawIndexedArgs)(ref commandData[0])).startIndex = 0u;
			((IndirectDrawIndexedArgs)(ref commandData[0])).startInstance = 0u;
			graphicsBuffer.SetData((Array)commandData);
		}

		public static void RenderMarks(RasterCommandBuffer cmd, Material markMaterial, ComputeBuffer computeBuffer, GraphicsBuffer graphicsBuffer, IndirectDrawIndexedArgs[] commandData, Mesh mesh, Marks[] renderMarks, bool showMark)
		{
			//IL_007a: Unknown result type (might be due to invalid IL or missing references)
			//IL_007f: Unknown result type (might be due to invalid IL or missing references)
			//IL_00ca: Unknown result type (might be due to invalid IL or missing references)
			//IL_00cf: Unknown result type (might be due to invalid IL or missing references)
			//IL_0136: Unknown result type (might be due to invalid IL or missing references)
			//IL_013c: Expected O, but got Unknown
			if (!showMark && (renderMarks == null || renderMarks.Length == 0))
			{
				return;
			}
			if ((Object)(object)markMaterial == (Object)null)
			{
				ManualLogSource logger = TerrainScannerPlugin.Logger;
				if (logger != null)
				{
					logger.LogError((object)"[ScanMarkRenderer] markMaterial is null - cannot render marks");
				}
				return;
			}
			if (computeBuffer == null || graphicsBuffer == null || commandData == null || (Object)(object)mesh == (Object)null)
			{
				ManualLogSource logger2 = TerrainScannerPlugin.Logger;
				if (logger2 != null)
				{
					logger2.LogError((object)"[ScanMarkRenderer] missing GPU resource(s) - computeBuffer/graphicsBuffer/commandData/mesh");
				}
				return;
			}
			int num = 0;
			if (renderMarks != null)
			{
				for (int i = 0; i < renderMarks.Length; i++)
				{
					if (renderMarks[i].markCategory != ScanRaySampling.RayMarkCategory.Undefined || renderMarks[i].markPosition != Vector3.zero)
					{
						num++;
					}
				}
			}
			if (num <= 0)
			{
				return;
			}
			Marks[] array = new Marks[num];
			int num2 = 0;
			for (int j = 0; j < ((renderMarks != null) ? renderMarks.Length : 0); j++)
			{
				if (renderMarks[j].markCategory != ScanRaySampling.RayMarkCategory.Undefined || renderMarks[j].markPosition != Vector3.zero)
				{
					array[num2++] = renderMarks[j];
				}
			}
			try
			{
				computeBuffer.SetData((Array)array);
			}
			catch (Exception ex)
			{
				ManualLogSource logger3 = TerrainScannerPlugin.Logger;
				if (logger3 != null)
				{
					logger3.LogError((object)("[ScanMarkRenderer] computeBuffer.SetData failed: " + ex.Message));
				}
				return;
			}
			MaterialPropertyBlock val = new MaterialPropertyBlock();
			val.SetBuffer("markBuffer", computeBuffer);
			((IndirectDrawIndexedArgs)(ref commandData[0])).indexCountPerInstance = 6u;
			((IndirectDrawIndexedArgs)(ref commandData[0])).instanceCount = (uint)num;
			graphicsBuffer.SetData((Array)commandData);
			if (((IndirectDrawIndexedArgs)(ref commandData[0])).instanceCount == 0)
			{
				return;
			}
			try
			{
				if ((Object)(object)markMaterial != (Object)null)
				{
					markMaterial.enableInstancing = true;
				}
			}
			catch (Exception ex2)
			{
				ManualLogSource logger4 = TerrainScannerPlugin.Logger;
				if (logger4 != null)
				{
					logger4.LogError((object)("[ScanMarkRenderer] enableInstancing failed: " + ex2.Message));
				}
			}
			try
			{
				cmd.DrawMeshInstancedIndirect(mesh, 0, markMaterial, 0, graphicsBuffer, 0, val);
			}
			catch (Exception arg)
			{
				ManualLogSource logger5 = TerrainScannerPlugin.Logger;
				if (logger5 != null)
				{
					logger5.LogError((object)$"[ScanMarkRenderer] DrawMeshInstancedIndirect failed: {arg}");
				}
			}
		}
	}
	public static class ScanRaySampling
	{
		public enum RayMarkCategory
		{
			Road,
			Flat,
			MidSlope,
			Steep,
			Undefined
		}

		[StructLayout(LayoutKind.Auto)]
		[CompilerGenerated]
		private struct <PerformGradientAscentSampling>d__2 : IAsyncStateMachine
		{
			public int <>1__state;

			public AsyncUniTaskMethodBuilder <>t__builder;

			private void MoveNext()
			{
				int num = <>1__state;
				try
				{
				}
				catch (Exception exception)
				{
					<>1__state = -2;
					((AsyncUniTaskMethodBuilder)(ref <>t__builder)).SetException(exception);
					return;
				}
				<>1__state = -2;
				((AsyncUniTaskMethodBuilder)(ref <>t__builder)).SetResult();
			}

			void IAsyncStateMachine.MoveNext()
			{
				//ILSpy generated this explicit interface implementation from .override directive in MoveNext
				this.MoveNext();
			}

			[DebuggerHidden]
			private void SetStateMachine(IAsyncStateMachine stateMachine)
			{
				((AsyncUniTaskMethodBuilder)(ref <>t__builder)).SetStateMachine(stateMachine);
			}

			void IAsyncStateMachine.SetStateMachine(IAsyncStateMachine stateMachine)
			{
				//ILSpy generated this explicit interface implementation from .override directive in SetStateMachine
				this.SetStateMachine(stateMachine);
			}
		}

		[StructLayout(LayoutKind.Auto)]
		[CompilerGenerated]
		private struct <PerformGridSamples>d__1 : IAsyncStateMachine
		{
			public int <>1__state;

			public AsyncUniTaskMethodBuilder <>t__builder;

			public Transform player;

			public ScanConfig config;

			public int horizCount;

			public float gridStep;

			public int layerMask;

			public Action<RaycastHit, int, int> onHit;

			public int maxRays;

			public int vertCount;

			private Vector3 <forward>5__2;

			private Vector3 <right>5__3;

			private float <centerShapeExp>5__4;

			private float <jitterScale>5__5;

			private float <rowStepMultiplier>5__6;

			private float <halfWidth>5__7;

			private float <maxDistanceShort>5__8;

			private int <raysDone>5__9;

			private Vector3 <rowBase>5__10;

			private int <i>5__11;

			private Awaiter <>u__1;

			private void MoveNext()
			{
				//IL_0356: Unknown result type (might be due to invalid IL or missing references)
				//IL_035b: Unknown result type (might be due to invalid IL or missing references)
				//IL_0363: 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_0030: 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_0041: 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_006e: Unknown result type (might be due to invalid IL or missing references)
				//IL_0318: Unknown result type (might be due to invalid IL or missing references)
				//IL_031d: Unknown result type (might be due to invalid IL or missing references)
				//IL_0321: Unknown result type (might be due to invalid IL or missing references)
				//IL_0326: Unknown result type (might be due to invalid IL or missing references)
				//IL_01b6: Unknown result type (might be due to invalid IL or missing references)
				//IL_01bc: Unknown result type (might be due to invalid IL or missing references)
				//IL_01c2: Unknown result type (might be due to invalid IL or missing references)
				//IL_01c7: Unknown result type (might be due to invalid IL or missing references)
				//IL_01cc: 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_00a9: Unknown result type (might be due to invalid IL or missing references)
				//IL_00b3: Unknown result type (might be due to invalid IL or missing references)
				//IL_00b9: Unknown result type (might be due to invalid IL or missing references)
				//IL_033b: Unknown result type (might be due to invalid IL or missing references)
				//IL_033d: Unknown result type (might be due to invalid IL or missing references)
				//IL_0258: Unknown result type (might be due to invalid IL or missing references)
				//IL_025b: Unknown result type (might be due to invalid IL or missing references)
				//IL_0265: Unknown result type (might be due to invalid IL or missing references)
				//IL_026a: Unknown result type (might be due to invalid IL or missing references)
				//IL_0270: Unknown result type (might be due to invalid IL or missing references)
				//IL_0277: Unknown result type (might be due to invalid IL or missing references)
				//IL_027c: Unknown result type (might be due to invalid IL or missing references)
				//IL_0281: Unknown result type (might be due to invalid IL or missing references)
				//IL_0283: Unknown result type (might be due to invalid IL or missing references)
				//IL_0285: Unknown result type (might be due to invalid IL or missing references)
				//IL_00d4: Unknown result type (might be due to invalid IL or missing references)
				//IL_00d9: Unknown result type (might be due to invalid IL or missing references)
				//IL_00de: Unknown result type (might be due to invalid IL or missing references)
				//IL_02aa: Unknown result type (might be due to invalid IL or missing references)
				//IL_0171: Unknown result type (might be due to invalid IL or missing references)
				//IL_0173: Unknown result type (might be due to invalid IL or missing references)
				//IL_0184: Unknown result type (might be due to invalid IL or missing references)
				//IL_0189: Unknown result type (might be due to invalid IL or missing references)
				//IL_018e: Unknown result type (might be due to invalid IL or missing references)
				int num = <>1__state;
				try
				{
					if (num == 0 || !((Object)(object)player == (Object)null))
					{
						try
						{
							if (num != 0)
							{
								<forward>5__2 = player.forward;
								<right>5__3 = player.right;
								float y = player.position.y;
								if ((Object)(object)Camera.main != (Object)null)
								{
									y = ((Component)Camera.main).transform.position.y;
								}
								y += config?.sampling_originHeightOffset ?? 0.9f;
								Vector3 val = new Vector3(player.position.x, y, player.position.z) + <forward>5__2 * (config?.sampling_forwardOffset ?? 1f);
								<centerShapeExp>5__4 = config?.sampling_centerShapeExponent ?? 0.75f;
								<jitterScale>5__5 = config?.sampling_jitterScale ?? 0.06f;
								<rowStepMultiplier>5__6 = config?.sampling_rowStepMultiplier ?? 0.9f;
								<halfWidth>5__7 = (float)horizCount * gridStep * 0.5f;
								<maxDistanceShort>5__8 = config?.sampling_maxDistanceShort ?? 12f;
								<raysDone>5__9 = 0;
								<rowBase>5__10 = val - <forward>5__2 * (gridStep * 0.5f);
								<i>5__11 = 0;
								goto IL_038b;
							}
							Awaiter awaiter = <>u__1;
							<>u__1 = default(Awaiter);
							num = (<>1__state = -1);
							goto IL_0372;
							IL_0372:
							((Awaiter)(ref awaiter)).GetResult();
							<i>5__11++;
							goto IL_038b;
							IL_038b:
							if (<i>5__11 < vertCount)
							{
								float num2 = (float)<i>5__11 * gridStep * <rowStepMultiplier>5__6;
								Vector3 val2 = <rowBase>5__10 + <forward>5__2 * num2;
								int num3 = 0;
								RaycastHit arg = default(RaycastHit);
								while (true)
								{
									if (num3 >= horizCount)
									{
										YieldAwaitable val3 = UniTask.Yield();
										awaiter = ((YieldAwaitable)(ref val3)).GetAwaiter();
										if (((Awaiter)(ref awaiter)).IsCompleted)
										{
											break;
										}
										num = (<>1__state = 0);
										<>u__1 = awaiter;
										((AsyncUniTaskMethodBuilder)(ref <>t__builder)).AwaitUnsafeOnCompleted<Awaiter, <PerformGridSamples>d__1>(ref awaiter, ref this);
										return;
									}
									float num4 = ((horizCount == 1) ? 0f : ((float)num3 / (float)(horizCount - 1) - 0.5f));
									float num5 = Mathf.Sign(num4) * Mathf.Pow(Mathf.Abs(num4), <centerShapeExp>5__4);
									float num6 = num5 * <halfWidth>5__7;
									float num7 = Random.Range(0f - <jitterScale>5__5, <jitterScale>5__5) * gridStep;
									float num8 = Random.Range(0f - <jitterScale>5__5, <jitterScale>5__5) * gridStep;
									Vector3 val4 = val2 - <right>5__3 * (num6 + num7) + <forward>5__2 * num8;
									Physics.Raycast(val4, Vector3.down, ref arg, <maxDistanceShort>5__8, layerMask);
									try
									{
										onHit?.Invoke(arg, <i>5__11, num3);
									}
									catch (Exception ex)
									{
										ManualLogSource logger = TerrainScannerPlugin.Logger;
										if (logger != null)
										{
											logger.LogWarning((object)("[ScanRaySampling] onHit callback threw: " + ex.Message));
										}
									}
									<raysDone>5__9++;
									if (<raysDone>5__9 < maxRays)
									{
										num3++;
										continue;
									}
									goto end_IL_001e;
								}
								goto IL_0372;
							}
							end_IL_001e:;
						}
						catch (Exception arg2)
						{
							ManualLogSource logger2 = TerrainScannerPlugin.Logger;
							if (logger2 != null)
							{
								logger2.LogWarning((object)$"[ScanRaySampling] PerformGridSamples failed: {arg2}");
							}
						}
					}
				}
				catch (Exception exception)
				{
					<>1__state = -2;
					((AsyncUniTaskMethodBuilder)(ref <>t__builder)).SetException(exception);
					return;
				}
				<>1__state = -2;
				((AsyncUniTaskMethodBuilder)(ref <>t__builder)).SetResult();
			}

			void IAsyncStateMachine.MoveNext()
			{
				//ILSpy generated this explicit interface implementation from .override directive in MoveNext
				this.MoveNext();
			}

			[DebuggerHidden]
			private void SetStateMachine(IAsyncStateMachine stateMachine)
			{
				((AsyncUniTaskMethodBuilder)(ref <>t__builder)).SetStateMachine(stateMachine);
			}

			void IAsyncStateMachine.SetStateMachine(IAsyncStateMachine stateMachine)
			{
				//ILSpy generated this explicit interface implementation from .override directive in SetStateMachine
				this.SetStateMachine(stateMachine);
			}
		}

		[AsyncStateMachine(typeof(<PerformGridSamples>d__1))]
		public static UniTask PerformGridSamples(Transform player, ScanConfig config, int horizCount, int vertCount, float gridStep, int layerMask, int maxRays, Action<RaycastHit, int, int> onHit, int scanId)
		{
			//IL_0002: Unknown result type (might be due to invalid IL or missing references)
			//IL_0007: Unknown result type (might be due to invalid IL or missing references)
			//IL_006d: Unknown result type (might be due to invalid IL or missing references)
			<PerformGridSamples>d__1 <PerformGridSamples>d__ = default(<PerformGridSamples>d__1);
			<PerformGridSamples>d__.<>t__builder = AsyncUniTaskMethodBuilder.Create();
			<PerformGridSamples>d__.player = player;
			<PerformGridSamples>d__.config = config;
			<PerformGridSamples>d__.horizCount = horizCount;
			<PerformGridSamples>d__.vertCount = vertCount;
			<PerformGridSamples>d__.gridStep = gridStep;
			<PerformGridSamples>d__.layerMask = layerMask;
			<PerformGridSamples>d__.maxRays = maxRays;
			<PerformGridSamples>d__.onHit = onHit;
			<PerformGridSamples>d__.<>1__state = -1;
			((AsyncUniTaskMethodBuilder)(ref <PerformGridSamples>d__.<>t__builder)).Start<<PerformGridSamples>d__1>(ref <PerformGridSamples>d__);
			return ((AsyncUniTaskMethodBuilder)(ref <PerformGridSamples>d__.<>t__builder)).Task;
		}

		[AsyncStateMachine(typeof(<PerformGradientAscentSampling>d__2))]
		public static UniTask PerformGradientAscentSampling(Transform player, ScanConfig config, int horizCount, int vertCount, float gridStep, int layerMask, int maxRays, Action<RaycastHit, int, int> onHit, int scanId)
		{
			//IL_0002: Unknown result type (might be due to invalid IL or missing references)
			//IL_0007: 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)
			<PerformGradientAscentSampling>d__2 <PerformGradientAscentSampling>d__ = default(<PerformGradientAscentSampling>d__2);
			<PerformGradientAscentSampling>d__.<>t__builder = AsyncUniTaskMethodBuilder.Create();
			<PerformGradientAscentSampling>d__.<>1__state = -1;
			((AsyncUniTaskMethodBuilder)(ref <PerformGradientAscentSampling>d__.<>t__builder)).Start<<PerformGradientAscentSampling>d__2>(ref <PerformGradientAscentSampling>d__);
			return ((AsyncUniTaskMethodBuilder)(ref <PerformGradientAscentSampling>d__.<>t__builder)).Task;
		}
	}
}
namespace System.Runtime.CompilerServices
{
	[AttributeUsage(AttributeTargets.Assembly, AllowMultiple = true)]
	internal sealed class IgnoresAccessChecksToAttribute : Attribute
	{
		public IgnoresAccessChecksToAttribute(string assemblyName)
		{
		}
	}
}