Skip to content

Commit

Permalink
feat(webgpu): register WebGPU implementation at import time
Browse files Browse the repository at this point in the history
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
  • Loading branch information
jourdain committed May 7, 2021
1 parent 7c33950 commit cffd616
Show file tree
Hide file tree
Showing 12 changed files with 70 additions and 55 deletions.
5 changes: 5 additions & 0 deletions Sources/Rendering/WebGPU/Actor/index.js
Original file line number Diff line number Diff line change
Expand Up @@ -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
// ----------------------------------------------------------------------------
Expand Down Expand Up @@ -194,3 +196,6 @@ export const newInstance = macro.newInstance(extend);
// ----------------------------------------------------------------------------

export default { newInstance, extend };

// Register ourself to WebGPU backend if imported
registerOverride('vtkActor', newInstance);
9 changes: 7 additions & 2 deletions Sources/Rendering/WebGPU/Camera/index.js
Original file line number Diff line number Diff line change
@@ -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
Expand Down Expand Up @@ -107,3 +109,6 @@ export const newInstance = macro.newInstance(extend);
// ----------------------------------------------------------------------------

export default { newInstance, extend };

// Register ourself to WebGPU backend if imported
registerOverride('vtkCamera', newInstance);
5 changes: 5 additions & 0 deletions Sources/Rendering/WebGPU/Glyph3DMapper/index.js
Original file line number Diff line number Diff line change
Expand Up @@ -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
// ----------------------------------------------------------------------------
Expand Down Expand Up @@ -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);
5 changes: 5 additions & 0 deletions Sources/Rendering/WebGPU/PixelSpaceCallbackMapper/index.js
Original file line number Diff line number Diff line change
@@ -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
// ----------------------------------------------------------------------------
Expand Down Expand Up @@ -62,3 +64,6 @@ export const newInstance = macro.newInstance(
// ----------------------------------------------------------------------------

export default { newInstance, extend };

// Register ourself to WebGPU backend if imported
registerOverride('vtkPixelSpaceCallbackMapper', newInstance);
7 changes: 6 additions & 1 deletion Sources/Rendering/WebGPU/PolyDataMapper/index.js
Original file line number Diff line number Diff line change
@@ -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';
Expand All @@ -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;
Expand Down Expand Up @@ -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);
5 changes: 5 additions & 0 deletions Sources/Rendering/WebGPU/Renderer/index.js
Original file line number Diff line number Diff line change
Expand Up @@ -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 = `
Expand Down Expand Up @@ -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);
5 changes: 5 additions & 0 deletions Sources/Rendering/WebGPU/SphereMapper/index.js
Original file line number Diff line number Diff line change
Expand Up @@ -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;

Expand Down Expand Up @@ -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);
5 changes: 5 additions & 0 deletions Sources/Rendering/WebGPU/StickMapper/index.js
Original file line number Diff line number Diff line change
Expand Up @@ -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;

Expand Down Expand Up @@ -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);
5 changes: 5 additions & 0 deletions Sources/Rendering/WebGPU/Texture/index.js
Original file line number Diff line number Diff line change
Expand Up @@ -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;

// ----------------------------------------------------------------------------
Expand Down Expand Up @@ -223,3 +225,6 @@ export const newInstance = macro.newInstance(extend);
// ----------------------------------------------------------------------------

export default { newInstance, extend };

// Register ourself to WebGPU backend if imported
registerOverride('vtkTexture', newInstance);
62 changes: 11 additions & 51 deletions Sources/Rendering/WebGPU/ViewNodeFactory/index.js
Original file line number Diff line number Diff line change
@@ -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
// ----------------------------------------------------------------------------
Expand All @@ -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
// );
}

// ----------------------------------------------------------------------------
Expand Down
5 changes: 5 additions & 0 deletions Sources/Rendering/WebGPU/Volume/index.js
Original file line number Diff line number Diff line change
Expand Up @@ -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
// ----------------------------------------------------------------------------
Expand Down Expand Up @@ -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);
7 changes: 6 additions & 1 deletion Sources/Rendering/WebGPU/VolumeMapper/index.js
Original file line number Diff line number Diff line change
@@ -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';
Expand All @@ -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
Expand Down Expand Up @@ -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);

0 comments on commit cffd616

Please # to comment.