/// <summary> /// Function called to render the effect. /// </summary> /// <param name="renderMethod">The method used to render the scene that will be used in the effect.</param> /// <param name="output">The render target that will receive the results of rendering the effect.</param> /// <param name="blendStateOverride">[Optional] An override for the current blending state.</param> /// <param name="depthStencilStateOverride">[Optional] An override for the current depth/stencil state.</param> /// <param name="rasterStateOverride">[Optional] An override for the current raster state.</param> /// <param name="camera">[Optional] The camera to use when rendering.</param> /// <exception cref="ArgumentNullException">Thrown when the <paramref name="renderMethod"/>, or the <paramref name="output"/> parameter is <b>null</b>.</exception> /// <remarks> /// <para> /// The <paramref name="renderMethod"/> is a callback to a method with 3 parameters: /// <list type="number"> /// <item> /// <description>The current pass index.</description> /// </item> /// <item> /// <description>The total number of passes.</description> /// </item> /// <item> /// <description>The size of the current render target.</description> /// </item> /// </list> /// Users should pass a method that will render the items they want to use with this effect. /// </para> /// <para> /// <para> /// If the <paramref name="blendStateOverride"/>, parameter is omitted, then the <see cref="GorgonBlendState.Default"/> is used. When provided, this will override the current blending state. /// </para> /// <para> /// If the <paramref name="depthStencilStateOverride"/> parameter is omitted, then the <see cref="GorgonDepthStencilState.Default"/> is used. When provided, this will override the current /// depth/stencil state. /// </para> /// <para> /// If the <paramref name="rasterStateOverride"/> parameter is omitted, then the <see cref="GorgonRasterState.Default"/> is used. When provided, this will override the current raster state. /// </para> /// <para> /// The <paramref name="camera"/> parameter is used to render the texture using a different view, and optionally, a different coordinate set. /// </para> /// <para> /// <note type="important"> /// <para> /// For performance reasons, any exceptions thrown by this method will only be thrown when Gorgon is compiled as DEBUG. /// </para> /// </note> /// </para> /// </para> /// </remarks> public void Render(Action <int, int, DX.Size2> renderMethod, GorgonRenderTargetView output, GorgonBlendState blendStateOverride = null, GorgonDepthStencilState depthStencilStateOverride = null, GorgonRasterState rasterStateOverride = null, IGorgon2DCamera camera = null) { renderMethod.ValidateObject(nameof(renderMethod)); output.ValidateObject(nameof(output)); bool stateChanged = SetupStates(blendStateOverride, depthStencilStateOverride, rasterStateOverride, output, camera); for (int i = 0; i < PassCount; ++i) { // Batch state should be cached on the implementation side, otherwise the GC could be impacted by a lot of dead objects per frame. Gorgon2DBatchState batchState = OnGetBatchState(i, stateChanged); switch (OnBeforeRenderPass(i, output, camera)) { case PassContinuationState.Continue: Renderer.Begin(batchState, camera); OnRenderPass(i, renderMethod, output); Renderer.End(); OnAfterRenderPass(i, output); break; case PassContinuationState.Skip: continue; default: OnAfterRender(output); return; } } OnAfterRender(output); }
/// <summary> /// Function to set up state prior to rendering. /// </summary> /// <param name="blendStateOverride">An override for the current blending state.</param> /// <param name="depthStencilStateOverride">An override for the current depth/stencil state.</param> /// <param name="rasterStateOverride">An override for the current raster state.</param> /// <param name="output">The target used as the output.</param> /// <param name="camera">The active camera.</param> /// <returns><b>true</b> if state was overridden, <b>false</b> if not or <b>null</b> if rendering is canceled.</returns> private bool SetupStates(GorgonBlendState blendStateOverride, GorgonDepthStencilState depthStencilStateOverride, GorgonRasterState rasterStateOverride, GorgonRenderTargetView output, IGorgon2DCamera camera) { if (!_isInitialized) { OnInitialize(); _isInitialized = true; } bool outputSizeChanged = false; if ((_prevOutputSize.Width != output.Width) || (_prevOutputSize.Height != output.Height)) { _prevOutputSize = new DX.Size2(output.Width, output.Height); outputSizeChanged = true; } OnBeforeRender(output, camera, outputSizeChanged); if ((blendStateOverride == BlendStateOverride) && (depthStencilStateOverride == DepthStencilStateOverride) && (rasterStateOverride == RasterStateOverride)) { return(false); } BatchStateBuilder.BlendState(blendStateOverride ?? GorgonBlendState.Default) .DepthStencilState(depthStencilStateOverride ?? GorgonDepthStencilState.Default) .RasterState(rasterStateOverride ?? GorgonRasterState.Default); BlendStateOverride = blendStateOverride; DepthStencilStateOverride = depthStencilStateOverride; RasterStateOverride = rasterStateOverride; return(true); }
/// <summary> /// Function to assign a depth/stencil state to the batch state. /// </summary> /// <param name="depthStencilState">The depth/stencil state to assign, or <b>null</b> for a default state.</param> /// <returns>The fluent builder interface.</returns> public Gorgon2DBatchStateBuilder DepthStencilState(GorgonDepthStencilState depthStencilState) { _worker.DepthStencilState = depthStencilState; return(this); }
/// <summary> /// Function to provide an override for the depth/stencil state when rendering the initial scene. /// </summary> /// <param name="depthStencilState">The depth/stencil state to use.</param> /// <returns>The fluent interface for the effects processor.</returns> public Gorgon2DCompositor FinalDepthStencilState(GorgonDepthStencilState depthStencilState) { _finalBatchStateBuilder.DepthStencilState(depthStencilState); _hasFinalBatchStateChanged = true; return(this); }