/** * @author alteredq / http://alteredqualia.com/ */ THREE.MaskPass = function ( scene, camera ) { this.scene = scene; this.camera = camera; this.enabled = true; this.clear = true; this.needsSwap = false; this.inverse = false; }; THREE.MaskPass.prototype = { render: function ( renderer, writeBuffer, readBuffer, delta ) { var context = renderer.context; // don't update color or depth context.colorMask( false, false, false, false ); context.depthMask( false ); // set up stencil var writeValue, clearValue; if ( this.inverse ) { writeValue = 0; clearValue = 1; } else { writeValue = 1; clearValue = 0; } context.enable( context.STENCIL_TEST ); context.stencilOp( context.REPLACE, context.REPLACE, context.REPLACE ); context.stencilFunc( context.ALWAYS, writeValue, 0xffffffff ); context.clearStencil( clearValue ); // draw into the stencil buffer renderer.render( this.scene, this.camera, readBuffer, this.clear ); renderer.render( this.scene, this.camera, writeBuffer, this.clear ); // re-enable update of color and depth context.colorMask( true, true, true, true ); context.depthMask( true ); // only render where stencil is set to 1 context.stencilFunc( context.EQUAL, 1, 0xffffffff ); // draw if == 1 context.stencilOp( context.KEEP, context.KEEP, context.KEEP ); } }; THREE.ClearMaskPass = function () { this.enabled = true; }; THREE.ClearMaskPass.prototype = { render: function ( renderer, writeBuffer, readBuffer, delta ) { var context = renderer.context; context.disable( context.STENCIL_TEST ); } };