UNPKG

@kitware/vtk.js

Version:

Visualization Toolkit for the Web

130 lines (114 loc) 4.98 kB
import { m as macro } from '../../macros2.js'; import vtkWebGPUShaderCache from './ShaderCache.js'; // ---------------------------------------------------------------------------- // vtkWebGPUShaderDescription methods // ---------------------------------------------------------------------------- // shader description function vtkWebGPUShaderDescription(publicAPI, model) { // Set our className model.classHierarchy.push('vtkWebGPUShaderDescription'); publicAPI.hasOutput = name => model.outputNames.includes(name); publicAPI.addOutput = (type, name, interpolation = undefined) => { model.outputTypes.push(type); model.outputNames.push(name); model.outputInterpolations.push(interpolation); }; publicAPI.addBuiltinOutput = (type, name) => { model.builtinOutputTypes.push(type); model.builtinOutputNames.push(name); }; publicAPI.addBuiltinInput = (type, name) => { model.builtinInputTypes.push(type); model.builtinInputNames.push(name); }; // perform shader replacements for the input and outputs // of this shader. That includes vertex inputs if specified publicAPI.replaceShaderCode = (priorStage, vertexInput) => { const inputImpl = []; let iodec = []; if (vertexInput) { inputImpl.push(vertexInput.getShaderCode()); } if (priorStage || model.builtinInputNames.length) { const inputStruct = []; inputStruct.push(`struct ${model.type}Input\n{`); if (priorStage) { const inputNames = priorStage.getOutputNamesByReference(); const inputTypes = priorStage.getOutputTypesByReference(); const inputInterpolations = priorStage.getOutputInterpolationsByReference(); for (let i = 0; i < inputNames.length; i++) { if (inputInterpolations[i] !== undefined) { inputStruct.push(` @location(${i}) @interpolate(${inputInterpolations[i]}) ${inputNames[i]} : ${inputTypes[i]},`); } else { inputStruct.push(` @location(${i}) ${inputNames[i]} : ${inputTypes[i]},`); } } } for (let i = 0; i < model.builtinInputNames.length; i++) { inputStruct.push(` ${model.builtinInputNames[i]} : ${model.builtinInputTypes[i]},`); } if (inputStruct.length > 1) { inputStruct.push('};'); iodec = inputStruct; inputImpl[inputImpl.length - 1] += ','; inputImpl.push(`input: ${model.type}Input`); } } if (inputImpl.length) { model.code = vtkWebGPUShaderCache.substitute(model.code, '//VTK::IOStructs::Input', inputImpl).result; } if (model.outputNames.length + model.builtinOutputNames.length) { const outputStruct = [`struct ${model.type}Output\n{`]; for (let i = 0; i < model.outputNames.length; i++) { if (model.outputInterpolations[i] !== undefined) { outputStruct.push(` @location(${i}) @interpolate(${model.outputInterpolations[i]}) ${model.outputNames[i]} : ${model.outputTypes[i]},`); } else { outputStruct.push(` @location(${i}) ${model.outputNames[i]} : ${model.outputTypes[i]},`); } } for (let i = 0; i < model.builtinOutputNames.length; i++) { outputStruct.push(` ${model.builtinOutputNames[i]} : ${model.builtinOutputTypes[i]},`); } outputStruct.push('};'); iodec = iodec.concat(outputStruct); model.code = vtkWebGPUShaderCache.substitute(model.code, '//VTK::IOStructs::Output', [`-> ${model.type}Output`]).result; } model.code = vtkWebGPUShaderCache.substitute(model.code, '//VTK::IOStructs::Dec', iodec).result; }; } // ---------------------------------------------------------------------------- // Object factory // ---------------------------------------------------------------------------- const DEFAULT_VALUES = { type: null, // 'vertex' or 'fragment' hash: null, code: null, outputNames: null, outputTypes: null }; // ---------------------------------------------------------------------------- function extend(publicAPI, model, initialValues = {}) { Object.assign(model, DEFAULT_VALUES, initialValues); model.outputNames = []; model.outputTypes = []; model.outputInterpolations = []; model.builtinOutputNames = []; model.builtinOutputTypes = []; model.builtinInputNames = []; model.builtinInputTypes = []; // Build VTK API macro.obj(publicAPI, model); macro.setGet(publicAPI, model, ['type', 'hash', 'code']); macro.getArray(publicAPI, model, ['outputTypes', 'outputNames', 'outputInterpolations']); // Object methods vtkWebGPUShaderDescription(publicAPI, model); } // ---------------------------------------------------------------------------- const newInstance = macro.newInstance(extend, 'vtkWebGPUShaderDescription'); // ---------------------------------------------------------------------------- var vtkWebGPUShaderDescription$1 = { newInstance, extend }; export { vtkWebGPUShaderDescription$1 as default, extend, newInstance };