// StencilExt operates like stencil but with access to change the stencil action, // value, and keepvalues. // // action: How to modify any stencil values of pixels that are touched by what's // drawn in the stencil function. // // value: The new stencil value to use for pixels if the "replace" stencil action // is used. Has no effect with other stencil actions. Must be between 0 and 255. // // keepvalues: True to preserve old stencil values of pixels, false to re-set // every pixel's stencil value to 0 before executing the stencil function. Clear // will also re-set all stencil values. func StencilExt(stencil_func func(), action StencilAction, value int32, keepvalues bool) { gl_state.writingToStencil = true if !keepvalues { gl.Clear(gl.STENCIL_BUFFER_BIT | gl.DEPTH_BUFFER_BIT) } if gl_state.currentCanvas != nil { gl_state.currentCanvas.checkCreateStencil() } gl.Enable(gl.STENCIL_TEST) gl.ColorMask(false, false, false, false) gl.StencilFunc(gl.ALWAYS, int(value), 0xFF) gl.StencilOp(gl.KEEP, gl.KEEP, gl.Enum(action)) stencil_func() gl_state.writingToStencil = false SetColorMask(states.back().colorMask) SetStencilTest(states.back().stencilCompare, states.back().stencilTestValue) }
// SetStencilTest configures or disables stencil testing. When stencil testing is // enabled, the geometry of everything that is drawn afterward will be clipped/stencilled // out based on a comparison between the arguments of this function and the stencil // value of each pixel that the geometry touches. The stencil values of pixels are // affected via Stencil/StencilEXT. func SetStencilTest(compare CompareMode, value int32) { if gl_state.writingToStencil { return } states.back().stencilCompare = compare states.back().stencilTestValue = value if compare == COMPARE_ALWAYS { gl.Disable(gl.STENCIL_TEST) return } if gl_state.currentCanvas != nil { gl_state.currentCanvas.checkCreateStencil() } gl.Enable(gl.STENCIL_TEST) gl.StencilFunc(gl.Enum(compare), int(value), 0xFF) gl.StencilOp(gl.KEEP, gl.KEEP, gl.REPLACE) }