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; }
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); }
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)); }
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)); }
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 }); }
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)); }
public static Matrix4x4 SetLinearDepthProjection(Matrix4x4 projection, float farClip) { SunshineMath.SetLinearDepthProjection(ref projection, farClip); return(projection); }
public static float QuantizeValueWithoutFlicker(float number, int resolution, float lastResult) { return(SunshineMath.QuantizeValueWithoutFlicker(number, 1f / (float)resolution, lastResult)); }
public static float QuantizeValue(float number, int resolution) { return(SunshineMath.QuantizeValue(number, 1f / (float)resolution)); }
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); }
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 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); }