import '@kitware/vtk.js/favicon';
import '@kitware/vtk.js/Rendering/Profiles/Geometry';
import vtkVectorText from '@kitware/vtk.js/Rendering/Core/VectorText'; import vtkFullScreenRenderWindow from '@kitware/vtk.js/Rendering/Misc/FullScreenRenderWindow'; import vtkActor from '@kitware/vtk.js/Rendering/Core/Actor'; import vtkMapper from '@kitware/vtk.js/Rendering/Core/Mapper'; import vtkURLExtract from '@kitware/vtk.js/Common/Core/URLExtract';
import controlPanel from './controller.html';
const fullScreenRenderer = vtkFullScreenRenderWindow.newInstance(); const renderer = fullScreenRenderer.getRenderer(); const renderWindow = fullScreenRenderer.getRenderWindow(); fullScreenRenderer.addController(controlPanel); const textInput = document.getElementById('text'); const fontSelect = document.getElementById('font'); const fontSize = document.getElementById('fontSize'); const bevelInput = document.getElementById('bevel');
const actor = vtkActor.newInstance(); const mapper = vtkMapper.newInstance(); let pd;
const fonts = { Roboto: 'https://fonts.gstatic.com/s/roboto/v15/zN7GBFwfMP4uA6AR0HCoLQ.ttf', OpenSans: 'https://fonts.gstatic.com/s/opensans/v10/IgZJs4-7SA1XX_edsoXWog.ttf', };
const userParms = vtkURLExtract.extractURLParameters(); const selectedFont = userParms.font || 'Roboto';
const fontKeys = Object.keys(fonts); fontKeys.forEach((key) => { const option = document.createElement('option'); option.value = key; option.innerHTML = key; fontSelect.appendChild(option); }); fontSelect.value = selectedFont;
let text = 'I love VTK.js!'; let size = 16;
async function load() { const fontModule = await import( 'https://unpkg.com/[email protected]/dist/opentype.module.js' ); const earcutModule = await import( 'https://unpkg.com/[email protected]/src/earcut.js' ); fetch(fonts[selectedFont]) .then((response) => response.arrayBuffer()) .then((buffer) => { const font = fontModule.parse(buffer); function perLetterFaceColors(letterIndex) { const seed = letterIndex * 9301 + 49297; const r = (Math.sin(seed) + 1) / 2; const g = (Math.sin(seed + 1) + 1) / 2; const b = (Math.sin(seed + 2) + 1) / 2; return [r, g, b]; } pd = vtkVectorText.newInstance({ font, bevelEnabled: bevelInput.checked, text, size, perLetterFaceColors, earcut: earcutModule.default, }); mapper.setInputConnection(pd.getOutputPort()); actor.setMapper(mapper); renderer.addActor(actor); renderer.resetCamera(); renderWindow.render(); });
textInput.addEventListener('input', (event) => { text = event.target.value; pd.setText(text); renderer.resetCamera(); renderWindow.render(); });
fontSize.addEventListener('input', (event) => { size = event.target.value; pd.setFontSize(size); renderer.resetCamera(); renderWindow.render(); });
bevelInput.addEventListener('change', (event) => { const bevel = event.target.checked; pd.setBevelEnabled(bevel); renderWindow.render(); }); }
fontSelect.addEventListener('change', (event) => { const font = event.target.value; window.location.search = `?font=${font}`; });
load();
|