private void UseEffect(Action <EffectSpecialPaintShop> fn, TargetResourceTexture tex)
        {
            if (_paintShopEffect == null)
            {
                _paintShopEffect = DeviceContextHolder.GetEffect <EffectSpecialPaintShop>();

                var s = Stopwatch.StartNew();
                _paintShopEffect.FxNoiseMap.SetResource(DeviceContextHolder.GetRandomTexture(OptionPaintShopRandomSize, OptionPaintShopRandomSize));
                AcToolsLogging.Write($"Random texture: {s.Elapsed.TotalMilliseconds:F1} ms");
            }

            using (DeviceContextHolder.SaveRenderTargetAndViewport()) {
                DeviceContextHolder.PrepareQuad(_paintShopEffect.LayoutPT);
                DeviceContext.Rasterizer.SetViewports(tex.Viewport);
                DeviceContext.OutputMerger.SetTargets(tex.TargetView);
                DeviceContext.ClearRenderTargetView(tex.TargetView, new Color4(0f, 0f, 0f, 0f));
                DeviceContext.OutputMerger.BlendState        = null;
                DeviceContext.OutputMerger.DepthStencilState = null;
                DeviceContext.Rasterizer.State = null;

                _paintShopEffect.FxNoiseMultipler.Set((float)Math.Max(tex.Width, tex.Height) / OptionPaintShopRandomSize);
                _paintShopEffect.FxSize.Set(new Vector4(tex.Width, tex.Height, 1f / tex.Width, 1f / tex.Height));

                fn?.Invoke(_paintShopEffect);
            }
        }
Пример #2
0
        public bool DrawScene(DeviceContextHolder holder, IReflectionDraw draw, int facesPerFrame)
        {
            if (facesPerFrame == 0 || _dirty.All(x => !x))
            {
                return(true);
            }

            using (holder.SaveRenderTargetAndViewport()) {
                holder.DeviceContext.Rasterizer.SetViewports(_viewport);

                var offset = _previouslyUpdated + 1;
                for (var k = 0; k < 6; k++)
                {
                    var i = (k + offset) % 6;
                    if (_dirty[i] && --facesPerFrame >= 0)
                    {
                        _dirty[i] = false;

                        holder.DeviceContext.ClearRenderTargetView(_targetView[i], BackgroundColor);
                        holder.DeviceContext.ClearDepthStencilView(_depthTargetView,
                                                                   DepthStencilClearFlags.Depth,
                                                                   1.0f, 0);
                        holder.DeviceContext.OutputMerger.SetTargets(_depthTargetView, _targetView[i]);
                        draw.DrawSceneForReflection(holder, _cameras[i]);
                        _previouslyUpdated = i;
                    }
                }

                holder.DeviceContext.GenerateMips(_view);
            }

            return(facesPerFrame >= 0);
        }
Пример #3
0
        public void DrawScene(DeviceContextHolder holder, [NotNull] IShadowsDraw draw)
        {
            using (holder.SaveRenderTargetAndViewport()) {
                holder.DeviceContext.Rasterizer.SetViewports(_viewport);
                holder.DeviceContext.Rasterizer.State = _rasterizerState;
                holder.DeviceContext.OutputMerger.DepthStencilState = _depthStencilState;
                holder.DeviceContext.OutputMerger.BlendState        = null;

                UpdateBuffers(holder, draw);

                holder.DeviceContext.Rasterizer.State = null;
                holder.DeviceContext.OutputMerger.DepthStencilState = null;
            }
        }
Пример #4
0
        public void DrawScene(DeviceContextHolder holder, IReflectionDraw draw)
        {
            holder.SaveRenderTargetAndViewport();
            holder.DeviceContext.Rasterizer.SetViewports(_viewport);
            for (var i = 0; i < 6; i++)
            {
                holder.DeviceContext.ClearRenderTargetView(_targetView[i], BackgroundColor);
                holder.DeviceContext.ClearDepthStencilView(_depthTargetView,
                                                           DepthStencilClearFlags.Depth | DepthStencilClearFlags.Stencil,
                                                           1.0f, 0);
                holder.DeviceContext.OutputMerger.SetTargets(_depthTargetView, _targetView[i]);
                draw.DrawSceneForReflection(holder, _cameras[i]);
            }

            holder.DeviceContext.GenerateMips(_view);
            holder.RestoreRenderTargetAndViewport();
        }
Пример #5
0
        public void Clear(DeviceContextHolder holder)
        {
            holder.SaveRenderTargetAndViewport();

            holder.DeviceContext.Rasterizer.SetViewports(_viewport);
            holder.DeviceContext.OutputMerger.DepthStencilState = null;
            holder.DeviceContext.OutputMerger.BlendState        = null;
            holder.DeviceContext.Rasterizer.State = _rasterizerState;

            foreach (var split in Splits)
            {
                holder.DeviceContext.OutputMerger.SetTargets(split.Buffer.DepthView);
                holder.DeviceContext.ClearDepthStencilView(split.Buffer.DepthView, DepthStencilClearFlags.Depth | DepthStencilClearFlags.Stencil, 1f, 0);
            }

            holder.DeviceContext.Rasterizer.State = null;
            holder.DeviceContext.OutputMerger.DepthStencilState = null;
            holder.RestoreRenderTargetAndViewport();
        }
Пример #6
0
        public void Draw(DeviceContextHolder holder, ShaderResourceView view, TargetResourceTexture temporary)
        {
            // preparation
            var saved = holder.SaveRenderTargetAndViewport();

            holder.QuadBuffers.Prepare(holder.DeviceContext, _effect.LayoutPT);

            // update those small texture
            UpdateNewAverateColor(holder, view);
            UpdateAdaptation(holder);

            // restore viewport
            saved.Dispose();

            holder.DeviceContext.OutputMerger.SetTargets(temporary.TargetView);
            holder.DeviceContext.ClearRenderTargetView(temporary.TargetView, BaseRenderer.ColorTransparent);

            _effect.FxInputMap.SetResource(view);
            _effect.FxBrightnessMap.SetResource(GetAdaptationTexture().View);
            _effect.TechTonemap.DrawAllPasses(holder.DeviceContext, 6);

            // update bloom texture (bright areas)
            UpdateBloom(holder, temporary.View);

            if (BloomDebug)
            {
                // restore viewport
                saved.Dispose();

                _effect.FxInputMap.SetResource(_bloomTexture.View);
                _effect.TechCopy.DrawAllPasses(holder.DeviceContext, 6);
                return;
            }

            // restore viewport
            saved.Dispose();

            _effect.FxInputMap.SetResource(temporary.View);
            _effect.FxBloomMap.SetResource(_bloomTexture.View);
            _effect.TechCombine.DrawAllPasses(holder.DeviceContext, 6);
        }
Пример #7
0
        public void DrawScene(DeviceContextHolder holder, IShadowsDraw draw)
        {
            holder.SaveRenderTargetAndViewport();

            holder.DeviceContext.Rasterizer.SetViewports(_viewport);
            holder.DeviceContext.OutputMerger.DepthStencilState = null;
            holder.DeviceContext.OutputMerger.BlendState        = null;
            holder.DeviceContext.Rasterizer.State = _rasterizerState;

            foreach (var split in Splits)
            {
                holder.DeviceContext.OutputMerger.SetTargets(split.Buffer.DepthView);
                holder.DeviceContext.ClearDepthStencilView(split.Buffer.DepthView, DepthStencilClearFlags.Depth | DepthStencilClearFlags.Stencil, 1f, 0);
                draw.DrawSceneForShadows(holder, split.Camera);
                holder.DeviceContext.GenerateMips(split.Buffer.View);
            }

            holder.DeviceContext.Rasterizer.State = null;
            holder.DeviceContext.OutputMerger.DepthStencilState = null;
            holder.RestoreRenderTargetAndViewport();
        }
Пример #8
0
        public void DrawScene(DeviceContextHolder holder, IReflectionDraw draw) {
            holder.SaveRenderTargetAndViewport();
            holder.DeviceContext.Rasterizer.SetViewports(_viewport);
            for (var i = 0; i < 6; i++) {
                holder.DeviceContext.ClearRenderTargetView(_targetView[i], new Color4(0));
                holder.DeviceContext.ClearDepthStencilView(_depthTargetView,
                                                           DepthStencilClearFlags.Depth | DepthStencilClearFlags.Stencil,
                                                           1.0f, 0);
                holder.DeviceContext.OutputMerger.SetTargets(_depthTargetView, _targetView[i]);
                draw.DrawSceneForReflection(holder, _cameras[i]);
            }

            holder.DeviceContext.GenerateMips(_view);
            holder.RestoreRenderTargetAndViewport();
        }
Пример #9
0
        public void DrawScene(DeviceContextHolder holder, IShadowsDraw draw) {
            holder.SaveRenderTargetAndViewport();

            holder.DeviceContext.Rasterizer.SetViewports(_viewport);
            holder.DeviceContext.OutputMerger.DepthStencilState = null;
            holder.DeviceContext.OutputMerger.BlendState = null;
            holder.DeviceContext.Rasterizer.State = _rasterizerState;

            foreach (var split in Splits) {
                holder.DeviceContext.OutputMerger.SetTargets(split.Buffer.DepthView);
                holder.DeviceContext.ClearDepthStencilView(split.Buffer.DepthView, DepthStencilClearFlags.Depth | DepthStencilClearFlags.Stencil, 1f, 0);
                draw.DrawSceneForShadows(holder, split.Camera);
                holder.DeviceContext.GenerateMips(split.Buffer.View);
            }

            holder.DeviceContext.Rasterizer.State = null;
            holder.DeviceContext.OutputMerger.DepthStencilState = null;
            holder.RestoreRenderTargetAndViewport();
        }
Пример #10
0
        public void Draw(DeviceContextHolder holder, ShaderResourceView view, TargetResourceTexture temporary) {
            // preparation
            holder.SaveRenderTargetAndViewport();
            holder.QuadBuffers.Prepare(holder.DeviceContext, _effect.LayoutPT);

            // update those small texture
            UpdateNewAverateColor(holder, view);
            UpdateAdaptation(holder);

            holder.RestoreRenderTargetAndViewport();
            holder.DeviceContext.OutputMerger.SetTargets(temporary.TargetView);
            holder.DeviceContext.ClearRenderTargetView(temporary.TargetView, BaseRenderer.ColorTransparent);

            _effect.FxInputMap.SetResource(view);
            _effect.FxBrightnessMap.SetResource(GetAdaptationTexture().View);
            _effect.TechTonemap.DrawAllPasses(holder.DeviceContext, 6);

            // update bloom texture (bright areas)
            UpdateBloom(holder, temporary.View);

            if (BloomDebug) {
                holder.RestoreRenderTargetAndViewport();
                _effect.FxInputMap.SetResource(_bloomTexture.View);
                _effect.TechCopy.DrawAllPasses(holder.DeviceContext, 6);
                return;
            }

            // reset viewport
            holder.RestoreRenderTargetAndViewport();

            _effect.FxInputMap.SetResource(temporary.View);
            _effect.FxBloomMap.SetResource(_bloomTexture.View);
            _effect.TechCombine.DrawAllPasses(holder.DeviceContext, 6);
        }