@kitware/vtk.js 24.5.2 → 24.5.3
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/Common/DataModel/DataSetAttributes/FieldData.d.ts +3 -1
- package/Rendering/Core/RenderWindowInteractor.d.ts +123 -109
- package/Rendering/Core/ScalarBarActor.js +2 -2
- package/Rendering/OpenGL/OrderIndependentTranslucentPass.js +5 -1
- package/Rendering/OpenGL/RenderWindow.d.ts +1 -1
- package/Rendering/SceneGraph/ViewNode.js +28 -2
- package/Rendering/WebGPU/CellArrayMapper.js +629 -0
- package/Rendering/WebGPU/FullScreenQuad.js +4 -6
- package/Rendering/WebGPU/Glyph3DMapper.js +60 -27
- package/Rendering/WebGPU/ImageMapper.js +23 -60
- package/Rendering/WebGPU/OrderIndependentTranslucentPass.js +4 -6
- package/Rendering/WebGPU/Pipeline.js +12 -0
- package/Rendering/WebGPU/PolyDataMapper.js +49 -623
- package/Rendering/WebGPU/RenderEncoder.js +34 -0
- package/Rendering/WebGPU/Renderer.js +4 -62
- package/Rendering/WebGPU/ShaderDescription.js +6 -6
- package/Rendering/WebGPU/{MapperHelper.js → SimpleMapper.js} +64 -38
- package/Rendering/WebGPU/SphereMapper.js +41 -37
- package/Rendering/WebGPU/StickMapper.js +35 -30
- package/Rendering/WebGPU/StorageBuffer.js +2 -2
- package/Rendering/WebGPU/UniformBuffer.js +1 -1
- package/Rendering/WebGPU/Volume.js +1 -14
- package/Rendering/WebGPU/VolumePass.js +15 -19
- package/Rendering/WebGPU/VolumePassFSQ.js +19 -25
- package/package.json +1 -1
|
@@ -1,618 +1,90 @@
|
|
|
1
|
-
import {
|
|
2
|
-
import { newInstance as newInstance$1, get, setGet } from '../../macros.js';
|
|
3
|
-
import vtkMapper from '../Core/Mapper.js';
|
|
4
|
-
import vtkProperty from '../Core/Property.js';
|
|
5
|
-
import vtkTexture from '../Core/Texture.js';
|
|
1
|
+
import { newInstance as newInstance$1 } from '../../macros.js';
|
|
6
2
|
import vtkWebGPUBufferManager from './BufferManager.js';
|
|
7
|
-
import
|
|
8
|
-
import vtkWebGPUUniformBuffer from './UniformBuffer.js';
|
|
9
|
-
import vtkWebGPUMapperHelper from './MapperHelper.js';
|
|
3
|
+
import vtkWebGPUCellArrayMapper from './CellArrayMapper.js';
|
|
10
4
|
import vtkViewNode from '../SceneGraph/ViewNode.js';
|
|
11
5
|
import { registerOverride } from './ViewNodeFactory.js';
|
|
12
6
|
|
|
13
|
-
var
|
|
14
|
-
PrimitiveTypes = vtkWebGPUBufferManager.PrimitiveTypes;
|
|
15
|
-
var Representation = vtkProperty.Representation;
|
|
16
|
-
var ScalarMode = vtkMapper.ScalarMode;
|
|
17
|
-
var StartEvent = {
|
|
18
|
-
type: 'StartEvent'
|
|
19
|
-
};
|
|
20
|
-
var EndEvent = {
|
|
21
|
-
type: 'EndEvent'
|
|
22
|
-
};
|
|
23
|
-
var vtkWebGPUPolyDataVS = "\n//VTK::Renderer::Dec\n\n//VTK::Color::Dec\n\n//VTK::Normal::Dec\n\n//VTK::TCoord::Dec\n\n//VTK::Select::Dec\n\n//VTK::Mapper::Dec\n\n//VTK::IOStructs::Dec\n\n@stage(vertex)\nfn main(\n//VTK::IOStructs::Input\n)\n//VTK::IOStructs::Output\n{\n var output : vertexOutput;\n\n var vertex: vec4<f32> = vertexBC;\n\n //VTK::Color::Impl\n\n //VTK::Normal::Impl\n\n //VTK::TCoord::Impl\n\n //VTK::Select::Impl\n\n //VTK::Position::Impl\n\n return output;\n}\n";
|
|
24
|
-
var vtkWebGPUPolyDataFS = "\n//VTK::Renderer::Dec\n\n//VTK::Color::Dec\n\n// optional surface normal declaration\n//VTK::Normal::Dec\n\n//VTK::TCoord::Dec\n\n//VTK::Select::Dec\n\n//VTK::RenderEncoder::Dec\n\n//VTK::Mapper::Dec\n\n//VTK::IOStructs::Dec\n\n@stage(fragment)\nfn main(\n//VTK::IOStructs::Input\n)\n//VTK::IOStructs::Output\n{\n var output : fragmentOutput;\n\n var ambientColor: vec4<f32> = mapperUBO.AmbientColor;\n var diffuseColor: vec4<f32> = mapperUBO.DiffuseColor;\n var opacity: f32 = mapperUBO.Opacity;\n\n //VTK::Color::Impl\n\n //VTK::Normal::Impl\n\n //VTK::Light::Impl\n\n var computedColor: vec4<f32> = vec4<f32>(ambientColor.rgb * mapperUBO.AmbientIntensity\n + diffuse * mapperUBO.DiffuseIntensity\n + specular * mapperUBO.SpecularIntensity,\n opacity);\n\n //VTK::TCoord::Impl\n\n //VTK::Select::Impl\n\n if (computedColor.a == 0.0) { discard; };\n\n //VTK::Position::Impl\n\n //VTK::RenderEncoder::Impl\n return output;\n}\n";
|
|
25
|
-
|
|
26
|
-
function isEdges(hash) {
|
|
27
|
-
// edge pipelines have "edge" in them
|
|
28
|
-
return hash.indexOf('edge') >= 0;
|
|
29
|
-
} // ----------------------------------------------------------------------------
|
|
7
|
+
var PrimitiveTypes = vtkWebGPUBufferManager.PrimitiveTypes; // ----------------------------------------------------------------------------
|
|
30
8
|
// vtkWebGPUPolyDataMapper methods
|
|
31
9
|
// ----------------------------------------------------------------------------
|
|
32
10
|
|
|
33
|
-
|
|
34
11
|
function vtkWebGPUPolyDataMapper(publicAPI, model) {
|
|
35
12
|
// Set our className
|
|
36
13
|
model.classHierarchy.push('vtkWebGPUPolyDataMapper');
|
|
37
14
|
|
|
38
|
-
publicAPI.
|
|
39
|
-
|
|
40
|
-
model.WebGPUActor = publicAPI.getFirstAncestorOfType('vtkWebGPUActor');
|
|
41
|
-
model.WebGPURenderer = model.WebGPUActor.getFirstAncestorOfType('vtkWebGPURenderer');
|
|
42
|
-
model.WebGPURenderWindow = model.WebGPURenderer.getParent();
|
|
43
|
-
model.device = model.WebGPURenderWindow.getDevice();
|
|
44
|
-
}
|
|
45
|
-
}; // Renders myself
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
publicAPI.translucentPass = function (prepass) {
|
|
49
|
-
if (prepass) {
|
|
50
|
-
publicAPI.render();
|
|
51
|
-
}
|
|
15
|
+
publicAPI.createCellArrayMapper = function () {
|
|
16
|
+
return vtkWebGPUCellArrayMapper.newInstance();
|
|
52
17
|
};
|
|
53
18
|
|
|
54
|
-
publicAPI.
|
|
19
|
+
publicAPI.buildPass = function (prepass) {
|
|
55
20
|
if (prepass) {
|
|
56
|
-
publicAPI.
|
|
57
|
-
}
|
|
58
|
-
};
|
|
59
|
-
|
|
60
|
-
publicAPI.updateUBO = function () {
|
|
61
|
-
// make sure the data is up to date
|
|
62
|
-
var actor = model.WebGPUActor.getRenderable();
|
|
63
|
-
var ppty = actor.getProperty();
|
|
64
|
-
var utime = model.UBO.getSendTime();
|
|
65
|
-
|
|
66
|
-
if (publicAPI.getMTime() > utime || ppty.getMTime() > utime || model.renderable.getMTime() > utime) {
|
|
67
|
-
var keyMats = model.WebGPUActor.getKeyMatrices(model.WebGPURenderer);
|
|
68
|
-
model.UBO.setArray('BCWCMatrix', keyMats.bcwc);
|
|
69
|
-
model.UBO.setArray('BCSCMatrix', keyMats.bcsc);
|
|
70
|
-
model.UBO.setArray('MCWCNormals', keyMats.normalMatrix);
|
|
71
|
-
var aColor = ppty.getAmbientColorByReference();
|
|
72
|
-
model.UBO.setValue('AmbientIntensity', ppty.getAmbient());
|
|
73
|
-
model.UBO.setArray('AmbientColor', [aColor[0], aColor[1], aColor[2], 1.0]);
|
|
74
|
-
model.UBO.setValue('DiffuseIntensity', ppty.getDiffuse());
|
|
75
|
-
aColor = ppty.getDiffuseColorByReference();
|
|
76
|
-
model.UBO.setArray('DiffuseColor', [aColor[0], aColor[1], aColor[2], 1.0]);
|
|
77
|
-
model.UBO.setValue('SpecularIntensity', ppty.getSpecular());
|
|
78
|
-
model.UBO.setValue('SpecularPower', ppty.getSpecularPower());
|
|
79
|
-
aColor = ppty.getSpecularColorByReference();
|
|
80
|
-
model.UBO.setArray('SpecularColor', [aColor[0], aColor[1], aColor[2], 1.0]);
|
|
81
|
-
aColor = ppty.getEdgeColorByReference();
|
|
82
|
-
model.UBO.setArray('EdgeColor', [aColor[0], aColor[1], aColor[2], 1.0]);
|
|
83
|
-
model.UBO.setValue('Opacity', ppty.getOpacity());
|
|
84
|
-
model.UBO.setValue('PropID', model.WebGPUActor.getPropID());
|
|
85
|
-
var device = model.WebGPURenderWindow.getDevice();
|
|
86
|
-
model.UBO.sendIfNeeded(device);
|
|
87
|
-
}
|
|
88
|
-
};
|
|
89
|
-
|
|
90
|
-
publicAPI.render = function () {
|
|
91
|
-
publicAPI.invokeEvent(StartEvent);
|
|
92
|
-
|
|
93
|
-
if (!model.renderable.getStatic()) {
|
|
94
|
-
model.renderable.update();
|
|
95
|
-
}
|
|
96
|
-
|
|
97
|
-
model.currentInput = model.renderable.getInputData();
|
|
98
|
-
publicAPI.invokeEvent(EndEvent);
|
|
99
|
-
model.renderEncoder = model.WebGPURenderer.getRenderEncoder();
|
|
100
|
-
publicAPI.buildPrimitives(); // update descriptor sets
|
|
101
|
-
|
|
102
|
-
publicAPI.updateUBO();
|
|
103
|
-
};
|
|
104
|
-
|
|
105
|
-
publicAPI.replaceShaderPosition = function (hash, pipeline, vertexInput) {
|
|
106
|
-
var vDesc = pipeline.getShaderDescription('vertex');
|
|
107
|
-
vDesc.addBuiltinOutput('vec4<f32>', '@builtin(position) Position');
|
|
108
|
-
var code = vDesc.getCode();
|
|
109
|
-
|
|
110
|
-
if (isEdges(hash)) {
|
|
111
|
-
vDesc.addBuiltinInput('u32', '@builtin(instance_index) instanceIndex'); // widen the edge
|
|
112
|
-
|
|
113
|
-
code = vtkWebGPUShaderCache.substitute(code, '//VTK::Position::Impl', [' var tmpPos: vec4<f32> = rendererUBO.SCPCMatrix*mapperUBO.BCSCMatrix*vertexBC;', ' var tmpPos2: vec3<f32> = tmpPos.xyz / tmpPos.w;', ' tmpPos2.x = tmpPos2.x + 1.4*(f32(input.instanceIndex % 2u) - 0.5)/rendererUBO.viewportSize.x;', ' tmpPos2.y = tmpPos2.y + 1.4*(f32(input.instanceIndex / 2u) - 0.5)/rendererUBO.viewportSize.y;', ' tmpPos2.z = tmpPos2.z + 0.00001;', // could become a setting
|
|
114
|
-
' output.Position = vec4<f32>(tmpPos2.xyz * tmpPos.w, tmpPos.w);']).result;
|
|
115
|
-
} else {
|
|
116
|
-
code = vtkWebGPUShaderCache.substitute(code, '//VTK::Position::Impl', [' output.Position = rendererUBO.SCPCMatrix*mapperUBO.BCSCMatrix*vertexBC;']).result;
|
|
117
|
-
}
|
|
118
|
-
|
|
119
|
-
vDesc.setCode(code);
|
|
120
|
-
};
|
|
121
|
-
|
|
122
|
-
publicAPI.replaceShaderNormal = function (hash, pipeline, vertexInput) {
|
|
123
|
-
if (vertexInput.hasAttribute('normalMC')) {
|
|
124
|
-
var vDesc = pipeline.getShaderDescription('vertex');
|
|
125
|
-
vDesc.addOutput('vec3<f32>', 'normalVC');
|
|
126
|
-
var code = vDesc.getCode();
|
|
127
|
-
code = vtkWebGPUShaderCache.substitute(code, '//VTK::Normal::Impl', [' output.normalVC = normalize((rendererUBO.WCVCNormals * mapperUBO.MCWCNormals * normalMC).xyz);']).result;
|
|
128
|
-
vDesc.setCode(code);
|
|
129
|
-
var fDesc = pipeline.getShaderDescription('fragment');
|
|
130
|
-
code = fDesc.getCode();
|
|
131
|
-
code = vtkWebGPUShaderCache.substitute(code, '//VTK::Normal::Impl', [' var normal: vec3<f32> = input.normalVC;', ' if (!input.frontFacing) { normal = -normal; }']).result;
|
|
132
|
-
fDesc.setCode(code);
|
|
133
|
-
}
|
|
134
|
-
}; // we only apply lighting when there is a "var normal" declaration in the
|
|
135
|
-
// fragment shader code. That is the lighting trigger.
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
publicAPI.replaceShaderLight = function (hash, pipeline, vertexInput) {
|
|
139
|
-
var fDesc = pipeline.getShaderDescription('fragment');
|
|
140
|
-
var code = fDesc.getCode();
|
|
141
|
-
|
|
142
|
-
if (code.includes('var normal')) {
|
|
143
|
-
code = vtkWebGPUShaderCache.substitute(code, '//VTK::Light::Impl', [' var df: f32 = max(0.0, normal.z);', ' var sf: f32 = pow(df, mapperUBO.SpecularPower);', ' var diffuse: vec3<f32> = df * diffuseColor.rgb;', ' var specular: vec3<f32> = sf * mapperUBO.SpecularColor.rgb * mapperUBO.SpecularColor.a;']).result;
|
|
144
|
-
fDesc.setCode(code);
|
|
145
|
-
} else {
|
|
146
|
-
code = vtkWebGPUShaderCache.substitute(code, '//VTK::Light::Impl', [' var diffuse: vec3<f32> = diffuseColor.rgb;', ' var specular: vec3<f32> = mapperUBO.SpecularColor.rgb * mapperUBO.SpecularColor.a;']).result;
|
|
147
|
-
fDesc.setCode(code);
|
|
148
|
-
}
|
|
149
|
-
};
|
|
150
|
-
|
|
151
|
-
publicAPI.replaceShaderColor = function (hash, pipeline, vertexInput) {
|
|
152
|
-
if (isEdges(hash)) {
|
|
153
|
-
var _fDesc = pipeline.getShaderDescription('fragment');
|
|
154
|
-
|
|
155
|
-
var _code = _fDesc.getCode();
|
|
156
|
-
|
|
157
|
-
_code = vtkWebGPUShaderCache.substitute(_code, '//VTK::Color::Impl', ['ambientColor = mapperUBO.EdgeColor;', 'diffuseColor = mapperUBO.EdgeColor;']).result;
|
|
158
|
-
|
|
159
|
-
_fDesc.setCode(_code);
|
|
160
|
-
|
|
161
|
-
return;
|
|
162
|
-
}
|
|
163
|
-
|
|
164
|
-
if (!vertexInput.hasAttribute('colorVI')) return;
|
|
165
|
-
var vDesc = pipeline.getShaderDescription('vertex');
|
|
166
|
-
vDesc.addOutput('vec4<f32>', 'color');
|
|
167
|
-
var code = vDesc.getCode();
|
|
168
|
-
code = vtkWebGPUShaderCache.substitute(code, '//VTK::Color::Impl', [' output.color = colorVI;']).result;
|
|
169
|
-
vDesc.setCode(code);
|
|
170
|
-
var fDesc = pipeline.getShaderDescription('fragment');
|
|
171
|
-
code = fDesc.getCode();
|
|
172
|
-
code = vtkWebGPUShaderCache.substitute(code, '//VTK::Color::Impl', ['ambientColor = input.color;', 'diffuseColor = input.color;', 'opacity = mapperUBO.Opacity * input.color.a;']).result;
|
|
173
|
-
fDesc.setCode(code);
|
|
174
|
-
};
|
|
175
|
-
|
|
176
|
-
publicAPI.replaceShaderTCoord = function (hash, pipeline, vertexInput) {
|
|
177
|
-
if (!vertexInput.hasAttribute('tcoord')) return;
|
|
178
|
-
var vDesc = pipeline.getShaderDescription('vertex');
|
|
179
|
-
vDesc.addOutput('vec2<f32>', 'tcoordVS');
|
|
180
|
-
var code = vDesc.getCode();
|
|
181
|
-
code = vtkWebGPUShaderCache.substitute(code, '//VTK::TCoord::Impl', [' output.tcoordVS = tcoord;']).result;
|
|
182
|
-
vDesc.setCode(code);
|
|
183
|
-
var fDesc = pipeline.getShaderDescription('fragment');
|
|
184
|
-
code = fDesc.getCode(); // todo handle multiple textures? Blend multiply ?
|
|
185
|
-
|
|
186
|
-
if (model.textures.length) {
|
|
187
|
-
code = vtkWebGPUShaderCache.substitute(code, '//VTK::TCoord::Impl', ['var tcolor: vec4<f32> = textureSample(Texture0, Texture0Sampler, input.tcoordVS);', 'computedColor = computedColor*tcolor;']).result;
|
|
188
|
-
}
|
|
189
|
-
|
|
190
|
-
fDesc.setCode(code);
|
|
191
|
-
};
|
|
192
|
-
|
|
193
|
-
publicAPI.replaceShaderSelect = function (hash, pipeline, vertexInput) {
|
|
194
|
-
if (hash.includes('sel')) {
|
|
195
|
-
var fDesc = pipeline.getShaderDescription('fragment');
|
|
196
|
-
var code = fDesc.getCode(); // by default there are no composites, so just 0
|
|
197
|
-
|
|
198
|
-
code = vtkWebGPUShaderCache.substitute(code, '//VTK::Select::Impl', [' var compositeID: u32 = 0u;']).result;
|
|
199
|
-
fDesc.setCode(code);
|
|
200
|
-
}
|
|
201
|
-
};
|
|
202
|
-
|
|
203
|
-
publicAPI.getUsage = function (rep, i) {
|
|
204
|
-
if (rep === Representation.POINTS || i === PrimitiveTypes.Points) {
|
|
205
|
-
return BufferUsage.Verts;
|
|
206
|
-
}
|
|
207
|
-
|
|
208
|
-
if (i === PrimitiveTypes.Lines) {
|
|
209
|
-
return BufferUsage.Lines;
|
|
210
|
-
}
|
|
21
|
+
model.WebGPUActor = publicAPI.getFirstAncestorOfType('vtkWebGPUActor');
|
|
211
22
|
|
|
212
|
-
|
|
213
|
-
|
|
214
|
-
return BufferUsage.LinesFromTriangles;
|
|
23
|
+
if (!model.renderable.getStatic()) {
|
|
24
|
+
model.renderable.update();
|
|
215
25
|
}
|
|
216
26
|
|
|
217
|
-
|
|
218
|
-
|
|
219
|
-
|
|
220
|
-
if (i === PrimitiveTypes.Triangles) {
|
|
221
|
-
return BufferUsage.Triangles;
|
|
222
|
-
}
|
|
223
|
-
|
|
224
|
-
if (i === PrimitiveTypes.TriangleStrips) {
|
|
225
|
-
return BufferUsage.Strips;
|
|
226
|
-
}
|
|
227
|
-
|
|
228
|
-
if (i === PrimitiveTypes.TriangleEdges) {
|
|
229
|
-
return BufferUsage.LinesFromTriangles;
|
|
230
|
-
} // only strip edges left which are lines
|
|
231
|
-
|
|
232
|
-
|
|
233
|
-
return BufferUsage.LinesFromStrips;
|
|
234
|
-
};
|
|
235
|
-
|
|
236
|
-
publicAPI.getHashFromUsage = function (usage) {
|
|
237
|
-
return "pt".concat(usage);
|
|
238
|
-
};
|
|
239
|
-
|
|
240
|
-
publicAPI.getTopologyFromUsage = function (usage) {
|
|
241
|
-
switch (usage) {
|
|
242
|
-
case BufferUsage.Triangles:
|
|
243
|
-
return 'triangle-list';
|
|
244
|
-
|
|
245
|
-
case BufferUsage.Verts:
|
|
246
|
-
return 'point-list';
|
|
247
|
-
|
|
248
|
-
case BufferUsage.Lines:
|
|
249
|
-
default:
|
|
250
|
-
return 'line-list';
|
|
27
|
+
var poly = model.renderable.getInputData();
|
|
28
|
+
model.renderable.mapScalars(poly, 1.0);
|
|
29
|
+
publicAPI.updateCellArrayMappers(poly);
|
|
251
30
|
}
|
|
252
31
|
};
|
|
253
32
|
|
|
254
|
-
publicAPI.
|
|
255
|
-
var
|
|
256
|
-
|
|
257
|
-
var device = model.WebGPURenderWindow.getDevice();
|
|
258
|
-
var edges = false;
|
|
259
|
-
|
|
260
|
-
if (primType === PrimitiveTypes.TriangleEdges) {
|
|
261
|
-
edges = true;
|
|
262
|
-
representation = Representation.WIREFRAME;
|
|
263
|
-
}
|
|
33
|
+
publicAPI.updateCellArrayMappers = function (poly) {
|
|
34
|
+
var prims = [poly.getVerts(), poly.getLines(), poly.getPolys(), poly.getStrips()]; // we instantiate a cell array mapper for each cellArray that has cells
|
|
35
|
+
// and they handle the rendering of that cell array
|
|
264
36
|
|
|
265
|
-
var
|
|
266
|
-
var
|
|
267
|
-
// since mtimes are unique we can use
|
|
268
|
-
// - cells mtime - because cells drive how we pack
|
|
269
|
-
// - rep (point/wireframe/surface) - again because of packing
|
|
270
|
-
// - relevant dataArray mtime - the source data
|
|
271
|
-
// - shift - not currently captured
|
|
272
|
-
// - scale - not currently captured
|
|
273
|
-
// - format
|
|
274
|
-
// - usage
|
|
275
|
-
// - packExtra - covered by format
|
|
276
|
-
// - prim type (vert/lines/polys/strips) - covered by cells mtime
|
|
277
|
-
// points
|
|
37
|
+
var cellMappers = [];
|
|
38
|
+
var cellOffset = 0;
|
|
278
39
|
|
|
279
|
-
var
|
|
280
|
-
|
|
281
|
-
|
|
282
|
-
|
|
283
|
-
var buffRequest = {
|
|
284
|
-
owner: points,
|
|
285
|
-
usage: BufferUsage.PointArray,
|
|
286
|
-
format: 'float32x4',
|
|
287
|
-
time: Math.max(points.getMTime(), cells.getMTime(), model.WebGPUActor.getKeyMatricesTime().getMTime()),
|
|
288
|
-
hash: hash,
|
|
289
|
-
dataArray: points,
|
|
290
|
-
cells: cells,
|
|
291
|
-
primitiveType: primType,
|
|
292
|
-
representation: representation,
|
|
293
|
-
shift: shift,
|
|
294
|
-
packExtra: true
|
|
295
|
-
};
|
|
296
|
-
var buff = device.getBufferManager().getBuffer(buffRequest);
|
|
297
|
-
vertexInput.addBuffer(buff, ['vertexBC']);
|
|
298
|
-
} else {
|
|
299
|
-
vertexInput.removeBufferIfPresent('vertexBC');
|
|
300
|
-
} // normals, only used for surface rendering
|
|
301
|
-
|
|
302
|
-
|
|
303
|
-
var usage = publicAPI.getUsage(representation, primType);
|
|
304
|
-
|
|
305
|
-
if (usage === BufferUsage.Triangles || usage === BufferUsage.Strips) {
|
|
306
|
-
var normals = pd.getPointData().getNormals();
|
|
307
|
-
var _buffRequest = {
|
|
308
|
-
format: 'snorm8x4',
|
|
309
|
-
hash: hash,
|
|
310
|
-
cells: cells,
|
|
311
|
-
representation: representation,
|
|
312
|
-
primitiveType: primType,
|
|
313
|
-
packExtra: true,
|
|
314
|
-
shift: 0,
|
|
315
|
-
scale: 127
|
|
316
|
-
};
|
|
317
|
-
|
|
318
|
-
if (normals) {
|
|
319
|
-
_buffRequest.owner = normals;
|
|
320
|
-
_buffRequest.dataArray = normals;
|
|
321
|
-
_buffRequest.time = Math.max(normals.getMTime(), cells.getMTime());
|
|
322
|
-
_buffRequest.usage = BufferUsage.PointArray;
|
|
323
|
-
|
|
324
|
-
var _buff = device.getBufferManager().getBuffer(_buffRequest);
|
|
325
|
-
|
|
326
|
-
vertexInput.addBuffer(_buff, ['normalMC']);
|
|
327
|
-
} else if (primType === PrimitiveTypes.Triangles) {
|
|
328
|
-
_buffRequest.owner = points;
|
|
329
|
-
_buffRequest.dataArray = points;
|
|
330
|
-
_buffRequest.time = Math.max(points.getMTime(), cells.getMTime());
|
|
331
|
-
_buffRequest.usage = BufferUsage.NormalsFromPoints;
|
|
332
|
-
|
|
333
|
-
var _buff2 = device.getBufferManager().getBuffer(_buffRequest);
|
|
334
|
-
|
|
335
|
-
vertexInput.addBuffer(_buff2, ['normalMC']);
|
|
336
|
-
} else {
|
|
337
|
-
vertexInput.removeBufferIfPresent('normalMC');
|
|
338
|
-
}
|
|
339
|
-
} else {
|
|
340
|
-
vertexInput.removeBufferIfPresent('normalMC');
|
|
341
|
-
} // deal with colors but only if modified
|
|
342
|
-
|
|
343
|
-
|
|
344
|
-
var haveColors = false;
|
|
345
|
-
|
|
346
|
-
if (model.renderable.getScalarVisibility()) {
|
|
347
|
-
var c = model.renderable.getColorMapColors();
|
|
348
|
-
|
|
349
|
-
if (c && !edges) {
|
|
350
|
-
var scalarMode = model.renderable.getScalarMode();
|
|
351
|
-
var haveCellScalars = false; // We must figure out how the scalars should be mapped to the polydata.
|
|
352
|
-
|
|
353
|
-
if ((scalarMode === ScalarMode.USE_CELL_DATA || scalarMode === ScalarMode.USE_CELL_FIELD_DATA || scalarMode === ScalarMode.USE_FIELD_DATA || !pd.getPointData().getScalars()) && scalarMode !== ScalarMode.USE_POINT_FIELD_DATA && c) {
|
|
354
|
-
haveCellScalars = true;
|
|
40
|
+
for (var i = PrimitiveTypes.Points; i <= PrimitiveTypes.Triangles; i++) {
|
|
41
|
+
if (prims[i].getNumberOfValues() > 0) {
|
|
42
|
+
if (!model.primitives[i]) {
|
|
43
|
+
model.primitives[i] = publicAPI.createCellArrayMapper();
|
|
355
44
|
}
|
|
356
45
|
|
|
357
|
-
var
|
|
358
|
-
|
|
359
|
-
|
|
360
|
-
|
|
361
|
-
|
|
362
|
-
|
|
363
|
-
|
|
364
|
-
|
|
365
|
-
|
|
366
|
-
|
|
367
|
-
cellData: haveCellScalars,
|
|
368
|
-
cellOffset: 0
|
|
369
|
-
};
|
|
370
|
-
|
|
371
|
-
var _buff3 = device.getBufferManager().getBuffer(_buffRequest2);
|
|
372
|
-
|
|
373
|
-
vertexInput.addBuffer(_buff3, ['colorVI']);
|
|
374
|
-
haveColors = true;
|
|
375
|
-
}
|
|
376
|
-
}
|
|
377
|
-
|
|
378
|
-
if (!haveColors) {
|
|
379
|
-
vertexInput.removeBufferIfPresent('colorVI');
|
|
380
|
-
}
|
|
381
|
-
|
|
382
|
-
var tcoords = null;
|
|
383
|
-
|
|
384
|
-
if (model.renderable.getInterpolateScalarsBeforeMapping() && model.renderable.getColorCoordinates()) {
|
|
385
|
-
tcoords = model.renderable.getColorCoordinates();
|
|
386
|
-
} else {
|
|
387
|
-
tcoords = pd.getPointData().getTCoords();
|
|
388
|
-
}
|
|
389
|
-
|
|
390
|
-
if (tcoords && !edges) {
|
|
391
|
-
var _buffRequest3 = {
|
|
392
|
-
owner: tcoords,
|
|
393
|
-
usage: BufferUsage.PointArray,
|
|
394
|
-
format: 'float32x2',
|
|
395
|
-
time: Math.max(tcoords.getMTime(), cells.getMTime()),
|
|
396
|
-
hash: hash,
|
|
397
|
-
dataArray: tcoords,
|
|
398
|
-
cells: cells,
|
|
399
|
-
primitiveType: primType,
|
|
400
|
-
representation: representation
|
|
401
|
-
};
|
|
402
|
-
|
|
403
|
-
var _buff4 = device.getBufferManager().getBuffer(_buffRequest3);
|
|
404
|
-
|
|
405
|
-
vertexInput.addBuffer(_buff4, ['tcoord']);
|
|
406
|
-
} else {
|
|
407
|
-
vertexInput.removeBufferIfPresent('tcoord');
|
|
408
|
-
}
|
|
409
|
-
};
|
|
410
|
-
|
|
411
|
-
publicAPI.updateTextures = function () {
|
|
412
|
-
// we keep track of new and used textures so
|
|
413
|
-
// that we can clean up any unused textures so we don't hold onto them
|
|
414
|
-
var usedTextures = [];
|
|
415
|
-
var newTextures = []; // do we have a scalar color texture
|
|
416
|
-
|
|
417
|
-
var idata = model.renderable.getColorTextureMap(); // returns an imagedata
|
|
418
|
-
|
|
419
|
-
if (idata) {
|
|
420
|
-
if (!model.colorTexture) {
|
|
421
|
-
model.colorTexture = vtkTexture.newInstance({
|
|
422
|
-
label: 'polyDataColor'
|
|
423
|
-
});
|
|
424
|
-
}
|
|
425
|
-
|
|
426
|
-
model.colorTexture.setInputData(idata);
|
|
427
|
-
newTextures.push(model.colorTexture);
|
|
428
|
-
} // actor textures?
|
|
429
|
-
|
|
430
|
-
|
|
431
|
-
var actor = model.WebGPUActor.getRenderable();
|
|
432
|
-
var textures = actor.getTextures();
|
|
433
|
-
|
|
434
|
-
for (var i = 0; i < textures.length; i++) {
|
|
435
|
-
if (textures[i].getInputData() || textures[i].getJsImageData() || textures[i].getCanvas()) {
|
|
436
|
-
newTextures.push(textures[i]);
|
|
437
|
-
}
|
|
438
|
-
|
|
439
|
-
if (textures[i].getImage() && textures[i].getImageLoaded()) {
|
|
440
|
-
newTextures.push(textures[i]);
|
|
46
|
+
var cellMapper = model.primitives[i];
|
|
47
|
+
cellMapper.setCellArray(prims[i]);
|
|
48
|
+
cellMapper.setCurrentInput(poly);
|
|
49
|
+
cellMapper.setCellOffset(cellOffset);
|
|
50
|
+
cellMapper.setPrimitiveType(i);
|
|
51
|
+
cellMapper.setRenderable(model.renderable);
|
|
52
|
+
cellOffset += prims[i].getNumberOfCells();
|
|
53
|
+
cellMappers.push(cellMapper);
|
|
54
|
+
} else {
|
|
55
|
+
model.primitives[i] = null;
|
|
441
56
|
}
|
|
442
57
|
}
|
|
443
58
|
|
|
444
|
-
|
|
445
|
-
|
|
446
|
-
|
|
447
|
-
|
|
448
|
-
|
|
449
|
-
time: srcTexture.getMTime()
|
|
450
|
-
};
|
|
451
|
-
|
|
452
|
-
if (srcTexture.getInputData()) {
|
|
453
|
-
treq.imageData = srcTexture.getInputData();
|
|
454
|
-
treq.owner = treq.imageData.getPointData().getScalars();
|
|
455
|
-
} else if (srcTexture.getImage()) {
|
|
456
|
-
treq.image = srcTexture.getImage();
|
|
457
|
-
treq.owner = treq.image;
|
|
458
|
-
} else if (srcTexture.getJsImageData()) {
|
|
459
|
-
treq.jsImageData = srcTexture.getJsImageData();
|
|
460
|
-
treq.owner = treq.jsImageData;
|
|
461
|
-
} else if (srcTexture.getCanvas()) {
|
|
462
|
-
treq.canvas = srcTexture.getCanvas();
|
|
463
|
-
treq.owner = treq.canvas;
|
|
464
|
-
}
|
|
465
|
-
|
|
466
|
-
var newTex = model.device.getTextureManager().getTexture(treq);
|
|
467
|
-
|
|
468
|
-
if (newTex.getReady()) {
|
|
469
|
-
// is this a new texture
|
|
470
|
-
var found = false;
|
|
471
|
-
|
|
472
|
-
for (var t = 0; t < model.textures.length; t++) {
|
|
473
|
-
if (model.textures[t] === newTex) {
|
|
474
|
-
usedCount++;
|
|
475
|
-
found = true;
|
|
476
|
-
usedTextures[t] = true;
|
|
59
|
+
if (model.WebGPUActor.getRenderable().getProperty().getEdgeVisibility()) {
|
|
60
|
+
for (var _i = PrimitiveTypes.TriangleEdges; _i <= PrimitiveTypes.TriangleStripEdges; _i++) {
|
|
61
|
+
if (prims[_i - 2].getNumberOfValues() > 0) {
|
|
62
|
+
if (!model.primitives[_i]) {
|
|
63
|
+
model.primitives[_i] = publicAPI.createCellArrayMapper();
|
|
477
64
|
}
|
|
478
|
-
}
|
|
479
|
-
|
|
480
|
-
if (!found) {
|
|
481
|
-
usedTextures[model.textures.length] = true;
|
|
482
|
-
var tview = newTex.createView("Texture".concat(usedCount++));
|
|
483
|
-
model.textures.push(newTex);
|
|
484
|
-
model.textureViews.push(tview);
|
|
485
|
-
var interpolate = srcTexture.getInterpolate() ? 'linear' : 'nearest';
|
|
486
|
-
tview.addSampler(model.device, {
|
|
487
|
-
minFilter: interpolate,
|
|
488
|
-
magFilter: interpolate
|
|
489
|
-
});
|
|
490
|
-
}
|
|
491
|
-
}
|
|
492
|
-
} // remove unused textures
|
|
493
|
-
|
|
494
|
-
|
|
495
|
-
for (var _i2 = model.textures.length - 1; _i2 >= 0; _i2--) {
|
|
496
|
-
if (!usedTextures[_i2]) {
|
|
497
|
-
model.textures.splice(_i2, 1);
|
|
498
|
-
model.textureViews.splice(_i2, 1);
|
|
499
|
-
}
|
|
500
|
-
}
|
|
501
|
-
}; // compute a unique hash for a pipeline, this needs to be unique enough to
|
|
502
|
-
// capture any pipeline code changes (which includes shader changes)
|
|
503
|
-
// or vertex input changes/ bind groups/ etc
|
|
504
|
-
|
|
505
|
-
|
|
506
|
-
publicAPI.computePipelineHash = function (vertexInput, usage, edges) {
|
|
507
|
-
var pipelineHash = 'pd';
|
|
508
|
-
|
|
509
|
-
if (edges) {
|
|
510
|
-
pipelineHash += 'edge';
|
|
511
|
-
} else {
|
|
512
|
-
if (vertexInput.hasAttribute("normalMC")) {
|
|
513
|
-
pipelineHash += "n";
|
|
514
|
-
}
|
|
515
|
-
|
|
516
|
-
if (vertexInput.hasAttribute("colorVI")) {
|
|
517
|
-
pipelineHash += "c";
|
|
518
|
-
}
|
|
519
|
-
|
|
520
|
-
if (vertexInput.hasAttribute("tcoord")) {
|
|
521
|
-
pipelineHash += "t";
|
|
522
|
-
}
|
|
523
|
-
|
|
524
|
-
if (model.textures.length) {
|
|
525
|
-
pipelineHash += "tx".concat(model.textures.length);
|
|
526
|
-
}
|
|
527
|
-
}
|
|
528
|
-
|
|
529
|
-
if (model.SSBO) {
|
|
530
|
-
pipelineHash += "ssbo";
|
|
531
|
-
}
|
|
532
|
-
|
|
533
|
-
var uhash = publicAPI.getHashFromUsage(usage);
|
|
534
|
-
pipelineHash += uhash;
|
|
535
|
-
pipelineHash += model.renderEncoder.getPipelineHash();
|
|
536
|
-
return pipelineHash;
|
|
537
|
-
}; // was originally buildIBOs() but not using IBOs right now
|
|
538
|
-
|
|
539
|
-
|
|
540
|
-
publicAPI.buildPrimitives = function () {
|
|
541
|
-
var poly = model.currentInput;
|
|
542
|
-
var prims = [poly.getVerts(), poly.getLines(), poly.getPolys(), poly.getStrips()];
|
|
543
|
-
var device = model.WebGPURenderWindow.getDevice();
|
|
544
|
-
model.renderable.mapScalars(poly, 1.0); // handle textures
|
|
545
65
|
|
|
546
|
-
|
|
547
|
-
var actor = model.WebGPUActor.getRenderable();
|
|
548
|
-
var rep = actor.getProperty().getRepresentation();
|
|
549
|
-
var edgeVisibility = actor.getProperty().getEdgeVisibility(); // handle per primitive type
|
|
66
|
+
var _cellMapper = model.primitives[_i];
|
|
550
67
|
|
|
551
|
-
|
|
552
|
-
if (prims[i].getNumberOfValues() > 0) {
|
|
553
|
-
{
|
|
554
|
-
var usage = publicAPI.getUsage(rep, i);
|
|
555
|
-
var primHelper = model.primitives[i];
|
|
556
|
-
publicAPI.buildVertexInput(model.currentInput, prims[i], i);
|
|
557
|
-
primHelper.setPipelineHash(publicAPI.computePipelineHash(primHelper.getVertexInput(), usage, false));
|
|
558
|
-
primHelper.setTextureViews(model.textureViews);
|
|
559
|
-
primHelper.setWebGPURenderer(model.WebGPURenderer);
|
|
560
|
-
primHelper.setNumberOfInstances(1);
|
|
561
|
-
var vbo = primHelper.getVertexInput().getBuffer('vertexBC');
|
|
562
|
-
primHelper.setNumberOfVertices(vbo.getSizeInBytes() / vbo.getStrideInBytes());
|
|
563
|
-
primHelper.setTopology(publicAPI.getTopologyFromUsage(usage));
|
|
564
|
-
primHelper.build(model.renderEncoder, device);
|
|
565
|
-
primHelper.registerToDraw();
|
|
566
|
-
} // also handle edge visibility if turned on
|
|
567
|
-
|
|
568
|
-
if (edgeVisibility && rep === Representation.SURFACE && i === PrimitiveTypes.Triangles) {
|
|
569
|
-
var _primHelper = model.primitives[PrimitiveTypes.TriangleEdges];
|
|
570
|
-
|
|
571
|
-
var _usage = publicAPI.getUsage(rep, PrimitiveTypes.TriangleEdges);
|
|
572
|
-
|
|
573
|
-
publicAPI.buildVertexInput(model.currentInput, prims[PrimitiveTypes.Triangles], PrimitiveTypes.TriangleEdges);
|
|
574
|
-
|
|
575
|
-
_primHelper.setPipelineHash(publicAPI.computePipelineHash(_primHelper.getVertexInput(), _usage, true));
|
|
68
|
+
_cellMapper.setCellArray(prims[_i - 2]);
|
|
576
69
|
|
|
577
|
-
|
|
70
|
+
_cellMapper.setCurrentInput(poly);
|
|
578
71
|
|
|
579
|
-
|
|
72
|
+
_cellMapper.setCellOffset(model.primitives[_i - 2].getCellOffset());
|
|
580
73
|
|
|
581
|
-
|
|
74
|
+
_cellMapper.setPrimitiveType(_i);
|
|
582
75
|
|
|
583
|
-
|
|
76
|
+
_cellMapper.setRenderable(model.renderable);
|
|
584
77
|
|
|
585
|
-
|
|
586
|
-
|
|
587
|
-
|
|
588
|
-
|
|
589
|
-
_primHelper.registerToDraw();
|
|
78
|
+
cellMappers.push(_cellMapper);
|
|
79
|
+
} else {
|
|
80
|
+
model.primitives[_i] = null;
|
|
590
81
|
}
|
|
591
82
|
}
|
|
592
83
|
}
|
|
593
|
-
};
|
|
594
84
|
|
|
595
|
-
|
|
596
|
-
|
|
597
|
-
|
|
598
|
-
sr.set(name, func);
|
|
599
|
-
}
|
|
600
|
-
};
|
|
601
|
-
|
|
602
|
-
publicAPI.setFragmentShaderTemplate = function (val) {
|
|
603
|
-
model.fragmentShaderTemplate = val;
|
|
604
|
-
|
|
605
|
-
for (var i = PrimitiveTypes.Start; i < PrimitiveTypes.End; i++) {
|
|
606
|
-
model.primitives[i].setFragmentShaderTemplate(val);
|
|
607
|
-
}
|
|
608
|
-
};
|
|
609
|
-
|
|
610
|
-
publicAPI.setVertexShaderTemplate = function (val) {
|
|
611
|
-
model.fragmentShaderTemplate = val;
|
|
612
|
-
|
|
613
|
-
for (var i = PrimitiveTypes.Start; i < PrimitiveTypes.End; i++) {
|
|
614
|
-
model.primitives[i].setVertexShaderTemplate(val);
|
|
615
|
-
}
|
|
85
|
+
publicAPI.prepareNodes();
|
|
86
|
+
publicAPI.addMissingChildren(cellMappers);
|
|
87
|
+
publicAPI.removeUnusedNodes();
|
|
616
88
|
};
|
|
617
89
|
} // ----------------------------------------------------------------------------
|
|
618
90
|
// Object factory
|
|
@@ -620,14 +92,7 @@ function vtkWebGPUPolyDataMapper(publicAPI, model) {
|
|
|
620
92
|
|
|
621
93
|
|
|
622
94
|
var DEFAULT_VALUES = {
|
|
623
|
-
|
|
624
|
-
renderEncoder: null,
|
|
625
|
-
textures: null,
|
|
626
|
-
textureViews: null,
|
|
627
|
-
primitives: null,
|
|
628
|
-
tmpMat4: null,
|
|
629
|
-
fragmentShaderTemplate: null,
|
|
630
|
-
vertexShaderTemplate: null
|
|
95
|
+
primitives: null
|
|
631
96
|
}; // ----------------------------------------------------------------------------
|
|
632
97
|
|
|
633
98
|
function extend(publicAPI, model) {
|
|
@@ -635,48 +100,9 @@ function extend(publicAPI, model) {
|
|
|
635
100
|
Object.assign(model, DEFAULT_VALUES, initialValues); // Inheritance
|
|
636
101
|
|
|
637
102
|
vtkViewNode.extend(publicAPI, model, initialValues);
|
|
638
|
-
model.tmpMat3 = mat3.identity(new Float64Array(9));
|
|
639
|
-
model.tmpMat4 = mat4.identity(new Float64Array(16));
|
|
640
|
-
model.fragmentShaderTemplate = model.fragmentShaderTemplate || vtkWebGPUPolyDataFS;
|
|
641
|
-
model.vertexShaderTemplate = model.vertexShaderTemplate || vtkWebGPUPolyDataVS;
|
|
642
|
-
model.UBO = vtkWebGPUUniformBuffer.newInstance({
|
|
643
|
-
label: 'mapperUBO'
|
|
644
|
-
});
|
|
645
|
-
model.UBO.addEntry('BCWCMatrix', 'mat4x4<f32>');
|
|
646
|
-
model.UBO.addEntry('BCSCMatrix', 'mat4x4<f32>');
|
|
647
|
-
model.UBO.addEntry('MCWCNormals', 'mat4x4<f32>');
|
|
648
|
-
model.UBO.addEntry('AmbientColor', 'vec4<f32>');
|
|
649
|
-
model.UBO.addEntry('DiffuseColor', 'vec4<f32>');
|
|
650
|
-
model.UBO.addEntry('EdgeColor', 'vec4<f32>');
|
|
651
|
-
model.UBO.addEntry('AmbientIntensity', 'f32');
|
|
652
|
-
model.UBO.addEntry('DiffuseIntensity', 'f32');
|
|
653
|
-
model.UBO.addEntry('SpecularColor', 'vec4<f32>');
|
|
654
|
-
model.UBO.addEntry('SpecularIntensity', 'f32');
|
|
655
|
-
model.UBO.addEntry('Opacity', 'f32');
|
|
656
|
-
model.UBO.addEntry('SpecularPower', 'f32');
|
|
657
|
-
model.UBO.addEntry('PropID', 'u32'); // Build VTK API
|
|
658
|
-
|
|
659
|
-
get(publicAPI, model, ['fragmentShaderTemplate', 'vertexShaderTemplate', 'UBO']);
|
|
660
|
-
setGet(publicAPI, model, ['renderEncoder']);
|
|
661
|
-
model.textures = [];
|
|
662
|
-
model.textureViews = [];
|
|
663
103
|
model.primitives = []; // Object methods
|
|
664
104
|
|
|
665
105
|
vtkWebGPUPolyDataMapper(publicAPI, model);
|
|
666
|
-
|
|
667
|
-
for (var i = PrimitiveTypes.Start; i < PrimitiveTypes.End; i++) {
|
|
668
|
-
model.primitives[i] = vtkWebGPUMapperHelper.newInstance();
|
|
669
|
-
model.primitives[i].setUBO(model.UBO);
|
|
670
|
-
model.primitives[i].setVertexShaderTemplate(publicAPI.getVertexShaderTemplate());
|
|
671
|
-
model.primitives[i].setFragmentShaderTemplate(publicAPI.getFragmentShaderTemplate());
|
|
672
|
-
}
|
|
673
|
-
|
|
674
|
-
publicAPI.setShaderReplacement('replaceShaderPosition', publicAPI.replaceShaderPosition);
|
|
675
|
-
publicAPI.setShaderReplacement('replaceShaderLight', publicAPI.replaceShaderLight);
|
|
676
|
-
publicAPI.setShaderReplacement('replaceShaderTCoord', publicAPI.replaceShaderTCoord);
|
|
677
|
-
publicAPI.setShaderReplacement('replaceShaderNormal', publicAPI.replaceShaderNormal);
|
|
678
|
-
publicAPI.setShaderReplacement('replaceShaderSelect', publicAPI.replaceShaderSelect);
|
|
679
|
-
publicAPI.setShaderReplacement('replaceShaderColor', publicAPI.replaceShaderColor);
|
|
680
106
|
} // ----------------------------------------------------------------------------
|
|
681
107
|
|
|
682
108
|
var newInstance = newInstance$1(extend, 'vtkWebGPUPolyDataMapper'); // ----------------------------------------------------------------------------
|