コード例 #1
0
    private void RenderCascades()
    {
        SunshineMath.BoundingSphere boundingSphere = default(SunshineMath.BoundingSphere);
        if (Sunshine.Instance.UsingCustomBounds)
        {
            boundingSphere = Sunshine.Instance.CustomBounds;
        }
        else
        {
            boundingSphere = SunshineMath.FrustumBoundingSphereBinarySearch(this.AttachedCamera, this.AttachedCamera.nearClipPlane, Sunshine.Instance.LightDistance, true, this.BoundsPadding, 0.01f, 20);
        }
        if (!this.NeedsRefresh(boundingSphere.origin))
        {
            return;
        }
        bool flag = Sunshine.Instance.TerrainLODTweak > 0f;

        if (flag)
        {
            this.tempTerrainList.Clear();
            this.tempTerrainPixelError.Clear();
            Terrain[] activeTerrains = Terrain.activeTerrains;
            for (int i = 0; i < activeTerrains.Length; i++)
            {
                Terrain terrain = activeTerrains[i];
                if (terrain)
                {
                    this.tempTerrainList.Add(terrain);
                    this.tempTerrainPixelError.Add(terrain.heightmapPixelError);
                    terrain.heightmapPixelError *= 1f - Sunshine.Instance.TerrainLODTweak;
                }
            }
        }
        for (int j = 0; j < Sunshine.Instance.CascadeCount; j++)
        {
            Camera camera = Sunshine.Instance.SunLightCameras[j];
            camera.cullingMask = Sunshine.Instance.GetCascadeOccluders(j);
            SunshineMath.SetupShadowCamera(Sunshine.Instance.SunLight, camera, this.AttachedCamera, Sunshine.Instance.CascadeNearClip(j), Sunshine.Instance.CascadeFarClip(j), Sunshine.Instance.LightPaddingZ, this.BoundsPadding, Sunshine.Instance.CascadeMapResolution, ref boundingSphere, ref this.cascadeTemporalData[j]);
            Shader.SetGlobalVector("sunshine_DepthBiases", new Vector2(Sunshine.Instance.ShadowBias, Sunshine.Instance.ShadowSlopeBias(j)));
            camera.rect                = Sunshine.Instance.CascadeRects[j];
            camera.targetTexture       = Sunshine.Instance.Lightmap;
            camera.useOcclusionCulling = Sunshine.Instance.UseOcclusionCulling;
            camera.RenderWithShader(Sunshine.Instance.OccluderShader, "RenderType");
        }
        if (flag)
        {
            for (int k = this.tempTerrainList.Count - 1; k >= 0; k--)
            {
                Terrain terrain2 = this.tempTerrainList[k];
                terrain2.heightmapPixelError = this.tempTerrainPixelError[k];
            }
            this.tempTerrainList.Clear();
            this.tempTerrainPixelError.Clear();
        }
        this.refreshRequested = false;
    }
コード例 #2
0
    public static float QuantizeValueWithoutFlicker(float number, float step, float lastResult)
    {
        float num = SunshineMath.QuantizeValue(number, step);

        if (Mathf.Abs(num - number) * 4f < Mathf.Abs(lastResult - number))
        {
            return(num);
        }
        return(lastResult);
    }
コード例 #3
0
    private void SetShadowCamera()
    {
        if (this.eyeCamera.renderingPath == RenderingPath.DeferredShading && this.enableFarShadows)
        {
            Shader.EnableKeyword("_USING_DEFERREDSHADING");
            this.shadowCameraGO.transform.rotation = Quaternion.LookRotation(Sunshine.Instance.SunLight.transform.forward);
            Transform transform = this.shadowCameraGO.transform;
            SunshineMath.BoundingSphere boundingSphere = default(SunshineMath.BoundingSphere);
            boundingSphere = SunshineMath.FrustumBoundingSphereBinarySearch(this.eyeCamera, this.eyeCamera.nearClipPlane, this.FarCascadeDistance, true, 0f, 0.01f, 20);
            float num = SunshineMath.QuantizeValueWithoutFlicker(boundingSphere.radius, 100, this.last_boundingRadius);
            this.last_boundingRadius = num;
            float num2 = num * 2f;
            transform.position = boundingSphere.origin;
            transform.position = this.eyeCamera.transform.position - Sunshine.Instance.SunLight.transform.forward * this.FarCascadeDistance * 0.5f;
            Vector3 vector = transform.InverseTransformPoint(Vector3.zero);
            float   step   = num2 / (float)this.shadowMapSize;
            vector.x = SunshineMath.QuantizeValueWithoutFlicker(vector.x, step, this.last_lightWorldOrigin.x);
            vector.y = SunshineMath.QuantizeValueWithoutFlicker(vector.y, step, this.last_lightWorldOrigin.y);
            this.last_lightWorldOrigin = vector;
            transform.position        -= transform.TransformPoint(vector);
            Vector3 vector2 = transform.InverseTransformPoint(boundingSphere.origin);
            transform.position += transform.forward * (vector2.z - (boundingSphere.radius + this.lightCamera.nearClipPlane));
            this.lightCamera.orthographicSize = num2 * 0.5f;
            this.lightCamera.nearClipPlane    = this.eyeCamera.nearClipPlane;
            this.lightCamera.farClipPlane     = (boundingSphere.radius + this.lightCamera.nearClipPlane) * 2f;
            this.lightCamera.cullingMask      = this.CullingMask;
            this.bb_quad      = Vector3.Dot(-Sunshine.Instance.SunLight.transform.forward, Vector3.up);
            this.biasLerp     = Mathf.Abs(this.bb_quad);
            this.bb_quad      = Mathf.Clamp01(Mathf.Clamp01(this.bb_quad + 0.0001f) - 0.75f) * 4f;
            this.bb_billboard = 1f - this.bb_quad;
            Shader.SetGlobalVector(this.billboardShadeFadeFactorsProp, new Vector4(this.bb_billboard, this.bb_quad, 0f, 0f));
            this.biasLerp            = Mathf.Clamp01(Mathf.Abs(0.7071f - this.biasLerp) * 4f);
            this.FarCascadeDepthBias = Mathf.Lerp(this.MaxFarCascadeDepthBias, this.MinFarCascadeDepthBias, this.biasLerp);
            this.SetFarShadowMatrix(boundingSphere.radius, this.FarCascadeDistance);
            Component[] componentsInChildren = this.parent.GetComponentsInChildren(typeof(MeshFilter));
            int         num3 = componentsInChildren.Length;
            GL.PushMatrix();
            Graphics.SetRenderTarget(this.m_shadowTexture);
            GL.LoadProjectionMatrix(this.lightCamera.projectionMatrix);
            GL.Clear(true, false, Color.black, 6000f);
            this.mat.SetPass(0);
            foreach (MeshFilter meshFilter in componentsInChildren)
            {
                Graphics.DrawMeshNow(meshFilter.mesh, this.matrix);
            }
            GL.PopMatrix();
        }
        else
        {
            Shader.DisableKeyword("_USING_DEFERREDSHADING");
        }
        float num4 = QualitySettings.shadowDistance * 0.125f;

        Shader.SetGlobalVector(this.farCascadeBlendValuesProps, new Vector4(QualitySettings.shadowDistance - num4 * 2f, num4, this.FarCascadeDistance - this.FarCascadeDistance * 0.275f));
    }
コード例 #4
0
    private void SetShadowCamera()
    {
        if (this.eyeCamera.renderingPath == RenderingPath.DeferredShading && this.enableFarShadows)
        {
            Shader.EnableKeyword("_USING_DEFERREDSHADING");
            if (this.shadowCameraGO == null || Sunshine.Instance == null)
            {
                return;
            }
            this.shadowCameraGO.transform.rotation = Quaternion.LookRotation(Sunshine.Instance.SunLight.transform.forward);
            Transform transform = this.shadowCameraGO.transform;
            SunshineMath.BoundingSphere boundingSphere = default(SunshineMath.BoundingSphere);
            boundingSphere = SunshineMath.FrustumBoundingSphereBinarySearch(this.eyeCamera, this.eyeCamera.nearClipPlane, this.FarCascadeDistance, true, 0f, 0.01f, 20);
            float num = SunshineMath.QuantizeValueWithoutFlicker(boundingSphere.radius, 100, this.last_boundingRadius);
            this.last_boundingRadius = num;
            float num2 = num * 2f;
            transform.position = boundingSphere.origin;
            transform.position = this.eyeCamera.transform.position - Sunshine.Instance.SunLight.transform.forward * this.FarCascadeDistance * 0.5f;
            Vector3 vector = transform.InverseTransformPoint(Vector3.zero);
            float   step   = num2 / (float)this.shadowMapSize;
            vector.x = SunshineMath.QuantizeValueWithoutFlicker(vector.x, step, this.last_lightWorldOrigin.x);
            vector.y = SunshineMath.QuantizeValueWithoutFlicker(vector.y, step, this.last_lightWorldOrigin.y);
            this.last_lightWorldOrigin = vector;
            transform.position        -= transform.TransformPoint(vector);
            Vector3 vector2 = transform.InverseTransformPoint(boundingSphere.origin);
            transform.position += transform.forward * (vector2.z - (boundingSphere.radius + this.lightCamera.nearClipPlane));
            this.lightCamera.orthographicSize = num2 * 0.5f;
            this.lightCamera.nearClipPlane    = this.eyeCamera.nearClipPlane;
            this.lightCamera.farClipPlane     = (boundingSphere.radius + this.lightCamera.nearClipPlane) * 2f;
            this.lightCamera.cullingMask      = this.CullingMask;
            this.bb_quad      = Vector3.Dot(-Sunshine.Instance.SunLight.transform.forward, Vector3.up);
            this.biasLerp     = Mathf.Abs(this.bb_quad);
            this.bb_quad      = Mathf.Clamp01(Mathf.Clamp01(this.bb_quad + 0.0001f) - 0.75f) * 4f;
            this.bb_billboard = 1f - this.bb_quad;
            Shader.SetGlobalVector(this.billboardShadeFadeFactorsProp, new Vector4(this.bb_billboard, this.bb_quad, 0f, 0f));
            this.biasLerp            = Mathf.Clamp01(Mathf.Abs(0.7071f - this.biasLerp) * 4f);
            this.FarCascadeDepthBias = Mathf.Lerp(this.MaxFarCascadeDepthBias, this.MinFarCascadeDepthBias, this.biasLerp);
            this.SetFarShadowMatrix(boundingSphere.radius, this.FarCascadeDistance);
            float shadowDistance = QualitySettings.shadowDistance;
            QualitySettings.shadowDistance = 0f;
            this.lightCamera.Render();
            QualitySettings.shadowDistance = shadowDistance;
            Shader.SetGlobalTexture(this.farCascadeProp, this.m_shadowTexture);
            Shader.SetGlobalMatrix(this.farCascadeMatrixProp, this.m_shadowMatrix);
        }
        else
        {
            Shader.DisableKeyword("_USING_DEFERREDSHADING");
        }
        float num3 = QualitySettings.shadowDistance * 0.125f;

        Shader.SetGlobalVector(this.farCascadeBlendValuesProps, new Vector4(QualitySettings.shadowDistance - num3 * 2f, num3, this.FarCascadeDistance - this.FarCascadeDistance * 0.275f));
    }
コード例 #5
0
    public static SunshineMath.BoundingSphere FrustumBoundingSphereBinarySearch(Camera camera, float nearClip, float farClip, bool radial, float radialPadding, float maxError = 0.01f, int maxSteps = 100)
    {
        float   num     = SunshineMath.RadialClipCornerRatio(camera);
        float   z       = (!radial) ? nearClip : (nearClip * num);
        float   z2      = (!radial) ? farClip : (farClip * num);
        Vector3 a       = camera.ViewportToWorldPoint(new Vector3(0.5f, 0.5f, nearClip));
        Vector3 b       = camera.ViewportToWorldPoint(new Vector3(0.5f, 0.5f, z2));
        Vector3 vector  = camera.ViewportToWorldPoint(new Vector3(0f, 0f, z));
        Vector3 vector2 = camera.ViewportToWorldPoint(new Vector3(1f, 1f, farClip));
        Vector3 vector3 = (!radial) ? vector2 : camera.ViewportToWorldPoint(new Vector3(1f, 1f, z2));

        SunshineMath._frustumTestPoints[0] = vector;
        SunshineMath._frustumTestPoints[1] = vector3;
        float   num2   = float.MaxValue;
        Vector3 origin = Vector3.zero;
        float   num3   = 0f;
        float   num4   = 0.2f;

        for (int i = 0; i < maxSteps; i++)
        {
            Vector3 vector4 = Vector3.Lerp(a, b, num3);
            float   num5    = SunshineMath.MinRadiusSq(vector4, SunshineMath._frustumTestPoints);
            if (num5 < num2)
            {
                num2   = num5;
                origin = vector4;
            }
            else
            {
                num4 *= -0.5f;
                if (Mathf.Abs(num4) < maxError)
                {
                    break;
                }
            }
            num3 += num4;
        }
        return(new SunshineMath.BoundingSphere
        {
            origin = origin,
            radius = Mathf.Sqrt(num2) + radialPadding
        });
    }
コード例 #6
0
    public static void SetupShadowCamera(Light light, Camera lightCamera, Camera eyeCamera, float eyeNearClip, float eyeFarClip, float paddingZ, float paddingRadius, int snapResolution, ref SunshineMath.BoundingSphere totalShadowBounds, ref SunshineMath.ShadowCameraTemporalData temporalData)
    {
        Transform transform = lightCamera.transform;

        SunshineMath.BoundingSphere boundingSphere = default(SunshineMath.BoundingSphere);
        if (Sunshine.Instance.UsingCustomBounds)
        {
            boundingSphere = Sunshine.Instance.CustomBounds;
        }
        else
        {
            boundingSphere = SunshineMath.FrustumBoundingSphereBinarySearch(eyeCamera, eyeNearClip, eyeFarClip, true, paddingRadius, 0.01f, 20);
        }
        float num = SunshineMath.QuantizeValueWithoutFlicker(boundingSphere.radius, 100, temporalData.boundingRadius);

        temporalData.boundingRadius = num;
        float num2 = num * 2f;

        lightCamera.aspect           = 1f;
        lightCamera.orthographic     = true;
        lightCamera.nearClipPlane    = eyeCamera.nearClipPlane;
        lightCamera.farClipPlane     = (totalShadowBounds.radius + paddingZ + lightCamera.nearClipPlane) * 2f;
        lightCamera.orthographicSize = num2 * 0.5f;
        transform.rotation           = Quaternion.LookRotation(light.transform.forward);
        transform.position           = boundingSphere.origin;
        Vector3 vector = transform.InverseTransformPoint(Vector3.zero);
        float   step   = num2 / (float)snapResolution;

        vector.x = SunshineMath.QuantizeValueWithoutFlicker(vector.x, step, temporalData.lightWorldOrigin.x);
        vector.y = SunshineMath.QuantizeValueWithoutFlicker(vector.y, step, temporalData.lightWorldOrigin.y);
        temporalData.lightWorldOrigin = vector;
        transform.position           -= transform.TransformPoint(vector);
        Vector3 vector2 = transform.InverseTransformPoint(totalShadowBounds.origin);

        transform.position += transform.forward * (vector2.z - (totalShadowBounds.radius + lightCamera.nearClipPlane + paddingZ));
    }
コード例 #7
0
ファイル: SunshineMath.cs プロジェクト: GameDiffs/TheForest
 public static void SetupShadowCamera(Light light, Camera lightCamera, Camera eyeCamera, float eyeNearClip, float eyeFarClip, float paddingZ, float paddingRadius, int snapResolution, ref SunshineMath.BoundingSphere totalShadowBounds, ref SunshineMath.ShadowCameraTemporalData temporalData)
 {
     Transform transform = lightCamera.transform;
     SunshineMath.BoundingSphere boundingSphere = default(SunshineMath.BoundingSphere);
     if (Sunshine.Instance.UsingCustomBounds)
     {
         boundingSphere = Sunshine.Instance.CustomBounds;
     }
     else
     {
         boundingSphere = SunshineMath.FrustumBoundingSphereBinarySearch(eyeCamera, eyeNearClip, eyeFarClip, true, paddingRadius, 0.01f, 20);
     }
     float num = SunshineMath.QuantizeValueWithoutFlicker(boundingSphere.radius, 100, temporalData.boundingRadius);
     temporalData.boundingRadius = num;
     float num2 = num * 2f;
     lightCamera.aspect = 1f;
     lightCamera.orthographic = true;
     lightCamera.nearClipPlane = eyeCamera.nearClipPlane;
     lightCamera.farClipPlane = (totalShadowBounds.radius + paddingZ + lightCamera.nearClipPlane) * 2f;
     lightCamera.orthographicSize = num2 * 0.5f;
     transform.rotation = Quaternion.LookRotation(light.transform.forward);
     transform.position = boundingSphere.origin;
     Vector3 vector = transform.InverseTransformPoint(Vector3.zero);
     float step = num2 / (float)snapResolution;
     vector.x = SunshineMath.QuantizeValueWithoutFlicker(vector.x, step, temporalData.lightWorldOrigin.x);
     vector.y = SunshineMath.QuantizeValueWithoutFlicker(vector.y, step, temporalData.lightWorldOrigin.y);
     temporalData.lightWorldOrigin = vector;
     transform.position -= transform.TransformPoint(vector);
     Vector3 vector2 = transform.InverseTransformPoint(totalShadowBounds.origin);
     transform.position += transform.forward * (vector2.z - (totalShadowBounds.radius + lightCamera.nearClipPlane + paddingZ));
 }
コード例 #8
0
 public static Matrix4x4 SetLinearDepthProjection(Matrix4x4 projection, float farClip)
 {
     SunshineMath.SetLinearDepthProjection(ref projection, farClip);
     return(projection);
 }
コード例 #9
0
 public static float QuantizeValueWithoutFlicker(float number, int resolution, float lastResult)
 {
     return(SunshineMath.QuantizeValueWithoutFlicker(number, 1f / (float)resolution, lastResult));
 }
コード例 #10
0
 public static float QuantizeValue(float number, int resolution)
 {
     return(SunshineMath.QuantizeValue(number, 1f / (float)resolution));
 }
コード例 #11
0
    private void OnPreCull()
    {
        Camera camera = this.GetCamera();

        if (camera == null)
        {
            return;
        }
        if (this.rtWidth < 1 || this.rtHeight < 1)
        {
            return;
        }
        if (this.sunshineCamera == null)
        {
            this.sunshineCamera = base.GetComponent <SunshineCamera>();
            if (this.sunshine_cb != null)
            {
                this.sunshine_cb.Clear();
                this.MYFILTER_STYLES = null;
            }
        }
        if (!this.sunshineCamera.GoodToGo)
        {
            if (this.sunshine_cb != null)
            {
                this.sunshine_cb.Clear();
                this.MYFILTER_STYLES = null;
            }
            return;
        }
        if (this.MYFILTER_STYLES == null)
        {
            this.SetKeywordArray();
        }
        Vector3 direction = camera.ViewportPointToRay(new Vector3(0f, 0f, 0f)).direction;
        Vector3 v         = camera.ViewportPointToRay(new Vector3(1f, 0f, 0f)).direction - direction;
        Vector3 v2        = camera.ViewportPointToRay(new Vector3(0f, 1f, 0f)).direction - direction;

        Sunshine.Instance.PostScatterMaterial.SetVector("worldLightRay", Sunshine.Instance.SunLight.transform.forward);
        Sunshine.Instance.PostScatterMaterial.SetVector("worldRay", direction);
        Sunshine.Instance.PostScatterMaterial.SetVector("worldRayU", v);
        Sunshine.Instance.PostScatterMaterial.SetVector("worldRayV", v2);
        Sunshine.Instance.PostScatterMaterial.SetTexture("_ScatterRamp", Sunshine.Instance.ScatterRamp);
        this.quality = (int)(1 + Sunshine.Instance.ScatterSamplingQuality);
        Sunshine.Instance.PostScatterMaterial.SetColor("ScatterColor", Sunshine.Instance.ScatterColor);
        if (Sunshine.Instance.ScatterAnimateNoise)
        {
            this.scatterNoiseSeed += Time.deltaTime * Sunshine.Instance.ScatterAnimateNoiseSpeed;
            this.scatterNoiseSeed -= Mathf.Floor(this.scatterNoiseSeed);
        }
        Sunshine.Instance.PostScatterMaterial.SetTexture("ScatterDitherMap", Sunshine.Instance.ScatterDitherTexture);
        float value = 1f - Sunshine.Instance.ScatterExaggeration;
        float y     = 1f / (Mathf.Clamp01(value) * Sunshine.Instance.LightDistance / camera.farClipPlane);
        float num   = Sunshine.Instance.ScatterSky * Sunshine.Instance.ScatterIntensity;

        Sunshine.Instance.PostScatterMaterial.SetVector("ScatterIntensityVolumeSky", new Vector4(Sunshine.Instance.ScatterIntensity, y, num * 0.333f, num * 0.667f));
        int  b    = SunshineMath.RelativeResolutionDivisor(Sunshine.Instance.ScatterResolution);
        int2 @int = new int2(camera.pixelWidth, camera.pixelHeight) / b;

        @int.x = Mathf.Max(@int.x, 1);
        @int.y = Mathf.Max(@int.y, 1);
        Sunshine.Instance.PostScatterMaterial.SetVector("ScatterDitherData", new Vector3((float)@int.x / (float)Sunshine.Instance.ScatterDitherTexture.width, (float)@int.y / (float)Sunshine.Instance.ScatterDitherTexture.height, (!Sunshine.Instance.ScatterAnimateNoise) ? 0f : this.scatterNoiseSeed));
        Sunshine.Instance.PostBlurMaterial.SetFloat("BlurDepthTollerance", Sunshine.Instance.ScatterBlurDepthTollerance);
        if (this.sunshine_cb == null)
        {
            CommandBuffer[] commandBuffers = camera.GetCommandBuffers(CameraEvent.BeforeImageEffects);
            for (int i = 0; i < commandBuffers.Length; i++)
            {
                if (commandBuffers[i].name == "Sunshine CommandBuffer")
                {
                    this.sunshine_cb = commandBuffers[i];
                    break;
                }
            }
        }
        if (this.sunshine_cb == null)
        {
            this.sunshine_cb      = new CommandBuffer();
            this.sunshine_cb.name = "Sunshine CommandBuffer";
            camera.AddCommandBuffer(CameraEvent.BeforeImageEffects, this.sunshine_cb);
        }
        this.sunshine_cb.Clear();
        int nameID = Shader.PropertyToID("_SunshineScreenCopy");

        this.sunshine_cb.GetTemporaryRT(nameID, this.rtWidth, this.rtHeight, 0, FilterMode.Point, RenderTextureFormat.DefaultHDR, RenderTextureReadWrite.Default);
        this.sunshine_cb.Blit(BuiltinRenderTextureType.CameraTarget, nameID, this.blitMaterial, 0);
        int nameID2 = Shader.PropertyToID("_STempRT");
        int nameID3 = Shader.PropertyToID("_STempPingPongRT");

        this.sunshine_cb.GetTemporaryRT(nameID2, @int.x, @int.y, 0, FilterMode.Point, RenderTextureFormat.DefaultHDR, RenderTextureReadWrite.Default);
        this.sunshine_cb.GetTemporaryRT(nameID3, @int.x, @int.y, 0, FilterMode.Point, RenderTextureFormat.DefaultHDR, RenderTextureReadWrite.Default);
        this.sunshine_cb.SetGlobalTexture("_ScatterTexture", nameID2);
        this.sunshine_cb.DisableShaderKeyword(this.MYFILTER_STYLES[this.quality][0]);
        this.sunshine_cb.DisableShaderKeyword(this.MYFILTER_STYLES[this.quality][1]);
        this.sunshine_cb.DisableShaderKeyword(this.MYFILTER_STYLES[this.quality][2]);
        this.sunshine_cb.DisableShaderKeyword(this.MYFILTER_STYLES[this.quality][3]);
        this.sunshine_cb.EnableShaderKeyword(this.MYFILTER_STYLES[this.quality][4]);
        this.sunshine_cb.Blit(Texture2D.blackTexture, nameID2, Sunshine.Instance.PostScatterMaterial, 0);
        this.sunshine_cb.SetGlobalVector("BlurXY", new Vector2(1f, 0f));
        this.sunshine_cb.Blit(nameID2, nameID3, Sunshine.Instance.PostBlurMaterial, 0);
        this.sunshine_cb.SetGlobalVector("BlurXY", new Vector2(0f, 1f));
        this.sunshine_cb.Blit(nameID3, nameID2, Sunshine.Instance.PostBlurMaterial, 0);
        this.sunshine_cb.SetGlobalTexture(this.MainTexID, nameID);
        this.sunshine_cb.Blit(nameID, BuiltinRenderTextureType.CameraTarget, Sunshine.Instance.PostScatterMaterial, 1);
        this.sunshine_cb.ReleaseTemporaryRT(nameID);
        this.sunshine_cb.ReleaseTemporaryRT(nameID2);
        this.sunshine_cb.ReleaseTemporaryRT(nameID3);
    }
コード例 #12
0
 public void OnPostProcess(RenderTexture source, RenderTexture destination)
 {
     if (!this.GoodToGo)
     {
         Graphics.Blit(source, destination);
         return;
     }
     if (Sunshine.Instance.DebugView == SunshineDebugViews.Cascades)
     {
         SunshinePostprocess.Blit(source, destination, Sunshine.Instance.PostDebugMaterial, SunshinePostDebugPass.DebugCascades);
     }
     else
     {
         bool scatterActive = Sunshine.Instance.ScatterActive;
         if (scatterActive)
         {
             bool flag = Sunshine.Instance.ScatterBlur;
             if (!Sunshine.Instance.PostBlurSupported)
             {
                 flag = false;
             }
             bool      flag2 = Sunshine.Instance.OvercastAffectsScatter && (Sunshine.Instance.OvercastTexture || Sunshine.Instance.ScatterOvercastTexture);
             bool      customScatterOvercast = Sunshine.Instance.CustomScatterOvercast;
             Texture2D overcastTexture       = (!flag2) ? null : ((!customScatterOvercast) ? Sunshine.Instance.OvercastTexture : Sunshine.Instance.ScatterOvercastTexture);
             float     overcastScale         = (!customScatterOvercast) ? Sunshine.Instance.OvercastScale : Sunshine.Instance.ScatterOvercastScale;
             Vector2   overcastMovement      = (!customScatterOvercast) ? Sunshine.Instance.OvercastMovement : Sunshine.Instance.ScatterOvercastMovement;
             float     overcastPlaneHeight   = (!customScatterOvercast) ? Sunshine.Instance.OvercastPlaneHeight : Sunshine.Instance.ScatterOvercastPlaneHeight;
             this.ConfigureOvercast(flag2, overcastTexture, overcastScale, overcastMovement, overcastPlaneHeight);
             Vector3 direction = this.AttachedCamera.ViewportPointToRay(new Vector3(0f, 0f, 0f)).direction;
             Vector3 v         = this.AttachedCamera.ViewportPointToRay(new Vector3(1f, 0f, 0f)).direction - direction;
             Vector3 v2        = this.AttachedCamera.ViewportPointToRay(new Vector3(0f, 1f, 0f)).direction - direction;
             Sunshine.Instance.PostScatterMaterial.SetVector("worldLightRay", Sunshine.Instance.SunLight.transform.forward);
             Sunshine.Instance.PostScatterMaterial.SetVector("worldRay", direction);
             Sunshine.Instance.PostScatterMaterial.SetVector("worldRayU", v);
             Sunshine.Instance.PostScatterMaterial.SetVector("worldRayV", v2);
             Sunshine.Instance.PostScatterMaterial.SetTexture("_ScatterRamp", Sunshine.Instance.ScatterRamp);
             SunshineKeywords.SetScatterQuality(Sunshine.Instance.ScatterSamplingQuality);
             Sunshine.Instance.PostScatterMaterial.SetVector("ScatterColor", Sunshine.Instance.ScatterColor);
             if (Sunshine.Instance.ScatterAnimateNoise)
             {
                 this.scatterNoiseSeed += Time.deltaTime * Sunshine.Instance.ScatterAnimateNoiseSpeed;
                 this.scatterNoiseSeed -= Mathf.Floor(this.scatterNoiseSeed);
             }
             Sunshine.Instance.PostScatterMaterial.SetTexture("ScatterDitherMap", Sunshine.Instance.ScatterDitherTexture);
             float value = 1f - Sunshine.Instance.ScatterExaggeration;
             float y     = 1f / (Mathf.Clamp01(value) * Sunshine.Instance.LightDistance / this.AttachedCamera.farClipPlane);
             float num   = Sunshine.Instance.ScatterSky * Sunshine.Instance.ScatterIntensity;
             Sunshine.Instance.PostScatterMaterial.SetVector("ScatterIntensityVolumeSky", new Vector4(Sunshine.Instance.ScatterIntensity, y, num * 0.333f, num * 0.667f));
             bool flag3 = Sunshine.Instance.ScatterResolution == SunshineRelativeResolutions.Full && !flag && Sunshine.Instance.DebugView != SunshineDebugViews.Scatter;
             SunshineKeywords.ToggleScatterBlendNow(flag3);
             if (!flag3)
             {
                 int  b    = SunshineMath.RelativeResolutionDivisor(Sunshine.Instance.ScatterResolution);
                 int2 @int = new int2(source.width, source.height) / b;
                 @int.x = Mathf.Max(@int.x, 1);
                 @int.y = Mathf.Max(@int.y, 1);
                 Sunshine.Instance.PostScatterMaterial.SetVector("ScatterDitherData", new Vector3((float)@int.x / (float)Sunshine.Instance.ScatterDitherTexture.width, (float)@int.y / (float)Sunshine.Instance.ScatterDitherTexture.height, (!Sunshine.Instance.ScatterAnimateNoise) ? 0f : this.scatterNoiseSeed));
                 RenderTexture temporary = RenderTexture.GetTemporary(@int.x, @int.y, 0, source.format, RenderTextureReadWrite.Default);
                 if (temporary)
                 {
                     temporary.filterMode = FilterMode.Point;
                     temporary.wrapMode   = TextureWrapMode.Clamp;
                     SunshinePostprocess.Blit(source, temporary, Sunshine.Instance.PostScatterMaterial, SunshinePostScatterPass.DrawScatter);
                     if (flag)
                     {
                         Sunshine.Instance.PostBlurMaterial.SetFloat("BlurDepthTollerance", Sunshine.Instance.ScatterBlurDepthTollerance);
                         RenderTexture temporary2 = RenderTexture.GetTemporary(temporary.width, temporary.height, 0, temporary.format, RenderTextureReadWrite.Default);
                         if (temporary2)
                         {
                             temporary2.filterMode = temporary.filterMode;
                             temporary2.wrapMode   = temporary.wrapMode;
                             Sunshine.Instance.PostBlurMaterial.SetVector("BlurXY", new Vector2(1f, 0f));
                             SunshinePostprocess.Blit(temporary, temporary2, Sunshine.Instance.PostBlurMaterial, 0);
                             temporary.DiscardContents();
                             Sunshine.Instance.PostBlurMaterial.SetVector("BlurXY", new Vector2(0f, 1f));
                             SunshinePostprocess.Blit(temporary2, temporary, Sunshine.Instance.PostBlurMaterial, 0);
                             RenderTexture.ReleaseTemporary(temporary2);
                         }
                     }
                     temporary.filterMode = FilterMode.Bilinear;
                     if (Sunshine.Instance.DebugView == SunshineDebugViews.Scatter)
                     {
                         SunshinePostprocess.Blit(temporary, destination, Sunshine.Instance.PostDebugMaterial, SunshinePostDebugPass.DebugAlpha);
                     }
                     else
                     {
                         Sunshine.Instance.PostScatterMaterial.SetTexture("_ScatterTexture", temporary);
                         SunshinePostprocess.Blit(source, destination, Sunshine.Instance.PostScatterMaterial, SunshinePostScatterPass.ApplyScatter);
                     }
                     RenderTexture.ReleaseTemporary(temporary);
                 }
                 else
                 {
                     flag3 = true;
                 }
             }
             if (flag3)
             {
                 Sunshine.Instance.PostScatterMaterial.SetVector("ScatterDitherData", new Vector3((float)this.AttachedCamera.pixelWidth / (float)Sunshine.Instance.ScatterDitherTexture.width, (float)this.AttachedCamera.pixelHeight / (float)Sunshine.Instance.ScatterDitherTexture.height, (!Sunshine.Instance.ScatterAnimateNoise) ? 0f : this.scatterNoiseSeed));
                 SunshinePostprocess.Blit(source, destination, Sunshine.Instance.PostScatterMaterial, SunshinePostScatterPass.DrawScatter);
             }
         }
     }
 }
コード例 #13
0
    private void ConfigureShaders()
    {
        this.ConfigureTheForestShaders();
        if (this.ShadowsActive)
        {
            SunshineKeywords.SetFilterStyle(Sunshine.Instance.ShadowFilter);
        }
        else
        {
            SunshineKeywords.DisableShadows();
        }
        Matrix4x4 lhs = Matrix4x4.identity;

        lhs = SunshineMath.ToRectSpaceProjection(Sunshine.Instance.CascadeRect(0)) * Sunshine.Instance.SunLightCamera.projectionMatrix;
        SunshineMath.SetLinearDepthProjection(ref lhs, Sunshine.Instance.SunLightCamera.farClipPlane);
        Matrix4x4 matrix4x = lhs * Sunshine.Instance.SunLightCamera.worldToCameraMatrix;
        Matrix4x4 mat      = matrix4x * this.AttachedCamera.cameraToWorldMatrix;

        Shader.SetGlobalMatrix("sunshine_CameraVToSunVP", mat);
        Shader.SetGlobalMatrix("sunshine_WorldToSunVP", matrix4x);
        float num = (float)Sunshine.Instance.Lightmap.width;

        Shader.SetGlobalVector("sunshine_ShadowParamsAndHalfTexel", new Vector4(Sunshine.Instance.SunLight.shadowStrength, Sunshine.Instance.CascadeFade, 0.5f / num, 0.5f / num));
        this.ConfigureCascadeClips(this.AttachedCamera.farClipPlane);
        Vector3   position  = (!this.AttachedCamera.orthographic) ? base.transform.position : this.AttachedCamera.ViewportToWorldPoint(new Vector3(0f, 0f, 0f));
        Vector3   position2 = this.AttachedCamera.ViewportToWorldPoint(new Vector3(0f, 0f, this.AttachedCamera.farClipPlane));
        Vector3   position3 = this.AttachedCamera.ViewportToWorldPoint(new Vector3(1f, 0f, this.AttachedCamera.farClipPlane));
        Vector3   position4 = this.AttachedCamera.ViewportToWorldPoint(new Vector3(0f, 1f, this.AttachedCamera.farClipPlane));
        Transform transform = Sunshine.Instance.SunLightCamera.transform;
        Vector3   vector    = transform.InverseTransformPoint(position);
        Vector3   vector2   = transform.InverseTransformPoint(position2);
        Vector3   vector3   = transform.InverseTransformPoint(position3);
        Vector3   vector4   = transform.InverseTransformPoint(position4);
        Vector2   vector5   = SunshineMath.xy(Sunshine.Instance.SunLightCamera.WorldToViewportPoint(position));
        Vector2   vector6   = SunshineMath.xy(Sunshine.Instance.SunLightCamera.WorldToViewportPoint(position2));
        Vector2   vector7   = SunshineMath.xy(Sunshine.Instance.SunLightCamera.WorldToViewportPoint(position3));
        Vector2   vector8   = SunshineMath.xy(Sunshine.Instance.SunLightCamera.WorldToViewportPoint(position4));
        Vector4   vector9   = new Vector4(vector6.x, vector6.y, vector2.z / Sunshine.Instance.SunLightCamera.farClipPlane, vector.y);
        Vector4   vector10  = new Vector4(vector5.x, vector5.y, vector.z / Sunshine.Instance.SunLightCamera.farClipPlane, vector.y);
        Vector4   vec       = vector9 - vector10;
        Vector4   vec2      = new Vector4(vector7.x, vector7.y, vector3.z / Sunshine.Instance.SunLightCamera.farClipPlane, vector3.y) - vector9;
        Vector4   vec3      = new Vector4(vector8.x, vector8.y, vector4.z / Sunshine.Instance.SunLightCamera.farClipPlane, vector4.y) - vector9;
        Rect      rect      = Sunshine.Instance.CascadeRect(0);

        SunshineMath.ShadowCoordDataInRect(ref vector10, ref rect);
        SunshineMath.ShadowCoordDataRayInRect(ref vec, ref rect);
        SunshineMath.ShadowCoordDataRayInRect(ref vec2, ref rect);
        SunshineMath.ShadowCoordDataRayInRect(ref vec3, ref rect);
        Shader.SetGlobalFloat("sunshine_IsOrthographic", (!this.AttachedCamera.orthographic) ? 0f : 1f);
        Shader.SetGlobalVector("sunshine_ShadowCoordDepthStart", vector10);
        Shader.SetGlobalVector("sunshine_ShadowCoordDepthRayZ", vec);
        Shader.SetGlobalVector("sunshine_ShadowCoordDepthRayU", vec2);
        Shader.SetGlobalVector("sunshine_ShadowCoordDepthRayV", vec3);
        float   num2     = Sunshine.Instance.SunLightCamera.orthographicSize * 2f;
        Vector2 vector11 = new Vector2(num2, num2);

        vector11.x /= rect.width;
        vector11.y /= rect.height;
        Vector3 v = new Vector3(vector11.x, vector11.y, Sunshine.Instance.SunLightCamera.farClipPlane) / this.AttachedCamera.farClipPlane;

        Shader.SetGlobalVector("sunshine_ShadowToWorldScale", v);
        Matrix4x4 zero      = Matrix4x4.zero;
        Vector3   position5 = Sunshine.Instance.SunLightCamera.ViewportToWorldPoint(new Vector3(0f, 0f, 0f));
        Vector3   position6 = Sunshine.Instance.SunLightCamera.ViewportToWorldPoint(new Vector3(1f, 1f, 0f));

        for (int i = 0; i < Sunshine.Instance.CascadeCount; i++)
        {
            Vector4 v2 = new Vector4(0f, 0f, 1f, 1f);
            if (i > 0)
            {
                Camera  camera   = Sunshine.Instance.SunLightCameras[i];
                Vector3 vector12 = camera.WorldToViewportPoint(position5);
                Vector3 vector13 = camera.WorldToViewportPoint(position6);
                v2 = new Vector4(vector12.x, vector12.y, vector13.x, vector13.y);
            }
            Rect rect2 = Sunshine.Instance.CascadeRect(i);
            v2.x  = rect2.xMin + rect2.width * v2.x;
            v2.y  = rect2.yMin + rect2.height * v2.y;
            v2.z  = rect2.xMin + rect2.width * v2.z;
            v2.w  = rect2.yMin + rect2.height * v2.w;
            v2.z -= v2.x;
            v2.w -= v2.y;
            zero.SetRow(i, v2);
        }
        Vector4 row = zero.GetRow(0);

        for (int j = 0; j < Sunshine.Instance.CascadeCount; j++)
        {
            Vector4 row2 = zero.GetRow(j);
            row2.z /= row.z;
            row2.w /= row.w;
            zero.SetRow(j, row2);
        }
        bool flag = Sunshine.Instance.OvercastTexture;

        this.ConfigureOvercast(flag, (!flag) ? Sunshine.Instance.BlankOvercastTexture : Sunshine.Instance.OvercastTexture, Sunshine.Instance.OvercastScale, Sunshine.Instance.OvercastMovement, Sunshine.Instance.OvercastPlaneHeight);
        Shader.SetGlobalMatrix("sunshine_CascadeRanges", zero);
    }
コード例 #14
0
ファイル: SunshineCamera.cs プロジェクト: K07H/The-Forest
    private void ConfigureShaders()
    {
        this.ConfigureTheForestShaders();
        if (this.ShadowsActive)
        {
            SunshineKeywords.SetFilterStyle(Sunshine.Instance.ShadowFilter);
        }
        else
        {
            SunshineKeywords.DisableShadows();
        }
        Matrix4x4 lhs = Matrix4x4.identity;

        lhs = SunshineMath.ToRectSpaceProjection(Sunshine.Instance.CascadeRect(0)) * Sunshine.Instance.SunLightCamera.projectionMatrix;
        SunshineMath.SetLinearDepthProjection(ref lhs, Sunshine.Instance.SunLightCamera.farClipPlane);
        Matrix4x4 matrix4x = lhs * Sunshine.Instance.SunLightCamera.worldToCameraMatrix;
        Matrix4x4 value    = matrix4x * this.AttachedCamera.cameraToWorldMatrix;

        Shader.SetGlobalMatrix("sunshine_CameraVToSunVP", value);
        Shader.SetGlobalMatrix("sunshine_WorldToSunVP", matrix4x);
        float num = (float)Sunshine.Instance.Lightmap.width;

        Shader.SetGlobalVector("sunshine_ShadowParamsAndHalfTexel", new Vector4(Sunshine.Instance.SunLight.shadowStrength, Sunshine.Instance.CascadeFade, 0.5f / num, 0.5f / num));
        this.ConfigureCascadeClips(this.AttachedCamera.farClipPlane);
        Vector3   position  = this.AttachedCamera.ViewportToWorldPoint(new Vector3(0f, 0f, this.AttachedCamera.farClipPlane));
        Vector3   position2 = this.AttachedCamera.ViewportToWorldPoint(new Vector3(1f, 0f, this.AttachedCamera.farClipPlane));
        Vector3   position3 = this.AttachedCamera.ViewportToWorldPoint(new Vector3(0f, 1f, this.AttachedCamera.farClipPlane));
        Transform transform = Sunshine.Instance.SunLightCamera.transform;
        Vector3   position4 = (!this.AttachedCamera.orthographic) ? base.transform.position : this.AttachedCamera.ViewportToWorldPoint(new Vector3(0f, 0f, 0f));
        Vector3   vector    = transform.InverseTransformPoint(position4);
        Vector3   vector2   = transform.InverseTransformPoint(position);
        Vector3   vector3   = transform.InverseTransformPoint(position2);
        Vector3   vector4   = transform.InverseTransformPoint(position3);
        Vector2   vector5   = SunshineMath.xy(Sunshine.Instance.SunLightCamera.WorldToViewportPoint(position4));
        Vector2   vector6   = SunshineMath.xy(Sunshine.Instance.SunLightCamera.WorldToViewportPoint(position));
        Vector2   vector7   = SunshineMath.xy(Sunshine.Instance.SunLightCamera.WorldToViewportPoint(position2));
        Vector2   vector8   = SunshineMath.xy(Sunshine.Instance.SunLightCamera.WorldToViewportPoint(position3));
        Vector4   vector9   = new Vector4(vector6.x, vector6.y, vector2.z / Sunshine.Instance.SunLightCamera.farClipPlane, vector.y);
        Vector4   vector10  = new Vector4(vector5.x, vector5.y, vector.z / Sunshine.Instance.SunLightCamera.farClipPlane, vector.y);
        Vector4   value2    = vector9 - vector10;
        Vector4   value3    = new Vector4(vector7.x, vector7.y, vector3.z / Sunshine.Instance.SunLightCamera.farClipPlane, vector3.y) - vector9;
        Vector4   value4    = new Vector4(vector8.x, vector8.y, vector4.z / Sunshine.Instance.SunLightCamera.farClipPlane, vector4.y) - vector9;
        Rect      rect      = Sunshine.Instance.CascadeRect(0);

        SunshineMath.ShadowCoordDataInRect(ref vector10, ref rect);
        SunshineMath.ShadowCoordDataRayInRect(ref value2, ref rect);
        SunshineMath.ShadowCoordDataRayInRect(ref value3, ref rect);
        SunshineMath.ShadowCoordDataRayInRect(ref value4, ref rect);
        Shader.SetGlobalFloat("sunshine_IsOrthographic", (!this.AttachedCamera.orthographic) ? 0f : 1f);
        Shader.SetGlobalVector("sunshine_ShadowCoordDepthStart", vector10);
        Shader.SetGlobalVector("sunshine_ShadowCoordDepthRayZ", value2);
        Shader.SetGlobalVector("sunshine_ShadowCoordDepthRayU", value3);
        Shader.SetGlobalVector("sunshine_ShadowCoordDepthRayV", value4);
        if (ForestVR.Enabled)
        {
            Vector3   a                   = Quaternion.Inverse(InputTracking.GetLocalRotation(VRNode.LeftEye)) * InputTracking.GetLocalPosition(VRNode.LeftEye);
            Vector3   b                   = Quaternion.Inverse(InputTracking.GetLocalRotation(VRNode.RightEye)) * InputTracking.GetLocalPosition(VRNode.RightEye);
            Vector3   vector11            = (a - b) * 0.5f;
            Matrix4x4 cameraToWorldMatrix = this.AttachedCamera.cameraToWorldMatrix;
            Vector3   vector12            = cameraToWorldMatrix.MultiplyPoint(-vector11);
            Vector3   vector13            = cameraToWorldMatrix.MultiplyPoint(vector11);
            position4 = vector12;
            Vector3[] array  = new Vector3[4];
            Vector3[] array2 = new Vector3[4];
            this.AttachedCamera.CalculateFrustumCorners(new Rect(0f, 0f, 1f, 1f), this.AttachedCamera.farClipPlane, Camera.MonoOrStereoscopicEye.Left, array);
            position  = this.AttachedCamera.transform.TransformVector(array[0]);
            position2 = this.AttachedCamera.transform.TransformVector(array[3]);
            position3 = this.AttachedCamera.transform.TransformVector(array[1]);
            vector    = transform.InverseTransformPoint(position4);
            vector2   = transform.InverseTransformPoint(position);
            vector3   = transform.InverseTransformPoint(position2);
            vector4   = transform.InverseTransformPoint(position3);
            vector5   = SunshineMath.xy(Sunshine.Instance.SunLightCamera.WorldToViewportPoint(position4));
            vector6   = SunshineMath.xy(Sunshine.Instance.SunLightCamera.WorldToViewportPoint(position));
            vector7   = SunshineMath.xy(Sunshine.Instance.SunLightCamera.WorldToViewportPoint(position2));
            vector8   = SunshineMath.xy(Sunshine.Instance.SunLightCamera.WorldToViewportPoint(position3));
            vector9   = new Vector4(vector6.x, vector6.y, vector2.z / Sunshine.Instance.SunLightCamera.farClipPlane, vector.y);
            Vector4 value5 = new Vector4(vector5.x, vector5.y, vector.z / Sunshine.Instance.SunLightCamera.farClipPlane, vector.y);
            Vector4 value6 = vector9 - vector10;
            Vector4 value7 = new Vector4(vector7.x, vector7.y, vector3.z / Sunshine.Instance.SunLightCamera.farClipPlane, vector3.y) - vector9;
            Vector4 value8 = new Vector4(vector8.x, vector8.y, vector4.z / Sunshine.Instance.SunLightCamera.farClipPlane, vector4.y) - vector9;
            position4 = vector13;
            this.AttachedCamera.CalculateFrustumCorners(new Rect(0f, 0f, 1f, 1f), this.AttachedCamera.farClipPlane, Camera.MonoOrStereoscopicEye.Right, array2);
            position  = this.AttachedCamera.transform.TransformVector(array2[0]);
            position2 = this.AttachedCamera.transform.TransformVector(array2[3]);
            position3 = this.AttachedCamera.transform.TransformVector(array2[1]);
            vector    = transform.InverseTransformPoint(position4);
            vector2   = transform.InverseTransformPoint(position);
            vector3   = transform.InverseTransformPoint(position2);
            vector4   = transform.InverseTransformPoint(position3);
            vector5   = SunshineMath.xy(Sunshine.Instance.SunLightCamera.WorldToViewportPoint(position4));
            vector6   = SunshineMath.xy(Sunshine.Instance.SunLightCamera.WorldToViewportPoint(position));
            vector7   = SunshineMath.xy(Sunshine.Instance.SunLightCamera.WorldToViewportPoint(position2));
            vector8   = SunshineMath.xy(Sunshine.Instance.SunLightCamera.WorldToViewportPoint(position3));
            vector9   = new Vector4(vector6.x, vector6.y, vector2.z / Sunshine.Instance.SunLightCamera.farClipPlane, vector.y);
            Vector4 value9  = new Vector4(vector5.x, vector5.y, vector.z / Sunshine.Instance.SunLightCamera.farClipPlane, vector.y);
            Vector4 value10 = vector9 - vector10;
            Vector4 value11 = new Vector4(vector7.x, vector7.y, vector3.z / Sunshine.Instance.SunLightCamera.farClipPlane, vector3.y) - vector9;
            Vector4 value12 = new Vector4(vector8.x, vector8.y, vector4.z / Sunshine.Instance.SunLightCamera.farClipPlane, vector4.y) - vector9;
            Shader.SetGlobalVector("L_sunshine_ShadowCoordDepthStart", value5);
            Shader.SetGlobalVector("L_sunshine_ShadowCoordDepthRayZ", value6);
            Shader.SetGlobalVector("L_sunshine_ShadowCoordDepthRayU", value7);
            Shader.SetGlobalVector("L_sunshine_ShadowCoordDepthRayV", value8);
            Shader.SetGlobalVector("R_sunshine_ShadowCoordDepthStart", value9);
            Shader.SetGlobalVector("R_sunshine_ShadowCoordDepthRayZ", value10);
            Shader.SetGlobalVector("R_sunshine_ShadowCoordDepthRayU", value11);
            Shader.SetGlobalVector("R_sunshine_ShadowCoordDepthRayV", value12);
        }
        float   num2     = Sunshine.Instance.SunLightCamera.orthographicSize * 2f;
        Vector2 vector14 = new Vector2(num2, num2);

        vector14.x /= rect.width;
        vector14.y /= rect.height;
        Vector3 v = new Vector3(vector14.x, vector14.y, Sunshine.Instance.SunLightCamera.farClipPlane) / this.AttachedCamera.farClipPlane;

        Shader.SetGlobalVector("sunshine_ShadowToWorldScale", v);
        Matrix4x4 zero      = Matrix4x4.zero;
        Vector3   position5 = Sunshine.Instance.SunLightCamera.ViewportToWorldPoint(new Vector3(0f, 0f, 0f));
        Vector3   position6 = Sunshine.Instance.SunLightCamera.ViewportToWorldPoint(new Vector3(1f, 1f, 0f));

        for (int i = 0; i < Sunshine.Instance.CascadeCount; i++)
        {
            Vector4 v2 = new Vector4(0f, 0f, 1f, 1f);
            if (i > 0)
            {
                Camera  camera   = Sunshine.Instance.SunLightCameras[i];
                Vector3 vector15 = camera.WorldToViewportPoint(position5);
                Vector3 vector16 = camera.WorldToViewportPoint(position6);
                v2 = new Vector4(vector15.x, vector15.y, vector16.x, vector16.y);
            }
            Rect rect2 = Sunshine.Instance.CascadeRect(i);
            v2.x  = rect2.xMin + rect2.width * v2.x;
            v2.y  = rect2.yMin + rect2.height * v2.y;
            v2.z  = rect2.xMin + rect2.width * v2.z;
            v2.w  = rect2.yMin + rect2.height * v2.w;
            v2.z -= v2.x;
            v2.w -= v2.y;
            zero.SetRow(i, v2);
        }
        Vector4 row = zero.GetRow(0);

        for (int j = 0; j < Sunshine.Instance.CascadeCount; j++)
        {
            Vector4 row2 = zero.GetRow(j);
            row2.z /= row.z;
            row2.w /= row.w;
            zero.SetRow(j, row2);
        }
        bool flag = Sunshine.Instance.OvercastTexture;

        this.ConfigureOvercast(flag, (!flag) ? Sunshine.Instance.BlankOvercastTexture : Sunshine.Instance.OvercastTexture, Sunshine.Instance.OvercastScale, Sunshine.Instance.OvercastMovement, Sunshine.Instance.OvercastPlaneHeight);
        Shader.SetGlobalMatrix("sunshine_CascadeRanges", zero);
    }