summaryrefslogtreecommitdiff
path: root/Valheim_r202102_v0.141.2/Valheim/assembly_postprocessing/UnityEngine.PostProcessing/DepthOfFieldComponent.cs
diff options
context:
space:
mode:
Diffstat (limited to 'Valheim_r202102_v0.141.2/Valheim/assembly_postprocessing/UnityEngine.PostProcessing/DepthOfFieldComponent.cs')
-rw-r--r--Valheim_r202102_v0.141.2/Valheim/assembly_postprocessing/UnityEngine.PostProcessing/DepthOfFieldComponent.cs155
1 files changed, 155 insertions, 0 deletions
diff --git a/Valheim_r202102_v0.141.2/Valheim/assembly_postprocessing/UnityEngine.PostProcessing/DepthOfFieldComponent.cs b/Valheim_r202102_v0.141.2/Valheim/assembly_postprocessing/UnityEngine.PostProcessing/DepthOfFieldComponent.cs
new file mode 100644
index 0000000..787f3ff
--- /dev/null
+++ b/Valheim_r202102_v0.141.2/Valheim/assembly_postprocessing/UnityEngine.PostProcessing/DepthOfFieldComponent.cs
@@ -0,0 +1,155 @@
+using System;
+
+namespace UnityEngine.PostProcessing;
+
+public sealed class DepthOfFieldComponent : PostProcessingComponentRenderTexture<DepthOfFieldModel>
+{
+ private static class Uniforms
+ {
+ internal static readonly int _DepthOfFieldTex = Shader.PropertyToID("_DepthOfFieldTex");
+
+ internal static readonly int _DepthOfFieldCoCTex = Shader.PropertyToID("_DepthOfFieldCoCTex");
+
+ internal static readonly int _Distance = Shader.PropertyToID("_Distance");
+
+ internal static readonly int _LensCoeff = Shader.PropertyToID("_LensCoeff");
+
+ internal static readonly int _MaxCoC = Shader.PropertyToID("_MaxCoC");
+
+ internal static readonly int _RcpMaxCoC = Shader.PropertyToID("_RcpMaxCoC");
+
+ internal static readonly int _RcpAspect = Shader.PropertyToID("_RcpAspect");
+
+ internal static readonly int _MainTex = Shader.PropertyToID("_MainTex");
+
+ internal static readonly int _CoCTex = Shader.PropertyToID("_CoCTex");
+
+ internal static readonly int _TaaParams = Shader.PropertyToID("_TaaParams");
+
+ internal static readonly int _DepthOfFieldParams = Shader.PropertyToID("_DepthOfFieldParams");
+ }
+
+ private const string k_ShaderString = "Hidden/Post FX/Depth Of Field";
+
+ private RenderTexture m_CoCHistory;
+
+ private const float k_FilmHeight = 0.024f;
+
+ public override bool active
+ {
+ get
+ {
+ if (base.model.enabled)
+ {
+ return !context.interrupted;
+ }
+ return false;
+ }
+ }
+
+ public override DepthTextureMode GetCameraFlags()
+ {
+ return DepthTextureMode.Depth;
+ }
+
+ private float CalculateFocalLength()
+ {
+ DepthOfFieldModel.Settings settings = base.model.settings;
+ if (!settings.useCameraFov)
+ {
+ return settings.focalLength / 1000f;
+ }
+ float num = context.camera.fieldOfView * ((float)Math.PI / 180f);
+ return 0.012f / Mathf.Tan(0.5f * num);
+ }
+
+ private float CalculateMaxCoCRadius(int screenHeight)
+ {
+ float num = (float)base.model.settings.kernelSize * 4f + 6f;
+ return Mathf.Min(0.05f, num / (float)screenHeight);
+ }
+
+ private bool CheckHistory(int width, int height)
+ {
+ if (m_CoCHistory != null && m_CoCHistory.IsCreated() && m_CoCHistory.width == width)
+ {
+ return m_CoCHistory.height == height;
+ }
+ return false;
+ }
+
+ private RenderTextureFormat SelectFormat(RenderTextureFormat primary, RenderTextureFormat secondary)
+ {
+ if (SystemInfo.SupportsRenderTextureFormat(primary))
+ {
+ return primary;
+ }
+ if (SystemInfo.SupportsRenderTextureFormat(secondary))
+ {
+ return secondary;
+ }
+ return RenderTextureFormat.Default;
+ }
+
+ public void Prepare(RenderTexture source, Material uberMaterial, bool antialiasCoC, Vector2 taaJitter, float taaBlending)
+ {
+ DepthOfFieldModel.Settings settings = base.model.settings;
+ RenderTextureFormat format = RenderTextureFormat.DefaultHDR;
+ RenderTextureFormat format2 = SelectFormat(RenderTextureFormat.R8, RenderTextureFormat.RHalf);
+ float num = CalculateFocalLength();
+ float num2 = Mathf.Max(settings.focusDistance, num);
+ float num3 = (float)source.width / (float)source.height;
+ float num4 = num * num / (settings.aperture * (num2 - num) * 0.024f * 2f);
+ float num5 = CalculateMaxCoCRadius(source.height);
+ Material material = context.materialFactory.Get("Hidden/Post FX/Depth Of Field");
+ material.SetFloat(Uniforms._Distance, num2);
+ material.SetFloat(Uniforms._LensCoeff, num4);
+ material.SetFloat(Uniforms._MaxCoC, num5);
+ material.SetFloat(Uniforms._RcpMaxCoC, 1f / num5);
+ material.SetFloat(Uniforms._RcpAspect, 1f / num3);
+ RenderTexture renderTexture = context.renderTextureFactory.Get(context.width, context.height, 0, format2, RenderTextureReadWrite.Linear);
+ Graphics.Blit(null, renderTexture, material, 0);
+ if (antialiasCoC)
+ {
+ material.SetTexture(Uniforms._CoCTex, renderTexture);
+ float z = (CheckHistory(context.width, context.height) ? taaBlending : 0f);
+ material.SetVector(Uniforms._TaaParams, new Vector3(taaJitter.x, taaJitter.y, z));
+ RenderTexture temporary = RenderTexture.GetTemporary(context.width, context.height, 0, format2);
+ Graphics.Blit(m_CoCHistory, temporary, material, 1);
+ context.renderTextureFactory.Release(renderTexture);
+ if (m_CoCHistory != null)
+ {
+ RenderTexture.ReleaseTemporary(m_CoCHistory);
+ }
+ renderTexture = (m_CoCHistory = temporary);
+ }
+ RenderTexture renderTexture2 = context.renderTextureFactory.Get(context.width / 2, context.height / 2, 0, format);
+ material.SetTexture(Uniforms._CoCTex, renderTexture);
+ Graphics.Blit(source, renderTexture2, material, 2);
+ RenderTexture renderTexture3 = context.renderTextureFactory.Get(context.width / 2, context.height / 2, 0, format);
+ Graphics.Blit(renderTexture2, renderTexture3, material, (int)(3 + settings.kernelSize));
+ Graphics.Blit(renderTexture3, renderTexture2, material, 7);
+ uberMaterial.SetVector(Uniforms._DepthOfFieldParams, new Vector3(num2, num4, num5));
+ if (context.profile.debugViews.IsModeActive(BuiltinDebugViewsModel.Mode.FocusPlane))
+ {
+ uberMaterial.EnableKeyword("DEPTH_OF_FIELD_COC_VIEW");
+ context.Interrupt();
+ }
+ else
+ {
+ uberMaterial.SetTexture(Uniforms._DepthOfFieldTex, renderTexture2);
+ uberMaterial.SetTexture(Uniforms._DepthOfFieldCoCTex, renderTexture);
+ uberMaterial.EnableKeyword("DEPTH_OF_FIELD");
+ }
+ context.renderTextureFactory.Release(renderTexture3);
+ }
+
+ public override void OnDisable()
+ {
+ if (m_CoCHistory != null)
+ {
+ RenderTexture.ReleaseTemporary(m_CoCHistory);
+ }
+ m_CoCHistory = null;
+ }
+}