@kitware/vtk.js 25.2.4 → 25.5.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/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/VolumeMapper.d.ts +40 -1
- package/Rendering/Core/VolumeMapper.js +25 -11
- package/Rendering/OpenGL/RenderWindow/ContextProxy.js +65 -0
- package/Rendering/OpenGL/RenderWindow.js +3 -1
- package/Rendering/OpenGL/VolumeMapper.js +42 -20
- package/Rendering/OpenGL/glsl/vtkVolumeFS.glsl.js +1 -1
- package/Rendering/WebGPU/CellArrayMapper.js +43 -13
- package/Rendering/WebGPU/FullScreenQuad.js +2 -1
- 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/index.js +0 -2
- package/package.json +4 -5
- package/ThirdParty/index.js +0 -9
|
@@ -9,7 +9,12 @@ import vtkWebGPUUniformBuffer from './UniformBuffer.js';
|
|
|
9
9
|
import { registerOverride } from './ViewNodeFactory.js';
|
|
10
10
|
|
|
11
11
|
var vtkDebugMacro = vtkDebugMacro$1;
|
|
12
|
-
var
|
|
12
|
+
var clearFragColorTemplate = "\n//VTK::Renderer::Dec\n\n//VTK::Mapper::Dec\n\n//VTK::TCoord::Dec\n\n//VTK::RenderEncoder::Dec\n\n//VTK::IOStructs::Dec\n\n@fragment\nfn main(\n//VTK::IOStructs::Input\n)\n//VTK::IOStructs::Output\n{\n var output: fragmentOutput;\n\n var computedColor: vec4<f32> = mapperUBO.BackgroundColor;\n\n //VTK::RenderEncoder::Impl\n return output;\n}\n";
|
|
13
|
+
var clearFragTextureTemplate = "\nfn vecToRectCoord(dir: vec3<f32>) -> vec2<f32> {\n var tau: f32 = 6.28318530718;\n var pi: f32 = 3.14159265359;\n var out: vec2<f32> = vec2<f32>(0.0);\n\n out.x = atan2(dir.z, dir.x) / tau;\n out.x += 0.5;\n\n var phix: f32 = length(vec2(dir.x, dir.z));\n out.y = atan2(dir.y, phix) / pi + 0.5;\n\n return out;\n}\n\n//VTK::Renderer::Dec\n\n//VTK::Mapper::Dec\n\n//VTK::TCoord::Dec\n\n//VTK::RenderEncoder::Dec\n\n//VTK::IOStructs::Dec\n\n@fragment\nfn main(\n//VTK::IOStructs::Input\n)\n//VTK::IOStructs::Output\n{\n var output: fragmentOutput;\n\n var tcoord: vec4<f32> = vec4<f32>(input.vertexVC.xy, -1, 1);\n var V: vec4<f32> = normalize(mapperUBO.FSQMatrix * tcoord); // vec2<f32>((input.tcoordVS.x - 0.5) * 2, -(input.tcoordVS.y - 0.5) * 2);\n // textureSampleLevel gets rid of some ugly artifacts\n var background = textureSampleLevel(EnvironmentTexture, EnvironmentTextureSampler, vecToRectCoord(V.xyz), 0);\n var computedColor: vec4<f32> = vec4<f32>(background.rgb, 1);\n\n //VTK::RenderEncoder::Impl\n return output;\n}\n";
|
|
14
|
+
|
|
15
|
+
var _fsqClearMat4 = new Float64Array(16);
|
|
16
|
+
|
|
17
|
+
var _tNormalMat4 = new Float64Array(16); // Light type index gives either 0, 1, or 2 which indicates what type of light there is.
|
|
13
18
|
// While technically, there are only spot and directional lights, within the CellArrayMapper
|
|
14
19
|
// there is a third, positional light. It is technically just a variant of a spot light with
|
|
15
20
|
// a cone angle of 90 or above, however certain calculations can be skipped if it is treated
|
|
@@ -19,6 +24,7 @@ var clearFragTemplate = "\n//VTK::Renderer::Dec\n\n//VTK::Mapper::Dec\n\n//VTK::
|
|
|
19
24
|
// 1 -> directional light
|
|
20
25
|
// 2 -> spot light
|
|
21
26
|
|
|
27
|
+
|
|
22
28
|
function getLightTypeIndex(light) {
|
|
23
29
|
if (light.getPositional()) {
|
|
24
30
|
if (light.getConeAngle() >= 90) {
|
|
@@ -124,6 +130,8 @@ function vtkWebGPURenderer(publicAPI, model) {
|
|
|
124
130
|
var utime = model.UBO.getSendTime();
|
|
125
131
|
|
|
126
132
|
if (model._parent.getMTime() > utime || publicAPI.getMTime() > utime || model.camera.getMTime() > utime || model.renderable.getMTime() > utime) {
|
|
133
|
+
var _model$renderable$get;
|
|
134
|
+
|
|
127
135
|
var keyMats = model.webgpuCamera.getKeyMatrices(publicAPI);
|
|
128
136
|
model.UBO.setArray('WCVCMatrix', keyMats.wcvc);
|
|
129
137
|
model.UBO.setArray('SCPCMatrix', keyMats.scpc);
|
|
@@ -132,6 +140,9 @@ function vtkWebGPURenderer(publicAPI, model) {
|
|
|
132
140
|
model.UBO.setArray('VCPCMatrix', keyMats.vcpc);
|
|
133
141
|
model.UBO.setArray('WCVCNormals', keyMats.normalMatrix);
|
|
134
142
|
model.UBO.setValue('LightCount', model.renderable.getLights().length);
|
|
143
|
+
model.UBO.setValue('MaxEnvironmentMipLevel', (_model$renderable$get = model.renderable.getEnvironmentTexture()) === null || _model$renderable$get === void 0 ? void 0 : _model$renderable$get.getMipLevel());
|
|
144
|
+
model.UBO.setValue('BackgroundDiffuseStrength', model.renderable.getEnvironmentTextureDiffuseStrength());
|
|
145
|
+
model.UBO.setValue('BackgroundSpecularStrength', model.renderable.getEnvironmentTextureSpecularStrength());
|
|
135
146
|
var tsize = publicAPI.getYInvertedTiledSizeAndOrigin();
|
|
136
147
|
model.UBO.setArray('viewportSize', [tsize.usize, tsize.vsize]);
|
|
137
148
|
model.UBO.setValue('cameraParallel', model.camera.getParallelProjection());
|
|
@@ -162,8 +173,7 @@ function vtkWebGPURenderer(publicAPI, model) {
|
|
|
162
173
|
|
|
163
174
|
var viewCoordinatePosition = lights[_i].getPosition();
|
|
164
175
|
|
|
165
|
-
vec3.transformMat4(viewCoordinatePosition, viewCoordinatePosition, keyMats.wcvc); //
|
|
166
|
-
// viewCoordinatePosition
|
|
176
|
+
vec3.transformMat4(viewCoordinatePosition, viewCoordinatePosition, keyMats.wcvc); // viewCoordinatePosition
|
|
167
177
|
|
|
168
178
|
lightPosArray[offset] = viewCoordinatePosition[0];
|
|
169
179
|
lightPosArray[offset + 1] = viewCoordinatePosition[1];
|
|
@@ -240,26 +250,85 @@ function vtkWebGPURenderer(publicAPI, model) {
|
|
|
240
250
|
};
|
|
241
251
|
|
|
242
252
|
publicAPI.clear = function () {
|
|
253
|
+
var _model$backgroundTex;
|
|
254
|
+
|
|
243
255
|
if (model.renderable.getTransparent() || model.suppressClear) {
|
|
244
256
|
return;
|
|
245
257
|
}
|
|
246
258
|
|
|
247
|
-
var device = model._parent.getDevice();
|
|
259
|
+
var device = model._parent.getDevice(); // Normal Solid Color
|
|
260
|
+
|
|
248
261
|
|
|
249
262
|
if (!model.clearFSQ) {
|
|
250
263
|
model.clearFSQ = vtkWebGPUFullScreenQuad.newInstance();
|
|
251
264
|
model.clearFSQ.setDevice(device);
|
|
252
265
|
model.clearFSQ.setPipelineHash('clearfsq');
|
|
253
|
-
model.clearFSQ.setFragmentShaderTemplate(
|
|
266
|
+
model.clearFSQ.setFragmentShaderTemplate(clearFragColorTemplate);
|
|
254
267
|
var ubo = vtkWebGPUUniformBuffer.newInstance({
|
|
255
268
|
label: 'mapperUBO'
|
|
256
269
|
});
|
|
270
|
+
ubo.addEntry('FSQMatrix', 'mat4x4<f32>');
|
|
257
271
|
ubo.addEntry('BackgroundColor', 'vec4<f32>');
|
|
258
272
|
model.clearFSQ.setUBO(ubo);
|
|
273
|
+
model.backgroundTex = model.renderable.getEnvironmentTexture();
|
|
274
|
+
} // Textured Background
|
|
275
|
+
|
|
276
|
+
|
|
277
|
+
if (model.clearFSQ.getPipelineHash() !== 'clearfsqwithtexture' && model.renderable.getUseEnvironmentTextureAsBackground() && (_model$backgroundTex = model.backgroundTex) !== null && _model$backgroundTex !== void 0 && _model$backgroundTex.getImageLoaded()) {
|
|
278
|
+
model.clearFSQ.setFragmentShaderTemplate(clearFragTextureTemplate);
|
|
279
|
+
|
|
280
|
+
var _ubo = vtkWebGPUUniformBuffer.newInstance({
|
|
281
|
+
label: 'mapperUBO'
|
|
282
|
+
});
|
|
283
|
+
|
|
284
|
+
_ubo.addEntry('FSQMatrix', 'mat4x4<f32>');
|
|
285
|
+
|
|
286
|
+
_ubo.addEntry('BackgroundColor', 'vec4<f32>');
|
|
287
|
+
|
|
288
|
+
model.clearFSQ.setUBO(_ubo);
|
|
289
|
+
var environmentTextureHash = device.getTextureManager().getTextureForVTKTexture(model.backgroundTex);
|
|
290
|
+
|
|
291
|
+
if (environmentTextureHash.getReady()) {
|
|
292
|
+
var tview = environmentTextureHash.createView("EnvironmentTexture");
|
|
293
|
+
model.clearFSQ.setTextureViews([tview]);
|
|
294
|
+
model.backgroundTexLoaded = true;
|
|
295
|
+
var interpolate = model.backgroundTex.getInterpolate() ? 'linear' : 'nearest';
|
|
296
|
+
tview.addSampler(device, {
|
|
297
|
+
addressModeU: 'repeat',
|
|
298
|
+
addressModeV: 'clamp-to-edge',
|
|
299
|
+
addressModeW: 'repeat',
|
|
300
|
+
minFilter: interpolate,
|
|
301
|
+
magFilter: interpolate,
|
|
302
|
+
mipmapFilter: 'linear'
|
|
303
|
+
});
|
|
304
|
+
}
|
|
305
|
+
|
|
306
|
+
model.clearFSQ.setPipelineHash('clearfsqwithtexture');
|
|
307
|
+
} else if (model.clearFSQ.getPipelineHash() === 'clearfsqwithtexture' && !model.renderable.getUseEnvironmentTextureAsBackground()) {
|
|
308
|
+
// In case the mode is changed at runtime
|
|
309
|
+
model.clearFSQ = vtkWebGPUFullScreenQuad.newInstance();
|
|
310
|
+
model.clearFSQ.setDevice(device);
|
|
311
|
+
model.clearFSQ.setPipelineHash('clearfsq');
|
|
312
|
+
model.clearFSQ.setFragmentShaderTemplate(clearFragColorTemplate);
|
|
313
|
+
|
|
314
|
+
var _ubo2 = vtkWebGPUUniformBuffer.newInstance({
|
|
315
|
+
label: 'mapperUBO'
|
|
316
|
+
});
|
|
317
|
+
|
|
318
|
+
_ubo2.addEntry('FSQMatrix', 'mat4x4<f32>');
|
|
319
|
+
|
|
320
|
+
_ubo2.addEntry('BackgroundColor', 'vec4<f32>');
|
|
321
|
+
|
|
322
|
+
model.clearFSQ.setUBO(_ubo2);
|
|
259
323
|
}
|
|
260
324
|
|
|
325
|
+
var keyMats = model.webgpuCamera.getKeyMatrices(publicAPI);
|
|
261
326
|
var background = model.renderable.getBackgroundByReference();
|
|
262
327
|
model.clearFSQ.getUBO().setArray('BackgroundColor', background);
|
|
328
|
+
mat4.transpose(_tNormalMat4, keyMats.normalMatrix);
|
|
329
|
+
mat4.mul(_fsqClearMat4, keyMats.scvc, keyMats.pcsc);
|
|
330
|
+
mat4.mul(_fsqClearMat4, _tNormalMat4, _fsqClearMat4);
|
|
331
|
+
model.clearFSQ.getUBO().setArray('FSQMatrix', _fsqClearMat4);
|
|
263
332
|
model.clearFSQ.getUBO().sendIfNeeded(device);
|
|
264
333
|
model.clearFSQ.prepareAndDraw(model.renderEncoder);
|
|
265
334
|
};
|
|
@@ -395,6 +464,9 @@ function extend(publicAPI, model) {
|
|
|
395
464
|
model.UBO.addEntry('WCVCNormals', 'mat4x4<f32>');
|
|
396
465
|
model.UBO.addEntry('viewportSize', 'vec2<f32>');
|
|
397
466
|
model.UBO.addEntry('LightCount', 'i32');
|
|
467
|
+
model.UBO.addEntry('MaxEnvironmentMipLevel', 'f32');
|
|
468
|
+
model.UBO.addEntry('BackgroundDiffuseStrength', 'f32');
|
|
469
|
+
model.UBO.addEntry('BackgroundSpecularStrength', 'f32');
|
|
398
470
|
model.UBO.addEntry('cameraParallel', 'u32'); // SSBO (Light data)
|
|
399
471
|
|
|
400
472
|
model.SSBO = vtkWebGPUStorageBuffer.newInstance({
|
|
@@ -12,8 +12,12 @@ function vtkWebGPUSampler(publicAPI, model) {
|
|
|
12
12
|
publicAPI.create = function (device) {
|
|
13
13
|
var options = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};
|
|
14
14
|
model.device = device;
|
|
15
|
+
model.options.addressModeU = options.addressModeU ? options.addressModeU : 'clamp-to-edge';
|
|
16
|
+
model.options.addressModeV = options.addressModeV ? options.addressModeV : 'clamp-to-edge';
|
|
17
|
+
model.options.addressModeW = options.addressModeW ? options.addressModeW : 'clamp-to-edge';
|
|
15
18
|
model.options.magFilter = options.magFilter ? options.magFilter : 'nearest';
|
|
16
19
|
model.options.minFilter = options.minFilter ? options.minFilter : 'nearest';
|
|
20
|
+
model.options.mipmapFilter = options.mipmapFilter ? options.mipmapFilter : 'nearest';
|
|
17
21
|
model.options.label = model.label;
|
|
18
22
|
model.handle = model.device.getHandle().createSampler(model.options);
|
|
19
23
|
model.bindGroupTime.modified();
|
|
@@ -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
|
} // ----------------------------------------------------------------------------
|
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.5.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",
|