UNPKG

@kitware/vtk.js

Version:

Visualization Toolkit for the Web

119 lines (95 loc) 4.07 kB
import { m as macro } from '../../macros2.js'; import vtkRenderer from '../Core/Renderer.js'; import vtkRenderWindow from '../Core/RenderWindow.js'; import vtkRenderWindowInteractor from '../Core/RenderWindowInteractor.js'; import vtkInteractorStyleTrackballCamera from '../../Interaction/Style/InteractorStyleTrackballCamera.js'; import vtkURLExtract from '../../Common/Core/URLExtract.js'; import '../../Common/Core/Points.js'; import '../../Common/Core/DataArray.js'; import '../../Common/DataModel/PolyData.js'; import '../Core/Actor.js'; import '../Core/Mapper.js'; import '../OpenGL/RenderWindow.js'; import '../WebGPU/RenderWindow.js'; // Process arguments from URL const userParams = vtkURLExtract.extractURLParameters(); function vtkGenericRenderWindow(publicAPI, model) { // Capture resize trigger method to remove from publicAPI const invokeResize = publicAPI.invokeResize; delete publicAPI.invokeResize; // VTK renderWindow/renderer model.renderWindow = vtkRenderWindow.newInstance(); model.renderer = vtkRenderer.newInstance(); model.renderWindow.addRenderer(model.renderer); // OpenGLRenderWindow model._apiSpecificRenderWindow = model.renderWindow.newAPISpecificView(userParams.viewAPI ?? model.defaultViewAPI); model.renderWindow.addView(model._apiSpecificRenderWindow); // Interactor model.interactor = vtkRenderWindowInteractor.newInstance(); model.interactor.setInteractorStyle(vtkInteractorStyleTrackballCamera.newInstance()); model.interactor.setView(model._apiSpecificRenderWindow); model.interactor.initialize(); // Expose background publicAPI.setBackground = model.renderer.setBackground; // Update BG color publicAPI.setBackground(...model.background); // Handle window resize publicAPI.resize = () => { if (model.container) { const dims = model.container.getBoundingClientRect(); const devicePixelRatio = window.devicePixelRatio || 1; model._apiSpecificRenderWindow.setSize(Math.floor(dims.width * devicePixelRatio), Math.floor(dims.height * devicePixelRatio)); invokeResize(); model.renderWindow.render(); } }; // Handle DOM container relocation publicAPI.setContainer = el => { if (model.container) { model.interactor.unbindEvents(model.container); } // Switch container model.container = el; model._apiSpecificRenderWindow.setContainer(model.container); // Bind to new container if (model.container) { model.interactor.bindEvents(model.container); } }; // Properly release GL context publicAPI.delete = macro.chain(publicAPI.setContainer, model._apiSpecificRenderWindow.delete, () => { window.removeEventListener('resize', publicAPI.resize); }, publicAPI.delete); // Handle size if (model.listenWindowResize) { window.addEventListener('resize', publicAPI.resize); } publicAPI.resize(); } // ---------------------------------------------------------------------------- // Object factory // ---------------------------------------------------------------------------- const DEFAULT_VALUES = { background: [0.32, 0.34, 0.43], listenWindowResize: true, container: null }; // ---------------------------------------------------------------------------- function extend(publicAPI, model, initialValues = {}) { Object.assign(model, DEFAULT_VALUES, initialValues); // Object methods macro.obj(publicAPI, model); macro.get(publicAPI, model, ['renderWindow', 'renderer', '_apiSpecificRenderWindow', 'interactor', 'container']); macro.moveToProtected(publicAPI, model, ['_apiSpecificRenderWindow']); macro.event(publicAPI, model, 'resize'); // Object specific methods vtkGenericRenderWindow(publicAPI, model); } // ---------------------------------------------------------------------------- const newInstance = macro.newInstance(extend); // ---------------------------------------------------------------------------- var vtkGenericRenderWindow$1 = { newInstance, extend }; export { vtkGenericRenderWindow$1 as default, extend, newInstance };