@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.
- package/IO/Core/DataAccessHelper/HtmlDataAccessHelper.js +4 -8
- package/IO/Core/DataAccessHelper/HttpDataAccessHelper.js +6 -14
- package/IO/Core/DataAccessHelper/JSZipDataAccessHelper.js +60 -57
- package/IO/Core/ZipMultiDataSetReader.js +19 -29
- package/IO/Core/ZipMultiDataSetWriter.js +7 -23
- package/IO/Misc/SkyboxReader.js +67 -75
- package/IO/XML/XMLReader.js +2 -2
- package/IO/XML/XMLWriter.js +2 -2
- package/Interaction/Style/InteractorStyleTrackballCamera.js +16 -0
- package/README.md +2 -2
- package/Rendering/Core/Actor2D.d.ts +12 -6
- package/Rendering/Core/ColorTransferFunction/ColorMaps.d.ts +24 -0
- package/Rendering/Core/Property2D.d.ts +1 -1
- package/Rendering/Core/Renderer.d.ts +43 -3
- package/Rendering/Core/Renderer.js +5 -1
- package/Rendering/Core/Texture.d.ts +22 -0
- package/Rendering/Core/Texture.js +159 -10
- package/Rendering/Core/VolumeProperty.d.ts +4 -4
- package/Rendering/Core/VolumeProperty.js +1 -1
- package/Rendering/OpenGL/RenderWindow/ContextProxy.js +65 -0
- package/Rendering/OpenGL/RenderWindow.js +3 -1
- package/Rendering/WebGPU/CellArrayMapper.js +43 -13
- package/Rendering/WebGPU/ForwardPass.js +93 -15
- package/Rendering/WebGPU/FullScreenQuad.js +2 -1
- package/Rendering/WebGPU/OpaquePass.js +1 -1
- package/Rendering/WebGPU/OrderIndependentTranslucentPass.js +1 -1
- package/Rendering/WebGPU/RenderEncoder.js +9 -5
- package/Rendering/WebGPU/RenderWindow.js +15 -13
- package/Rendering/WebGPU/Renderer.js +77 -5
- package/Rendering/WebGPU/Sampler.js +4 -0
- package/Rendering/WebGPU/Texture.js +78 -46
- package/Rendering/WebGPU/TextureManager.js +5 -3
- package/Rendering/WebGPU/TextureView.js +15 -2
- package/Rendering/WebGPU/VolumePass.js +1 -1
- package/index.d.ts +1 -0
- package/index.js +0 -2
- package/package.json +4 -5
- 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
|
-
};
|
|
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
|
-
|
|
88
|
-
//
|
|
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 =
|
|
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 *
|
|
105
|
+
var outArray = macro.newTypedArray(halfFloat ? 'Uint16Array' : inArray.constructor.name, outWidth * height * depth);
|
|
115
106
|
|
|
116
|
-
for (var v = 0; 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
|
-
|
|
127
|
-
bufferBytesPerRow = outWidthInBytes;
|
|
117
|
+
return [outArray, outWidthInBytes];
|
|
128
118
|
}
|
|
129
119
|
|
|
130
|
-
|
|
131
|
-
|
|
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);
|
|
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
|
-
|
|
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
|
-
|
|
186
|
+
|
|
152
187
|
};
|
|
188
|
+
_buffRequest.nativeArray = _fix[0];
|
|
153
189
|
|
|
154
190
|
var _buff = model.device.getBufferManager().getBuffer(_buffRequest);
|
|
155
191
|
|
|
156
|
-
|
|
157
|
-
|
|
158
|
-
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
|
|
163
|
-
|
|
164
|
-
|
|
165
|
-
|
|
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.
|
|
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();
|
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
|
+
"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": "
|
|
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.
|
|
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",
|