Decompiled source of Hadal Laboratories v0.0.4
TolianWaterSystem.dll
Decompiled 2 days ago
The result has been truncated due to the large size, download it to view full contents!
using System; using System.Collections.Generic; using System.Diagnostics; using System.IO; using System.IO.Compression; using System.Linq; using System.Reflection; using System.Runtime.CompilerServices; using System.Runtime.Serialization.Formatters.Binary; using System.Runtime.Versioning; using System.Security; using System.Security.Permissions; using System.Threading; using System.Threading.Tasks; using BepInEx; using Microsoft.CodeAnalysis; using Unity.Collections; using UnityEditor; using UnityEngine; using UnityEngine.Experimental.Rendering; using UnityEngine.Rendering; using UnityEngine.Rendering.HighDefinition; using UnityEngine.Video; [assembly: CompilationRelaxations(8)] [assembly: RuntimeCompatibility(WrapNonExceptionThrows = true)] [assembly: Debuggable(DebuggableAttribute.DebuggingModes.Default | DebuggableAttribute.DebuggingModes.DisableOptimizations | DebuggableAttribute.DebuggingModes.IgnoreSymbolStoreSequencePoints | DebuggableAttribute.DebuggingModes.EnableEditAndContinue)] [assembly: TargetFramework(".NETStandard,Version=v2.1", FrameworkDisplayName = ".NET Standard 2.1")] [assembly: AssemblyCompany("TolianWaterSystem")] [assembly: AssemblyConfiguration("Debug")] [assembly: AssemblyDescription("A template for Lethal Company")] [assembly: AssemblyFileVersion("1.0.0.0")] [assembly: AssemblyInformationalVersion("1.0.0+646ca23083ece7cd6b0810d9c33b0fdcd17eeab1")] [assembly: AssemblyProduct("TolianWaterSystem")] [assembly: AssemblyTitle("TolianWaterSystem")] [assembly: SecurityPermission(SecurityAction.RequestMinimum, SkipVerification = true)] [assembly: AssemblyVersion("1.0.0.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.Module, AllowMultiple = false, Inherited = false)] internal sealed class RefSafetyRulesAttribute : Attribute { public readonly int Version; public RefSafetyRulesAttribute(int P_0) { Version = P_0; } } } public class FFT_CPU : MonoBehaviour { public enum SizeSetting { Size_32 = 0x20, Size_64 = 0x40, Size_128 = 0x80 } public class OutputFFTData { public Color[] OutputPixels; } public bool IsDetailed; public SizeSetting Size = SizeSetting.Size_64; [Range(0f, 1f)] public float WindDirection = 0.3f; [Range(0.2f, 10f)] public float WindSpeed = 5f; [Range(0.25f, 1.5f)] public float Choppines = 0.85f; [Range(1f, 100f)] public float WaterScale = 10f; [Range(0f, 2f)] public float TimeScale = 1f; public Texture2D DisplaceTexture; public RenderTexture NormalTexture; public Material WaterMaterial; private const float DomainSize = 20f; private float prevWindDirection; private float prevWindSpeed; private int prevSize; private FFT_CPU_Spectrum spectrumCpu; private OutputFFTData outputFftData; private FFT_CPU_Simulation fftCpu1; private FFT_CPU_Simulation fftCpu2; private FFT_CPU_Simulation fftCpu3; private Vector2[] butterflyRawData; private Material normalComputeMaterial; private Thread t0; private Thread t1; private Thread t2; private Thread t3; private float currentTime; private bool canUpdate = true; private bool isDoneComputeFFT_1; private bool isDoneComputeFFT_2; private bool isDoneComputeFFT_3; private AutoResetEvent[] startHandle; private void InitializeResources() { //IL_009c: Unknown result type (might be due to invalid IL or missing references) //IL_00a6: Expected O, but got Unknown //IL_00d2: Unknown result type (might be due to invalid IL or missing references) //IL_00dc: Expected O, but got Unknown //IL_0123: Unknown result type (might be due to invalid IL or missing references) //IL_012d: Expected O, but got Unknown isDoneComputeFFT_1 = false; isDoneComputeFFT_2 = false; isDoneComputeFFT_3 = false; canUpdate = true; outputFftData = new OutputFFTData(); fftCpu1 = new FFT_CPU_Simulation((int)Size, outputFftData); fftCpu2 = new FFT_CPU_Simulation((int)Size, outputFftData); fftCpu3 = new FFT_CPU_Simulation((int)Size, outputFftData); prevSize = (int)Size; prevWindDirection = WindDirection; prevWindSpeed = WindSpeed; normalComputeMaterial = new Material(WaterShadersSingleton.Instance.ComputeNormalShader); if ((Object)(object)NormalTexture != (Object)null) { NormalTexture.Release(); } NormalTexture = new RenderTexture((int)Size, (int)Size, 0, (RenderTextureFormat)2, (RenderTextureReadWrite)1); ((Texture)NormalTexture).filterMode = (FilterMode)1; ((Texture)NormalTexture).wrapMode = (TextureWrapMode)0; if ((Object)(object)DisplaceTexture != (Object)null) { Object.DestroyImmediate((Object)(object)DisplaceTexture); } DisplaceTexture = new Texture2D((int)Size, (int)Size, (TextureFormat)17, false, true); InitializeButterfly((int)Size); spectrumCpu = new FFT_CPU_Spectrum((int)Size); spectrumCpu.InitializeSpectrum(20f, WindSpeed, WindDirection, (int)Size); if (startHandle == null) { startHandle = new AutoResetEvent[4]; startHandle[0] = new AutoResetEvent(initialState: true); startHandle[1] = new AutoResetEvent(initialState: false); startHandle[2] = new AutoResetEvent(initialState: false); startHandle[3] = new AutoResetEvent(initialState: false); } } private void InitializeButterfly(int size) { //IL_0088: Unknown result type (might be due to invalid IL or missing references) //IL_008d: Unknown result type (might be due to invalid IL or missing references) //IL_00a6: Unknown result type (might be due to invalid IL or missing references) //IL_00ab: Unknown result type (might be due to invalid IL or missing references) int num = Mathf.RoundToInt(Mathf.Log((float)size, 2f)); butterflyRawData = (Vector2[])(object)new Vector2[size * num]; int num2 = 1; int num3 = size >> 1; for (int i = 0; i < num; i++) { int num4 = i * size; int num5 = 0; int num6 = 2 * num2; for (int j = 0; j < num3; j++) { float num7 = 0f; for (int k = num5; k < num6; k += 2) { float num8 = MathF.PI * 2f * num7 * (float)num3 / (float)size; float num9 = Mathf.Cos(num8); float num10 = Mathf.Sin(num8); butterflyRawData[num4 + k / 2] = new Vector2(num9, 0f - num10); butterflyRawData[num4 + k / 2 + num2] = new Vector2(0f - num9, num10); num7 += 1f; } num5 += 4 * num2; num6 = num5 + 2 * num2; } num3 >>= 1; num2 <<= 1; } } private void StartThreads() { if (startHandle != null) { startHandle[0].Set(); } if (t0 == null) { t0 = new Thread(thread0); t0.Start(); } if (t1 == null) { t1 = new Thread(thread1); t1.Start(); } if (t2 == null) { t2 = new Thread(thread2); t2.Start(); } if (t3 == null) { t3 = new Thread(thread3); t3.Start(); } } private void RestartCompute() { ReleaseAll(); InitializeResources(); StartThreads(); } private void ReleaseAll() { canUpdate = false; if (t0 != null) { t0.Abort(); } t0 = null; if (t1 != null) { t1.Abort(); } t1 = null; if (t2 != null) { t2.Abort(); } t2 = null; if (t3 != null) { t3.Abort(); } t3 = null; if ((Object)(object)DisplaceTexture != (Object)null) { Object.DestroyImmediate((Object)(object)DisplaceTexture); } if ((Object)(object)NormalTexture != (Object)null) { NormalTexture.Release(); } if (IsDetailed) { Shader.DisableKeyword("KW_DETAIL_FFT"); } } private void thread0() { while (canUpdate) { startHandle[0].WaitOne(); isDoneComputeFFT_1 = false; isDoneComputeFFT_2 = false; isDoneComputeFFT_3 = false; spectrumCpu.GetUpdatedSpectrum(currentTime, (int)Size); startHandle[1].Set(); startHandle[2].Set(); startHandle[3].Set(); } } private void thread1() { while (canUpdate) { startHandle[1].WaitOne(); fftCpu1.Compute(spectrumCpu.ResultDisplaceZ, butterflyRawData, 0, (int)Size); isDoneComputeFFT_1 = true; } } private void thread2() { while (canUpdate) { startHandle[2].WaitOne(); fftCpu2.Compute(spectrumCpu.ResultHeight, butterflyRawData, 1, (int)Size); isDoneComputeFFT_2 = true; } } private void thread3() { while (canUpdate) { startHandle[3].WaitOne(); fftCpu3.Compute(spectrumCpu.ResultDisplaceX, butterflyRawData, 2, (int)Size); isDoneComputeFFT_3 = true; } } private void ReadThreadsData() { if (isDoneComputeFFT_1 && isDoneComputeFFT_2 && isDoneComputeFFT_3) { DisplaceTexture.SetPixels(outputFftData.OutputPixels); DisplaceTexture.Apply(); normalComputeMaterial.SetTexture("_DispTex", (Texture)(object)DisplaceTexture); int num = Mathf.RoundToInt(Mathf.Log((float)Size, 2f)) - 4; normalComputeMaterial.SetFloat("_SizeLog", (float)num); normalComputeMaterial.SetFloat("_Choppines", Choppines); normalComputeMaterial.SetFloat("_WindSpeed", WindSpeed); NormalTexture.DiscardContents(); RenderTexture active = RenderTexture.active; if (!Application.isPlaying) { RenderTexture.active = null; } Graphics.Blit((Texture)null, NormalTexture, normalComputeMaterial); if (!Application.isPlaying) { RenderTexture.active = active; } startHandle[0].Set(); } } private void UpdateFFT() { //IL_043e: Unknown result type (might be due to invalid IL or missing references) //IL_043f: 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_0426: Unknown result type (might be due to invalid IL or missing references) //IL_027f: Unknown result type (might be due to invalid IL or missing references) //IL_0280: Unknown result type (might be due to invalid IL or missing references) //IL_0266: Unknown result type (might be due to invalid IL or missing references) //IL_0267: Unknown result type (might be due to invalid IL or missing references) if (prevSize != (int)Size) { prevSize = (int)Size; RestartCompute(); } else if (Mathf.Abs(prevWindDirection - WindDirection) > 0.001f || Mathf.Abs(prevWindSpeed - WindSpeed) > 0.01f) { prevWindDirection = WindDirection; prevWindSpeed = WindSpeed; spectrumCpu.InitializeSpectrum(20f, WindSpeed, WindDirection, (int)Size); } currentTime += Time.deltaTime * Mathf.Lerp(TimeScale, TimeScale * 0.5f, WaterScale / 100f); ReadThreadsData(); Vector3 val = default(Vector3); ((Vector3)(ref val))..ctor(WaterScale * Choppines / 20f, 1f, WaterScale * Choppines / 20f); if (!IsDetailed) { if ((Object)(object)WaterMaterial == (Object)null) { Shader.SetGlobalTexture("KW_DispTex", (Texture)(object)DisplaceTexture); } else { WaterMaterial.SetTexture("KW_DispTex", (Texture)(object)DisplaceTexture); } if ((Object)(object)WaterMaterial == (Object)null) { Shader.SetGlobalTexture("KW_NormTex", (Texture)(object)NormalTexture); } else { WaterMaterial.SetTexture("KW_NormTex", (Texture)(object)NormalTexture); } if ((Object)(object)WaterMaterial == (Object)null) { Shader.SetGlobalFloat("KW_WindSpeed", WindSpeed); } else { WaterMaterial.SetFloat("KW_WindSpeed", WindSpeed); } if ((Object)(object)WaterMaterial == (Object)null) { Shader.SetGlobalFloat("KW_Choppines", Choppines); } else { WaterMaterial.SetFloat("KW_Choppines", Choppines); } if ((Object)(object)WaterMaterial == (Object)null) { Shader.SetGlobalFloat("KW_FFTScale", WaterScale); } else { WaterMaterial.SetFloat("KW_FFTScale", WaterScale); } if ((Object)(object)WaterMaterial == (Object)null) { Shader.SetGlobalVector("KW_DisplaceScale", Vector4.op_Implicit(val)); } else { WaterMaterial.SetVector("KW_DisplaceScale", Vector4.op_Implicit(val)); } int num = Mathf.RoundToInt(Mathf.Log((float)Size, 2f)) - 5; if ((Object)(object)WaterMaterial == (Object)null) { Shader.SetGlobalFloat("KW_NormalLod", (float)num); } else { WaterMaterial.SetFloat("KW_NormalLod", (float)num); } return; } if ((Object)(object)WaterMaterial == (Object)null) { Shader.SetGlobalTexture("KW_DispTexDetail", (Texture)(object)DisplaceTexture); } else { WaterMaterial.SetTexture("KW_DispTexDetail", (Texture)(object)DisplaceTexture); } if ((Object)(object)WaterMaterial == (Object)null) { Shader.SetGlobalTexture("KW_NormTexDetail", (Texture)(object)NormalTexture); } else { WaterMaterial.SetTexture("KW_NormTexDetail", (Texture)(object)NormalTexture); } if ((Object)(object)WaterMaterial == (Object)null) { Shader.SetGlobalFloat("KW_WindSpeedDetail", WindSpeed); } else { WaterMaterial.SetFloat("KW_WindSpeedDetail", WindSpeed); } if ((Object)(object)WaterMaterial == (Object)null) { Shader.SetGlobalFloat("KW_ChoppinesDetail", Choppines); } else { WaterMaterial.SetFloat("KW_ChoppinesDetail", Choppines); } if ((Object)(object)WaterMaterial == (Object)null) { Shader.SetGlobalFloat("KW_FFTScaleDetail", WaterScale); } else { WaterMaterial.SetFloat("KW_FFTScaleDetail", WaterScale); } if ((Object)(object)WaterMaterial == (Object)null) { Shader.SetGlobalVector("KW_DisplaceScaleDetail", Vector4.op_Implicit(val)); } else { WaterMaterial.SetVector("KW_DisplaceScaleDetail", Vector4.op_Implicit(val)); } int num2 = Mathf.RoundToInt(Mathf.Log((float)Size, 2f)) - 5; if ((Object)(object)WaterMaterial == (Object)null) { Shader.SetGlobalFloat("KW_NormalLodDetail", (float)num2); } else { WaterMaterial.SetFloat("KW_NormalLodDetail", (float)num2); } Shader.EnableKeyword("KW_DETAIL_FFT"); } private void OnEnable() { RestartCompute(); } private void OnDisable() { ReleaseAll(); } private void OnDestroy() { ReleaseAll(); } private void Update() { UpdateFFT(); } } public class FFT_CPU_Simulation { private struct ButterflyHashProperties { public int x; public int y; public bool pingPong; public int index; public ButterflyHashProperties(int X, int Y, bool Pingpong, int Index) { x = X; y = Y; pingPong = Pingpong; index = Index; } } private Vector2[] input_H; private Vector2[] complex_H; private Vector2[] intermediates_H; private Vector2[] scratch_H; private Vector2[] inpButt; private bool firstThreadDone; private bool secondThreadDone; private int passes; private int size; private ButterflyHashProperties[,] hashFunction; private FFT_CPU.OutputFFTData currentBuffer; public FFT_CPU_Simulation(int Size, FFT_CPU.OutputFFTData outputFftData) { currentBuffer = outputFftData; Initialize(Size); } private void Initialize(int Size) { size = Size; passes = Mathf.RoundToInt(Mathf.Log((float)size, 2f)); intermediates_H = (Vector2[])(object)new Vector2[size]; scratch_H = (Vector2[])(object)new Vector2[size]; complex_H = (Vector2[])(object)new Vector2[size * size]; hashFunction = new ButterflyHashProperties[size, passes]; for (int i = 0; i < size; i++) { for (int j = 0; j < passes; j++) { hashFunction[i, j] = ButteflyHashFunction(i, j); } } if (currentBuffer.OutputPixels == null || currentBuffer.OutputPixels.Length != size * size) { currentBuffer.OutputPixels = (Color[])(object)new Color[size * size]; } } public void Compute(Vector2[] inpHeight, Vector2[] inpButterfly, int colorChannel, int currentSize) { if (currentSize != size) { Initialize(currentSize); } input_H = inpHeight; inpButt = inpButterfly; FFT_H(); FFT_V(colorChannel); } private void FFT_H() { bool flag = passes % 2 == 0; for (int i = 0; i < size; i++) { for (int j = 0; j < size; j++) { int num = i * size + j; intermediates_H[j].x = input_H[num].x; intermediates_H[j].y = 0f - input_H[num].y; } for (int k = 0; k < passes; k++) { for (int l = 0; l < size; l++) { ButterflyHashProperties butterflyHashProperties = hashFunction[l, k]; if (butterflyHashProperties.pingPong) { scratch_H[l].x = inpButt[butterflyHashProperties.index].x * intermediates_H[butterflyHashProperties.y].x - inpButt[butterflyHashProperties.index].y * intermediates_H[butterflyHashProperties.y].y + intermediates_H[butterflyHashProperties.x].x; scratch_H[l].y = inpButt[butterflyHashProperties.index].y * intermediates_H[butterflyHashProperties.y].x + inpButt[butterflyHashProperties.index].x * intermediates_H[butterflyHashProperties.y].y + intermediates_H[butterflyHashProperties.x].y; } else { intermediates_H[l].x = inpButt[butterflyHashProperties.index].x * scratch_H[butterflyHashProperties.y].x - inpButt[butterflyHashProperties.index].y * scratch_H[butterflyHashProperties.y].y + scratch_H[butterflyHashProperties.x].x; intermediates_H[l].y = inpButt[butterflyHashProperties.index].y * scratch_H[butterflyHashProperties.y].x + inpButt[butterflyHashProperties.index].x * scratch_H[butterflyHashProperties.y].y + scratch_H[butterflyHashProperties.x].y; } } } for (int m = 0; m < size; m++) { int num = i * size + m; if (flag) { complex_H[num].x = intermediates_H[m].x; complex_H[num].y = intermediates_H[m].y; } else { complex_H[num].x = scratch_H[m].x; complex_H[num].y = scratch_H[m].y; } } } } private void FFT_V(int colorChannel) { //IL_0031: 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_02f0: Unknown result type (might be due to invalid IL or missing references) //IL_02e1: Unknown result type (might be due to invalid IL or missing references) //IL_02f5: Unknown result type (might be due to invalid IL or missing references) //IL_034a: Unknown result type (might be due to invalid IL or missing references) //IL_0376: Unknown result type (might be due to invalid IL or missing references) //IL_03a2: Unknown result type (might be due to invalid IL or missing references) bool flag = passes % 2 == 0; for (int i = 0; i < size; i++) { for (int j = 0; j < size; j++) { intermediates_H[j] = complex_H[j * size + i]; } for (int k = 0; k < passes; k++) { for (int l = 0; l < size; l++) { ButterflyHashProperties butterflyHashProperties = hashFunction[l, k]; if (butterflyHashProperties.pingPong) { scratch_H[l].x = inpButt[butterflyHashProperties.index].x * intermediates_H[butterflyHashProperties.y].x - inpButt[butterflyHashProperties.index].y * intermediates_H[butterflyHashProperties.y].y + intermediates_H[butterflyHashProperties.x].x; scratch_H[l].y = inpButt[butterflyHashProperties.index].y * intermediates_H[butterflyHashProperties.y].x + inpButt[butterflyHashProperties.index].x * intermediates_H[butterflyHashProperties.y].y + intermediates_H[butterflyHashProperties.x].y; } else { intermediates_H[l].x = inpButt[butterflyHashProperties.index].x * scratch_H[butterflyHashProperties.y].x - inpButt[butterflyHashProperties.index].y * scratch_H[butterflyHashProperties.y].y + scratch_H[butterflyHashProperties.x].x; intermediates_H[l].y = inpButt[butterflyHashProperties.index].y * scratch_H[butterflyHashProperties.y].x + inpButt[butterflyHashProperties.index].x * scratch_H[butterflyHashProperties.y].y + scratch_H[butterflyHashProperties.x].y; } } } for (int m = 0; m < size; m++) { Vector2 val = (flag ? intermediates_H[m] : scratch_H[m]); float num = (((i + m) % 2 == 1) ? (-1f) : 1f); switch (colorChannel) { case 0: currentBuffer.OutputPixels[m * size + i].r = num * val.x; break; case 1: currentBuffer.OutputPixels[m * size + i].g = num * val.x; break; case 2: currentBuffer.OutputPixels[m * size + i].b = num * val.x; break; } } } } private ButterflyHashProperties ButteflyHashFunction(int coord, int passIndex) { int num = 1 << passIndex; int num2; int num3; if (coord / num % 2 == 1) { num2 = coord - num; num3 = coord; } else { num2 = coord; num3 = coord + num; } if (passIndex == 0) { num2 = (int)(Reverse(num2) >> 32 - passes); num3 = (int)(Reverse(num3) >> 32 - passes); } bool pingpong = passIndex % 2 == 0; int index = coord + passIndex * size; return new ButterflyHashProperties(num2, num3, pingpong, index); } private uint Reverse(int x1) { uint num = (uint)x1; uint num2 = 0u; for (int i = 0; i < 32; i++) { num2 <<= 1; num2 |= num & 1u; num >>= 1; } return num2; } } public class FFT_CPU_Spectrum { private struct UpdateSpectrumHashProperties { public float k_x; public float k_y; public float w; public int index; } private UpdateSpectrumHashProperties[,] hashFunc; private float[] sinHash; private float[] cosHash; private Vector4[] initColors; public Vector2[] ResultHeight; public Vector2[] ResultDisplaceX; public Vector2[] ResultDisplaceZ; private float INVPI2 = 2f / MathF.PI; private float HPI = MathF.PI / 2f; private float PI2 = MathF.PI * 2f; private float PI4 = 0.33661976f; private int rngState; private const float Gravity = 9.81f; private int size; private UpdateSpectrumHashProperties hash; private float scaledTime; private int index; private float hX; private float hY; private float sw; private float cw; public FFT_CPU_Spectrum(int Size) { Initialize(Size); } private void Initialize(int Size) { size = Size; sinHash = new float[6284]; cosHash = new float[6284]; for (int i = 0; i < 6284; i++) { sinHash[i] = Mathf.Sin((float)i / 100f); cosHash[i] = Mathf.Cos((float)i / 100f); } initColors = (Vector4[])(object)new Vector4[size * size]; ResultHeight = (Vector2[])(object)new Vector2[size * size]; ResultDisplaceX = (Vector2[])(object)new Vector2[size * size]; ResultDisplaceZ = (Vector2[])(object)new Vector2[size * size]; } public void InitializeSpectrum(float domainSize, float windSpeed, float direction, int currentSize) { //IL_0076: Unknown result type (might be due to invalid IL or missing references) //IL_007b: 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_01d4: Unknown result type (might be due to invalid IL or missing references) if (size != currentSize) { Initialize(currentSize); } for (int i = 0; i < size; i++) { for (int j = 0; j < size; j++) { int num = size / 2; int num2 = i - num; int num3 = j - num; if (num2 != 0 || num3 != 0) { float num4 = PI2 * (float)num2 / domainSize; float num5 = PI2 * (float)num3 / domainSize; Vector2 val = new Vector2(num4, num5); float magnitude = ((Vector2)(ref val)).magnitude; rngState = WangHash(j * size + i); float num6 = Mathf.Sqrt(Mathf.Abs(9.81f * magnitude)); float num7 = 9.81f / (2f * num6); float num8 = PiersonMoskowitzSpectrum(num6, windSpeed); float num9 = num8; float num10 = num8; float num11 = PI2 / domainSize; float theta = Mathf.Atan2(0f - num5, num4); float theta2 = Mathf.Atan2(num5, 0f - num4); num9 *= PosCosSquaredDirectionalSpreading(theta, direction); num10 *= PosCosSquaredDirectionalSpreading(theta2, direction); num9 *= num11 * num11 * num7 / magnitude; num10 *= num11 * num11 * num7 / magnitude; float num12 = RandGauss() * Mathf.Sqrt(Mathf.Abs(num9) * 2f); float num13 = RandGauss() * Mathf.Sqrt(Mathf.Abs(num10) * 2f); float num14 = RandFloat() * PI2; float num15 = RandFloat() * PI2; float num16 = num12 * Mathf.Cos(num14); float num17 = num12 * (0f - Mathf.Sin(num14)); float num18 = num13 * Mathf.Cos(num15); float num19 = num13 * (0f - Mathf.Sin(num15)); initColors[j * size + i] = new Vector4(num16, num17, num18, num19); } } } hashFunc = new UpdateSpectrumHashProperties[size, size]; for (int k = 0; k < size; k++) { for (int l = 0; l < size; l++) { hashFunc[k, l] = UpdateHashFunc(k, l, domainSize); } } } public void GetUpdatedSpectrum(float time, int currentSize) { scaledTime = time / 10f; for (int i = 0; i < size; i++) { for (int j = 0; j < size; j++) { hash = hashFunc[i, j]; index = (int)(hash.w * scaledTime % PI2 * 1000f); sw = sinHash[index]; cw = cosHash[index]; index = hash.index; hX = initColors[index].x * cw - initColors[index].y * (0f - sw) + initColors[index].z * cw - initColors[index].w * sw; hY = initColors[index].x * (0f - sw) + initColors[index].y * cw + initColors[index].z * sw + initColors[index].w * cw; ResultHeight[index].x = hX; ResultHeight[index].y = hY; ResultDisplaceX[index].x = (0f - hY) * hash.k_x; ResultDisplaceX[index].y = hX * hash.k_x; ResultDisplaceZ[index].x = (0f - hY) * hash.k_y; ResultDisplaceZ[index].y = hX * hash.k_y; } } } private int WangHash(int seed) { seed = seed ^ 0x3D ^ (seed >> 16); seed *= 9; seed ^= seed >> 4; seed *= 668265261; seed ^= seed >> 15; return seed; } private int Rand() { rngState ^= rngState << 13; rngState ^= rngState >> 17; rngState ^= rngState << 5; return Mathf.Abs(rngState); } private float RandFloat() { return (float)Rand() / 4.2949673E+09f; } private float RandGauss() { float num = RandFloat(); float num2 = RandFloat(); if (num < 1E-06f) { num = 1E-06f; } return Mathf.Sqrt(-2f * Mathf.Log(num)) * Mathf.Cos(PI2 * num2); } private float PiersonMoskowitzSpectrum(float w, float windSpeed) { float wm = 8.5347f / windSpeed; return AlphaBetaSpectrum(0.0081f, 1.291f, 9.81f, w, wm); } private float AlphaBetaSpectrum(float A, float B, float g, float w, float wm) { return A * g * g / Mathf.Pow(w, 5f) * Mathf.Exp((0f - B) * Mathf.Pow(wm / w, 4f)); } private float PosCosSquaredDirectionalSpreading(float theta, float direction) { if (theta > 0f - HPI && theta < HPI) { float num = Mathf.Cos(theta); return INVPI2 * (num * num) * (1f - direction) + PI4 * direction; } return PI4 * direction; } private UpdateSpectrumHashProperties UpdateHashFunc(int x, int y, float domainSize) { int num = size / 2; int num2 = x - num; int num3 = y - num; float num4 = PI2 * (float)num2 / domainSize; float num5 = PI2 * (float)num3 / domainSize; float num6 = Mathf.Sqrt(num4 * num4 + num5 * num5); float w = Mathf.Sqrt(Mathf.Abs(9.81f * num6)); num6 += 1E-05f; num4 /= num6; num5 /= num6; int num7 = x * size + y; UpdateSpectrumHashProperties result = default(UpdateSpectrumHashProperties); result.index = num7; result.k_x = num4; result.k_y = num5; result.w = w; return result; } } public class FFT_GPU : MonoBehaviour { public enum SizeSetting { Size_32 = 0x20, Size_64 = 0x40, Size_128 = 0x80, Size_256 = 0x100, Size_512 = 0x200 } public enum LodPrefix { LOD0, LOD1, LOD2 } public RenderTexture DisplaceTexture; public RenderTexture NormalTexture; private RenderTexture spectrumInitRenderTexture; private RenderTexture spectrumHeight; private RenderTexture spectrumDisplaceX; private RenderTexture spectrumDisplaceZ; private RenderTexture fftTemp1; private RenderTexture fftTemp2; private RenderTexture fftTemp3; private Material normalComputeMaterial; private ComputeShader spectrumShader; private ComputeShader shaderFFT; private Texture2D texButterfly; private float prevWindTurbulence; private float prevWindSpeed; private float prevWindRotation; private float currentHeightDataDomainScale; private int kernelSpectrumInit; private int kernelSpectrumUpdate; private Color[] butterflyColors; private bool isInitialized = false; private int ID_DispTex = Shader.PropertyToID("KW_DispTex"); private int ID_DispTex1 = Shader.PropertyToID("KW_DispTex_LOD1"); private int ID_DispTex2 = Shader.PropertyToID("KW_DispTex_LOD2"); private int ID_NormTex = Shader.PropertyToID("KW_NormTex"); private int ID_LeanTex = Shader.PropertyToID("KW_LeanTex"); private int ID_NormTex1 = Shader.PropertyToID("KW_NormTex_LOD1"); private int ID_NormTex2 = Shader.PropertyToID("KW_NormTex_LOD2"); private int ID_MipCount = Shader.PropertyToID("KW_NormMipCount"); private int ID_MipCount1 = Shader.PropertyToID("KW_NormMipCount_LOD1"); private int ID_MipCount2 = Shader.PropertyToID("KW_NormMipCount_LOD2"); private int ID_FFTDomainSize = Shader.PropertyToID("KW_FFTDomainSize"); private int ID_FFTDomainSize1 = Shader.PropertyToID("KW_FFTDomainSize_LOD1"); private int ID_FFTDomainSize2 = Shader.PropertyToID("KW_FFTDomainSize_LOD2"); private int ID_NormalLod = Shader.PropertyToID("KW_NormalLod"); public void Release() { KW_Extensions.SafeDestroy((Object)spectrumShader, (Object)shaderFFT, (Object)texButterfly, (Object)normalComputeMaterial); KW_Extensions.ReleaseRenderTextures(spectrumInitRenderTexture, spectrumHeight, spectrumDisplaceX, spectrumDisplaceZ, fftTemp1, fftTemp2, fftTemp3, DisplaceTexture, NormalTexture); prevWindTurbulence = -1f; prevWindSpeed = -1f; prevWindRotation = -1f; isInitialized = false; } private void InitializeResources(int size, int anisoLevel) { //IL_0069: Unknown result type (might be due to invalid IL or missing references) //IL_0073: Expected O, but got Unknown //IL_008a: Unknown result type (might be due to invalid IL or missing references) //IL_0094: Expected O, but got Unknown //IL_009b: Unknown result type (might be due to invalid IL or missing references) //IL_00a5: Expected O, but got Unknown //IL_00c5: Unknown result type (might be due to invalid IL or missing references) //IL_00cf: Expected O, but got Unknown //IL_00ef: Unknown result type (might be due to invalid IL or missing references) //IL_00f9: Expected O, but got Unknown //IL_0119: Unknown result type (might be due to invalid IL or missing references) //IL_0123: Expected O, but got Unknown //IL_0142: Unknown result type (might be due to invalid IL or missing references) //IL_014c: Expected O, but got Unknown //IL_016b: Unknown result type (might be due to invalid IL or missing references) //IL_0175: Expected O, but got Unknown //IL_0194: Unknown result type (might be due to invalid IL or missing references) //IL_019e: Expected O, but got Unknown //IL_01be: Unknown result type (might be due to invalid IL or missing references) //IL_01c8: Expected O, but got Unknown //IL_01e7: Unknown result type (might be due to invalid IL or missing references) //IL_01f1: Expected O, but got Unknown Release(); spectrumShader = Object.Instantiate<ComputeShader>(WaterShadersSingleton.Instance.SpectrumGPUComputeShader); kernelSpectrumInit = spectrumShader.FindKernel("SpectrumInitalize"); kernelSpectrumUpdate = spectrumShader.FindKernel("SpectrumUpdate"); shaderFFT = Object.Instantiate<ComputeShader>(WaterShadersSingleton.Instance.FFTComputeShader); normalComputeMaterial = new Material(WaterShadersSingleton.Instance.ComputeNormalShader); texButterfly = new Texture2D(size, Mathf.RoundToInt(Mathf.Log((float)size, 2f)), (TextureFormat)20, false, true); spectrumInitRenderTexture = new RenderTexture(size, size, 0, (RenderTextureFormat)11, (RenderTextureReadWrite)1); spectrumInitRenderTexture.enableRandomWrite = true; spectrumInitRenderTexture.Create(); spectrumHeight = new RenderTexture(size, size, 0, (RenderTextureFormat)12, (RenderTextureReadWrite)1); spectrumHeight.enableRandomWrite = true; spectrumHeight.Create(); spectrumDisplaceX = new RenderTexture(size, size, 0, (RenderTextureFormat)12, (RenderTextureReadWrite)1); spectrumDisplaceX.enableRandomWrite = true; spectrumDisplaceX.Create(); spectrumDisplaceZ = new RenderTexture(size, size, 0, (RenderTextureFormat)12, (RenderTextureReadWrite)1); spectrumDisplaceZ.enableRandomWrite = true; spectrumDisplaceZ.Create(); fftTemp1 = new RenderTexture(size, size, 0, (RenderTextureFormat)12); fftTemp1.enableRandomWrite = true; fftTemp1.Create(); fftTemp2 = new RenderTexture(size, size, 0, (RenderTextureFormat)12); fftTemp2.enableRandomWrite = true; fftTemp2.Create(); fftTemp3 = new RenderTexture(size, size, 0, (RenderTextureFormat)12); fftTemp3.enableRandomWrite = true; fftTemp3.Create(); DisplaceTexture = new RenderTexture(size, size, 0, (RenderTextureFormat)11, (RenderTextureReadWrite)1); DisplaceTexture.enableRandomWrite = true; DisplaceTexture.Create(); NormalTexture = new RenderTexture(size, size, 0, (RenderTextureFormat)2, (RenderTextureReadWrite)1); ((Texture)NormalTexture).filterMode = (FilterMode)2; ((Texture)NormalTexture).wrapMode = (TextureWrapMode)0; NormalTexture.useMipMap = true; ((Texture)NormalTexture).anisoLevel = anisoLevel; InitializeButterfly(size); isInitialized = true; } private void OnDisable() { Release(); } public void ComputeFFT(LodPrefix lodPrefix, int size, int anisoLevel, float domainSize, float windTurbulence, float windSpeed, float windRotation, float timeOffset, List<Material> waterSharedMaterials, Dictionary<ComputeShader, List<int>> waterSharedComputeShaders) { if (!isInitialized || ((Texture)DisplaceTexture).width != size || ((Texture)NormalTexture).anisoLevel != anisoLevel) { InitializeResources(size, anisoLevel); } if (Mathf.Abs(prevWindTurbulence - windTurbulence) > 0.001f || Mathf.Abs(prevWindSpeed - windSpeed) > 0.01f || Mathf.Abs(prevWindRotation - windRotation) > 0.01f) { prevWindTurbulence = windTurbulence; prevWindSpeed = windSpeed; prevWindRotation = windRotation; InitializeSpectrum(size, domainSize, windSpeed, windTurbulence, windRotation); } UpdateSpectrum(size, timeOffset, windRotation); DispatchFFT(size, domainSize, windSpeed); int num = Mathf.RoundToInt(Mathf.Log((float)size, 2f)) - 4; int num2 = Mathf.RoundToInt(Mathf.Log((float)size, 2f)); foreach (Material waterSharedMaterial in waterSharedMaterials) { if (!((Object)(object)waterSharedMaterial == (Object)null)) { UpdateMaterialParameters(lodPrefix, num, domainSize, num2, waterSharedMaterial); } } foreach (KeyValuePair<ComputeShader, List<int>> waterSharedComputeShader in waterSharedComputeShaders) { if (!((Object)(object)waterSharedComputeShader.Key == (Object)null)) { UpdateComputeParameters(lodPrefix, num, domainSize, num2, waterSharedComputeShader.Key, waterSharedComputeShader.Value); } } } private void UpdateMaterialParameters(LodPrefix lodPrefix, float normalLodSize, float domainSize, float mipCount, Material material) { switch (lodPrefix) { case LodPrefix.LOD0: material.SetTexture(ID_DispTex, (Texture)(object)DisplaceTexture); material.SetTexture(ID_NormTex, (Texture)(object)NormalTexture); material.SetFloat(ID_FFTDomainSize, domainSize); material.SetFloat(ID_NormalLod, normalLodSize); material.SetFloat(ID_MipCount, mipCount); break; case LodPrefix.LOD1: material.SetTexture(ID_DispTex1, (Texture)(object)DisplaceTexture); material.SetTexture(ID_NormTex1, (Texture)(object)NormalTexture); material.SetFloat(ID_FFTDomainSize1, domainSize); material.SetFloat(ID_MipCount1, mipCount); break; case LodPrefix.LOD2: material.SetTexture(ID_DispTex2, (Texture)(object)DisplaceTexture); material.SetTexture(ID_NormTex2, (Texture)(object)NormalTexture); material.SetFloat(ID_FFTDomainSize2, domainSize); material.SetFloat(ID_MipCount2, mipCount); break; } } private void UpdateComputeParameters(LodPrefix lodPrefix, float normalLodSize, float domainSize, float mipCount, ComputeShader computeShader, List<int> kernels) { foreach (int kernel in kernels) { switch (lodPrefix) { case LodPrefix.LOD0: computeShader.SetTexture(kernel, ID_DispTex, (Texture)(object)DisplaceTexture); computeShader.SetTexture(kernel, ID_NormTex, (Texture)(object)NormalTexture); computeShader.SetFloat(ID_FFTDomainSize, domainSize); computeShader.SetFloat(ID_NormalLod, normalLodSize); computeShader.SetFloat(ID_MipCount, mipCount); break; case LodPrefix.LOD1: computeShader.SetTexture(kernel, ID_DispTex1, (Texture)(object)DisplaceTexture); computeShader.SetTexture(kernel, ID_NormTex1, (Texture)(object)NormalTexture); computeShader.SetFloat(ID_FFTDomainSize1, domainSize); computeShader.SetFloat(ID_MipCount1, mipCount); break; case LodPrefix.LOD2: computeShader.SetTexture(kernel, ID_DispTex2, (Texture)(object)DisplaceTexture); computeShader.SetTexture(kernel, ID_NormTex2, (Texture)(object)NormalTexture); computeShader.SetFloat(ID_FFTDomainSize2, domainSize); computeShader.SetFloat(ID_MipCount2, mipCount); break; } } } private void InitializeButterfly(int size) { //IL_0095: Unknown result type (might be due to invalid IL or missing references) //IL_009a: 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_00c2: Unknown result type (might be due to invalid IL or missing references) int num = Mathf.RoundToInt(Mathf.Log((float)size, 2f)); butterflyColors = (Color[])(object)new Color[size * num]; int num2 = 1; int num3 = size >> 1; for (int i = 0; i < num; i++) { int num4 = i * size; int num5 = 0; int num6 = 2 * num2; for (int j = 0; j < num3; j++) { float num7 = 0f; for (int k = num5; k < num6; k += 2) { float num8 = MathF.PI * 2f * num7 * (float)num3 / (float)size; float num9 = Mathf.Cos(num8); float num10 = Mathf.Sin(num8); butterflyColors[num4 + k / 2] = new Color(num9, 0f - num10, 0f, 1f); butterflyColors[num4 + k / 2 + num2] = new Color(0f - num9, num10, 0f, 1f); num7 += 1f; } num5 += 4 * num2; num6 = num5 + 2 * num2; } num3 >>= 1; num2 <<= 1; } texButterfly.SetPixels(butterflyColors); texButterfly.Apply(); } private void InitializeSpectrum(int size, float domainSize, float windSpeed, float windTurbulence, float windRotation) { Graphics.SetRenderTarget(spectrumInitRenderTexture); spectrumShader.SetInt("size", size); spectrumShader.SetFloat("domainSize", domainSize); spectrumShader.SetFloats("turbulence", new float[1] { windTurbulence }); spectrumShader.SetFloat("windSpeed", windSpeed); spectrumShader.SetFloat("windRotation", windRotation); spectrumShader.SetTexture(kernelSpectrumInit, "resultInit", (Texture)(object)spectrumInitRenderTexture); spectrumShader.Dispatch(kernelSpectrumInit, size / 8, size / 8, 1); } private void UpdateSpectrum(int size, float timeOffset, float windRotation) { Graphics.SetRenderTarget(spectrumHeight); spectrumShader.SetFloat("time", timeOffset); spectrumShader.SetTexture(kernelSpectrumUpdate, "init0", (Texture)(object)spectrumInitRenderTexture); spectrumShader.SetTexture(kernelSpectrumUpdate, "resultHeight", (Texture)(object)spectrumHeight); spectrumShader.SetTexture(kernelSpectrumUpdate, "resultDisplaceX", (Texture)(object)spectrumDisplaceX); spectrumShader.SetTexture(kernelSpectrumUpdate, "resultDisplaceZ", (Texture)(object)spectrumDisplaceZ); spectrumShader.Dispatch(kernelSpectrumUpdate, size / 8, size / 8, 1); } private void DispatchFFT(int size, float domainSize, float windSpeed) { RenderTexture active = RenderTexture.active; int num = 0; switch (size) { case 32: num = 0; break; case 64: num = 2; break; case 128: num = 4; break; case 256: num = 6; break; case 512: num = 8; break; } Graphics.SetRenderTarget(fftTemp1); shaderFFT.SetTexture(num, "inputH", (Texture)(object)spectrumHeight); shaderFFT.SetTexture(num, "inputX", (Texture)(object)spectrumDisplaceX); shaderFFT.SetTexture(num, "inputZ", (Texture)(object)spectrumDisplaceZ); shaderFFT.SetTexture(num, "inputButterfly", (Texture)(object)texButterfly); shaderFFT.SetTexture(num, "output1", (Texture)(object)fftTemp1); shaderFFT.SetTexture(num, "output2", (Texture)(object)fftTemp2); shaderFFT.SetTexture(num, "output3", (Texture)(object)fftTemp3); shaderFFT.Dispatch(num, 1, size, 1); Graphics.SetRenderTarget(DisplaceTexture); shaderFFT.SetTexture(num + 1, "inputH", (Texture)(object)fftTemp1); shaderFFT.SetTexture(num + 1, "inputX", (Texture)(object)fftTemp2); shaderFFT.SetTexture(num + 1, "inputZ", (Texture)(object)fftTemp3); shaderFFT.SetTexture(num + 1, "inputButterfly", (Texture)(object)texButterfly); shaderFFT.SetTexture(num + 1, "output", (Texture)(object)DisplaceTexture); shaderFFT.Dispatch(num + 1, size, 1, 1); normalComputeMaterial.SetFloat("KW_FFTDomainSize", domainSize); normalComputeMaterial.SetTexture("_DispTex", (Texture)(object)DisplaceTexture); int num2 = Mathf.RoundToInt(Mathf.Log((float)size, 2f)) - 4; normalComputeMaterial.SetFloat("_SizeLog", (float)num2); normalComputeMaterial.SetFloat("_WindSpeed", windSpeed); Graphics.SetRenderTarget(NormalTexture); Graphics.Blit((Texture)null, NormalTexture, normalComputeMaterial, 0); RenderTexture.active = active; } } [ExecuteInEditMode] public class KW_AddLightToWaterRendering : MonoBehaviour { private Light currentLight; private LightType lastLightType; private LightShadows lastLightShadows; private Color lastLightColor; private float lastLightRange; private float lastLightIntencity; private float lastSpotLightAngle; private Vector3 lastLightPos; private Vector3 lastLightDir; private static readonly int KW_DirLightForward_ID = Shader.PropertyToID("KW_DirLightForward"); private static readonly int KW_DirLightColor_ID = Shader.PropertyToID("KW_DirLightColor"); private KW_WaterVolumetricLighting.VolumeLight currentVolumeLight; private void OnEnable() { if ((Object)(object)currentLight == (Object)null) { currentLight = ((Component)this).GetComponent<Light>(); } if (currentVolumeLight == null) { currentVolumeLight = new KW_WaterVolumetricLighting.VolumeLight(); } currentVolumeLight.Light = currentLight; currentVolumeLight.RequiredUpdate = true; KW_WaterVolumetricLighting.ActiveLights.Add(currentVolumeLight); } private void OnDisable() { KW_WaterVolumetricLighting.ActiveLights.Remove(currentVolumeLight); if (currentVolumeLight.CopyShadowMapBuffer != null) { currentLight.RemoveCommandBuffer((LightEvent)1, currentVolumeLight.CopyShadowMapBuffer); } if (currentVolumeLight.LightCommandBuffer != null) { currentVolumeLight.Light.RemoveCommandBuffer((LightEvent)2, currentVolumeLight.LightCommandBuffer); currentVolumeLight.Light.RemoveCommandBuffer((LightEvent)1, currentVolumeLight.LightCommandBuffer); } } private bool IsRequiredLightUpdate() { //IL_0010: 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_0026: 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_003c: Unknown result type (might be due to invalid IL or missing references) //IL_0047: Unknown result type (might be due to invalid IL or missing references) //IL_00e6: Unknown result type (might be due to invalid IL or missing references) //IL_00eb: Unknown result type (might be due to invalid IL or missing references) //IL_00f7: Unknown result type (might be due to invalid IL or missing references) //IL_00fc: Unknown result type (might be due to invalid IL or missing references) //IL_0108: Unknown result type (might be due to invalid IL or missing references) //IL_010d: 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_013b: 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_0147: Unknown result type (might be due to invalid IL or missing references) //IL_00b1: Unknown result type (might be due to invalid IL or missing references) //IL_00b7: 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_00ca: Unknown result type (might be due to invalid IL or missing references) bool result = false; Transform transform = ((Component)currentLight).transform; if (lastLightType != currentLight.type || lastLightShadows != currentLight.shadows || lastLightColor != currentLight.color || Math.Abs(lastLightIntencity - currentLight.intensity) > 0.001f || Math.Abs(lastLightRange - currentLight.range) > 0.001f || Math.Abs(lastSpotLightAngle - currentLight.spotAngle) > 0.001f || lastLightPos != transform.position || lastLightDir != transform.forward) { result = true; } lastLightType = currentLight.type; lastLightShadows = currentLight.shadows; lastLightColor = currentLight.color; lastLightIntencity = currentLight.intensity; lastLightRange = currentLight.range; lastLightPos = transform.position; lastLightDir = transform.forward; return result; } private void Update() { //IL_0007: Unknown result type (might be due to invalid IL or missing references) //IL_000d: Invalid comparison between Unknown and I4 //IL_0020: Unknown result type (might be due to invalid IL or missing references) //IL_0026: Invalid comparison between Unknown and I4 if ((int)currentLight.type == 0) { ComputeSpotLightShadowMatrix(); } if ((int)currentLight.type == 1) { UpdateDirLight(); } if (IsRequiredLightUpdate()) { currentVolumeLight.RequiredUpdate = true; } } private void UpdateDirLight() { //IL_0011: Unknown result type (might be due to invalid IL or missing references) //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_0031: 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_0046: Unknown result type (might be due to invalid IL or missing references) Shader.SetGlobalVector(KW_DirLightForward_ID, Vector4.op_Implicit(-((Component)currentLight).transform.forward)); Shader.SetGlobalVector(KW_DirLightColor_ID, Color.op_Implicit(currentLight.color * currentLight.intensity)); } private void ComputeSpotLightShadowMatrix() { //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_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_0033: 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_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_0099: Unknown result type (might be due to invalid IL or missing references) //IL_009a: 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_0120: Unknown result type (might be due to invalid IL or missing references) //IL_0130: Unknown result type (might be due to invalid IL or missing references) //IL_0135: Unknown result type (might be due to invalid IL or missing references) //IL_013a: Unknown result type (might be due to invalid IL or missing references) //IL_013f: 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_0148: Unknown result type (might be due to invalid IL or missing references) //IL_014f: Unknown result type (might be due to invalid IL or missing references) //IL_0150: Unknown result type (might be due to invalid IL or missing references) //IL_0151: Unknown result type (might be due to invalid IL or missing references) //IL_0156: Unknown result type (might be due to invalid IL or missing references) Matrix4x4 val = Matrix4x4.TRS(new Vector3(0.5f, 0.5f, 0.5f), Quaternion.identity, new Vector3(0.5f, 0.5f, 0.5f)); Matrix4x4 val2 = ((!SystemInfo.usesReversedZBuffer) ? Matrix4x4.Perspective(currentLight.spotAngle, 1f, currentLight.shadowNearPlane, currentLight.range) : Matrix4x4.Perspective(currentLight.spotAngle, 1f, currentLight.range, currentLight.shadowNearPlane)); Matrix4x4 val3 = val * val2; ref Matrix4x4 reference = ref val3; ((Matrix4x4)(ref reference))[0, 2] = ((Matrix4x4)(ref reference))[0, 2] * -1f; reference = ref val3; ((Matrix4x4)(ref reference))[1, 2] = ((Matrix4x4)(ref reference))[1, 2] * -1f; reference = ref val3; ((Matrix4x4)(ref reference))[2, 2] = ((Matrix4x4)(ref reference))[2, 2] * -1f; reference = ref val3; ((Matrix4x4)(ref reference))[3, 2] = ((Matrix4x4)(ref reference))[3, 2] * -1f; Matrix4x4 val4 = Matrix4x4.TRS(((Component)currentLight).transform.position, ((Component)currentLight).transform.rotation, Vector3.one); Matrix4x4 inverse = ((Matrix4x4)(ref val4)).inverse; currentVolumeLight.SpotMatrix = val3 * inverse; } } [RequireComponent(typeof(Rigidbody))] [RequireComponent(typeof(Collider))] public class KW_Buoyancy : MonoBehaviour { public enum ModelSourceEnum { Collider, Mesh } public ModelSourceEnum VolumeSource = ModelSourceEnum.Mesh; public Transform OvverideCenterOfMass; [Range(100f, 1000f)] public float Density = 450f; [Range(1f, 6f)] public int SlicesPerAxisX = 2; [Range(1f, 6f)] public int SlicesPerAxisY = 2; [Range(1f, 6f)] public int SlicesPerAxisZ = 2; public bool isConcave = false; [Range(2f, 32f)] public int VoxelsLimit = 16; public float AngularDrag = 0.25f; public float Drag = 0.25f; [Range(0f, 1f)] public float NormalForce = 0.2f; public bool DebugForces = false; private const float DAMPFER = 0.1f; private const float WATER_DENSITY = 1000f; private Vector3 localArchimedesForce; private List<Vector3> voxels; private Vector3[] currentForces; private bool isMeshCollider; private List<Vector3[]> debugForces; private Rigidbody rigidBody; private Collider collider; private float bounceMaxSize; private void OnEnable() { //IL_0031: 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_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_0049: 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_006b: Unknown result type (might be due to invalid IL or missing references) //IL_0070: Unknown result type (might be due to invalid IL or missing references) //IL_007c: Unknown result type (might be due to invalid IL or missing references) //IL_008b: Unknown result type (might be due to invalid IL or missing references) //IL_009a: 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_00ee: Unknown result type (might be due to invalid IL or missing references) //IL_0156: Unknown result type (might be due to invalid IL or missing references) //IL_0163: Unknown result type (might be due to invalid IL or missing references) //IL_0194: 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_01c6: Unknown result type (might be due to invalid IL or missing references) //IL_01cb: Unknown result type (might be due to invalid IL or missing references) KW_WaterDynamicScripts.AddBuoyancyScript(this); debugForces = new List<Vector3[]>(); rigidBody = ((Component)this).GetComponent<Rigidbody>(); collider = ((Component)this).GetComponent<Collider>(); Quaternion rotation = ((Component)this).transform.rotation; Vector3 position = ((Component)this).transform.position; ((Component)this).transform.rotation = Quaternion.identity; ((Component)this).transform.position = Vector3.zero; Bounds bounds = collider.bounds; bounceMaxSize = Mathf.Max(new float[3] { ((Bounds)(ref bounds)).size.x, ((Bounds)(ref bounds)).size.y, ((Bounds)(ref bounds)).size.z }); isMeshCollider = (Object)(object)((Component)this).GetComponent<MeshCollider>() != (Object)null; if (Object.op_Implicit((Object)(object)OvverideCenterOfMass)) { rigidBody.centerOfMass = ((Component)this).transform.InverseTransformPoint(((Component)OvverideCenterOfMass).transform.position); } rigidBody.angularDrag = AngularDrag; rigidBody.drag = Drag; voxels = SliceIntoVoxels(isMeshCollider && isConcave); currentForces = (Vector3[])(object)new Vector3[voxels.Count]; ((Component)this).transform.rotation = rotation; ((Component)this).transform.position = position; float num = rigidBody.mass / Density; WeldPoints(voxels, VoxelsLimit); float num2 = 1000f * Mathf.Abs(Physics.gravity.y) * num; localArchimedesForce = new Vector3(0f, num2, 0f) / (float)voxels.Count; } private void OnDisable() { KW_WaterDynamicScripts.RemoveBuoyancyScript(this); } private Bounds GetCurrentBounds() { //IL_0003: 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_0021: 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_0064: 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_005c: Unknown result type (might be due to invalid IL or missing references) //IL_0061: 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_0052: Unknown result type (might be due to invalid IL or missing references) Bounds result = default(Bounds); if (VolumeSource == ModelSourceEnum.Mesh) { return ((Component)this).GetComponent<Renderer>().bounds; } if (VolumeSource == ModelSourceEnum.Collider) { MeshCollider component = ((Component)this).GetComponent<MeshCollider>(); if ((Object)(object)component != (Object)null) { return component.sharedMesh.bounds; } return ((Component)this).GetComponent<Collider>().bounds; } return result; } private List<Vector3> SliceIntoVoxels(bool concave) { //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_0176: Unknown result type (might be due to invalid IL or missing references) //IL_01af: Unknown result type (might be due to invalid IL or missing references) //IL_01bb: Unknown result type (might be due to invalid IL or missing references) //IL_01dc: Unknown result type (might be due to invalid IL or missing references) //IL_01e8: Unknown result type (might be due to invalid IL or missing references) //IL_0209: Unknown result type (might be due to invalid IL or missing references) //IL_0215: Unknown result type (might be due to invalid IL or missing references) //IL_0240: Unknown result type (might be due to invalid IL or missing references) //IL_0245: Unknown result type (might be due to invalid IL or missing references) //IL_024a: Unknown result type (might be due to invalid IL or missing references) //IL_024d: 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_006b: 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_0098: 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_00c5: 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_00f5: 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_00fd: Unknown result type (might be due to invalid IL or missing references) //IL_010c: Unknown result type (might be due to invalid IL or missing references) List<Vector3> list = new List<Vector3>(SlicesPerAxisX * SlicesPerAxisY * SlicesPerAxisZ); Bounds currentBounds = GetCurrentBounds(); if (concave) { MeshCollider component = ((Component)this).GetComponent<MeshCollider>(); bool convex = component.convex; component.convex = false; for (int i = 0; i < SlicesPerAxisX; i++) { for (int j = 0; j < SlicesPerAxisY; j++) { for (int k = 0; k < SlicesPerAxisZ; k++) { float num = ((Bounds)(ref currentBounds)).min.x + ((Bounds)(ref currentBounds)).size.x / (float)SlicesPerAxisX * (0.5f + (float)i); float num2 = ((Bounds)(ref currentBounds)).min.y + ((Bounds)(ref currentBounds)).size.y / (float)SlicesPerAxisY * (0.5f + (float)j); float num3 = ((Bounds)(ref currentBounds)).min.z + ((Bounds)(ref currentBounds)).size.z / (float)SlicesPerAxisZ * (0.5f + (float)k); Vector3 val = ((Component)this).transform.InverseTransformPoint(new Vector3(num, num2, num3)); if (PointIsInsideMeshCollider((Collider)(object)component, val)) { list.Add(val); } } } } if (list.Count == 0) { list.Add(((Bounds)(ref currentBounds)).center); } component.convex = convex; } else { for (int l = 0; l < SlicesPerAxisX; l++) { for (int m = 0; m < SlicesPerAxisY; m++) { for (int n = 0; n < SlicesPerAxisZ; n++) { float num4 = ((Bounds)(ref currentBounds)).min.x + ((Bounds)(ref currentBounds)).size.x / (float)SlicesPerAxisX * (0.5f + (float)l); float num5 = ((Bounds)(ref currentBounds)).min.y + ((Bounds)(ref currentBounds)).size.y / (float)SlicesPerAxisY * (0.5f + (float)m); float num6 = ((Bounds)(ref currentBounds)).min.z + ((Bounds)(ref currentBounds)).size.z / (float)SlicesPerAxisZ * (0.5f + (float)n); Vector3 item = ((Component)this).transform.InverseTransformPoint(new Vector3(num4, num5, num6)); list.Add(item); } } } } return list; } private static bool PointIsInsideMeshCollider(Collider c, Vector3 p) { //IL_0009: Unknown result type (might be due to invalid IL or missing references) //IL_000e: 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_001a: 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_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_0039: Unknown result type (might be due to invalid IL or missing references) //IL_003e: 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) //IL_004a: Unknown result type (might be due to invalid IL or missing references) //IL_0059: Unknown result type (might be due to invalid IL or missing references) //IL_005e: Unknown result type (might be due to invalid IL or missing references) //IL_0061: Unknown result type (might be due to invalid IL or missing references) //IL_0062: 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_006d: Unknown result type (might be due to invalid IL or missing references) //IL_0072: Unknown result type (might be due to invalid IL or missing references) //IL_0073: Unknown result type (might be due to invalid IL or missing references) Vector3[] array = (Vector3[])(object)new Vector3[6] { Vector3.up, Vector3.down, Vector3.left, Vector3.right, Vector3.forward, Vector3.back }; Vector3[] array2 = array; RaycastHit val2 = default(RaycastHit); foreach (Vector3 val in array2) { if (!c.Raycast(new Ray(p - val * 1000f, val), ref val2, 1000f)) { return false; } } return true; } private static void FindClosestPoints(IList<Vector3> list, out int firstIndex, out int secondIndex) { //IL_0021: Unknown result type (might be due to invalid IL or missing references) //IL_0028: Unknown result type (might be due to invalid IL or missing references) float num = float.MaxValue; float num2 = float.MinValue; firstIndex = 0; secondIndex = 1; for (int i = 0; i < list.Count - 1; i++) { for (int j = i + 1; j < list.Count; j++) { float num3 = Vector3.Distance(list[i], list[j]); if (num3 < num) { num = num3; firstIndex = i; secondIndex = j; } if (num3 > num2) { num2 = num3; } } } } private static void WeldPoints(IList<Vector3> list, int targetCount) { //IL_0028: Unknown result type (might be due to invalid IL or missing references) //IL_002f: 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_003e: 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) //IL_0055: Unknown result type (might be due to invalid IL or missing references) if (list.Count > 2 && targetCount >= 2) { while (list.Count > targetCount) { FindClosestPoints(list, out var firstIndex, out var secondIndex); Vector3 item = (list[firstIndex] + list[secondIndex]) * 0.5f; list.RemoveAt(secondIndex); list.RemoveAt(firstIndex); list.Add(item); } } } private void FixedUpdate() { //IL_0042: Unknown result type (might be due to invalid IL or missing references) //IL_0047: 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_004f: 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_005d: Unknown result type (might be due to invalid IL or missing references) //IL_018d: Unknown result type (might be due to invalid IL or missing references) //IL_0192: Unknown result type (might be due to invalid IL or missing references) //IL_0077: Unknown result type (might be due to invalid IL or missing references) //IL_007c: 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) //IL_0086: Unknown result type (might be due to invalid IL or missing references) //IL_008b: Unknown result type (might be due to invalid IL or missing references) //IL_008d: Unknown result type (might be due to invalid IL or missing references) //IL_008f: Unknown result type (might be due to invalid IL or missing references) //IL_0099: 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_00ae: Unknown result type (might be due to invalid IL or missing references) //IL_00b0: Unknown result type (might be due to invalid IL or missing references) //IL_00b7: Unknown result type (might be due to invalid IL or missing references) //IL_019b: Unknown result type (might be due to invalid IL or missing references) //IL_019d: Unknown result type (might be due to invalid IL or missing references) //IL_01bf: Unknown result type (might be due to invalid IL or missing references) //IL_01c1: Unknown result type (might be due to invalid IL or missing references) //IL_01c8: Unknown result type (might be due to invalid IL or missing references) //IL_01ca: Unknown result type (might be due to invalid IL or missing references) //IL_0101: Unknown result type (might be due to invalid IL or missing references) //IL_010b: Unknown result type (might be due to invalid IL or missing references) //IL_0110: Unknown result type (might be due to invalid IL or missing references) //IL_0115: Unknown result type (might be due to invalid IL or missing references) //IL_011a: Unknown result type (might be due to invalid IL or missing references) //IL_0123: Unknown result type (might be due to invalid IL or missing references) //IL_0128: 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) //IL_0158: Unknown result type (might be due to invalid IL or missing references) //IL_017b: Unknown result type (might be due to invalid IL or missing references) //IL_017d: Unknown result type (might be due to invalid IL or missing references) //IL_00f2: Unknown result type (might be due to invalid IL or missing references) //IL_00f9: Unknown result type (might be due to invalid IL or missing references) //IL_00fe: Unknown result type (might be due to invalid IL or missing references) WaterSystem currentWater = KW_WaterDynamicScripts.GetCurrentWater(); if ((Object)(object)currentWater == (Object)null) { return; } if (DebugForces) { debugForces.Clear(); } for (int i = 0; i < voxels.Count; i++) { Vector3 val = ((Component)this).transform.TransformPoint(voxels[i]); KW_WaterSurfaceData? waterSurfacePositionNormal = currentWater.GetWaterSurfacePositionNormal(val); Vector3 zero = Vector3.zero; if (waterSurfacePositionNormal.HasValue) { Vector3 position = waterSurfacePositionNormal.Value.Position; Vector3 pointVelocity = rigidBody.GetPointVelocity(val); Vector3 val2 = -pointVelocity * 0.1f * rigidBody.mass; float num = position.y - val.y; if (num > 1f) { num = 1f; } else if (num < 0f) { num = 0f; val2 *= 0.2f; } zero = val2 + Mathf.Sqrt(num) * localArchimedesForce; Vector3 normal = waterSurfacePositionNormal.Value.Normal; zero.x += normal.x * NormalForce * rigidBody.mass; zero.z += normal.z * NormalForce * rigidBody.mass; currentForces[i] = zero; } else { zero = currentForces[i]; } rigidBody.AddForceAtPosition(zero, val); if (DebugForces) { debugForces.Add((Vector3[])(object)new Vector3[2] { val, zero }); } } } private void OnDrawGizmos() { //IL_003e: 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_005f: 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_006a: Unknown result type (might be due to invalid IL or missing references) //IL_0072: 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_00c0: Unknown result type (might be due to invalid IL or missing references) //IL_00c8: Unknown result type (might be due to invalid IL or missing references) //IL_00d6: 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_00ee: Unknown result type (might be due to invalid IL or missing references) //IL_00f9: Unknown result type (might be due to invalid IL or missing references) //IL_0103: Unknown result type (might be due to invalid IL or missing references) if (!DebugForces || voxels == null || debugForces == null) { return; } float num = 0.02f * bounceMaxSize; Gizmos.color = Color.yellow; foreach (Vector3 voxel in voxels) { Gizmos.DrawCube(((Component)this).transform.TransformPoint(voxel), new Vector3(num, num, num)); } Gizmos.color = Color.cyan; foreach (Vector3[] debugForce in debugForces) { Gizmos.DrawCube(debugForce[0], new Vector3(num, num, num)); Gizmos.DrawRay(debugForce[0], debugForce[1] / rigidBody.mass * bounceMaxSize * 0.25f); } } } public class KW_CameraColorTexture : MonoBehaviour { public RenderTexture CameraColorTexture; public RenderTexture CameraColorTexture_Blured; public RenderTexture CameraColorTextureFinal; private string cb_Name = "CopyColorTexture"; private string cbFinal_Name = "CopyColorTextureFinal"; private CommandBuffer cb; private CommandBuffer cbFinal; private void OnDisable() { if ((Object)(object)CameraColorTexture != (Object)null) { CameraColorTexture.Release(); } if ((Object)(object)CameraColorTexture_Blured != (Object)null) { CameraColorTexture_Blured.Release(); } if ((Object)(object)CameraColorTextureFinal != (Object)null) { CameraColorTextureFinal.Release(); } } public void Release() { OnDisable(); } private void InitializeTextures(int width, int height, bool useHDR) { //IL_0029: Unknown result type (might be due to invalid IL or missing references) //IL_0033: Expected O, but got Unknown //IL_005b: Unknown result type (might be due to invalid IL or missing references) //IL_0065: Expected O, but got Unknown if ((Object)(object)CameraColorTexture != (Object)null) { CameraColorTexture.Release(); } CameraColorTexture = new RenderTexture(width, height, 0, (RenderTextureFormat)(useHDR ? 9 : 7)); if ((Object)(object)CameraColorTexture_Blured != (Object)null) { CameraColorTexture_Blured.Release(); } CameraColorTexture_Blured = new RenderTexture(width, height, 0, (RenderTextureFormat)(useHDR ? 9 : 7)); } private void InitializeFinalTextures(int width, int height, bool useHDR) { //IL_0029: Unknown result type (might be due to invalid IL or missing references) //IL_0033: Expected O, but got Unknown //IL_0039: Unknown result type (might be due to invalid IL or missing references) if ((Object)(object)CameraColorTextureFinal != (Object)null) { CameraColorTextureFinal.Release(); } CameraColorTextureFinal = new RenderTexture(width, height, 0, (RenderTextureFormat)(useHDR ? 9 : 7)); Debug.Log((object)CameraColorTextureFinal.format); } public void RenderColorTexture(Camera currentCamera, bool useHDR, bool isScreenSpaceWaterRendering, Dictionary<CommandBuffer, CameraEvent> waterSharedBuffers) { //IL_0030: Unknown result type (might be due to invalid IL or missing references) //IL_0035: Unknown result type (might be due to invalid IL or missing references) //IL_0047: Expected O, but got Unknown //IL_0074: 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_009b: Unknown result type (might be due to invalid IL or missing references) if (cb == null || !waterSharedBuffers.ContainsKey(cb)) { if (cb == null) { cb = new CommandBuffer { name = cb_Name }; } else { cb.Clear(); } int pixelWidth = currentCamera.pixelWidth; int pixelHeight = currentCamera.pixelHeight; InitializeTextures(pixelWidth, pixelHeight, useHDR); cb.Blit(RenderTargetIdentifier.op_Implicit((BuiltinRenderTextureType)1), RenderTargetIdentifier.op_Implicit((Texture)(object)CameraColorTexture)); cb.SetGlobalTexture("_CameraColorTexture", RenderTargetIdentifier.op_Implicit((Texture)(object)CameraColorTexture)); waterSharedBuffers.Add(cb, (CameraEvent)(isScreenSpaceWaterRendering ? 17 : 16)); } } public void RenderColorTextureFinal(Camera currentCamera, bool useHDR, Dictionary<CommandBuffer, CameraEvent> waterSharedBuffers) { //IL_002f: 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_0046: Expected O, but got Unknown //IL_0073: 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_009a: Unknown result type (might be due to invalid IL or missing references) if (cbFinal == null || !waterSharedBuffers.ContainsKey(cbFinal)) { if (cbFinal == null) { cbFinal = new CommandBuffer { name = cbFinal_Name }; } else { cbFinal.Clear(); } int pixelWidth = currentCamera.pixelWidth; int pixelHeight = currentCamera.pixelHeight; InitializeFinalTextures(pixelWidth, pixelHeight, useHDR); cbFinal.Blit(RenderTargetIdentifier.op_Implicit((BuiltinRenderTextureType)1), RenderTargetIdentifier.op_Implicit((Texture)(object)CameraColorTextureFinal)); cbFinal.SetGlobalTexture("_CameraColorTextureFinal", RenderTargetIdentifier.op_Implicit((Texture)(object)CameraColorTextureFinal)); waterSharedBuffers.Add(cbFinal, (CameraEvent)19); } } } public class KW_CameraReflection_HDRP : MonoBehaviour { private class PlanarReflectionSettingData { private readonly bool _fog; private readonly int _maxLod; private readonly float _lodBias; public PlanarReflectionSettingData() { _fog = RenderSettings.fog; _maxLod = QualitySettings.maximumLODLevel; _lodBias = QualitySettings.lodBias; } public void Set() { RenderSettings.fog = false; QualitySettings.maximumLODLevel += 1; QualitySettings.lodBias = _lodBias * 0.5f; } public void Restore() { RenderSettings.fog = _fog; QualitySettings.maximumLODLevel = _maxLod; QualitySettings.lodBias = _lodBias; } } private GameObject reflCameraGO; private Camera reflectionCamera; public RenderTexture reflectionRT; public RenderTexture reflectionCubemapRT; public float m_ClipPlaneOffset = -0.05f; public float m_planeOffset = -0.05f; private float currentInterval = 0f; private int sideIdx = 0; private int[] cubeMapSides = new int[5] { 0, 1, 2, 4, 5 }; private bool requiredUpdateAllFaces = true; private int waterCullingMask = -17; private HDAdditionalCameraData hdData; private bool lastSkyFix; public void Release() { KW_Extensions.SafeDestroy((Object)reflCameraGO); KW_Extensions.ReleaseRenderTextures(reflectionRT, reflectionCubemapRT); currentInterval = 0f; requiredUpdateAllFaces = true; } private void OnDisable() { Release(); } private void InitializeReflectionTexture(int width, int height, bool useMip) { reflectionRT = KW_Extensions.ReinitializeRenderTexture(reflectionRT, width, height, 24, (RenderTextureFormat)9, null, useRandomWrite: false, useMip, (TextureWrapMode)0, (FilterMode)1); } private void InitializeCubemapTexture(int width, int height) { reflectionCubemapRT = KW_Extensions.ReinitializeRenderTexture(reflectionCubemapRT, width, height, 0, (RenderTextureFormat)2, null, useRandomWrite: false, useMipMap: false, (TextureWrapMode)0, (FilterMode)1); ((Texture)reflectionCubemapRT).dimension = (TextureDimension)4; } private void CreateCamera() { //IL_0007: Unknown result type (might be due to invalid IL or missing references) //IL_0011: Expected O, but got Unknown reflCameraGO = new GameObject("WaterReflectionCamera"); reflCameraGO.transform.parent = ((Component)this).transform; reflectionCamera = reflCameraGO.AddComponent<Camera>(); reflectionCamera.cameraType = (CameraType)16; ((Behaviour)reflectionCamera).enabled = false; reflectionCamera.allowMSAA = false; reflectionCamera.useOcclusionCulling = false; hdData = reflCameraGO.AddComponent<HDAdditionalCameraData>(); } private void CopyCameraParams(Camera currentCamera, int cullingMask) { //IL_0012: 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_0076: Unknown result type (might be due to invalid IL or missing references) //IL_00ac: Unknown result type (might be due to invalid IL or missing references) //IL_00dd: 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_0162: Unknown result type (might be due to invalid IL or missing references) //IL_012b: Unknown result type (might be due to invalid IL or missing references) //IL_013d: Unknown result type (might be due to invalid IL or missing references) //IL_014f: Unknown result type (might be due to invalid IL or missing references) ((Component)reflectionCamera).transform.position = ((Component)currentCamera).transform.position; ((Component)reflectionCamera).transform.rotation = ((Component)currentCamera).transform.rotation; reflectionCamera.fieldOfView = currentCamera.fieldOfView; reflectionCamera.nearClipPlane = currentCamera.nearClipPlane; reflectionCamera.farClipPlane = currentCamera.farClipPlane; reflectionCamera.rect = currentCamera.rect; reflectionCamera.aspect = currentCamera.aspect; reflectionCamera.orthographicSize = currentCamera.orthographicSize; reflectionCamera.renderingPath = currentCamera.renderingPath; reflectionCamera.allowDynamicResolution = currentCamera.allowDynamicResolution; reflectionCamera.cullingMask = cullingMask; reflectionCamera.clearFlags = currentCamera.clearFlags; reflectionCamera.backgroundColor = currentCamera.backgroundColor; if (currentCamera.usePhysicalProperties) { reflectionCamera.usePhysicalProperties = true; reflectionCamera.focalLength = currentCamera.focalLength; reflectionCamera.sensorSize = currentCamera.sensorSize; reflectionCamera.lensShift = currentCamera.lensShift; reflectionCamera.gateFit = currentCamera.gateFit; } hdData.defaultFrameSettings = (FrameSettingsRenderType)2; hdData.customRenderingSettings = true; hdData.hasPersistentHistory = true; hdData.invertFaceCulling = true; } private void RenderCamera(Camera currentCamera, Vector3 waterPosition, Matrix4x4 cameraMatrix) { //IL_0001: Unknown result type (might be due to invalid IL or missing references) //IL_0002: 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_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_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_0030: 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_003c: 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_004f: Unknown result type (might be due to invalid IL or missing references) //IL_0060: 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_006f: Unknown result type (might be due to invalid IL or missing references) //IL_0073: Unknown result type (might be due to invalid IL or missing references) //IL_008b: 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_00b5: Unknown result type (might be due to invalid IL or missing references) //IL_00ba: 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_00cb: Unknown result type (might be due to invalid IL or missing references) //IL_00dc: Unknown result type (might be due to invalid IL or missing references) //IL_00dd: Unknown result type (might be due to invalid IL or missing references) //IL_00df: Unknown result type (might be due to invalid IL or missing references) //IL_00f1: Unknown result type (might be due to invalid IL or missing references) //IL_00f2: Unknown result type (might be due to invalid IL or missing references) //IL_00fc: Unknown result type (might be due to invalid IL or missing references) //IL_0101: Unknown result type (might be due to invalid IL or missing references) //IL_0106: Unknown result type (might be due to invalid IL or missing references) //IL_010c: Unknown result type (might be due to invalid IL or missing references) //IL_0111: Unknown result type (might be due to invalid IL or missing references) //IL_0119: Unknown result type (might be due to invalid IL or missing references) //IL_011b: Unknown result type (might be due to invalid IL or missing references) //IL_0120: Unknown result type (might be due to invalid IL or missing references) //IL_0128: Unknown result type (might be due to invalid IL or missing references) Vector3 val = waterPosition + Vector3.up * m_planeOffset; Vector3 up = Vector3.up; float num = 0f - Vector3.Dot(up, val) - m_ClipPlaneOffset; Vector4 plane = default(Vector4); ((Vector4)(ref plane))..ctor(up.x, up.y, up.z, num); Matrix4x4 reflectionMat = Matrix4x4.identity; reflectionMat *= Matrix4x4.Scale(new Vector3(1f, -1f, 1f)); CalculateReflectionMatrix(ref reflectionMat, plane); ((Component)reflectionCamera).transform.forward = Vector3.Scale(((Component)currentCamera).transform.forward, new Vector3(1f, -1f, 1f)); Vector3 position = ((Component)currentCamera).transform.position; ((Component)reflectionCamera).transform.position = ((Matrix4x4)(ref reflectionMat)).MultiplyPoint(position); reflectionCamera.worldToCameraMatrix = cameraMatrix * reflectionMat; Vector4 val2 = CameraSpacePlane(reflectionCamera, val - Vector3.up * 0.1f, up, 1f); Matrix4x4 projectionMatrix = reflectionCamera.CalculateObliqueMatrix(val2); reflectionCamera.projectionMatrix = projectionMatrix; PlanarReflectionSettingData planarReflectionSettingData = new PlanarReflectionSettingData(); planarReflectionSettingData.Set(); try { reflectionCamera.targetTexture = reflectionRT; KW_Extensions.CameraRender(reflectionCamera); } finally { planarReflectionSettingData.Restore(); } } public void RenderPlanar(Camera currentCamera, Vector3 waterPosition, float resolutionScale, bool useSkyFix, List<Material> waterShaderMaterials) { //IL_0064: Unknown result type (might be due to invalid IL or missing references) //IL_0066: Unknown result type (might be due to invalid IL or missing references) if ((Object)(object)currentCamera == (Object)null) { return; } if ((Object)(object)reflCameraGO == (Object)null) { CreateCamera(); } CopyCameraParams(currentCamera, waterCullingMask); UseSkyFix(currentCamera, useSkyFix); int width = (int)((float)currentCamera.pixelWidth * resolutionScale); int height = (int)((float)currentCamera.pixelHeight * resolutionScale); InitializeReflectionTexture(width, height, useMip: true); RenderCamera(currentCamera, waterPosition, currentCamera.worldToCameraMatrix); foreach (Material waterShaderMaterial in waterShaderMaterials) { if (!((Object)(object)waterShaderMaterial == (Object)null)) { waterShaderMaterial.SetTexture("KW_PlanarReflection", (Texture)(object)reflectionRT); } } } public void RenderCubemap(Camera currentCamera, Vector3 waterPosition, float interval, int cullingMask, int texSize, bool useSkyFix, List<Material> waterShaderMaterials) { //IL_0113: Unknown result type (might be due to invalid IL or missing references) //IL_011d: Unknown result type (might be due to invalid IL or missing references) //IL_0127: 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_013b: Unknown result type (might be due to invalid IL or missing references) //IL_017d: Unknown result type (might be due to invalid IL or missing references) if ((Object)(object)currentCamera == (Object)null) { return; } currentInterval += KW_Extensions.DeltaTime(); if (lastSkyFix != useSkyFix) { requiredUpdateAllFaces = true; } if (!requiredUpdateAllFaces && currentInterval < interval / 6f) { return; } currentInterval = 0f; if ((Object)(object)reflCameraGO == (Object)null) { CreateCamera(); } CopyCameraParams(currentCamera, cullingMask); UseSkyFix(currentCamera, useSkyFix); InitializeReflectionTexture(texSize, texSize, useMip: false); InitializeCubemapTexture(texSize, texSize); float fieldOfView = currentCamera.fieldOfView; float aspect = currentCamera.aspect; reflectionCamera.fieldOfView = 90f; reflectionCamera.aspect = 1f; m_planeOffset = 0f; m_ClipPlaneOffset = 0f; if (requiredUpdateAllFaces || interval < 0.0001f) { RenderToCubemapFace(currentCamera, waterPosition, (CubemapFace)1); RenderToCubemapFace(currentCamera, waterPosition, (CubemapFace)5); RenderToCubemapFace(currentCamera, waterPosition, (CubemapFace)0); RenderToCubemapFace(currentCamera, waterPosition, (CubemapFace)2); RenderToCubemapFace(currentCamera, waterPosition, (CubemapFace)4); } else { int num = cubeMapSides[sideIdx]; sideIdx = ((sideIdx < 4) ? (++sideIdx) : 0); RenderToCubemapFace(currentCamera, waterPosition, (CubemapFace)num); } requiredUpdateAllFaces = false; foreach (Material waterShaderMaterial in waterShaderMaterials) { if (!((Object)(object)waterShaderMaterial == (Object)null)) { waterShaderMaterial.SetTexture("KW_ReflectionCube", (Texture)(object)reflectionCubemapRT); } } } private void UseSkyFix(Camera currentCamera, bool useSkyFix) { //IL_000e: Unknown result type (might be due to invalid IL or missing references) //IL_0019: 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_0075: 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) //IL_0061: Unknown result type (might be due to invalid IL or missing references) //IL_0066: Unknown result type (might be due to invalid IL or missing references) if (useSkyFix) { hdData.clearColorMode = (ClearColorMode)1; hdData.backgroundColorHDR = Color.black; hdData.SetCameraFrameSetting((FrameSettingsField)27, enabled: false); } else { HDAdditionalCameraData component = ((Component)currentCamera).GetComponent<HDAdditionalCameraData>(); if ((Object)(object)component != (Object)null) { hdData.clearColorMode = component.clearColorMode; hdData.backgroundColorHDR = component.backgroundColorHDR; } else { hdData.clearColorMode = (ClearColorMode)0; } hdData.SetCameraFrameSetting((FrameSettingsField)27, enabled: true); } lastSkyFix = useSkyFix; } private void RenderToCubemapFace(Camera currentCamera, Vector3 waterPosition, CubemapFace face) { //IL_0007: Unknown result type (might be due to invalid IL or missing references) //IL_000c: 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_0010: 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_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_0033: 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_0037: 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_0051: Expected I4, but got Unknown Vector3 position = ((Component)currentCamera).transform.position; Matrix4x4 cameraMatrix = Matrix4x4.Inverse(Matrix4x4.TRS(position, GetRotationByCubeFace(face), new Vector3(1f, 1f, -1f))); RenderCamera(currentCamera, waterPosition, cameraMatrix); Graphics.CopyTexture((Texture)(object)reflectionRT, 0, (Texture)(object)reflectionCubemapRT, (int)face); } private Quaternion GetRotationByCubeFace(CubemapFace face) { //IL_0001: Unknown result type (might be due to invalid IL or missing references) //IL_0002: Unknown result type (might be due to invalid IL or missing references) //IL_0003: Unknown result type (might be due to invalid IL or missing references) //IL_0004: Unknown result type (might be due to invalid IL or missing references) //IL_0005: Unknown result type (might be due to invalid IL or missing references) //IL_0023: Expected I4, but got Unknown //IL_004e: 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_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_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_007c: 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) //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_00aa: Unknown result type (might be due to invalid IL or missing references) //IL_00af: Unknown result type (might be due to invalid IL or missing references) //IL_00ba: Unknown result type (might be due to invalid IL or missing references) //IL_00b2: Unknown result type (might be due to invalid IL or missing references) //IL_00b7: Unknown result type (might be due to invalid IL or missing references) return (Quaternion)((int)face switch { 1 => Quaternion.Euler(0f, -90f, 0f), 0 => Quaternion.Euler(0f, 90f, 0f), 2 => Quaternion.Euler(90f, 0f, 0f), 3 => Quaternion.Euler(-90f, 0f, 0f), 4 => Quaternion.Euler(0f, 0f, 0f), 5 => Quaternion.Euler(0f, -180f, 0f), _ => Quaternion.identity, }); } private static float sgn(float a) { if (a > 0f) { return 1f; } if (a < 0f) { return -1f; } return 0f; } private static Vector3 ReflectPosition(Vector3 pos) { //IL_0003: Unknown result type (might be due to invalid IL or missing references) //IL_0009: 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_001b: 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_001f: Unknown result type (might be due to invalid IL or missing references) Vector3 result = default(Vector3); ((Vector3)(ref result))..ctor(pos.x, 0f - pos.y, pos.z); return result; } private Vector4 CameraSpacePlane(Camera cam, Vector3 pos, Vector3 normal, float sideSign) { //IL_0001: Unknown result type (might be due to invalid IL or missing references) //IL_0002: Unknown result type (might be due to invalid IL or missing references) //IL_0009: Unknown result type (might be due to invalid IL or missing references) //IL_000e: Unknown result type (might be due to invalid IL or missing references) //IL_0013: 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_001a: 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_0023: 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_0027: 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) //IL_0030: 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_003d: 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) //IL_0049: 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_0050: Unknown result type (might be due to invalid IL or missing references) //IL_0057: 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_0060: Unknown result type (might be due to invalid IL or missing references) Vector3 val = pos + normal * m_ClipPlaneOffset; Matrix4x4 worldToCameraMatrix = cam.worldToCameraMatrix; Vector3 val2 = ((Matrix4x4)(ref worldToCameraMatrix)).MultiplyPoint(val); Vector3 val3 = ((Matrix4x4)(ref worldToCameraMatrix)).MultiplyVector(normal); Vector3 val4 = ((Vector3)(ref val3)).normalized * sideSign; return new Vector4(val4.x, val4.y, val4.z, 0f - Vector3.Dot(val2, val4)); } private static void CalculateReflectionMatrix(ref Matrix4x4 reflectionMat, Vector4 plane) { reflectionMat.m00 = 1f - 2f * ((Vector4)(ref plane))[0] * ((Vector4)(ref plane))[0]; reflectionMat.m01 = -2f * ((Vector4)(ref plane))[0] * ((Vector4)(ref plane))[1]; reflectionMat.m02 = -2f * ((Vector4)(ref plane))[0] * ((Vector4)(ref plane))[2]; reflectionMat.m03 = -2f * ((Vector4)(ref plane))[3] * ((Vector4)(ref plane))[0]; reflectionMat.m10 = -2f * ((Vector4)(ref plane))[1] * ((Vector4)(ref plane))[0]; reflectionMat.m11 = 1f - 2f * ((Vector4)(ref plane))[1] * ((Vector4)(ref plane))[1]; reflectionMat.m12 = -2f * ((Vector4)(ref plane))[1] * ((Vector4)(ref plane))[2]; reflectionMat.m13 = -2f * ((Vector4)(ref plane))[3] * ((Vector4)(ref plane))[1]; reflectionMat.m20 = -2f * ((Vector4)(ref plane))[2] * ((Vector4)(ref plane))[0]; reflectionMat.m21 = -2f * ((Vector4)(ref plane))[2] * ((Vector4)(ref plane))[1]; reflectionMat.m22 = 1f - 2f * ((Vector4)(ref plane))[2] * ((Vector4)(ref plane))[2]; reflectionMat.m23 = -2f * ((Vector4)(ref plane))[3] * ((Vector4)(ref plane))[2]; reflectionMat.m30 = 0f; reflectionMat.m31 = 0f; reflectionMat.m32 = 0f; reflectionMat.m33 = 1f; } } public class KW_CausticDecal_CustomPass : CustomPass { private string profilerTag; private Mesh decalMesh; private Material causticDecalMaterial; protected override void Setup(ScriptableRenderContext renderContext, CommandBuffer cmd) { ((CustomPass)this).name = "Water.CausticDecalCustomPass"; } public void UpdateParams() { WaterSystem currentWater = KW_WaterDynamicScripts.GetCurrentWater(); if ((Object)(object)causticDecalMaterial == (Object)null) { causticDecalMaterial = KW_Extensions.CreateMaterial(WaterShadersSingleton.Instance.CausticDecalShader); } if (!currentWater.waterSharedMaterials.Contains(causticDecalMaterial)) { currentWater.waterSharedMaterials.Add(causticDecalMaterial); } } protected override void Execute(CustomPassContext ctx) { //IL_0001: Unknown result type (might be due to invalid IL or missing references) //IL_0028: 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_004a: Unknown result type (might be due to invalid IL or missing references) //IL_0079: Unknown result type (might be due to invalid IL or missing references) //IL_007a: Unknown result type (might be due to invalid IL or missing references) //IL_0088: Unknown result type (might be due to invalid IL or missing references) //IL_008d: 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_00e2: Unknown result type (might be due to invalid IL or missing references) //IL_00f9: Unknown result type (might be due to invalid IL or missing references) //IL_00be: Unknown result type (might be due to invalid IL or missing references) //IL_00d2: Unknown result type (might be due to invalid IL or missing references) Camera camera = ctx.hdCamera.camera; WaterSystem currentWater = KW_WaterDynamicScripts.GetCurrentWater(); if (KW_Extensions.IsCanExecuteCameraBuffers(camera, currentWater)) { CommandBuffer cmd = ctx.cmd; UpdateParams(); Vector3 position = ((Component)camera).transform.position; position.y = ((Component)currentWater).transform.position.y - 20f; float num = ((Vector4)(ref KW_CausticRendering.LodSettings))[currentWater.CausticActiveLods - 1] * 2f; Matrix4x4 val = Matrix4x4.TRS(position, Quaternion.identity, new Vector3(num, 40f, num)); UpdateMaterialParams(currentWater); if ((Object)(object)decalMesh == (Object)null) { decalMesh = CoreUtils.CreateCubeMesh(new Vector3(-0.5f, -0.5f, -0.5f), new Vector3(0.5f, 0.5f, 0.5f)); } CoreUtils.SetRenderTarget(cmd, ctx.cameraColorBuffer, (ClearFlag)0, 0, (CubemapFace)(-1), -1); cmd.DrawMesh(decalMesh, val, causticDecalMaterial); } } private void UpdateMaterialParams(WaterSystem water) { causticDecalMaterial.SetFloat("KW_CaustisStrength", water.CausticStrength); float num = 1f - (float)(Mathf.RoundToInt(Mathf.Log((float)water.FFT_SimulationSize, 2f)) - 5) / 4f; if (water.UseCausticDispersion && num > 0.1f) { causticDecalMaterial.EnableKeyword("USE_DISPERSION"); num = Mathf.Lerp(num * 0.25f, num, (float)water.CausticTextureSize / 1024f); causticDecalMaterial.SetFloat("KW_CausticDispersionStrength", num); } else { causticDecalMaterial.DisableKeyword("USE_DISPERSION"); } } protected override void Cleanup() { KW_Extensions.SafeDestroy((Object)causticDecalMaterial); } public void Release() { ((CustomPass)this).Cleanup(); } } public class KW_CausticRendering : MonoBehaviour { public Texture2D depth_tex; public RenderTexture causticLod0; public RenderTexture causticLod1; public RenderTexture causticLod2; public RenderTexture causticLod3; public RenderTexture causticRT; private Material causticComputeMaterial; private Material causticDecalMaterial; private Mesh causticMesh; private Mesh decalMesh; private CommandBuffer cb; private const string path_causticFolder = "CausticMaps"; private const string path_causticDepthTexture = "KW_CausticDepthTexture"; private const string path_causticDepthData = "KW_CausticDepthData"; private int ID_KW_CausticDepth = Shader.PropertyToID("KW_CausticDepthTex"); private int ID_KW_CausticDepthOrthoSize = Shader.PropertyToID("KW_CausticDepthOrthoSize"); private int ID_KW_CausticDepthNearFarDistance = Shader.PropertyToID("KW_CausticDepth_Near_Far_Dist"); private int ID_KW_CausticDepthPos = Shader.PropertyToID("KW_CausticDepthPos"); private const int nearPlaneDepth = -2; private const int farPlaneDepth = 100; private int currentMeshResolution; private bool isDepthTextureInitialized; public static Vector4 LodSettings = new Vector4(10f, 20f, 40f, 80f); public void Release() { OnDisable(); } private void OnDisable() { KW_Extensions.SafeDestroy((Object)depth_tex, (Object)causticComputeMaterial, (Object)causticDecalMaterial, (Object)causticMesh, (Object)decalMesh); KW_Extensions.ReleaseRenderTextures(causticLod0, causticLod1, causticLod2, causticLod3, causticRT); currentMeshResolution = 0; isDepthTextureInitialized = false; Sh