UNPKG

@thewtex/vtk.js-esm

Version:

Visualization Toolkit for the Web

142 lines (108 loc) 4.75 kB
import macro from '../../macro.js'; import vtkOpenGLFramebuffer from './Framebuffer.js'; import vtkRenderPass from '../SceneGraph/RenderPass.js'; function vtkForwardPass(publicAPI, model) { // Set our className model.classHierarchy.push('vtkForwardPass'); // this pass implements a forward rendering pipeline // if both volumes and opaque geometry are present // it will mix the two together by capturing a zbuffer // first publicAPI.traverse = function (viewNode) { var parent = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : null; if (model.deleted) { return; } // we just render our delegates in order model.currentParent = parent; // build publicAPI.setCurrentOperation('buildPass'); viewNode.traverse(publicAPI); var numlayers = viewNode.getRenderable().getNumberOfLayers(); // iterate over renderers var renderers = viewNode.getChildren(); for (var i = 0; i < numlayers; i++) { for (var index = 0; index < renderers.length; index++) { var renNode = renderers[index]; var ren = viewNode.getRenderable().getRenderers()[index]; if (ren.getDraw() && ren.getLayer() === i) { // check for both opaque and volume actors model.opaqueActorCount = 0; model.translucentActorCount = 0; model.volumeCount = 0; publicAPI.setCurrentOperation('queryPass'); renNode.traverse(publicAPI); // do we need to capture a zbuffer? if (model.opaqueActorCount > 0 && model.volumeCount > 0 || model.depthRequested) { var size = viewNode.getFramebufferSize(); // make sure the framebuffer is setup if (model.framebuffer === null) { model.framebuffer = vtkOpenGLFramebuffer.newInstance(); } model.framebuffer.setOpenGLRenderWindow(viewNode); model.framebuffer.saveCurrentBindingsAndBuffers(); var fbSize = model.framebuffer.getSize(); if (fbSize === null || fbSize[0] !== size[0] || fbSize[1] !== size[1]) { model.framebuffer.create(size[0], size[1]); model.framebuffer.populateFramebuffer(); } model.framebuffer.bind(); publicAPI.setCurrentOperation('opaqueZBufferPass'); renNode.traverse(publicAPI); model.framebuffer.restorePreviousBindingsAndBuffers(); // reset now that we have done it model.depthRequested = false; } publicAPI.setCurrentOperation('cameraPass'); renNode.traverse(publicAPI); if (model.opaqueActorCount > 0) { publicAPI.setCurrentOperation('opaquePass'); renNode.traverse(publicAPI); } if (model.translucentActorCount > 0) { publicAPI.setCurrentOperation('translucentPass'); renNode.traverse(publicAPI); } if (model.volumeCount > 0) { publicAPI.setCurrentOperation('volumePass'); renNode.traverse(publicAPI); } } } } }; publicAPI.getZBufferTexture = function () { if (model.framebuffer) { return model.framebuffer.getColorTexture(); } return null; }; publicAPI.requestDepth = function () { model.depthRequested = true; }; publicAPI.incrementOpaqueActorCount = function () { return model.opaqueActorCount++; }; publicAPI.incrementTranslucentActorCount = function () { return model.translucentActorCount++; }; publicAPI.incrementVolumeCount = function () { return model.volumeCount++; }; } // ---------------------------------------------------------------------------- // Object factory // ---------------------------------------------------------------------------- var DEFAULT_VALUES = { opaqueActorCount: 0, translucentActorCount: 0, volumeCount: 0, framebuffer: null, depthRequested: false }; // ---------------------------------------------------------------------------- function extend(publicAPI, model) { var initialValues = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {}; Object.assign(model, DEFAULT_VALUES, initialValues); // Build VTK API vtkRenderPass.extend(publicAPI, model, initialValues); macro.get(publicAPI, model, ['framebuffer']); // Object methods vtkForwardPass(publicAPI, model); } // ---------------------------------------------------------------------------- var newInstance = macro.newInstance(extend, 'vtkForwardPass'); // ---------------------------------------------------------------------------- var vtkForwardPass$1 = { newInstance: newInstance, extend: extend }; export default vtkForwardPass$1; export { extend, newInstance };