public static void RenderPPXDepth(Effect effect, bool forceDepth, RenderPPXProcedureDelegate proc) { var color = ActiveColor; var depth = ActiveDepth; var gd = GD; if (FSOEnvironment.SoftwareDepth && depth != null) { var oldDS = gd.DepthStencilState; //completely special case. gd.SetRenderTarget(color); gd.DepthStencilState = new DepthStencilState { StencilEnable = true, StencilFunction = CompareFunction.Always, StencilFail = StencilOperation.Keep, StencilPass = StencilOperation.Replace, CounterClockwiseStencilPass = StencilOperation.Replace, StencilDepthBufferFail = StencilOperation.Keep, DepthBufferEnable = forceDepth, //(ActiveColor == null), DepthBufferWriteEnable = forceDepth, //(ActiveColor == null), ReferenceStencil = StencilValue, TwoSidedStencilMode = true }; effect.Parameters["depthMap"].SetValue(depth); effect.Parameters["depthOutMode"].SetValue(false); proc(false); //now draw the depth using the depth test information we got previously. //unbind depth map since we are writing to it effect.Parameters["depthMap"].SetValue((Texture2D)null); effect.Parameters["depthOutMode"].SetValue(true); gd.SetRenderTarget(depth); gd.DepthStencilState = new DepthStencilState { StencilEnable = true, StencilFunction = CompareFunction.Equal, DepthBufferEnable = forceDepth, DepthBufferWriteEnable = forceDepth, ReferenceStencil = StencilValue, }; proc(true); gd.DepthStencilState = oldDS; StencilValue++; //can increment up to 254 times. Assume we're not going to be rendering that much between clears. if (StencilValue > 255) { StencilValue = 1; } gd.SetRenderTarget(color); effect.Parameters["depthOutMode"].SetValue(false); } else if (!FSOEnvironment.UseMRT && depth != null) { //draw color then draw depth gd.SetRenderTarget(color); proc(false); gd.SetRenderTarget(depth); proc(true); } else { //mrt already bound. draw in both. proc(false); } }
public static void RenderPPXDepth(Effect effect, bool forceDepth, RenderPPXProcedureDelegate proc) { var color = ActiveColor; var depth = ActiveDepth; var gd = GD; if (FSOEnvironment.SoftwareDepth && depth != null) { var oldDS = gd.DepthStencilState; //completely special case. gd.SetRenderTarget(color); gd.DepthStencilState = new DepthStencilState { StencilEnable = true, StencilFunction = CompareFunction.Always, StencilFail = StencilOperation.Keep, StencilPass = StencilOperation.Replace, CounterClockwiseStencilPass = StencilOperation.Replace, StencilDepthBufferFail = StencilOperation.Keep, DepthBufferEnable = forceDepth, //(ActiveColor == null), DepthBufferWriteEnable = forceDepth, //(ActiveColor == null), ReferenceStencil = StencilValue, TwoSidedStencilMode = true }; effect.Parameters["depthMap"].SetValue(depth); effect.Parameters["depthOutMode"].SetValue(false); proc(false); //now draw the depth using the depth test information we got previously. //unbind depth map since we are writing to it effect.Parameters["depthMap"].SetValue((Texture2D)null); effect.Parameters["depthOutMode"].SetValue(true); gd.SetRenderTarget(depth); gd.DepthStencilState = new DepthStencilState { StencilEnable = true, StencilFunction = CompareFunction.Equal, DepthBufferEnable = forceDepth, DepthBufferWriteEnable = forceDepth, ReferenceStencil = StencilValue, }; proc(true); gd.DepthStencilState = oldDS; StencilValue++; //can increment up to 254 times. Assume we're not going to be rendering that much between clears. if (StencilValue > 255) StencilValue = 1; gd.SetRenderTarget(color); effect.Parameters["depthOutMode"].SetValue(false); } else if (!FSOEnvironment.UseMRT && depth != null) { //draw color then draw depth gd.SetRenderTarget(color); proc(false); gd.SetRenderTarget(depth); proc(true); } else { //mrt already bound. draw in both. proc(false); } }