Exemple #1
0
        /// <inheritdoc/>
        public override void Load(PipelinePluginContext context)
        {
            base.Load(context);

            // Mandatory render stages
            var mainRenderStage        = context.RenderSystem.GetOrCreateRenderStage("Main", "Main", new RenderOutputDescription(context.RenderContext.GraphicsDevice.Presenter.BackBuffer.ViewFormat, context.RenderContext.GraphicsDevice.Presenter.DepthStencilBuffer.ViewFormat));
            var transparentRenderStage = context.RenderSystem.GetOrCreateRenderStage("Transparent", "Main", new RenderOutputDescription(context.RenderContext.GraphicsDevice.Presenter.BackBuffer.ViewFormat, context.RenderContext.GraphicsDevice.Presenter.DepthStencilBuffer.ViewFormat));

            // Set default stage selector
            RegisterRenderStageSelector(meshRenderStageSelector = new MeshTransparentRenderStageSelector
            {
                EffectName             = ModelEffect,
                MainRenderStage        = mainRenderStage,
                TransparentRenderStage = transparentRenderStage,
            });

            // Default pipeline state
            RegisterPostProcessPipelineState((RenderNodeReference renderNodeReference, ref RenderNode renderNode, RenderObject renderObject, PipelineStateDescription pipelineState) =>
            {
                if (renderNode.RenderStage == transparentRenderStage)
                {
                    pipelineState.BlendState        = BlendStates.AlphaBlend;
                    pipelineState.DepthStencilState = DepthStencilStates.DepthRead;
                }

                var renderMesh       = (RenderMesh)renderObject;
                var cullModeOverride = renderMesh.MaterialInfo.CullMode;
                var cullMode         = pipelineState.RasterizerState.CullMode;

                // No override, or already two-sided?
                if (cullModeOverride.HasValue && cullMode != CullMode.None)
                {
                    if (cullModeOverride.Value == CullMode.None)
                    {
                        // Override to two-sided
                        cullMode = CullMode.None;
                    }
                    else if (cullModeOverride.Value == cullMode)
                    {
                        // No or double flipping
                        cullMode = CullMode.Back;
                    }
                    else
                    {
                        // Single flipping
                        cullMode = CullMode.Front;
                    }

                    pipelineState.RasterizerState.CullMode = cullMode;
                }
            });
        }
        /// <inheritdoc/>
        public override void Unload(PipelinePluginContext context)
        {
            meshRenderStageSelector = null;

            base.Unload(context);
        }