/// <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, }); }
/// <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); }
/// <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; } }
/// <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) { }
/// <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); }