@kitware/vtk.js 25.3.0 → 25.6.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (38) hide show
  1. package/IO/Core/DataAccessHelper/HtmlDataAccessHelper.js +4 -8
  2. package/IO/Core/DataAccessHelper/HttpDataAccessHelper.js +6 -14
  3. package/IO/Core/DataAccessHelper/JSZipDataAccessHelper.js +60 -57
  4. package/IO/Core/ZipMultiDataSetReader.js +19 -29
  5. package/IO/Core/ZipMultiDataSetWriter.js +7 -23
  6. package/IO/Misc/SkyboxReader.js +67 -75
  7. package/IO/XML/XMLReader.js +2 -2
  8. package/IO/XML/XMLWriter.js +2 -2
  9. package/Interaction/Style/InteractorStyleTrackballCamera.js +16 -0
  10. package/README.md +2 -2
  11. package/Rendering/Core/Actor2D.d.ts +12 -6
  12. package/Rendering/Core/ColorTransferFunction/ColorMaps.d.ts +24 -0
  13. package/Rendering/Core/Property2D.d.ts +1 -1
  14. package/Rendering/Core/Renderer.d.ts +43 -3
  15. package/Rendering/Core/Renderer.js +5 -1
  16. package/Rendering/Core/Texture.d.ts +22 -0
  17. package/Rendering/Core/Texture.js +159 -10
  18. package/Rendering/Core/VolumeProperty.d.ts +4 -4
  19. package/Rendering/Core/VolumeProperty.js +1 -1
  20. package/Rendering/OpenGL/RenderWindow/ContextProxy.js +65 -0
  21. package/Rendering/OpenGL/RenderWindow.js +3 -1
  22. package/Rendering/WebGPU/CellArrayMapper.js +43 -13
  23. package/Rendering/WebGPU/ForwardPass.js +93 -15
  24. package/Rendering/WebGPU/FullScreenQuad.js +2 -1
  25. package/Rendering/WebGPU/OpaquePass.js +1 -1
  26. package/Rendering/WebGPU/OrderIndependentTranslucentPass.js +1 -1
  27. package/Rendering/WebGPU/RenderEncoder.js +9 -5
  28. package/Rendering/WebGPU/RenderWindow.js +15 -13
  29. package/Rendering/WebGPU/Renderer.js +77 -5
  30. package/Rendering/WebGPU/Sampler.js +4 -0
  31. package/Rendering/WebGPU/Texture.js +78 -46
  32. package/Rendering/WebGPU/TextureManager.js +5 -3
  33. package/Rendering/WebGPU/TextureView.js +15 -2
  34. package/Rendering/WebGPU/VolumePass.js +1 -1
  35. package/index.d.ts +1 -0
  36. package/index.js +0 -2
  37. package/package.json +4 -5
  38. package/ThirdParty/index.js +0 -9
@@ -3,6 +3,7 @@ import HalfFloat from '../../Common/Core/HalfFloat.js';
3
3
  import vtkWebGPUBufferManager from './BufferManager.js';
4
4
  import vtkWebGPUTextureView from './TextureView.js';
5
5
  import vtkWebGPUTypes from './Types.js';
6
+ import vtkTexture from '../Core/Texture.js';
6
7
 
7
8
  var BufferUsage = vtkWebGPUBufferManager.BufferUsage; // ----------------------------------------------------------------------------
8
9
  // Global methods
@@ -22,6 +23,7 @@ function vtkWebGPUTexture(publicAPI, model) {
22
23
  model.depth = options.depth ? options.depth : 1;
23
24
  var dimension = model.depth === 1 ? '2d' : '3d';
24
25
  model.format = options.format ? options.format : 'rgba8unorm';
26
+ model.mipLevel = options.mipLevel ? options.mipLevel : 0;
25
27
  /* eslint-disable no-undef */
26
28
 
27
29
  /* eslint-disable no-bitwise */
@@ -37,7 +39,8 @@ function vtkWebGPUTexture(publicAPI, model) {
37
39
  // 'rgba8unorm',
38
40
  usage: model.usage,
39
41
  label: model.label,
40
- dimension: dimension
42
+ dimension: dimension,
43
+ mipLevelCount: model.mipLevel + 1
41
44
  });
42
45
  };
43
46
 
@@ -56,10 +59,11 @@ function vtkWebGPUTexture(publicAPI, model) {
56
59
  /* eslint-enable no-undef */
57
60
 
58
61
  /* eslint-enable no-bitwise */
59
- }; // set the data
60
-
62
+ };
61
63
 
62
64
  publicAPI.writeImageData = function (req) {
65
+ var nativeArray = [];
66
+
63
67
  if (req.canvas) {
64
68
  model.device.getHandle().queue.copyExternalImageToTexture({
65
69
  source: req.canvas,
@@ -84,36 +88,23 @@ function vtkWebGPUTexture(publicAPI, model) {
84
88
  var tDetails = vtkWebGPUTypes.getDetailsFromTextureFormat(model.format);
85
89
  var bufferBytesPerRow = model.width * tDetails.stride;
86
90
 
87
- if (req.nativeArray) {
88
- // create and write the buffer
89
- var buffRequest = {
90
- /* eslint-disable no-undef */
91
- usage: BufferUsage.Texture
92
- /* eslint-enable no-undef */
93
-
94
- };
95
-
96
- if (req.dataArray) {
97
- buffRequest.dataArray = req.dataArray;
98
- }
99
-
100
- buffRequest.nativeArray = req.nativeArray; // bytesPerRow must be a multiple of 256 so we might need to rebuild
91
+ var fixAll = function fixAll(arr, height, depth) {
92
+ // bytesPerRow must be a multiple of 256 so we might need to rebuild
101
93
  // the data here before passing to the buffer. e.g. if it is unorm8x4 then
102
94
  // we need to have width be a multiple of 64
103
-
104
- var inWidthInBytes = req.nativeArray.length / (model.height * model.depth) * req.nativeArray.BYTES_PER_ELEMENT; // is this a half float texture?
95
+ var inWidthInBytes = arr.length / (height * depth) * arr.BYTES_PER_ELEMENT; // is this a half float texture?
105
96
 
106
97
  var halfFloat = tDetails.elementSize === 2 && tDetails.sampleType === 'float'; // if we need to copy the data
107
98
 
108
99
  if (halfFloat || inWidthInBytes % 256) {
109
- var inArray = req.nativeArray;
100
+ var inArray = arr;
110
101
  var inWidth = inWidthInBytes / inArray.BYTES_PER_ELEMENT;
111
102
  var outBytesPerElement = tDetails.elementSize;
112
103
  var outWidthInBytes = 256 * Math.floor((inWidth * outBytesPerElement + 255) / 256);
113
104
  var outWidth = outWidthInBytes / outBytesPerElement;
114
- var outArray = macro.newTypedArray(halfFloat ? 'Uint16Array' : inArray.constructor.name, outWidth * model.height * model.depth);
105
+ var outArray = macro.newTypedArray(halfFloat ? 'Uint16Array' : inArray.constructor.name, outWidth * height * depth);
115
106
 
116
- for (var v = 0; v < model.height * model.depth; v++) {
107
+ for (var v = 0; v < height * depth; v++) {
117
108
  if (halfFloat) {
118
109
  for (var i = 0; i < inWidth; i++) {
119
110
  outArray[v * outWidth + i] = HalfFloat.toHalf(inArray[v * inWidth + i]);
@@ -123,12 +114,14 @@ function vtkWebGPUTexture(publicAPI, model) {
123
114
  }
124
115
  }
125
116
 
126
- buffRequest.nativeArray = outArray;
127
- bufferBytesPerRow = outWidthInBytes;
117
+ return [outArray, outWidthInBytes];
128
118
  }
129
119
 
130
- var buff = model.device.getBufferManager().getBuffer(buffRequest);
131
- model.buffer = buff;
120
+ return [arr, inWidthInBytes];
121
+ };
122
+
123
+ if (req.nativeArray) {
124
+ nativeArray = req.nativeArray;
132
125
  }
133
126
 
134
127
  if (req.image) {
@@ -139,35 +132,74 @@ function vtkWebGPUTexture(publicAPI, model) {
139
132
  ctx.translate(0, canvas.height);
140
133
  ctx.scale(1, -1);
141
134
  ctx.drawImage(req.image, 0, 0, req.image.width, req.image.height, 0, 0, canvas.width, canvas.height);
142
- var imageData = ctx.getImageData(0, 0, req.image.width, req.image.height); // create and write the buffer
135
+ var imageData = ctx.getImageData(0, 0, req.image.width, req.image.height);
136
+ nativeArray = imageData.data;
137
+ }
143
138
 
139
+ var cmdEnc = model.device.createCommandEncoder();
140
+
141
+ if (publicAPI.getDimensionality() !== 3) {
142
+ // Non-3D, supports mipmaps
143
+ var mips = vtkTexture.generateMipmaps(nativeArray, model.width, model.height, model.mipLevel);
144
+ var currentWidth = model.width;
145
+ var currentHeight = model.height;
146
+
147
+ for (var m = 0; m <= model.mipLevel; m++) {
148
+ var fix = fixAll(mips[m], currentHeight, 1);
149
+ bufferBytesPerRow = fix[1];
150
+ var buffRequest = {
151
+ dataArray: req.dataArray ? req.dataArray : null,
152
+ nativeArray: fix[0],
153
+
154
+ /* eslint-disable no-undef */
155
+ usage: BufferUsage.Texture
156
+ /* eslint-enable no-undef */
157
+
158
+ };
159
+ var buff = model.device.getBufferManager().getBuffer(buffRequest);
160
+ cmdEnc.copyBufferToTexture({
161
+ buffer: buff.getHandle(),
162
+ offset: 0,
163
+ bytesPerRow: bufferBytesPerRow,
164
+ rowsPerImage: currentHeight
165
+ }, {
166
+ texture: model.handle,
167
+ mipLevel: m
168
+ }, [currentWidth, currentHeight, 1]);
169
+ currentWidth /= 2;
170
+ currentHeight /= 2;
171
+ }
172
+
173
+ model.device.submitCommandEncoder(cmdEnc);
174
+ model.ready = true;
175
+ } else {
176
+ // 3D, no mipmaps
177
+ var _fix = fixAll(nativeArray, model.height, model.depth);
178
+
179
+ bufferBytesPerRow = _fix[1];
144
180
  var _buffRequest = {
145
- nativeArray: imageData.data,
181
+ dataArray: req.dataArray ? req.dataArray : null,
146
182
 
147
183
  /* eslint-disable no-undef */
148
- usage: BufferUsage.Texture,
149
-
184
+ usage: BufferUsage.Texture
150
185
  /* eslint-enable no-undef */
151
- format: 'unorm8x4'
186
+
152
187
  };
188
+ _buffRequest.nativeArray = _fix[0];
153
189
 
154
190
  var _buff = model.device.getBufferManager().getBuffer(_buffRequest);
155
191
 
156
- model.buffer = _buff;
157
- } // get a buffer for the image
158
-
159
-
160
- var cmdEnc = model.device.createCommandEncoder();
161
- cmdEnc.copyBufferToTexture({
162
- buffer: model.buffer.getHandle(),
163
- offset: 0,
164
- bytesPerRow: bufferBytesPerRow,
165
- rowsPerImage: model.height
166
- }, {
167
- texture: model.handle
168
- }, [model.width, model.height, model.depth]);
169
- model.device.submitCommandEncoder(cmdEnc);
170
- model.ready = true;
192
+ cmdEnc.copyBufferToTexture({
193
+ buffer: _buff.getHandle(),
194
+ offset: 0,
195
+ bytesPerRow: bufferBytesPerRow,
196
+ rowsPerImage: model.height
197
+ }, {
198
+ texture: model.handle
199
+ }, [model.width, model.height, model.depth]);
200
+ model.device.submitCommandEncoder(cmdEnc);
201
+ model.ready = true;
202
+ }
171
203
  }; // when data is pulled out of this texture what scale must be applied to
172
204
  // get back to the original source data. For formats such as r8unorm we
173
205
  // have to multiply by 255.0, for formats such as r16float it is 1.0
@@ -105,7 +105,8 @@ function vtkWebGPUTextureManager(publicAPI, model) {
105
105
  height: req.height,
106
106
  depth: req.depth,
107
107
  format: req.format,
108
- usage: req.usage
108
+ usage: req.usage,
109
+ mipLevel: req.mipLevel
109
110
  }); // fill the texture if we have data
110
111
 
111
112
  if (req.nativeArray || req.image || req.canvas) {
@@ -135,7 +136,7 @@ function vtkWebGPUTextureManager(publicAPI, model) {
135
136
 
136
137
  _fillRequest(treq);
137
138
 
138
- treq.hash = treq.time + treq.format;
139
+ treq.hash = treq.time + treq.format + treq.mipLevel;
139
140
  return model.device.getTextureManager().getTexture(treq);
140
141
  };
141
142
 
@@ -157,7 +158,8 @@ function vtkWebGPUTextureManager(publicAPI, model) {
157
158
 
158
159
  _fillRequest(treq);
159
160
 
160
- treq.hash = treq.time + treq.format;
161
+ treq.mipLevel = srcTexture.getMipLevel();
162
+ treq.hash = treq.time + treq.format + treq.mipLevel;
161
163
  return model.device.getTextureManager().getTexture(treq);
162
164
  };
163
165
  } // ----------------------------------------------------------------------------
@@ -23,6 +23,19 @@ function vtkWebGPUTextureView(publicAPI, model) {
23
23
  model.bindGroupLayoutEntry.texture.sampleType = tDetails.sampleType;
24
24
  };
25
25
 
26
+ publicAPI.createFromTextureHandle = function (textureHandle, options) {
27
+ model.texture = null;
28
+ model.options = options;
29
+ model.options.dimension = model.options.dimension || '2d';
30
+ model.options.label = model.label;
31
+ model.textureHandle = textureHandle;
32
+ model.handle = model.textureHandle.createView(model.options);
33
+ model.bindGroupLayoutEntry.texture.viewDimension = model.options.dimension;
34
+ var tDetails = vtkWebGPUTypes.getDetailsFromTextureFormat(options.format);
35
+ model.bindGroupLayoutEntry.texture.sampleType = tDetails.sampleType;
36
+ model.bindGroupTime.modified();
37
+ };
38
+
26
39
  publicAPI.getBindGroupEntry = function () {
27
40
  var foo = {
28
41
  resource: publicAPI.getHandle()
@@ -58,7 +71,7 @@ function vtkWebGPUTextureView(publicAPI, model) {
58
71
 
59
72
  publicAPI.getBindGroupTime = function () {
60
73
  // check if the handle changed
61
- if (model.texture.getHandle() !== model.textureHandle) {
74
+ if (model.texture && model.texture.getHandle() !== model.textureHandle) {
62
75
  model.textureHandle = model.texture.getHandle();
63
76
  model.handle = model.textureHandle.createView(model.options);
64
77
  model.bindGroupTime.modified();
@@ -69,7 +82,7 @@ function vtkWebGPUTextureView(publicAPI, model) {
69
82
 
70
83
 
71
84
  publicAPI.getHandle = function () {
72
- if (model.texture.getHandle() !== model.textureHandle) {
85
+ if (model.texture && model.texture.getHandle() !== model.textureHandle) {
73
86
  model.textureHandle = model.texture.getHandle();
74
87
  model.handle = model.textureHandle.createView(model.options);
75
88
  model.bindGroupTime.modified();
@@ -560,7 +560,7 @@ function vtkWebGPUVolumePass(publicAPI, model) {
560
560
  },
561
561
  fragment: {
562
562
  targets: [{
563
- format: 'bgra8unorm',
563
+ format: 'rgba16float',
564
564
  blend: {
565
565
  color: {
566
566
  srcFactor: 'one',
package/index.d.ts CHANGED
@@ -103,6 +103,7 @@
103
103
  /// <reference path="./Rendering/Core/AxesActor.d.ts" />
104
104
  /// <reference path="./Rendering/Core/Camera.d.ts" />
105
105
  /// <reference path="./Rendering/Core/CellPicker.d.ts" />
106
+ /// <reference path="./Rendering/Core/ColorTransferFunction/ColorMaps.d.ts" />
106
107
  /// <reference path="./Rendering/Core/ColorTransferFunction/Constants.d.ts" />
107
108
  /// <reference path="./Rendering/Core/ColorTransferFunction.d.ts" />
108
109
  /// <reference path="./Rendering/Core/Coordinate/Constants.d.ts" />
package/index.js CHANGED
@@ -5,7 +5,6 @@ import Interaction from './Interaction/index.js';
5
5
  import IO from './IO/index.js';
6
6
  import Rendering from './Rendering/index.js';
7
7
  import VTKProxy from './Proxy/index.js';
8
- import { T as ThirdParty } from './ThirdParty/index.js';
9
8
  import Widgets from './Widgets/index.js';
10
9
  import macro from './macros.js';
11
10
  import vtk from './vtk.js';
@@ -17,7 +16,6 @@ vtk.Interaction = Interaction;
17
16
  vtk.IO = IO;
18
17
  vtk.Proxy = VTKProxy;
19
18
  vtk.Rendering = Rendering;
20
- vtk.ThirdParty = ThirdParty;
21
19
  vtk.Widgets = Widgets;
22
20
  vtk.mtime = macro.getCurrentGlobalMTime;
23
21
  vtk.macro = macro; // Expose vtk to global scope without exporting it so nested namespace
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@kitware/vtk.js",
3
- "version": "25.3.0",
3
+ "version": "25.6.0",
4
4
  "description": "Visualization Toolkit for the Web",
5
5
  "keywords": [
6
6
  "3d",
@@ -33,14 +33,13 @@
33
33
  "@babel/runtime": "7.17.9",
34
34
  "commander": "9.2.0",
35
35
  "d3-scale": "4.0.2",
36
+ "fflate": "0.7.3",
36
37
  "gl-matrix": "3.4.3",
37
38
  "globalthis": "1.0.3",
38
- "jszip": "3.9.1",
39
- "pako": "2.0.4",
40
39
  "seedrandom": "3.0.5",
41
40
  "shader-loader": "1.3.1",
42
41
  "shelljs": "0.8.5",
43
- "spark-md5": "^3.0.2",
42
+ "spark-md5": "3.0.2",
44
43
  "stream-browserify": "3.0.0",
45
44
  "webworker-promise": "0.5.0",
46
45
  "worker-loader": "3.0.8",
@@ -96,7 +95,7 @@
96
95
  "kw-doc": "3.1.2",
97
96
  "lodash": "4.17.21",
98
97
  "magic-string": "0.26.2",
99
- "moment": "2.29.3",
98
+ "moment": "2.29.4",
100
99
  "patch-package": "6.4.7",
101
100
  "pixelmatch": "5.3.0",
102
101
  "postcss-loader": "6.2.1",
@@ -1,9 +0,0 @@
1
- import JSZip from 'jszip';
2
- import pako from 'pako';
3
-
4
- var ThirdParty = {
5
- JSZip: JSZip,
6
- pako: pako
7
- };
8
-
9
- export { ThirdParty as T };