Files
Dec2017-Script-Dump/Assembly-CSharp-firstpass/CinematicEffects/AmbientOcclusion.cs
T
2026-06-04 11:42:34 +02:00

515 lines
15 KiB
C#

using System;
using UnityEngine;
using UnityEngine.Rendering;
namespace UnityStandardAssets.CinematicEffects
{
// Token: 0x02000015 RID: 21
[ExecuteInEditMode]
[RequireComponent(typeof(Camera))]
[AddComponentMenu("Image Effects/Cinematic/Ambient Occlusion")]
[ImageEffectAllowedInSceneView]
public class AmbientOcclusion : MonoBehaviour
{
// Token: 0x17000013 RID: 19
// (get) Token: 0x06000036 RID: 54 RVA: 0x00002F05 File Offset: 0x00001305
public bool isAmbientOnlySupported
{
get
{
return this.targetCamera.allowHDR && this.occlusionSource == AmbientOcclusion.OcclusionSource.GBuffer;
}
}
// Token: 0x17000014 RID: 20
// (get) Token: 0x06000037 RID: 55 RVA: 0x00002F23 File Offset: 0x00001323
public bool isGBufferAvailable
{
get
{
return this.targetCamera.actualRenderingPath == RenderingPath.DeferredShading;
}
}
// Token: 0x17000015 RID: 21
// (get) Token: 0x06000038 RID: 56 RVA: 0x00002F33 File Offset: 0x00001333
private float intensity
{
get
{
return this.settings.intensity;
}
}
// Token: 0x17000016 RID: 22
// (get) Token: 0x06000039 RID: 57 RVA: 0x00002F40 File Offset: 0x00001340
private float radius
{
get
{
return Mathf.Max(this.settings.radius, 0.0001f);
}
}
// Token: 0x17000017 RID: 23
// (get) Token: 0x0600003A RID: 58 RVA: 0x00002F57 File Offset: 0x00001357
private AmbientOcclusion.SampleCount sampleCount
{
get
{
return this.settings.sampleCount;
}
}
// Token: 0x17000018 RID: 24
// (get) Token: 0x0600003B RID: 59 RVA: 0x00002F64 File Offset: 0x00001364
private int sampleCountValue
{
get
{
switch (this.settings.sampleCount)
{
case AmbientOcclusion.SampleCount.Lowest:
return 3;
case AmbientOcclusion.SampleCount.Low:
return 6;
case AmbientOcclusion.SampleCount.Medium:
return 12;
case AmbientOcclusion.SampleCount.High:
return 20;
default:
return Mathf.Clamp(this.settings.sampleCountValue, 1, 256);
}
}
}
// Token: 0x17000019 RID: 25
// (get) Token: 0x0600003C RID: 60 RVA: 0x00002FB8 File Offset: 0x000013B8
private AmbientOcclusion.OcclusionSource occlusionSource
{
get
{
if (this.settings.occlusionSource == AmbientOcclusion.OcclusionSource.GBuffer && !this.isGBufferAvailable)
{
return AmbientOcclusion.OcclusionSource.DepthNormalsTexture;
}
return this.settings.occlusionSource;
}
}
// Token: 0x1700001A RID: 26
// (get) Token: 0x0600003D RID: 61 RVA: 0x00002FE3 File Offset: 0x000013E3
private bool downsampling
{
get
{
return this.settings.downsampling;
}
}
// Token: 0x1700001B RID: 27
// (get) Token: 0x0600003E RID: 62 RVA: 0x00002FF0 File Offset: 0x000013F0
private bool ambientOnly
{
get
{
return this.settings.ambientOnly && this.isAmbientOnlySupported;
}
}
// Token: 0x1700001C RID: 28
// (get) Token: 0x0600003F RID: 63 RVA: 0x0000300B File Offset: 0x0000140B
private Shader aoShader
{
get
{
if (this._aoShader == null)
{
this._aoShader = Shader.Find("Hidden/Image Effects/Cinematic/AmbientOcclusion");
}
return this._aoShader;
}
}
// Token: 0x1700001D RID: 29
// (get) Token: 0x06000040 RID: 64 RVA: 0x00003034 File Offset: 0x00001434
private Material aoMaterial
{
get
{
if (this._aoMaterial == null)
{
this._aoMaterial = ImageEffectHelper.CheckShaderAndCreateMaterial(this.aoShader);
}
return this._aoMaterial;
}
}
// Token: 0x1700001E RID: 30
// (get) Token: 0x06000041 RID: 65 RVA: 0x0000305E File Offset: 0x0000145E
private CommandBuffer aoCommands
{
get
{
if (this._aoCommands == null)
{
this._aoCommands = new CommandBuffer();
this._aoCommands.name = "AmbientOcclusion";
}
return this._aoCommands;
}
}
// Token: 0x1700001F RID: 31
// (get) Token: 0x06000042 RID: 66 RVA: 0x0000308C File Offset: 0x0000148C
private Camera targetCamera
{
get
{
return base.GetComponent<Camera>();
}
}
// Token: 0x17000020 RID: 32
// (get) Token: 0x06000043 RID: 67 RVA: 0x00003094 File Offset: 0x00001494
// (set) Token: 0x06000044 RID: 68 RVA: 0x0000309C File Offset: 0x0000149C
private AmbientOcclusion.PropertyObserver propertyObserver { get; set; }
// Token: 0x17000021 RID: 33
// (get) Token: 0x06000045 RID: 69 RVA: 0x000030A5 File Offset: 0x000014A5
private Mesh quadMesh
{
get
{
return this._quadMesh;
}
}
// Token: 0x06000046 RID: 70 RVA: 0x000030B0 File Offset: 0x000014B0
private void BuildAOCommands()
{
CommandBuffer aoCommands = this.aoCommands;
int pixelWidth = this.targetCamera.pixelWidth;
int pixelHeight = this.targetCamera.pixelHeight;
int num = ((!this.downsampling) ? 1 : 2);
RenderTextureFormat renderTextureFormat = RenderTextureFormat.R8;
RenderTextureReadWrite renderTextureReadWrite = RenderTextureReadWrite.Linear;
FilterMode filterMode = FilterMode.Bilinear;
Material aoMaterial = this.aoMaterial;
int num2 = Shader.PropertyToID("_OcclusionTexture");
aoCommands.GetTemporaryRT(num2, pixelWidth / num, pixelHeight / num, 0, filterMode, renderTextureFormat, renderTextureReadWrite);
aoCommands.Blit(null, num2, aoMaterial, 0);
int num3 = Shader.PropertyToID("_OcclusionBlurTexture");
aoCommands.GetTemporaryRT(num3, pixelWidth, pixelHeight, 0, filterMode, renderTextureFormat, renderTextureReadWrite);
aoCommands.SetGlobalVector("_BlurVector", Vector2.right * 2f);
aoCommands.Blit(num2, num3, aoMaterial, 1);
aoCommands.ReleaseTemporaryRT(num2);
aoCommands.GetTemporaryRT(num2, pixelWidth, pixelHeight, 0, filterMode, renderTextureFormat, renderTextureReadWrite);
aoCommands.SetGlobalVector("_BlurVector", Vector2.up * 2f * (float)num);
aoCommands.Blit(num3, num2, aoMaterial, 1);
aoCommands.ReleaseTemporaryRT(num3);
aoCommands.GetTemporaryRT(num3, pixelWidth, pixelHeight, 0, filterMode, renderTextureFormat, renderTextureReadWrite);
aoCommands.SetGlobalVector("_BlurVector", Vector2.right * (float)num);
aoCommands.Blit(num2, num3, aoMaterial, 2);
aoCommands.ReleaseTemporaryRT(num2);
aoCommands.GetTemporaryRT(num2, pixelWidth, pixelHeight, 0, filterMode, renderTextureFormat, renderTextureReadWrite);
aoCommands.SetGlobalVector("_BlurVector", Vector2.up * (float)num);
aoCommands.Blit(num3, num2, aoMaterial, 2);
aoCommands.ReleaseTemporaryRT(num3);
RenderTargetIdentifier[] array = new RenderTargetIdentifier[]
{
BuiltinRenderTextureType.GBuffer0,
BuiltinRenderTextureType.CameraTarget
};
aoCommands.SetRenderTarget(array, BuiltinRenderTextureType.CameraTarget);
aoCommands.SetGlobalTexture("_OcclusionTexture", num2);
aoCommands.DrawMesh(this.quadMesh, Matrix4x4.identity, aoMaterial, 0, 4);
aoCommands.ReleaseTemporaryRT(num2);
}
// Token: 0x06000047 RID: 71 RVA: 0x000032E8 File Offset: 0x000016E8
private void ExecuteAOPass(RenderTexture source, RenderTexture destination)
{
int width = source.width;
int height = source.height;
int num = ((!this.downsampling) ? 1 : 2);
RenderTextureFormat renderTextureFormat = RenderTextureFormat.R8;
RenderTextureReadWrite renderTextureReadWrite = RenderTextureReadWrite.Linear;
Material aoMaterial = this.aoMaterial;
RenderTexture renderTexture = RenderTexture.GetTemporary(width / num, height / num, 0, renderTextureFormat, renderTextureReadWrite);
Graphics.Blit(null, renderTexture, aoMaterial, 0);
RenderTexture renderTexture2 = RenderTexture.GetTemporary(width, height, 0, renderTextureFormat, renderTextureReadWrite);
aoMaterial.SetVector("_BlurVector", Vector2.right * 2f);
Graphics.Blit(renderTexture, renderTexture2, aoMaterial, 1);
RenderTexture.ReleaseTemporary(renderTexture);
renderTexture = RenderTexture.GetTemporary(width, height, 0, renderTextureFormat, renderTextureReadWrite);
aoMaterial.SetVector("_BlurVector", Vector2.up * 2f * (float)num);
Graphics.Blit(renderTexture2, renderTexture, aoMaterial, 1);
RenderTexture.ReleaseTemporary(renderTexture2);
renderTexture2 = RenderTexture.GetTemporary(width, height, 0, renderTextureFormat, renderTextureReadWrite);
aoMaterial.SetVector("_BlurVector", Vector2.right * (float)num);
Graphics.Blit(renderTexture, renderTexture2, aoMaterial, 2);
RenderTexture.ReleaseTemporary(renderTexture);
renderTexture = RenderTexture.GetTemporary(width, height, 0, renderTextureFormat, renderTextureReadWrite);
aoMaterial.SetVector("_BlurVector", Vector2.up * (float)num);
Graphics.Blit(renderTexture2, renderTexture, aoMaterial, 2);
RenderTexture.ReleaseTemporary(renderTexture2);
aoMaterial.SetTexture("_OcclusionTexture", renderTexture);
if (!this.settings.debug)
{
Graphics.Blit(source, destination, aoMaterial, 3);
}
else
{
Graphics.Blit(source, destination, aoMaterial, 5);
}
RenderTexture.ReleaseTemporary(renderTexture);
}
// Token: 0x06000048 RID: 72 RVA: 0x00003480 File Offset: 0x00001880
private void UpdateMaterialProperties()
{
Material aoMaterial = this.aoMaterial;
aoMaterial.shaderKeywords = null;
aoMaterial.SetFloat("_Intensity", this.intensity);
aoMaterial.SetFloat("_Radius", this.radius);
aoMaterial.SetFloat("_TargetScale", (!this.downsampling) ? 1f : 0.5f);
if (this.occlusionSource == AmbientOcclusion.OcclusionSource.GBuffer)
{
aoMaterial.EnableKeyword("_SOURCE_GBUFFER");
}
else if (this.occlusionSource == AmbientOcclusion.OcclusionSource.DepthTexture)
{
aoMaterial.EnableKeyword("_SOURCE_DEPTH");
}
else
{
aoMaterial.EnableKeyword("_SOURCE_DEPTHNORMALS");
}
if (this.sampleCount == AmbientOcclusion.SampleCount.Lowest)
{
aoMaterial.EnableKeyword("_SAMPLECOUNT_LOWEST");
}
else
{
aoMaterial.SetInt("_SampleCount", this.sampleCountValue);
}
}
// Token: 0x06000049 RID: 73 RVA: 0x00003550 File Offset: 0x00001950
private void OnEnable()
{
if (!ImageEffectHelper.IsSupported(this.aoShader, true, false, this))
{
base.enabled = false;
return;
}
if (this.ambientOnly)
{
this.targetCamera.AddCommandBuffer(CameraEvent.BeforeReflections, this.aoCommands);
}
if (this.occlusionSource == AmbientOcclusion.OcclusionSource.DepthTexture)
{
this.targetCamera.depthTextureMode |= DepthTextureMode.Depth;
}
if (this.occlusionSource != AmbientOcclusion.OcclusionSource.GBuffer)
{
this.targetCamera.depthTextureMode |= DepthTextureMode.DepthNormals;
}
}
// Token: 0x0600004A RID: 74 RVA: 0x000035D4 File Offset: 0x000019D4
private void OnDisable()
{
if (this._aoMaterial != null)
{
global::UnityEngine.Object.DestroyImmediate(this._aoMaterial);
}
this._aoMaterial = null;
if (this._aoCommands != null)
{
this.targetCamera.RemoveCommandBuffer(CameraEvent.BeforeReflections, this._aoCommands);
}
this._aoCommands = null;
}
// Token: 0x0600004B RID: 75 RVA: 0x0000362C File Offset: 0x00001A2C
private void Update()
{
if (this.propertyObserver.CheckNeedsReset(this.settings, this.targetCamera))
{
this.OnDisable();
this.OnEnable();
if (this.ambientOnly)
{
this.aoCommands.Clear();
this.BuildAOCommands();
}
this.propertyObserver.Update(this.settings, this.targetCamera);
}
if (this.ambientOnly)
{
this.UpdateMaterialProperties();
}
}
// Token: 0x0600004C RID: 76 RVA: 0x000036AB File Offset: 0x00001AAB
[ImageEffectOpaque]
private void OnRenderImage(RenderTexture source, RenderTexture destination)
{
if (this.ambientOnly)
{
Graphics.Blit(source, destination);
}
else
{
this.UpdateMaterialProperties();
this.ExecuteAOPass(source, destination);
}
}
// Token: 0x04000048 RID: 72
[SerializeField]
public AmbientOcclusion.Settings settings = AmbientOcclusion.Settings.defaultSettings;
// Token: 0x04000049 RID: 73
[SerializeField]
private Shader _aoShader;
// Token: 0x0400004A RID: 74
private Material _aoMaterial;
// Token: 0x0400004B RID: 75
private CommandBuffer _aoCommands;
// Token: 0x0400004D RID: 77
[SerializeField]
private Mesh _quadMesh;
// Token: 0x02000016 RID: 22
private struct PropertyObserver
{
// Token: 0x0600004D RID: 77 RVA: 0x000036D4 File Offset: 0x00001AD4
public bool CheckNeedsReset(AmbientOcclusion.Settings setting, Camera camera)
{
return this._downsampling != setting.downsampling || this._occlusionSource != setting.occlusionSource || this._ambientOnly != setting.ambientOnly || this._pixelWidth != camera.pixelWidth || this._pixelHeight != camera.pixelHeight;
}
// Token: 0x0600004E RID: 78 RVA: 0x00003739 File Offset: 0x00001B39
public void Update(AmbientOcclusion.Settings setting, Camera camera)
{
this._downsampling = setting.downsampling;
this._occlusionSource = setting.occlusionSource;
this._ambientOnly = setting.ambientOnly;
this._pixelWidth = camera.pixelWidth;
this._pixelHeight = camera.pixelHeight;
}
// Token: 0x0400004E RID: 78
private bool _downsampling;
// Token: 0x0400004F RID: 79
private AmbientOcclusion.OcclusionSource _occlusionSource;
// Token: 0x04000050 RID: 80
private bool _ambientOnly;
// Token: 0x04000051 RID: 81
private int _pixelWidth;
// Token: 0x04000052 RID: 82
private int _pixelHeight;
}
// Token: 0x02000017 RID: 23
public enum SampleCount
{
// Token: 0x04000054 RID: 84
Lowest,
// Token: 0x04000055 RID: 85
Low,
// Token: 0x04000056 RID: 86
Medium,
// Token: 0x04000057 RID: 87
High,
// Token: 0x04000058 RID: 88
Variable
}
// Token: 0x02000018 RID: 24
public enum OcclusionSource
{
// Token: 0x0400005A RID: 90
DepthTexture,
// Token: 0x0400005B RID: 91
DepthNormalsTexture,
// Token: 0x0400005C RID: 92
GBuffer
}
// Token: 0x02000019 RID: 25
[Serializable]
public class Settings
{
// Token: 0x17000022 RID: 34
// (get) Token: 0x06000050 RID: 80 RVA: 0x00003780 File Offset: 0x00001B80
public static AmbientOcclusion.Settings defaultSettings
{
get
{
return new AmbientOcclusion.Settings
{
intensity = 1f,
radius = 0.3f,
sampleCount = AmbientOcclusion.SampleCount.Medium,
sampleCountValue = 24,
downsampling = false,
ambientOnly = false,
occlusionSource = AmbientOcclusion.OcclusionSource.DepthNormalsTexture
};
}
}
// Token: 0x0400005D RID: 93
[SerializeField]
[Range(0f, 4f)]
[Tooltip("Degree of darkness produced by the effect.")]
public float intensity;
// Token: 0x0400005E RID: 94
[SerializeField]
[Tooltip("Radius of sample points, which affects extent of darkened areas.")]
public float radius;
// Token: 0x0400005F RID: 95
[SerializeField]
[Tooltip("Number of sample points, which affects quality and performance.")]
public AmbientOcclusion.SampleCount sampleCount;
// Token: 0x04000060 RID: 96
[SerializeField]
[Tooltip("Determines the sample count when SampleCount.Variable is used.")]
public int sampleCountValue;
// Token: 0x04000061 RID: 97
[SerializeField]
[Tooltip("Halves the resolution of the effect to increase performance.")]
public bool downsampling;
// Token: 0x04000062 RID: 98
[SerializeField]
[Tooltip("If checked, the effect only affects ambient lighting.")]
public bool ambientOnly;
// Token: 0x04000063 RID: 99
[SerializeField]
[Tooltip("Source buffer on which the occlusion estimator is based.")]
public AmbientOcclusion.OcclusionSource occlusionSource;
// Token: 0x04000064 RID: 100
[SerializeField]
public bool debug;
}
}
}