From cffd616031f8cd5d5d770a29620b5b04d992197d Mon Sep 17 00:00:00 2001 From: Sebastien Jourdain Date: Fri, 30 Apr 2021 16:21:50 -0600 Subject: [PATCH] feat(webgpu): register WebGPU implementation at import time This change allow a better management for tree shaking but require the user to explicitly import the classes that will be required BREAKING CHANGE: Explicit import needs to be performed to enable rendering implementation. Profiles have been created to simplify that task. See vtk.js/Sources/Rendering/OpenGL|WebGPU/Profiles/*. fix #1865 --- Sources/Rendering/WebGPU/Actor/index.js | 5 ++ Sources/Rendering/WebGPU/Camera/index.js | 9 ++- .../Rendering/WebGPU/Glyph3DMapper/index.js | 5 ++ .../WebGPU/PixelSpaceCallbackMapper/index.js | 5 ++ .../Rendering/WebGPU/PolyDataMapper/index.js | 7 ++- Sources/Rendering/WebGPU/Renderer/index.js | 5 ++ .../Rendering/WebGPU/SphereMapper/index.js | 5 ++ Sources/Rendering/WebGPU/StickMapper/index.js | 5 ++ Sources/Rendering/WebGPU/Texture/index.js | 5 ++ .../Rendering/WebGPU/ViewNodeFactory/index.js | 62 ++++--------------- Sources/Rendering/WebGPU/Volume/index.js | 5 ++ .../Rendering/WebGPU/VolumeMapper/index.js | 7 ++- 12 files changed, 70 insertions(+), 55 deletions(-) diff --git a/Sources/Rendering/WebGPU/Actor/index.js b/Sources/Rendering/WebGPU/Actor/index.js index f581ae0c81a..be50ef47015 100644 --- a/Sources/Rendering/WebGPU/Actor/index.js +++ b/Sources/Rendering/WebGPU/Actor/index.js @@ -3,6 +3,8 @@ import { mat4 } from 'gl-matrix'; import macro from 'vtk.js/Sources/macro'; import vtkViewNode from 'vtk.js/Sources/Rendering/SceneGraph/ViewNode'; +import { registerOverride } from 'vtk.js/Sources/Rendering/WebGPU/ViewNodeFactory'; + // ---------------------------------------------------------------------------- // vtkWebGPUActor methods // ---------------------------------------------------------------------------- @@ -194,3 +196,6 @@ export const newInstance = macro.newInstance(extend); // ---------------------------------------------------------------------------- export default { newInstance, extend }; + +// Register ourself to WebGPU backend if imported +registerOverride('vtkActor', newInstance); diff --git a/Sources/Rendering/WebGPU/Camera/index.js b/Sources/Rendering/WebGPU/Camera/index.js index 90edb0b4ce7..9c28df0a2d2 100644 --- a/Sources/Rendering/WebGPU/Camera/index.js +++ b/Sources/Rendering/WebGPU/Camera/index.js @@ -1,7 +1,9 @@ import { mat4 } from 'gl-matrix'; -import * as macro from '../../../macro'; -import vtkViewNode from '../../SceneGraph/ViewNode'; +import macro from 'vtk.js/Sources/macro'; +import vtkViewNode from 'vtk.js/Sources/Rendering/SceneGraph/ViewNode'; + +import { registerOverride } from 'vtk.js/Sources/Rendering/WebGPU/ViewNodeFactory'; // ---------------------------------------------------------------------------- // vtkWebGPUCamera methods @@ -107,3 +109,6 @@ export const newInstance = macro.newInstance(extend); // ---------------------------------------------------------------------------- export default { newInstance, extend }; + +// Register ourself to WebGPU backend if imported +registerOverride('vtkCamera', newInstance); diff --git a/Sources/Rendering/WebGPU/Glyph3DMapper/index.js b/Sources/Rendering/WebGPU/Glyph3DMapper/index.js index f8a94cf5ba6..07e038736f5 100644 --- a/Sources/Rendering/WebGPU/Glyph3DMapper/index.js +++ b/Sources/Rendering/WebGPU/Glyph3DMapper/index.js @@ -3,6 +3,8 @@ import vtkWebGPUPolyDataMapper from 'vtk.js/Sources/Rendering/WebGPU/PolyDataMap import vtkWebGPUStorageBuffer from 'vtk.js/Sources/Rendering/WebGPU/StorageBuffer'; import vtkWebGPUShaderCache from 'vtk.js/Sources/Rendering/WebGPU/ShaderCache'; +import { registerOverride } from 'vtk.js/Sources/Rendering/WebGPU/ViewNodeFactory'; + // ---------------------------------------------------------------------------- // vtkWebGPUSphereMapper methods // ---------------------------------------------------------------------------- @@ -163,3 +165,6 @@ export const newInstance = macro.newInstance(extend, 'vtkWebGPUGlyph3DMapper'); // ---------------------------------------------------------------------------- export default { newInstance, extend }; + +// Register ourself to WebGPU backend if imported +registerOverride('vtkGlyph3DMapper', newInstance); diff --git a/Sources/Rendering/WebGPU/PixelSpaceCallbackMapper/index.js b/Sources/Rendering/WebGPU/PixelSpaceCallbackMapper/index.js index 70b8175687f..246e94642c3 100644 --- a/Sources/Rendering/WebGPU/PixelSpaceCallbackMapper/index.js +++ b/Sources/Rendering/WebGPU/PixelSpaceCallbackMapper/index.js @@ -1,6 +1,8 @@ import macro from 'vtk.js/Sources/macro'; import vtkViewNode from 'vtk.js/Sources/Rendering/SceneGraph/ViewNode'; +import { registerOverride } from 'vtk.js/Sources/Rendering/WebGPU/ViewNodeFactory'; + // ---------------------------------------------------------------------------- // vtkWebGPUPixelSpaceCallbackMapper methods // ---------------------------------------------------------------------------- @@ -62,3 +64,6 @@ export const newInstance = macro.newInstance( // ---------------------------------------------------------------------------- export default { newInstance, extend }; + +// Register ourself to WebGPU backend if imported +registerOverride('vtkPixelSpaceCallbackMapper', newInstance); diff --git a/Sources/Rendering/WebGPU/PolyDataMapper/index.js b/Sources/Rendering/WebGPU/PolyDataMapper/index.js index 50c849efe96..7b784b43182 100644 --- a/Sources/Rendering/WebGPU/PolyDataMapper/index.js +++ b/Sources/Rendering/WebGPU/PolyDataMapper/index.js @@ -1,6 +1,6 @@ import { mat3, mat4 } from 'gl-matrix'; -import macro from 'vtk.js/Sources/macro'; +import * as macro from 'vtk.js/Sources/macro'; import vtkMapper from 'vtk.js/Sources/Rendering/Core/Mapper'; import vtkProperty from 'vtk.js/Sources/Rendering/Core/Property'; import vtkTexture from 'vtk.js/Sources/Rendering/Core/Texture'; @@ -13,6 +13,8 @@ import vtkWebGPUUniformBuffer from 'vtk.js/Sources/Rendering/WebGPU/UniformBuffe import vtkWebGPUVertexInput from 'vtk.js/Sources/Rendering/WebGPU/VertexInput'; import vtkViewNode from 'vtk.js/Sources/Rendering/SceneGraph/ViewNode'; +import { registerOverride } from 'vtk.js/Sources/Rendering/WebGPU/ViewNodeFactory'; + const { BufferUsage, PrimitiveTypes } = vtkWebGPUBufferManager; const { Representation } = vtkProperty; const { ScalarMode } = vtkMapper; @@ -920,3 +922,6 @@ export const newInstance = macro.newInstance(extend, 'vtkWebGPUPolyDataMapper'); // ---------------------------------------------------------------------------- export default { newInstance, extend }; + +// Register ourself to WebGPU backend if imported +registerOverride('vtkMapper', newInstance); diff --git a/Sources/Rendering/WebGPU/Renderer/index.js b/Sources/Rendering/WebGPU/Renderer/index.js index a0073252341..c375ae6368b 100644 --- a/Sources/Rendering/WebGPU/Renderer/index.js +++ b/Sources/Rendering/WebGPU/Renderer/index.js @@ -5,6 +5,8 @@ import vtkViewNode from 'vtk.js/Sources/Rendering/SceneGraph/ViewNode'; import * as vtkMath from 'vtk.js/Sources/Common/Core/Math'; import vtkWebGPUFullScreenQuad from 'vtk.js/Sources/Rendering/WebGPU/FullScreenQuad'; +import { registerOverride } from 'vtk.js/Sources/Rendering/WebGPU/ViewNodeFactory'; + const { vtkDebugMacro } = macro; const clearFragTemplate = ` @@ -474,3 +476,6 @@ export const newInstance = macro.newInstance(extend, 'vtkWebGPURenderer'); // ---------------------------------------------------------------------------- export default { newInstance, extend }; + +// Register ourself to WebGPU backend if imported +registerOverride('vtkRenderer', newInstance); diff --git a/Sources/Rendering/WebGPU/SphereMapper/index.js b/Sources/Rendering/WebGPU/SphereMapper/index.js index 7aa2d7e7c67..c484d76919a 100644 --- a/Sources/Rendering/WebGPU/SphereMapper/index.js +++ b/Sources/Rendering/WebGPU/SphereMapper/index.js @@ -5,6 +5,8 @@ import vtkWebGPUBufferManager from 'vtk.js/Sources/Rendering/WebGPU/BufferManage import vtkWebGPUPipeline from 'vtk.js/Sources/Rendering/WebGPU/Pipeline'; import vtkWebGPUShaderCache from 'vtk.js/Sources/Rendering/WebGPU/ShaderCache'; +import { registerOverride } from 'vtk.js/Sources/Rendering/WebGPU/ViewNodeFactory'; + const { BufferUsage, PrimitiveTypes } = vtkWebGPUBufferManager; const { vtkErrorMacro } = macro; @@ -352,3 +354,6 @@ export const newInstance = macro.newInstance(extend, 'vtkWebGPUSphereMapper'); // ---------------------------------------------------------------------------- export default { newInstance, extend }; + +// Register ourself to WebGPU backend if imported +registerOverride('vtkSphereMapper', newInstance); diff --git a/Sources/Rendering/WebGPU/StickMapper/index.js b/Sources/Rendering/WebGPU/StickMapper/index.js index 675622a6a0c..48b075d2b3c 100644 --- a/Sources/Rendering/WebGPU/StickMapper/index.js +++ b/Sources/Rendering/WebGPU/StickMapper/index.js @@ -4,6 +4,8 @@ import vtkWebGPUBufferManager from 'vtk.js/Sources/Rendering/WebGPU/BufferManage import vtkWebGPUPipeline from 'vtk.js/Sources/Rendering/WebGPU/Pipeline'; import vtkWebGPUShaderCache from 'vtk.js/Sources/Rendering/WebGPU/ShaderCache'; +import { registerOverride } from 'vtk.js/Sources/Rendering/WebGPU/ViewNodeFactory'; + const { BufferUsage, PrimitiveTypes } = vtkWebGPUBufferManager; const { vtkErrorMacro } = macro; @@ -481,3 +483,6 @@ export const newInstance = macro.newInstance(extend, 'vtkWebGPUStickMapper'); // ---------------------------------------------------------------------------- export default { newInstance, extend }; + +// Register ourself to WebGPU backend if imported +registerOverride('vtkStickMapper', newInstance); diff --git a/Sources/Rendering/WebGPU/Texture/index.js b/Sources/Rendering/WebGPU/Texture/index.js index f6753b1e0b6..20c5dcfd291 100644 --- a/Sources/Rendering/WebGPU/Texture/index.js +++ b/Sources/Rendering/WebGPU/Texture/index.js @@ -2,6 +2,8 @@ import macro from 'vtk.js/Sources/macro'; import vtkWebGPUBufferManager from 'vtk.js/Sources/Rendering/WebGPU/BufferManager'; import vtkWebGPUTextureView from 'vtk.js/Sources/Rendering/WebGPU/TextureView'; +import { registerOverride } from 'vtk.js/Sources/Rendering/WebGPU/ViewNodeFactory'; + const { BufferUsage } = vtkWebGPUBufferManager; // ---------------------------------------------------------------------------- @@ -223,3 +225,6 @@ export const newInstance = macro.newInstance(extend); // ---------------------------------------------------------------------------- export default { newInstance, extend }; + +// Register ourself to WebGPU backend if imported +registerOverride('vtkTexture', newInstance); diff --git a/Sources/Rendering/WebGPU/ViewNodeFactory/index.js b/Sources/Rendering/WebGPU/ViewNodeFactory/index.js index 4e63c8adad5..986a6b531c4 100644 --- a/Sources/Rendering/WebGPU/ViewNodeFactory/index.js +++ b/Sources/Rendering/WebGPU/ViewNodeFactory/index.js @@ -1,21 +1,16 @@ import macro from 'vtk.js/Sources/macro'; -// import vtkGenericWidgetRepresentation from 'vtk.js/Sources/Rendering/SceneGraph/GenericWidgetRepresentation'; -import vtkWebGPUActor from 'vtk.js/Sources/Rendering/WebGPU/Actor'; -// import vtkWebGPUActor2D from 'vtk.js/Sources/Rendering/WebGPU/Actor2D'; -import vtkWebGPUCamera from 'vtk.js/Sources/Rendering/WebGPU/Camera'; -import vtkWebGPUGlyph3DMapper from 'vtk.js/Sources/Rendering/WebGPU/Glyph3DMapper'; -// import vtkWebGPUImageMapper from 'vtk.js/Sources/Rendering/WebGPU/ImageMapper'; -// import vtkWebGPUImageSlice from 'vtk.js/Sources/Rendering/WebGPU/ImageSlice'; -import vtkWebGPUPixelSpaceCallbackMapper from 'vtk.js/Sources/Rendering/WebGPU/PixelSpaceCallbackMapper'; -import vtkWebGPUPolyDataMapper from 'vtk.js/Sources/Rendering/WebGPU/PolyDataMapper'; -import vtkWebGPURenderer from 'vtk.js/Sources/Rendering/WebGPU/Renderer'; -// import vtkWebGPUSkybox from 'vtk.js/Sources/Rendering/WebGPU/Skybox'; -import vtkWebGPUSphereMapper from 'vtk.js/Sources/Rendering/WebGPU/SphereMapper'; -import vtkWebGPUStickMapper from 'vtk.js/Sources/Rendering/WebGPU/StickMapper'; + import vtkWebGPUVolume from 'vtk.js/Sources/Rendering/WebGPU/Volume'; import vtkWebGPUVolumeMapper from 'vtk.js/Sources/Rendering/WebGPU/VolumeMapper'; + import vtkViewNodeFactory from 'vtk.js/Sources/Rendering/SceneGraph/ViewNodeFactory'; +const CLASS_MAPPING = Object.create(null); + +export function registerOverride(className, fn) { + CLASS_MAPPING[className] = fn; +} + // ---------------------------------------------------------------------------- // vtkWebGPUViewNodeFactory methods // ---------------------------------------------------------------------------- @@ -36,49 +31,14 @@ const DEFAULT_VALUES = {}; export function extend(publicAPI, model, initialValues = {}) { Object.assign(model, DEFAULT_VALUES, initialValues); + // Static class mapping shared across instances + model.overrides = CLASS_MAPPING; + // Inheritance vtkViewNodeFactory.extend(publicAPI, model, initialValues); // Object methods vtkWebGPUViewNodeFactory(publicAPI, model); - - // Initialization - publicAPI.registerOverride('vtkActor', vtkWebGPUActor.newInstance); - // publicAPI.registerOverride('vtkActor2D', vtkWebGPUActor2D.newInstance); - publicAPI.registerOverride('vtkCamera', vtkWebGPUCamera.newInstance); - publicAPI.registerOverride( - 'vtkGlyph3DMapper', - vtkWebGPUGlyph3DMapper.newInstance - ); - // publicAPI.registerOverride( - // 'vtkImageMapper', - // vtkWebGPUImageMapper.newInstance - // ); - // publicAPI.registerOverride('vtkImageSlice', vtkWebGPUImageSlice.newInstance); - publicAPI.registerOverride('vtkMapper', vtkWebGPUPolyDataMapper.newInstance); - publicAPI.registerOverride( - 'vtkPixelSpaceCallbackMapper', - vtkWebGPUPixelSpaceCallbackMapper.newInstance - ); - publicAPI.registerOverride('vtkRenderer', vtkWebGPURenderer.newInstance); - // publicAPI.registerOverride('vtkSkybox', vtkWebGPUSkybox.newInstance); - publicAPI.registerOverride( - 'vtkSphereMapper', - vtkWebGPUSphereMapper.newInstance - ); - publicAPI.registerOverride( - 'vtkStickMapper', - vtkWebGPUStickMapper.newInstance - ); - publicAPI.registerOverride('vtkVolume', vtkWebGPUVolume.newInstance); - publicAPI.registerOverride( - 'vtkVolumeMapper', - vtkWebGPUVolumeMapper.newInstance - ); - // publicAPI.registerOverride( - // 'vtkWidgetRepresentation', - // vtkGenericWidgetRepresentation.newInstance - // ); } // ---------------------------------------------------------------------------- diff --git a/Sources/Rendering/WebGPU/Volume/index.js b/Sources/Rendering/WebGPU/Volume/index.js index 3c97ee6e742..36c90b3bb85 100644 --- a/Sources/Rendering/WebGPU/Volume/index.js +++ b/Sources/Rendering/WebGPU/Volume/index.js @@ -3,6 +3,8 @@ import { mat3, mat4 } from 'gl-matrix'; import macro from 'vtk.js/Sources/macro'; import vtkViewNode from 'vtk.js/Sources/Rendering/SceneGraph/ViewNode'; +import { registerOverride } from 'vtk.js/Sources/Rendering/WebGPU/ViewNodeFactory'; + // ---------------------------------------------------------------------------- // vtkWebGPUVolume methods // ---------------------------------------------------------------------------- @@ -116,3 +118,6 @@ export const newInstance = macro.newInstance(extend, 'vtkWebGPUVolume'); // ---------------------------------------------------------------------------- export default { newInstance, extend }; + +// Register ourself to WebGPU backend if imported +registerOverride('vtkVolume', newInstance); diff --git a/Sources/Rendering/WebGPU/VolumeMapper/index.js b/Sources/Rendering/WebGPU/VolumeMapper/index.js index d5e38e36e8a..c3133b0dfd5 100644 --- a/Sources/Rendering/WebGPU/VolumeMapper/index.js +++ b/Sources/Rendering/WebGPU/VolumeMapper/index.js @@ -1,4 +1,4 @@ -import macro from 'vtk.js/Sources/macro'; +import * as macro from 'vtk.js/Sources/macro'; import { vec3, mat3, mat4 } from 'gl-matrix'; // import vtkDataArray from 'vtk.js/Sources/Common/Core/DataArray'; // import { VtkDataTypes } from 'vtk.js/Sources/Common/Core/DataArray/Constants'; @@ -18,6 +18,8 @@ import vtkViewNode from 'vtk.js/Sources/Rendering/SceneGraph/ViewNode'; import { InterpolationType } from 'vtk.js/Sources/Rendering/Core/VolumeProperty/Constants'; // import { BlendMode } from 'vtk.js/Sources/Rendering/Core/VolumeMapper/Constants'; +import { registerOverride } from 'vtk.js/Sources/Rendering/WebGPU/ViewNodeFactory'; + const vtkWebGPUVolumeVS = ` //VTK::Renderer::Dec @@ -1721,3 +1723,6 @@ export const newInstance = macro.newInstance(extend, 'vtkWebGPUVolumeMapper'); // ---------------------------------------------------------------------------- export default { newInstance, extend }; + +// Register ourself to WebGPU backend if imported +registerOverride('vtkVolumeMapper', newInstance);