render method

  1. @override
void render(
  1. WebGLRenderer renderer,
  2. WebGLRenderTarget writeBuffer,
  3. WebGLRenderTarget readBuffer, {
  4. double? deltaTime,
  5. bool? maskActive,
})
override

Implementation

@override
void render(WebGLRenderer renderer, WebGLRenderTarget writeBuffer, WebGLRenderTarget readBuffer,{double? deltaTime, bool? maskActive}) {
  final context = renderer.getContext();
  final 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

  dynamic writeValue, clearValue;

  if (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 (clear) renderer.clear();
  renderer.render(scene, camera);

  renderer.setRenderTarget(writeBuffer);
  if (clear) renderer.clear();
  renderer.render(scene, 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);
}