private void OnPreCull() { if (!this.GoodToGo) { SunshineKeywords.DisableShadows(); return; } this.RenderCascades(); this.ConfigureShaders(); if (this.ShadowsActive) { this._lightShadows = Sunshine.Instance.SunLight.shadows; this._lightRenderMode = Sunshine.Instance.SunLight.renderMode; Sunshine.Instance.SunLight.shadows = LightShadows.None; Sunshine.Instance.SunLight.renderMode = LightRenderMode.ForcePixel; } if (Sunshine.Instance.RequiresPostprocessing) { if ((this.AttachedCamera.depthTextureMode & DepthTextureMode.Depth) == DepthTextureMode.None && SystemInfo.SupportsRenderTextureFormat(RenderTextureFormat.Depth)) { this.AttachedCamera.depthTextureMode |= DepthTextureMode.Depth; } this.AttachedCamera.depthTextureMode |= DepthTextureMode.DepthNormals; } }
public static void ToggleScatterBlendNow(bool enabled) { if (SunshineKeywords.scatterBlendNow.Change(enabled)) { SunshineKeywords.ToggleKeyword(enabled, "SUNSHINE_SCATTER_BLENDNOW_ON"); } }
private void OnPostRender() { if (this.ShadowsActive) { Sunshine.Instance.SunLight.shadows = this._lightShadows; Sunshine.Instance.SunLight.renderMode = this._lightRenderMode; } SunshineKeywords.DisableShadows(); }
public void DisableShadows() { SunshineKeywords.DisableShadows(); }
public static void SetScatterQuality(SunshineScatterSamplingQualities quality) { SunshineKeywords.SetKeyword((int)quality, SunshineKeywords.SCATTER_QUALITIES); }
public static void DisableShadows() { SunshineKeywords.SetFilterStyle(0); }
public static void SetFilterStyle(SunshineShadowFilters style) { SunshineKeywords.SetFilterStyle((int)(style + 1)); }
public static void SetFilterStyle(int style) { SunshineKeywords.SetKeywordWithFallbacks(style, SunshineKeywords.FILTER_STYLES, 1); }
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); } } } }
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); }
private void OnDestroy() { SunshineKeywords.DisableShadows(); }
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); }