public void Render(DX11RenderContext context)
        {
            Device device = context.Device;

            //Just in case
            if (!this.updateddevices.Contains(context))
            {
                this.Update(context);
            }

            if (this.rendereddevices.Contains(context))
            {
                return;
            }

            if (this.FInEnabled[0])
            {
                if (this.BeginQuery != null)
                {
                    this.BeginQuery(context);
                }

                DX11RenderTextureArray target = this.FOutTexture[0][context];
                DX11DepthTextureArray  depth  = this.FOutDepthTexture[0][context];

                if (this.FInClear[0])
                {
                    context.CurrentDeviceContext.ClearRenderTargetView(target.RTV, this.FInBgColor[0]);

                    if (this.FInDepthBuffer[0])
                    {
                        context.CurrentDeviceContext.ClearDepthStencilView(depth.DSV, DepthStencilClearFlags.Depth, 1.0f, 0);
                    }
                }

                if (this.FInLayer.IsConnected)
                {
                    int slicecount = target.ElemCnt;
                    if (this.FInBindTarget[0])
                    {
                        if (this.FInDepthBuffer[0])
                        {
                            context.RenderTargetStack.Push(depth, false, target);
                        }
                        else
                        {
                            context.RenderTargetStack.Push(target);
                        }
                        slicecount = 1;
                    }

                    for (int i = 0; i < slicecount; i++)
                    {
                        settings.ViewportIndex = i;
                        settings.ViewportCount = target.ElemCnt;
                        settings.ApplyTransforms(this.FInView[i], this.FInProjection[i], this.FInAspect[i], this.FInCrop[i]);

                        settings.RenderWidth  = target.Width;
                        settings.RenderHeight = target.Height;
                        settings.RenderDepth  = target.ElemCnt;
                        settings.BackBuffer   = target;
                        settings.CustomSemantics.Clear();
                        settings.ResourceSemantics.Clear();

                        if (this.FInBindTarget[0] == false)
                        {
                            if (this.FInDepthBuffer[0])
                            {
                                context.RenderTargetStack.Push(depth.SliceDSV[i], false, target.SliceRTV[i]);
                            }
                            else
                            {
                                context.RenderTargetStack.Push(target.SliceRTV[i]);
                            }
                        }

                        this.FInLayer.RenderAll(context, settings);

                        if (this.FInBindTarget[0] == false)
                        {
                            context.RenderTargetStack.Pop();
                        }
                    }

                    if (this.FInBindTarget[0])
                    {
                        context.RenderTargetStack.Pop();
                    }

                    if (this.FInMips[0])
                    {
                        context.CurrentDeviceContext.GenerateMips(this.FOutTexture[0][context].SRV);
                    }
                }


                if (this.EndQuery != null)
                {
                    this.EndQuery(context);
                }

                this.rendereddevices.Add(context);
            }
        }
Пример #2
0
        public void Render(DX11RenderContext context)
        {
            Device device = context.Device;

            //Just in case
            if (!this.updateddevices.Contains(context))
            {
                this.Update(null, context);
            }

            if (this.rendereddevices.Contains(context))
            {
                return;
            }

            if (this.FInEnabled[0])
            {
                if (this.BeginQuery != null)
                {
                    this.BeginQuery(context);
                }

                DX11RenderTextureArray target = this.FOutTexture[0][context];
                DX11DepthTextureArray  depth  = this.FOutDepthTexture[0][context];

                if (this.FInClear[0])
                {
                    context.CurrentDeviceContext.ClearRenderTargetView(target.RTV, this.FInBgColor[0]);

                    if (this.FInDepthBuffer[0])
                    {
                        context.CurrentDeviceContext.ClearDepthStencilView(depth.DSV, DepthStencilClearFlags.Depth, 1.0f, 0);
                    }
                }

                if (this.FInLayer.PluginIO.IsConnected)
                {
                    for (int i = 0; i < target.ElemCnt; i++)
                    {
                        settings.ViewportIndex = i;
                        settings.ViewportCount = target.ElemCnt;
                        settings.View          = this.FInView[i];

                        Matrix proj   = this.FInProjection[i];
                        Matrix aspect = Matrix.Invert(this.FInAspect[i]);
                        Matrix crop   = Matrix.Invert(this.FInCrop[i]);

                        settings.Projection     = proj * aspect * crop;
                        settings.ViewProjection = settings.View * settings.Projection;
                        settings.RenderWidth    = target.Width;
                        settings.RenderHeight   = target.Height;
                        settings.RenderDepth    = target.ElemCnt;
                        settings.BackBuffer     = null;
                        settings.CustomSemantics.Clear();
                        settings.ResourceSemantics.Clear();

                        if (this.FInDepthBuffer[0])
                        {
                            context.RenderTargetStack.Push(depth.SliceDSV[i], false, target.SliceRTV[i]);
                        }
                        else
                        {
                            context.RenderTargetStack.Push(target.SliceRTV[i]);
                        }



                        for (int j = 0; j < this.FInLayer.SliceCount; j++)
                        {
                            try
                            {
                                this.FInLayer[j][context].Render(this.FInLayer.PluginIO, context, settings);
                            }
                            catch (Exception ex)
                            {
                                Console.WriteLine(ex.Message);
                            }
                        }

                        context.RenderTargetStack.Pop();
                    }
                }


                if (this.EndQuery != null)
                {
                    this.EndQuery(context);
                }

                this.rendereddevices.Add(context);
            }
        }