public PlatformLoader(SiraLog siraLog, BloomPrePassRendererSO bloomPrepassRenderer, BloomPrePassEffectContainerSO bloomPrePassEffectContainer)
 {
     _siraLog = siraLog;
     _bloomPrepassRenderer        = bloomPrepassRenderer;
     _bloomPrePassEffectContainer = bloomPrePassEffectContainer;
     _pathTaskPairs = new Dictionary <string, Task <CustomPlatform?> >();
 }
Example #2
0
        private void ApplyBloomEffect(Camera camera)
        {
            //TODO Fix SmoothCamera instead of skipping. Current workaround is to use CameraPlus instead. Investigate what BloomPrePassRendererSO does differently
            //Mirror cam has no BloomPrePass
            if (camera.name == "SmoothCamera" || camera.name.StartsWith("MirrorCam"))
            {
                return;
            }

            if (BloomIntensity == 0)
            {
                return;
            }

            try
            {
                GetPrivateFields(camera);
            }
            catch (Exception e)
            {
                Log.Error(e);
                if (!_bloomPrePassDict.ContainsKey(camera))
                {
                    _bloomPrePassDict.Add(camera, null);
                }
            }

            _bloomPrePassDict.TryGetValue(camera, out var bloomPrePass);
            if (bloomPrePass == null)
            {
                return;
            }

            var rendererFound   = _bloomPrePassRendererDict.TryGetValue(camera, out var bloomPrePassRenderer);
            var paramsFound     = _bloomPrePassParamsDict.TryGetValue(camera, out var bloomPrePassParams);
            var renderDataFound = _bloomPrePassRenderDataDict.TryGetValue(camera, out var bloomPrePassRenderData);

            //Never the case in my testing, but better safe than sorry
            if (!rendererFound || !paramsFound || !renderDataFound)
            {
                return;
            }

            var sRGBWrite = GL.sRGBWrite;

            GL.sRGBWrite = false;

            bloomPrePassRenderer !.GetCameraParams(camera, out var projectionMatrix, out _, out var stereoCameraEyeOffset);

            //The next few lines are taken from bloomPrePassRenderer.RenderAndSetData()
            var textureToScreenRatio = new Vector2
            {
                x = Mathf.Clamp01((float)(1.0 / ((double)Mathf.Tan((float)(bloomPrePassParams !.fov.x * 0.5 * (Math.PI / 180.0))) * projectionMatrix.m00))),
                y = Mathf.Clamp01((float)(1.0 / ((double)Mathf.Tan((float)(bloomPrePassParams.fov.y * 0.5 * (Math.PI / 180.0))) * projectionMatrix.m11)))
            };

            projectionMatrix.m00 *= textureToScreenRatio.x;
            projectionMatrix.m02 *= textureToScreenRatio.x;
            projectionMatrix.m11 *= textureToScreenRatio.y;
            projectionMatrix.m12 *= textureToScreenRatio.y;

            var temporary = RenderTexture.GetTemporary(bloomPrePassParams.textureWidth, bloomPrePassParams.textureHeight, 0, RenderTextureFormat.RGB111110Float, RenderTextureReadWrite.Linear);

            Graphics.SetRenderTarget(temporary);
            GL.Clear(true, true, Color.black);

            GL.PushMatrix();
            GL.LoadProjectionMatrix(projectionMatrix);
            _renderer.material.SetPass(0);
            var transformTemp = transform;

            Graphics.DrawMeshNow(_mesh, Matrix4x4.TRS(transformTemp.position, transformTemp.rotation, transformTemp.lossyScale));
            GL.PopMatrix();

            var boost = GetBloomBoost(camera);
            var blur2 = RenderTexture.GetTemporary(bloomPrePassParams.textureWidth >> DOWNSAMPLE, bloomPrePassParams.textureHeight >> DOWNSAMPLE,
                                                   0, RenderTextureFormat.RGB111110Float, RenderTextureReadWrite.Linear);

            DoubleBlur(temporary, blur2,
                       KawaseBlurRendererSO.KernelSize.Kernel127, boost,
                       KawaseBlurRendererSO.KernelSize.Kernel35, boost, 0.5f, DOWNSAMPLE);

            Graphics.Blit(blur2, bloomPrePassRenderData !.bloomPrePassRenderTexture, _additiveMaterial);

            RenderTexture.ReleaseTemporary(temporary);
            RenderTexture.ReleaseTemporary(blur2);

            BloomPrePassRendererSO.SetDataToShaders(stereoCameraEyeOffset, textureToScreenRatio, bloomPrePassRenderData.bloomPrePassRenderTexture, bloomPrePassRenderData.toneMapping);
            GL.sRGBWrite = sRGBWrite;
        }