using UnityEngine; using UnityEngine.Rendering; namespace BodhiDonselaar { [RequireComponent(typeof(Camera))] public class EquiCam : MonoBehaviour { public enum Size { High = 2048, Default = 1024, Low = 512, Minimum = 256 } private static Material equi; public Size RenderResolution = Size.Default; private RenderTexture cubemap; private Camera cam; private GameObject child; private void OnEnable() { if (equi == null) { equi = new Material(Resources.Load("EquiCam")); } child = new GameObject(); child.hideFlags = HideFlags.HideInHierarchy; child.transform.SetParent(base.transform); child.transform.localPosition = Vector3.zero; child.transform.localEulerAngles = Vector3.zero; cam = child.AddComponent(); cam.CopyFrom(GetComponent()); child.SetActive(value: false); New(); } private void OnDisable() { if (child != null) { Object.DestroyImmediate(child); } if (cubemap != null) { cubemap.Release(); Object.DestroyImmediate(cubemap); } } private void OnRenderImage(RenderTexture src, RenderTexture des) { if (cubemap.width != (int)RenderResolution) { New(); } cam.RenderToCubemap(cubemap); Shader.SetGlobalFloat("FORWARD", cam.transform.eulerAngles.y * 0.01745f); Graphics.Blit(cubemap, des, equi); } private void New() { cam.targetTexture = null; if (cubemap != null) { cubemap.Release(); Object.DestroyImmediate(cubemap); } cubemap = new RenderTexture((int)RenderResolution, (int)RenderResolution, 0, RenderTextureFormat.ARGB32); cubemap.antiAliasing = 1; cubemap.filterMode = FilterMode.Bilinear; cubemap.anisoLevel = 0; cubemap.dimension = TextureDimension.Cube; cubemap.autoGenerateMips = false; cubemap.useMipMap = false; cam.targetTexture = cubemap; } } }