Files
2025-05-21 20:40:04 +02:00

509 lines
14 KiB
C#

using System;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.Rendering;
using UnityStandardAssets.ImageEffects;
namespace cakeslice
{
// Token: 0x02000113 RID: 275
[DisallowMultipleComponent]
[RequireComponent(typeof(Camera))]
public class OutlineEffect : MonoBehaviour
{
// Token: 0x1700005D RID: 93
// (get) Token: 0x0600167A RID: 5754 RVA: 0x0019E65A File Offset: 0x0019C85A
// (set) Token: 0x0600167B RID: 5755 RVA: 0x0019E661 File Offset: 0x0019C861
public static OutlineEffect Instance { get; private set; }
// Token: 0x0600167C RID: 5756 RVA: 0x0019E669 File Offset: 0x0019C869
private Material GetMaterialFromID(int ID)
{
if (ID == 0)
{
return this.outline1Material;
}
if (ID == 1)
{
return this.outline2Material;
}
return this.outline3Material;
}
// Token: 0x0600167D RID: 5757 RVA: 0x0019E688 File Offset: 0x0019C888
private Material CreateMaterial(Color emissionColor)
{
Material material = new Material(this.outlineBufferShader);
material.SetColor("_Color", emissionColor);
material.SetInt("_SrcBlend", 5);
material.SetInt("_DstBlend", 10);
material.SetInt("_ZWrite", 0);
material.DisableKeyword("_ALPHATEST_ON");
material.EnableKeyword("_ALPHABLEND_ON");
material.DisableKeyword("_ALPHAPREMULTIPLY_ON");
material.renderQueue = 3000;
return material;
}
// Token: 0x0600167E RID: 5758 RVA: 0x0019E6FD File Offset: 0x0019C8FD
private void Awake()
{
if (OutlineEffect.Instance != null)
{
Object.Destroy(this);
throw new Exception("you can only have one outline camera in the scene");
}
if (this.blur)
{
this.blur.enabled = false;
}
OutlineEffect.Instance = this;
}
// Token: 0x0600167F RID: 5759 RVA: 0x0019E73C File Offset: 0x0019C93C
private void Start()
{
this.CreateMaterialsIfNeeded();
this.UpdateMaterialsPublicProperties();
if (!Records.x.editor)
{
this.turnOffOutlines = false;
}
if (this.sourceCamera == null)
{
this.sourceCamera = base.GetComponent<Camera>();
if (this.sourceCamera == null)
{
this.sourceCamera = Camera.main;
}
}
this.hovers = Links.x.cameraEffects.hovers;
this.hoverTypes = Links.x.cameraEffects.hoverTypes;
this.bubbles = Links.x.cameraEffects.bubbles;
this.bubbleTypes = Links.x.cameraEffects.bubbleTypes;
if (this.renderTexture != null)
{
this.renderTexture.Release();
}
this.qualitySettings = 1;
if (QualitySettings.antiAliasing == 2)
{
this.qualitySettings = 2;
}
if (QualitySettings.antiAliasing == 4)
{
this.qualitySettings = 4;
}
if (QualitySettings.antiAliasing == 8)
{
this.qualitySettings = 8;
}
this.renderTexture = new RenderTexture(this.sourceCamera.pixelWidth, this.sourceCamera.pixelHeight, 16, RenderTextureFormat.R8);
this.renderTexture.antiAliasing = this.qualitySettings;
if (QualitySettings.antiAliasing == 0)
{
this.qualitySettings = 0;
}
this.commandBuffer = new CommandBuffer();
this.sourceCamera.AddCommandBuffer(CameraEvent.AfterForwardOpaque, this.commandBuffer);
}
// Token: 0x06001680 RID: 5760 RVA: 0x0019E8A0 File Offset: 0x0019CAA0
public void OnPreRender()
{
if (this.commandBuffer == null)
{
return;
}
this.CreateMaterialsIfNeeded();
if (this.renderTexture == null || this.renderTexture.width != this.sourceCamera.pixelWidth || this.renderTexture.height != this.sourceCamera.pixelHeight || this.qualitySettings != QualitySettings.antiAliasing)
{
if (this.renderTexture != null)
{
this.renderTexture.Release();
}
this.qualitySettings = 1;
if (QualitySettings.antiAliasing == 2)
{
this.qualitySettings = 2;
}
if (QualitySettings.antiAliasing == 4)
{
this.qualitySettings = 4;
}
if (QualitySettings.antiAliasing == 8)
{
this.qualitySettings = 8;
}
this.renderTexture = new RenderTexture(this.sourceCamera.pixelWidth, this.sourceCamera.pixelHeight, 16, RenderTextureFormat.Default);
this.renderTexture.antiAliasing = this.qualitySettings;
if (QualitySettings.antiAliasing == 0)
{
this.qualitySettings = 0;
}
}
this.UpdateMaterialsPublicProperties();
this.commandBuffer.Clear();
RenderTargetIdentifier renderTargetIdentifier = new RenderTargetIdentifier(this.renderTexture);
this.commandBuffer.SetRenderTarget(renderTargetIdentifier, BuiltinRenderTextureType.CameraTarget);
this.commandBuffer.ClearRenderTarget(false, true, Color.clear);
foreach (Outline outline in this.outlines)
{
2112;
if (outline != null && outline.gameObject.activeSelf && outline.gameObject.activeInHierarchy)
{
bool flag = true;
if (outline.Renderer && !outline.Renderer.enabled)
{
flag = false;
}
if (outline.SkinnedMeshRenderer && !outline.SkinnedMeshRenderer.enabled)
{
flag = false;
}
if (flag)
{
for (int i = 0; i < outline.SharedMaterials.Length; i++)
{
Material material = null;
if (outline.gameObject.layer == 11)
{
this.commandBuffer.SetGlobalFloat("useZCutoff", 0f);
}
else
{
this.commandBuffer.SetGlobalFloat("useZCutoff", 1f);
}
if (outline.SharedMaterials[i].mainTexture != null && outline.SharedMaterials[i])
{
foreach (Material material2 in this.materialBuffer)
{
if (material2.mainTexture == outline.SharedMaterials[i].mainTexture && material2.color == this.GetMaterialFromID(outline.color).color)
{
material = material2;
}
}
if (material == null)
{
material = new Material(this.GetMaterialFromID(outline.color));
material.mainTexture = outline.SharedMaterials[i].mainTexture;
this.materialBuffer.Add(material);
}
}
else
{
material = this.GetMaterialFromID(outline.color);
}
if (this.backfaceCulling)
{
material.SetInt("_Culling", 2);
}
else
{
material.SetInt("_Culling", 0);
}
this.commandBuffer.DrawRenderer(outline.Renderer, material, i, 0);
}
}
}
}
if (Links.x.cameraEffects.HoverCount() <= 0 && Links.x.cameraEffects.BubbleCount() <= 0)
{
int count = this.outlines.Count;
}
}
// Token: 0x06001681 RID: 5761 RVA: 0x0019EC68 File Offset: 0x0019CE68
private void OnEnable()
{
if (this.autoEnableOutlines)
{
foreach (Outline outline in Object.FindObjectsByType<Outline>(FindObjectsSortMode.None))
{
outline.enabled = false;
outline.enabled = true;
}
}
}
// Token: 0x06001682 RID: 5762 RVA: 0x0019ECA2 File Offset: 0x0019CEA2
private void OnDestroy()
{
if (this.renderTexture != null)
{
this.renderTexture.Release();
}
this.DestroyMaterials();
}
// Token: 0x06001683 RID: 5763 RVA: 0x0019ECC4 File Offset: 0x0019CEC4
private void OnRenderImage(RenderTexture source, RenderTexture destination)
{
if ((Links.x.cameraEffects.HoverCount() > 0 || Links.x.cameraEffects.BubbleCount() > 0 || this.outlines.Count > 0) && !this.turnOffOutlines)
{
this.outlineShaderMaterial.SetTexture("_FinalOutlineSource", this.renderTexture);
this.outlineShaderMaterial.SetFloat("UseBlur", 0f);
Graphics.Blit(source, destination, this.outlineShaderMaterial, 1);
return;
}
Graphics.Blit(source, destination);
}
// Token: 0x06001684 RID: 5764 RVA: 0x0019ED4C File Offset: 0x0019CF4C
private void CreateMaterialsIfNeeded()
{
if (this.outlineShader == null)
{
this.outlineShader = Resources.Load<Shader>("OutlineShader");
}
if (this.outlineBufferShader == null)
{
this.outlineBufferShader = Resources.Load<Shader>("OutlineBufferShader");
}
if (this.outlineShaderMaterial == null)
{
this.outlineShaderMaterial = new Material(this.outlineShader);
this.outlineShaderMaterial.hideFlags = HideFlags.HideAndDontSave;
this.UpdateMaterialsPublicProperties();
}
if (this.outlineEraseMaterial == null)
{
this.outlineEraseMaterial = this.CreateMaterial(new Color(0f, 0f, 0f, 0f));
}
if (this.outline1Material == null)
{
this.outline1Material = this.CreateMaterial(new Color(1f, 0f, 0f, 0f));
}
if (this.outline2Material == null)
{
this.outline2Material = this.CreateMaterial(new Color(0f, 1f, 0f, 0f));
}
if (this.outline3Material == null)
{
this.outline3Material = this.CreateMaterial(new Color(0f, 0f, 1f, 0f));
}
}
// Token: 0x06001685 RID: 5765 RVA: 0x0019EE94 File Offset: 0x0019D094
private void DestroyMaterials()
{
foreach (Material material in this.materialBuffer)
{
Object.DestroyImmediate(material);
}
this.materialBuffer.Clear();
Object.DestroyImmediate(this.outlineShaderMaterial);
Object.DestroyImmediate(this.outlineEraseMaterial);
Object.DestroyImmediate(this.outline1Material);
Object.DestroyImmediate(this.outline2Material);
Object.DestroyImmediate(this.outline3Material);
this.outlineShader = null;
this.outlineBufferShader = null;
this.outlineShaderMaterial = null;
this.outlineEraseMaterial = null;
this.outline1Material = null;
this.outline2Material = null;
this.outline3Material = null;
}
// Token: 0x06001686 RID: 5766 RVA: 0x0019EF58 File Offset: 0x0019D158
public void UpdateMaterialsPublicProperties()
{
if (this.outlineShaderMaterial)
{
float num = 1f;
if (this.scaleWithScreenSize)
{
num = (float)Screen.height / this.scale;
}
if (this.scaleWithScreenSize && num < 1f)
{
this.outlineShaderMaterial.SetFloat("_LineThicknessX", 0.001f * (1f / (float)Screen.width) * 1000f * this.lineThickness);
this.outlineShaderMaterial.SetFloat("_LineThicknessY", 0.001f * (1f / (float)Screen.height) * 1000f * this.lineThickness);
}
else
{
this.outlineShaderMaterial.SetFloat("_LineThicknessX", num * (this.lineThickness / 1000f) * (1f / (float)Screen.width) * 1000f);
this.outlineShaderMaterial.SetFloat("_LineThicknessY", num * (this.lineThickness / 1000f) * (1f / (float)Screen.height) * 1000f);
}
this.outlineShaderMaterial.SetFloat("_LineIntensity", this.lineIntensity);
this.outlineShaderMaterial.SetFloat("_FillAmount", this.fillAmount);
this.outlineShaderMaterial.SetColor("_LineColor1", this.lineColor0 * this.lineColor0);
this.outlineShaderMaterial.SetColor("_LineColor2", this.lineColor1 * this.lineColor1);
this.outlineShaderMaterial.SetColor("_LineColor3", this.lineColor2 * this.lineColor2);
Links.x.hoverMaterial1.SetColor("_Color", Color.red);
Links.x.hoverMaterial2.SetColor("_Color", Color.green);
Links.x.hoverMaterial3.SetColor("_Color", Color.blue);
if (this.flipY)
{
this.outlineShaderMaterial.SetInt("_FlipY", 1);
}
else
{
this.outlineShaderMaterial.SetInt("_FlipY", 0);
}
if (!this.additiveRendering)
{
this.outlineShaderMaterial.SetInt("_Dark", 1);
}
else
{
this.outlineShaderMaterial.SetInt("_Dark", 0);
}
if (this.cornerOutlines)
{
this.outlineShaderMaterial.SetInt("_CornerOutlines", 1);
}
else
{
this.outlineShaderMaterial.SetInt("_CornerOutlines", 0);
}
Shader.SetGlobalFloat("_OutlineAlphaCutoff", this.alphaCutoff);
}
}
// Token: 0x06001687 RID: 5767 RVA: 0x0019F1D1 File Offset: 0x0019D3D1
public void AddOutline(Outline outline)
{
this.outlines.Add(outline);
}
// Token: 0x06001688 RID: 5768 RVA: 0x0019F1E0 File Offset: 0x0019D3E0
public void RemoveOutline(Outline outline)
{
this.outlines.Remove(outline);
}
// Token: 0x04002675 RID: 9845
private readonly LinkedSet<Outline> outlines = new LinkedSet<Outline>();
// Token: 0x04002676 RID: 9846
public bool useBlur;
// Token: 0x04002677 RID: 9847
[Range(0.0001f, 6f)]
public float lineThickness = 1.25f;
// Token: 0x04002678 RID: 9848
[Range(0f, 10f)]
public float lineIntensity = 0.5f;
// Token: 0x04002679 RID: 9849
[Range(0f, 1f)]
public float fillAmount = 0.2f;
// Token: 0x0400267A RID: 9850
public Color lineColor0 = Color.red;
// Token: 0x0400267B RID: 9851
public Color lineColor1 = Color.green;
// Token: 0x0400267C RID: 9852
public Color lineColor2 = Color.blue;
// Token: 0x0400267D RID: 9853
public bool additiveRendering;
// Token: 0x0400267E RID: 9854
public bool backfaceCulling = true;
// Token: 0x0400267F RID: 9855
[Header("These settings can affect performance!")]
public bool cornerOutlines;
// Token: 0x04002680 RID: 9856
public bool addLinesBetweenColors;
// Token: 0x04002681 RID: 9857
[Header("Advanced settings")]
public bool scaleWithScreenSize = true;
// Token: 0x04002682 RID: 9858
[Range(0.1f, 0.9f)]
public float alphaCutoff = 0.5f;
// Token: 0x04002683 RID: 9859
public bool flipY;
// Token: 0x04002684 RID: 9860
public Camera sourceCamera;
// Token: 0x04002685 RID: 9861
public bool autoEnableOutlines = true;
// Token: 0x04002686 RID: 9862
public bool turnOffOutlines;
// Token: 0x04002687 RID: 9863
[HideInInspector]
public Camera outlineCamera;
// Token: 0x04002688 RID: 9864
private Material outline1Material;
// Token: 0x04002689 RID: 9865
private Material outline2Material;
// Token: 0x0400268A RID: 9866
private Material outline3Material;
// Token: 0x0400268B RID: 9867
private Material outlineEraseMaterial;
// Token: 0x0400268C RID: 9868
private Shader outlineShader;
// Token: 0x0400268D RID: 9869
private Shader outlineBufferShader;
// Token: 0x0400268E RID: 9870
[HideInInspector]
public Material outlineShaderMaterial;
// Token: 0x0400268F RID: 9871
[HideInInspector]
public RenderTexture renderTexture;
// Token: 0x04002690 RID: 9872
[HideInInspector]
private int w;
// Token: 0x04002691 RID: 9873
[HideInInspector]
private int h;
// Token: 0x04002692 RID: 9874
private int qualitySettings;
// Token: 0x04002693 RID: 9875
public float scale = 360f;
// Token: 0x04002694 RID: 9876
private List<Renderer> hovers;
// Token: 0x04002695 RID: 9877
private List<int> hoverTypes;
// Token: 0x04002696 RID: 9878
private List<Renderer> bubbles;
// Token: 0x04002697 RID: 9879
private List<int> bubbleTypes;
// Token: 0x04002698 RID: 9880
private Material[] mats;
// Token: 0x04002699 RID: 9881
public BlurOptimized blur;
// Token: 0x0400269A RID: 9882
private CommandBuffer commandBuffer;
// Token: 0x0400269B RID: 9883
private List<Material> materialBuffer = new List<Material>();
// Token: 0x0400269C RID: 9884
private bool RenderTheNextFrame;
}
}