UNPKG

@kitware/vtk.js

Version:

Visualization Toolkit for the Web

151 lines (133 loc) 5.54 kB
import { m as macro } from '../../macros2.js'; const { vtkErrorMacro } = macro; function notImplemented(method) { return () => vtkErrorMacro(`vtkViewport::${method} - NOT IMPLEMENTED`); } // ---------------------------------------------------------------------------- // vtkViewport methods // ---------------------------------------------------------------------------- function vtkViewport(publicAPI, model) { // Set our className model.classHierarchy.push('vtkViewport'); // Public API methods publicAPI.getViewProps = () => model.props; publicAPI.hasViewProp = prop => model.props.includes(prop); publicAPI.addViewProp = prop => { if (prop && !publicAPI.hasViewProp(prop)) { model.props.push(prop); } }; publicAPI.removeViewProp = prop => { const newPropList = model.props.filter(item => item !== prop); if (model.props.length !== newPropList.length) { model.props = newPropList; } }; publicAPI.removeAllViewProps = () => { model.props = []; }; // this method get all the props including any nested props function gatherProps(prop, allProps = []) { allProps.push(prop); const children = prop.getNestedProps(); if (children && children.length) { for (let i = 0; i < children.length; i++) { gatherProps(children[i], allProps); } } return allProps; } publicAPI.getViewPropsWithNestedProps = () => { let allPropsArray = []; // Repopulate the actor2D list to minimize browsing operations. model.actors2D = []; for (let i = 0; i < model.props.length; i++) { // Handle actor2D instances separately so that they can be overlayed and layered const isActor2D = model.props[i].getActors2D(); if (isActor2D && (!Array.isArray(isActor2D) || isActor2D.length > 0)) { model.actors2D = model.actors2D.concat(isActor2D); } else { gatherProps(model.props[i], allPropsArray); } } // Actor2D must be rendered by layer number order model.actors2D.sort((a, b) => a.getLayerNumber() - b.getLayerNumber()); // Finally, add the actor2D props at the end of the list // This works because, when traversing the render pass in vtkOpenGLRenderer, the children are // traversed in the order that they are added to the list allPropsArray = allPropsArray.concat(model.actors2D); return allPropsArray; }; publicAPI.addActor2D = publicAPI.addViewProp; publicAPI.removeActor2D = prop => { // VTK way: model.actors2D.RemoveItem(prop); publicAPI.removeViewProp(prop); }; publicAPI.getActors2D = () => { model.actors2D = []; model.props.forEach(prop => { model.actors2D = model.actors2D.concat(prop.getActors2D()); }); return model.actors2D; }; publicAPI.displayToView = () => vtkErrorMacro('call displayToView on your view instead'); publicAPI.viewToDisplay = () => vtkErrorMacro('callviewtodisplay on your view instead'); publicAPI.getSize = () => vtkErrorMacro('call getSize on your View instead'); publicAPI.normalizedDisplayToProjection = (x, y, z) => { // first to normalized viewport const nvp = publicAPI.normalizedDisplayToNormalizedViewport(x, y, z); // then to view return publicAPI.normalizedViewportToProjection(nvp[0], nvp[1], nvp[2]); }; publicAPI.normalizedDisplayToNormalizedViewport = (x, y, z) => { const scale = [model.viewport[2] - model.viewport[0], model.viewport[3] - model.viewport[1]]; return [(x - model.viewport[0]) / scale[0], (y - model.viewport[1]) / scale[1], z]; }; publicAPI.normalizedViewportToProjection = (x, y, z) => [x * 2.0 - 1.0, y * 2.0 - 1.0, z * 2.0 - 1.0]; publicAPI.projectionToNormalizedDisplay = (x, y, z) => { // first to nvp const nvp = publicAPI.projectionToNormalizedViewport(x, y, z); // then to ndp return publicAPI.normalizedViewportToNormalizedDisplay(nvp[0], nvp[1], nvp[2]); }; publicAPI.normalizedViewportToNormalizedDisplay = (x, y, z) => { const scale = [model.viewport[2] - model.viewport[0], model.viewport[3] - model.viewport[1]]; return [x * scale[0] + model.viewport[0], y * scale[1] + model.viewport[1], z]; }; publicAPI.projectionToNormalizedViewport = (x, y, z) => [(x + 1.0) * 0.5, (y + 1.0) * 0.5, (z + 1.0) * 0.5]; publicAPI.PickPropFrom = notImplemented('PickPropFrom'); } // ---------------------------------------------------------------------------- // Object factory // ---------------------------------------------------------------------------- const DEFAULT_VALUES = { // _vtkWindow: null, background: [0, 0, 0], background2: [0.2, 0.2, 0.2], gradientBackground: false, viewport: [0, 0, 1, 1], aspect: [1, 1], pixelAspect: [1, 1], props: [], actors2D: [] }; // ---------------------------------------------------------------------------- function extend(publicAPI, model, initialValues = {}) { Object.assign(model, DEFAULT_VALUES, initialValues); // Build VTK API macro.obj(publicAPI, model); macro.event(publicAPI, model, 'event'); macro.setGetArray(publicAPI, model, ['viewport'], 4); macro.setGetArray(publicAPI, model, ['background', 'background2'], 3); vtkViewport(publicAPI, model); } // ---------------------------------------------------------------------------- const newInstance = macro.newInstance(extend, 'vtkViewport'); // ---------------------------------------------------------------------------- var vtkViewport$1 = { newInstance, extend }; export { vtkViewport$1 as default, extend, newInstance };