using System; using System.Collections.Generic; using UnityEngine; using UnityEngine.Rendering; using UnityEngine.XR; using UnityStandardAssets.ImageEffects; namespace cakeslice { // Token: 0x02000115 RID: 277 [DisallowMultipleComponent] [RequireComponent(typeof(Camera))] public class OutlineEffectGlow : MonoBehaviour { // Token: 0x1700005F RID: 95 // (get) Token: 0x06001693 RID: 5779 RVA: 0x0019F38C File Offset: 0x0019D58C // (set) Token: 0x06001694 RID: 5780 RVA: 0x0019F393 File Offset: 0x0019D593 public static OutlineEffectGlow Instance { get; private set; } // Token: 0x06001695 RID: 5781 RVA: 0x0019F39B File Offset: 0x0019D59B private Material GetMaterialFromID(int ID) { if (ID == 0) { return this.outline1Material; } if (ID == 1) { return this.outline2Material; } return this.outline3Material; } // Token: 0x06001696 RID: 5782 RVA: 0x0019F3B8 File Offset: 0x0019D5B8 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: 0x06001697 RID: 5783 RVA: 0x0019F42D File Offset: 0x0019D62D private void Awake() { if (OutlineEffectGlow.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; } OutlineEffectGlow.Instance = this; } // Token: 0x06001698 RID: 5784 RVA: 0x0019F46C File Offset: 0x0019D66C private void Start() { this.CreateMaterialsIfNeeded(); this.UpdateMaterialsPublicProperties(); if (this.sourceCamera == null) { this.sourceCamera = base.GetComponent(); if (this.sourceCamera == null) { this.sourceCamera = Camera.main; } } if (this.outlineCamera == null) { foreach (Camera camera in base.GetComponentsInChildren()) { if (camera.name == "Outline Camera") { this.outlineCamera = camera; camera.enabled = false; break; } } if (this.outlineCamera == null) { this.outlineCamera = new GameObject("Outline Camera") { transform = { parent = this.sourceCamera.transform } }.AddComponent(); this.outlineCamera.enabled = false; } } 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.UpdateOutlineCameraFromSource(); this.commandBuffer = new CommandBuffer(); this.sourceCamera.AddCommandBuffer(CameraEvent.AfterForwardOpaque, this.commandBuffer); } // Token: 0x06001699 RID: 5785 RVA: 0x0019F5E8 File Offset: 0x0019D7E8 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) { 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.outlineCamera.targetTexture = this.renderTexture; } this.UpdateMaterialsPublicProperties(); this.UpdateOutlineCameraFromSource(); this.commandBuffer.Clear(); RenderTargetIdentifier renderTargetIdentifier = new RenderTargetIdentifier(this.renderTexture); this.commandBuffer.SetRenderTarget(renderTargetIdentifier, BuiltinRenderTextureType.CameraTarget); this.commandBuffer.ClearRenderTarget(false, true, Color.clear); foreach (OutlineGlow outlineGlow in this.outlines) { if (outlineGlow.gameObject.activeSelf && outlineGlow.gameObject.activeInHierarchy) { bool flag = true; if (outlineGlow.Renderer && !outlineGlow.Renderer.enabled) { flag = false; } if (outlineGlow.SkinnedMeshRenderer && !outlineGlow.SkinnedMeshRenderer.enabled) { flag = false; } if (flag) { LayerMask layerMask = 2112; if (outlineGlow != null && layerMask == (layerMask | (1 << outlineGlow.gameObject.layer))) { for (int i = 0; i < outlineGlow.SharedMaterials.Length; i++) { Material material = null; if (outlineGlow.SharedMaterials[i].mainTexture != null && outlineGlow.SharedMaterials[i]) { foreach (Material material2 in this.materialBuffer) { if (material2.mainTexture == outlineGlow.SharedMaterials[i].mainTexture) { if (outlineGlow.eraseRenderer && material2.color == this.outlineEraseMaterial.color) { material = material2; } else if (material2.color == this.GetMaterialFromID(outlineGlow.color).color) { material = material2; } } } if (material == null) { if (outlineGlow.eraseRenderer) { material = new Material(this.outlineEraseMaterial); } else { material = new Material(this.GetMaterialFromID(outlineGlow.color)); } material.mainTexture = outlineGlow.SharedMaterials[i].mainTexture; this.materialBuffer.Add(material); } } else if (outlineGlow.eraseRenderer) { material = this.outlineEraseMaterial; } else { material = this.GetMaterialFromID(outlineGlow.color); } if (this.backfaceCulling) { material.SetInt("_Culling", 2); } else { material.SetInt("_Culling", 0); } this.commandBuffer.DrawRenderer(outlineGlow.Renderer, material, 0, 0); MeshFilter meshFilter = outlineGlow.MeshFilter; if (meshFilter && meshFilter.sharedMesh != null) { for (int j = 1; j < meshFilter.sharedMesh.subMeshCount; j++) { this.commandBuffer.DrawRenderer(outlineGlow.Renderer, material, j, 0); } } SkinnedMeshRenderer skinnedMeshRenderer = outlineGlow.SkinnedMeshRenderer; if (skinnedMeshRenderer && skinnedMeshRenderer.sharedMesh != null) { for (int k = 1; k < skinnedMeshRenderer.sharedMesh.subMeshCount; k++) { this.commandBuffer.DrawRenderer(outlineGlow.Renderer, material, k, 0); } } } } } } } this.frameCount++; if (this.frameCount > 5000) { for (int l = 0; l < this.materialBuffer.Count; l++) { if (this.materialBuffer[l]) { Object.Destroy(this.materialBuffer[l]); } } this.frameCount = 0; this.materialBuffer.Clear(); } } // Token: 0x0600169A RID: 5786 RVA: 0x0019FADC File Offset: 0x0019DCDC private void OnEnable() { if (this.autoEnableOutlines) { foreach (OutlineGlow outlineGlow in Object.FindObjectsByType(FindObjectsSortMode.None)) { outlineGlow.enabled = false; outlineGlow.enabled = true; } } } // Token: 0x0600169B RID: 5787 RVA: 0x0019FB16 File Offset: 0x0019DD16 private void OnDestroy() { if (this.renderTexture != null) { this.renderTexture.Release(); } this.DestroyMaterials(); } // Token: 0x0600169C RID: 5788 RVA: 0x0019FB38 File Offset: 0x0019DD38 private void OnRenderImage(RenderTexture source, RenderTexture destination) { if (this.outlines.Count > 0) { this.outlineShaderMaterial.SetTexture("_FinalOutlineSource", this.renderTexture); if (this.useBlur && (this.w != Screen.width || this.h != Screen.height || this.blurred == null)) { if (this.blurred != null) { this.blurred.Release(); } if (this.readyToBlur != null) { this.readyToBlur.Release(); } this.w = Screen.width; this.h = Screen.height; this.blurred = new RenderTexture(this.w, this.h, 0, RenderTextureFormat.ARGB32); this.readyToBlur = new RenderTexture(this.w, this.h, 0, RenderTextureFormat.ARGB32); } if (this.useBlur) { this.outlineShaderMaterial.SetFloat("UseBlur", 1f); Graphics.Blit(source, this.readyToBlur, this.outlineShaderMaterial, 1); } else { this.outlineShaderMaterial.SetFloat("UseBlur", 0f); Graphics.Blit(source, destination, this.outlineShaderMaterial, 1); } if (this.useBlur) { this.blur.OnRenderImage(this.readyToBlur, this.blurred); this.outlineShaderMaterial.SetTexture("_OutlineTex", this.blurred); Graphics.Blit(source, destination, this.outlineShaderMaterial, 2); return; } } else { Graphics.Blit(source, destination); } } // Token: 0x0600169D RID: 5789 RVA: 0x0019FCBC File Offset: 0x0019DEBC private void CreateMaterialsIfNeeded() { if (this.outlineShader == null) { this.outlineShader = Resources.Load("OutlineShaderGlow"); } if (this.outlineBufferShader == null) { this.outlineBufferShader = Resources.Load("OutlineBufferShaderGlow"); } 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: 0x0600169E RID: 5790 RVA: 0x0019FE04 File Offset: 0x0019E004 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: 0x0600169F RID: 5791 RVA: 0x0019FEC8 File Offset: 0x0019E0C8 public void UpdateMaterialsPublicProperties() { if (this.outlineShaderMaterial) { float num = 1f; if (this.scaleWithScreenSize) { num = (float)Screen.height / 360f; } if (this.scaleWithScreenSize && num < 1f) { if (XRSettings.isDeviceActive && this.sourceCamera.stereoTargetEye != StereoTargetEyeMask.None) { this.outlineShaderMaterial.SetFloat("_LineThicknessX", 0.001f * (1f / (float)XRSettings.eyeTextureWidth) * 1000f); this.outlineShaderMaterial.SetFloat("_LineThicknessY", 0.001f * (1f / (float)XRSettings.eyeTextureHeight) * 1000f); } else { 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 if (XRSettings.isDeviceActive && this.sourceCamera.stereoTargetEye != StereoTargetEyeMask.None) { this.outlineShaderMaterial.SetFloat("_LineThicknessX", num * (this.lineThickness / 1000f) * (1f / (float)XRSettings.eyeTextureWidth) * 1000f); this.outlineShaderMaterial.SetFloat("_LineThicknessY", num * (this.lineThickness / 1000f) * (1f / (float)XRSettings.eyeTextureHeight) * 1000f); } 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: 0x060016A0 RID: 5792 RVA: 0x001A022C File Offset: 0x0019E42C private void UpdateOutlineCameraFromSource() { this.outlineCamera.CopyFrom(this.sourceCamera); this.outlineCamera.renderingPath = RenderingPath.Forward; this.outlineCamera.backgroundColor = new Color(0f, 0f, 0f, 0f); this.outlineCamera.clearFlags = CameraClearFlags.Color; this.outlineCamera.rect = new Rect(0f, 0f, 1f, 1f); this.outlineCamera.cullingMask = 0; this.outlineCamera.targetTexture = this.renderTexture; this.outlineCamera.enabled = false; this.outlineCamera.allowHDR = false; } // Token: 0x060016A1 RID: 5793 RVA: 0x001A02DF File Offset: 0x0019E4DF public void AddOutline(OutlineGlow outline) { this.outlines.Add(outline); } // Token: 0x060016A2 RID: 5794 RVA: 0x001A02EE File Offset: 0x0019E4EE public void RemoveOutline(OutlineGlow outline) { this.outlines.Remove(outline); } // Token: 0x040026A0 RID: 9888 private readonly LinkedSetGlow outlines = new LinkedSetGlow(); // Token: 0x040026A1 RID: 9889 public bool useBlur; // Token: 0x040026A2 RID: 9890 [Range(0.0001f, 6f)] public float lineThickness = 1.25f; // Token: 0x040026A3 RID: 9891 [Range(0f, 10f)] public float lineIntensity = 0.5f; // Token: 0x040026A4 RID: 9892 [Range(0f, 1f)] public float fillAmount = 0.2f; // Token: 0x040026A5 RID: 9893 public Color lineColor0 = Color.red; // Token: 0x040026A6 RID: 9894 public Color lineColor1 = Color.green; // Token: 0x040026A7 RID: 9895 public Color lineColor2 = Color.blue; // Token: 0x040026A8 RID: 9896 public bool additiveRendering; // Token: 0x040026A9 RID: 9897 public bool backfaceCulling = true; // Token: 0x040026AA RID: 9898 private int qualitySettings; // Token: 0x040026AB RID: 9899 [Header("These settings can affect performance!")] public bool cornerOutlines; // Token: 0x040026AC RID: 9900 public bool addLinesBetweenColors; // Token: 0x040026AD RID: 9901 [Header("Advanced settings")] public bool scaleWithScreenSize = true; // Token: 0x040026AE RID: 9902 [Range(0.1f, 0.9f)] public float alphaCutoff = 0.5f; // Token: 0x040026AF RID: 9903 public bool flipY; // Token: 0x040026B0 RID: 9904 public Camera sourceCamera; // Token: 0x040026B1 RID: 9905 public bool autoEnableOutlines = true; // Token: 0x040026B2 RID: 9906 [HideInInspector] public Camera outlineCamera; // Token: 0x040026B3 RID: 9907 private Material outline1Material; // Token: 0x040026B4 RID: 9908 private Material outline2Material; // Token: 0x040026B5 RID: 9909 private Material outline3Material; // Token: 0x040026B6 RID: 9910 private Material outlineEraseMaterial; // Token: 0x040026B7 RID: 9911 private Shader outlineShader; // Token: 0x040026B8 RID: 9912 private Shader outlineBufferShader; // Token: 0x040026B9 RID: 9913 [HideInInspector] public Material outlineShaderMaterial; // Token: 0x040026BA RID: 9914 [HideInInspector] public RenderTexture renderTexture; // Token: 0x040026BB RID: 9915 [HideInInspector] public RenderTexture extraRenderTexture; // Token: 0x040026BC RID: 9916 [HideInInspector] public RenderTexture blurred; // Token: 0x040026BD RID: 9917 [HideInInspector] public RenderTexture blurred1; // Token: 0x040026BE RID: 9918 [HideInInspector] public RenderTexture readyToBlur; // Token: 0x040026BF RID: 9919 private int w; // Token: 0x040026C0 RID: 9920 private int h; // Token: 0x040026C1 RID: 9921 public BlurOptimized blur; // Token: 0x040026C2 RID: 9922 private int frameCount; // Token: 0x040026C3 RID: 9923 private CommandBuffer commandBuffer; // Token: 0x040026C4 RID: 9924 private List materialBuffer = new List(); // Token: 0x040026C5 RID: 9925 private bool RenderTheNextFrame; } }