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