UNPKG

@acransac/vtk.js

Version:

Visualization Toolkit for the Web

109 lines (91 loc) 3.91 kB
import 'vtk.js/Sources/favicon'; import vtkActor from 'vtk.js/Sources/Rendering/Core/Actor'; import vtkCalculator from 'vtk.js/Sources/Filters/General/Calculator'; import vtkConeSource from 'vtk.js/Sources/Filters/Sources/ConeSource'; import vtkFullScreenRenderWindow from 'vtk.js/Sources/Rendering/Misc/FullScreenRenderWindow'; import vtkMapper from 'vtk.js/Sources/Rendering/Core/Mapper'; import { AttributeTypes } from 'vtk.js/Sources/Common/DataModel/DataSetAttributes/Constants'; import { FieldDataTypes } from 'vtk.js/Sources/Common/DataModel/DataSet/Constants'; import controlPanel from './controller.html'; // ---------------------------------------------------------------------------- // Standard rendering code setup // ---------------------------------------------------------------------------- const fullScreenRenderer = vtkFullScreenRenderWindow.newInstance({ background: [0, 0, 0], }); const renderer = fullScreenRenderer.getRenderer(); const renderWindow = fullScreenRenderer.getRenderWindow(); // ---------------------------------------------------------------------------- // Example code // ---------------------------------------------------------------------------- // create a filter on the fly, sort of cool, this is a random scalars // filter we create inline, for a simple cone you would not need // this // ---------------------------------------------------------------------------- const coneSource = vtkConeSource.newInstance({ height: 100.0, radius: 50.0 }); // const coneSource = vtkConeSource.newInstance({ height: 1.0, radius: 0.5 }); const filter = vtkCalculator.newInstance(); filter.setInputConnection(coneSource.getOutputPort()); // filter.setFormulaSimple(FieldDataTypes.CELL, [], 'random', () => Math.random()); filter.setFormula({ getArrays: (inputDataSets) => ({ input: [], output: [ { location: FieldDataTypes.CELL, name: 'Random', dataType: 'Float32Array', attribute: AttributeTypes.SCALARS, }, ], }), evaluate: (arraysIn, arraysOut) => { const [scalars] = arraysOut.map((d) => d.getData()); for (let i = 0; i < scalars.length; i++) { scalars[i] = Math.random(); } }, }); const mapper = vtkMapper.newInstance(); mapper.setInputConnection(filter.getOutputPort()); const actor = vtkActor.newInstance(); actor.setMapper(mapper); actor.setPosition(20.0, 0.0, 0.0); renderer.addActor(actor); renderer.resetCamera(); renderWindow.render(); // ----------------------------------------------------------- // UI control handling // ----------------------------------------------------------- fullScreenRenderer.addController(controlPanel); const representationSelector = document.querySelector('.representations'); const resolutionChange = document.querySelector('.resolution'); const vrbutton = document.querySelector('.vrbutton'); representationSelector.addEventListener('change', (e) => { const newRepValue = Number(e.target.value); actor.getProperty().setRepresentation(newRepValue); renderWindow.render(); }); resolutionChange.addEventListener('input', (e) => { const resolution = Number(e.target.value); coneSource.setResolution(resolution); renderWindow.render(); }); vrbutton.addEventListener('click', (e) => { if (vrbutton.textContent === 'Send To VR') { fullScreenRenderer.getOpenGLRenderWindow().startVR(); vrbutton.textContent = 'Return From VR'; } else { fullScreenRenderer.getOpenGLRenderWindow().stopVR(); vrbutton.textContent = 'Send To VR'; } }); // ----------------------------------------------------------- // Make some variables global so that you can inspect and // modify objects in your browser's developer console: // ----------------------------------------------------------- global.source = coneSource; global.mapper = mapper; global.actor = actor; global.renderer = renderer; global.renderWindow = renderWindow;