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