render method

dynamic render(
  1. dynamic renderer,
  2. dynamic writeBuffer,
  3. dynamic readBuffer, {
  4. num? deltaTime,
  5. bool? maskActive,
})
override

Implementation

render(renderer, writeBuffer, readBuffer,
    {num? deltaTime, bool? maskActive}) {
  var context = renderer.getContext();
  var state = renderer.state;

  // don't update color or depth

  state.buffers.color.setMask(false);
  state.buffers.depth.setMask(false);

  // lock buffers

  state.buffers.color.setLocked(true);
  state.buffers.depth.setLocked(true);

  // set up stencil

  var writeValue, clearValue;

  if (this.inverse) {
    writeValue = 0;
    clearValue = 1;
  } else {
    writeValue = 1;
    clearValue = 0;
  }

  state.buffers.stencil.setTest(true);
  state.buffers.stencil
      .setOp(context.REPLACE, context.REPLACE, context.REPLACE);
  state.buffers.stencil.setFunc(context.ALWAYS, writeValue, 0xffffffff);
  state.buffers.stencil.setClear(clearValue);
  state.buffers.stencil.setLocked(true);

  // draw into the stencil buffer

  renderer.setRenderTarget(readBuffer);
  if (this.clear) renderer.clear();
  renderer.render(this.scene, this.camera);

  renderer.setRenderTarget(writeBuffer);
  if (this.clear) renderer.clear();
  renderer.render(this.scene, this.camera);

  // unlock color and depth buffer for subsequent rendering

  state.buffers.color.setLocked(false);
  state.buffers.depth.setLocked(false);

  // only render where stencil is set to 1

  state.buffers.stencil.setLocked(false);
  state.buffers.stencil.setFunc(context.EQUAL, 1, 0xffffffff); // draw if == 1
  state.buffers.stencil.setOp(context.KEEP, context.KEEP, context.KEEP);
  state.buffers.stencil.setLocked(true);
}