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

            var shadowMapRenderStage = context.RenderSystem.GetRenderStage("ShadowMapCaster");

            var forwardLightingRenderFeature = RenderFeature.RenderFeatures.OfType <ForwardLightingRenderFeature>().First();

            forwardLightingRenderFeature.ShadowMapRenderStage = shadowMapRenderStage;

            RegisterPostProcessPipelineState((RenderNodeReference renderNodeReference, ref RenderNode renderNode, RenderObject renderObject, PipelineStateDescription pipelineState) =>
            {
                if (renderNode.RenderStage == shadowMapRenderStage)
                {
                    pipelineState.RasterizerState = new RasterizerStateDescription(CullMode.None)
                    {
                        DepthClipEnable = false
                    };
                }
            });

            RegisterRenderStageSelector(new ShadowMapRenderStageSelector
            {
                EffectName           = MeshPipelinePlugin.DefaultEffectName + ".ShadowMapCaster",
                ShadowMapRenderStage = shadowMapRenderStage,
            });
        }
Exemple #2
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;
                }
            });
        }
        protected override MeshRenderFeature CreateRenderFeature(PipelinePluginContext context)
        {
            var meshRenderFeature = new MeshRenderFeature
            {
                RenderFeatures =
                {
                    new TransformRenderFeature(),
                    new SkinningRenderFeature(),
                    new MaterialRenderFeature(),
                    (ForwardLightingRenderFeature = new ForwardLightingRenderFeature()),
                },
            };

            return(meshRenderFeature);
        }
Exemple #4
0
        /// <inheritdoc/>
        public virtual void Load(PipelinePluginContext context)
        {
            RenderFeature = context.RenderSystem.RenderFeatures.OfType <T>().FirstOrDefault();
            if (RenderFeature == null)
            {
                RenderFeature = CreateRenderFeature(context);
                if (RenderFeature == null)
                {
                    throw new InvalidOperationException($"RenderFeature {typeof(T).Name} didn't exist or could not be created when processing pipeline plugin ${GetType().Name}");
                }

                // Register top level render feature
                context.RenderSystem.RenderFeatures.Add(RenderFeature);
                unregisterRenderFeature = true;
            }
        }
Exemple #5
0
        /// <inheritdoc/>
        public virtual void Unload(PipelinePluginContext context)
        {
            // Clear RenderStageSelector
            foreach (var renderStageSelector in renderStageSelectors)
            {
                RenderFeature.RenderStageSelectors.Remove(renderStageSelector);
            }
            renderStageSelectors.Clear();

            // Clear PostProcessPipelineState
            foreach (var postProcessPipelineState in postProcessPipelineStates)
            {
                ((RootEffectRenderFeature)(RootRenderFeature)RenderFeature).PostProcessPipelineState -= postProcessPipelineState;
            }
            postProcessPipelineStates.Clear();

            if (unregisterRenderFeature)
            {
                context.RenderSystem.RenderFeatures.Remove(RenderFeature);
            }
            unregisterRenderFeature = false;
            RenderFeature           = null;
        }
 public void Unload(PipelinePluginContext context)
 {
 }
Exemple #7
0
 public void Unload(PipelinePluginContext context)
 {
 }
Exemple #8
0
 /// <summary>
 /// If requested <see cref="RootRenderFeature"/> doesn't exist, provide a way to instantiate it.
 /// </summary>
 /// <param name="context"></param>
 /// <returns></returns>
 protected virtual T CreateRenderFeature(PipelinePluginContext context)
 {
     return(null);
 }
        /// <inheritdoc/>
        public override void Unload(PipelinePluginContext context)
        {
            meshRenderStageSelector = null;

            base.Unload(context);
        }