@kitware/vtk.js 24.5.1 → 24.5.4

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 (192) hide show
  1. package/Common/Core/Base64.d.ts +4 -2
  2. package/Common/Core/CellArray.d.ts +2 -2
  3. package/Common/Core/DataArray.d.ts +2 -2
  4. package/Common/Core/Endian.d.ts +1 -1
  5. package/Common/Core/ImageHelper.d.ts +1 -1
  6. package/Common/Core/LookupTable.d.ts +1 -1
  7. package/Common/Core/Math/index.js +1 -1
  8. package/Common/Core/Math.d.ts +1 -1
  9. package/Common/Core/Math.js +1 -1
  10. package/Common/Core/MatrixBuilder.d.ts +1 -1
  11. package/Common/Core/Points.d.ts +2 -2
  12. package/Common/Core/PriorityQueue.d.ts +1 -1
  13. package/Common/Core/ProgressHandler.d.ts +1 -1
  14. package/Common/Core/ScalarsToColors.d.ts +3 -3
  15. package/Common/Core/StringArray.d.ts +1 -1
  16. package/Common/Core/VariantArray.d.ts +1 -1
  17. package/Common/DataModel/Box.d.ts +2 -2
  18. package/Common/DataModel/CardinalSpline1D.d.ts +1 -1
  19. package/Common/DataModel/Cell.d.ts +3 -3
  20. package/Common/DataModel/Cone.d.ts +2 -2
  21. package/Common/DataModel/Cylinder.d.ts +2 -2
  22. package/Common/DataModel/DataSet.d.ts +1 -1
  23. package/Common/DataModel/DataSetAttributes/FieldData.d.ts +4 -2
  24. package/Common/DataModel/DataSetAttributes.d.ts +3 -3
  25. package/Common/DataModel/ImageData.d.ts +1 -1
  26. package/Common/DataModel/Line.d.ts +1 -1
  27. package/Common/DataModel/PiecewiseFunction.d.ts +2 -2
  28. package/Common/DataModel/Plane.d.ts +2 -2
  29. package/Common/DataModel/PointSet.d.ts +2 -2
  30. package/Common/DataModel/PolyData.d.ts +2 -2
  31. package/Common/DataModel/Polygon.d.ts +2 -2
  32. package/Common/DataModel/SelectionNode.d.ts +2 -2
  33. package/Common/DataModel/Sphere.d.ts +2 -2
  34. package/Common/DataModel/Spline1D.d.ts +1 -1
  35. package/Common/DataModel/Spline3D.d.ts +1 -1
  36. package/Common/DataModel/Triangle.d.ts +1 -1
  37. package/Common/DataModel/Triangle.js +1 -1
  38. package/Common/Transform/LandmarkTransform.d.ts +2 -2
  39. package/Common/Transform/LandmarkTransform.js +1 -1
  40. package/Filters/Core/PolyDataNormals.js +1 -1
  41. package/Filters/General/AppendPolyData.d.ts +1 -1
  42. package/Filters/General/ImageCropFilter.d.ts +1 -1
  43. package/Filters/General/ImageOutlineFilter.d.ts +1 -1
  44. package/Filters/General/ImageSliceFilter.d.ts +1 -1
  45. package/Filters/General/ImageStreamline.d.ts +3 -3
  46. package/Filters/General/LineFilter.d.ts +1 -1
  47. package/Filters/General/OBBTree.js +1 -1
  48. package/Filters/General/OutlineFilter.d.ts +1 -1
  49. package/Filters/General/TriangleFilter.d.ts +1 -1
  50. package/Filters/General/TubeFilter.d.ts +2 -2
  51. package/Filters/General/WindowedSincPolyDataFilter.js +1 -1
  52. package/Filters/Sources/Arrow2DSource.d.ts +2 -2
  53. package/Filters/Sources/ArrowSource.d.ts +2 -2
  54. package/Filters/Sources/CircleSource.d.ts +2 -2
  55. package/Filters/Sources/CircleSource.js +1 -1
  56. package/Filters/Sources/ConeSource.d.ts +2 -2
  57. package/Filters/Sources/CubeSource.d.ts +2 -2
  58. package/Filters/Sources/Cursor3D.d.ts +3 -3
  59. package/Filters/Sources/CylinderSource.d.ts +2 -2
  60. package/Filters/Sources/LineSource.d.ts +2 -2
  61. package/Filters/Sources/PlaneSource.d.ts +2 -2
  62. package/Filters/Sources/PointSource.d.ts +2 -2
  63. package/Filters/Sources/PointSource.js +1 -1
  64. package/Filters/Sources/SphereSource.d.ts +2 -2
  65. package/Filters/Texture/TextureMapToPlane.d.ts +1 -1
  66. package/Filters/Texture/TextureMapToPlane.js +1 -1
  67. package/Filters/Texture/TextureMapToSphere.d.ts +1 -1
  68. package/IO/Core/DataAccessHelper.d.ts +4 -4
  69. package/IO/Core/HttpDataSetReader.d.ts +1 -1
  70. package/IO/Core/HttpSceneLoader.d.ts +5 -5
  71. package/IO/Core/ImageStream/DefaultProtocol.d.ts +1 -1
  72. package/IO/Core/ImageStream/ViewStream.d.ts +4 -4
  73. package/IO/Core/ImageStream.d.ts +3 -3
  74. package/IO/Core/WSLinkClient.d.ts +1 -1
  75. package/IO/Geometry/DracoReader.d.ts +5 -5
  76. package/IO/Geometry/PLYReader.d.ts +5 -5
  77. package/IO/Geometry/PLYWriter.d.ts +2 -2
  78. package/IO/Geometry/STLReader.d.ts +5 -5
  79. package/IO/Geometry/STLWriter.d.ts +2 -2
  80. package/IO/Misc/ElevationReader.d.ts +5 -5
  81. package/IO/Misc/ITKImageReader.d.ts +1 -1
  82. package/IO/Misc/ITKPolyDataReader.d.ts +1 -1
  83. package/IO/Misc/JSONNucleoReader.d.ts +5 -5
  84. package/IO/Misc/JSONReader.d.ts +1 -1
  85. package/IO/Misc/MTLReader.d.ts +6 -6
  86. package/IO/Misc/OBJReader.d.ts +5 -5
  87. package/IO/Misc/PDBReader.d.ts +5 -5
  88. package/IO/XML/XMLReader.d.ts +5 -5
  89. package/Interaction/Manipulators/MouseCameraTrackballRollManipulator.js +1 -1
  90. package/Interaction/Manipulators/MouseCameraTrackballRotateManipulator.js +1 -1
  91. package/Interaction/Manipulators/MouseCameraUnicamManipulator.js +1 -1
  92. package/Interaction/Manipulators/MouseCameraUnicamRotateManipulator.js +1 -1
  93. package/Interaction/Style/InteractorStyleTrackballCamera.js +1 -1
  94. package/Interaction/Widgets/OrientationMarkerWidget.d.ts +6 -6
  95. package/Interaction/Widgets/PiecewiseGaussianWidget.js +1 -1
  96. package/Proxy/Core/View2DProxy.js +1 -1
  97. package/Rendering/Core/AbstractMapper.d.ts +2 -2
  98. package/Rendering/Core/AbstractMapper3D.d.ts +1 -1
  99. package/Rendering/Core/AbstractPicker.d.ts +2 -2
  100. package/Rendering/Core/Actor.d.ts +1 -1
  101. package/Rendering/Core/Actor2D.d.ts +1 -1
  102. package/Rendering/Core/Camera.d.ts +2 -2
  103. package/Rendering/Core/CellPicker.d.ts +2 -2
  104. package/Rendering/Core/ColorTransferFunction.d.ts +1 -1
  105. package/Rendering/Core/ColorTransferFunction.js +1 -1
  106. package/Rendering/Core/Coordinate.d.ts +1 -1
  107. package/Rendering/Core/Coordinate.js +1 -1
  108. package/Rendering/Core/CubeAxesActor.js +1 -1
  109. package/Rendering/Core/Glyph3DMapper.d.ts +1 -1
  110. package/Rendering/Core/Glyph3DMapper.js +1 -1
  111. package/Rendering/Core/ImageMapper.d.ts +1 -1
  112. package/Rendering/Core/ImageMapper.js +1 -1
  113. package/Rendering/Core/ImageProperty.d.ts +1 -1
  114. package/Rendering/Core/ImageSlice.d.ts +1 -1
  115. package/Rendering/Core/Light.d.ts +2 -2
  116. package/Rendering/Core/Mapper.d.ts +1 -1
  117. package/Rendering/Core/Mapper.js +1 -1
  118. package/Rendering/Core/Mapper2D.d.ts +1 -1
  119. package/Rendering/Core/Picker.d.ts +1 -1
  120. package/Rendering/Core/PointPicker.d.ts +1 -1
  121. package/Rendering/Core/Prop.d.ts +1 -1
  122. package/Rendering/Core/Prop3D.d.ts +1 -1
  123. package/Rendering/Core/Prop3D.js +1 -1
  124. package/Rendering/Core/Property.d.ts +2 -2
  125. package/Rendering/Core/Property2D.d.ts +2 -2
  126. package/Rendering/Core/RenderWindow.d.ts +2 -2
  127. package/Rendering/Core/RenderWindowInteractor.d.ts +123 -109
  128. package/Rendering/Core/RenderWindowInteractor.js +1 -1
  129. package/Rendering/Core/Renderer.d.ts +1 -1
  130. package/Rendering/Core/Renderer.js +1 -1
  131. package/Rendering/Core/ScalarBarActor.d.ts +2 -2
  132. package/Rendering/Core/ScalarBarActor.js +3 -3
  133. package/Rendering/Core/Texture.d.ts +1 -1
  134. package/Rendering/Core/Viewport.d.ts +2 -2
  135. package/Rendering/Core/Volume.d.ts +1 -1
  136. package/Rendering/Core/VolumeMapper.d.ts +1 -1
  137. package/Rendering/Core/VolumeMapper.js +1 -1
  138. package/Rendering/Core/VolumeProperty.d.ts +1 -1
  139. package/Rendering/Misc/CanvasView.d.ts +2 -2
  140. package/Rendering/Misc/FullScreenRenderWindow.d.ts +8 -8
  141. package/Rendering/Misc/GenericRenderWindow.d.ts +6 -6
  142. package/Rendering/Misc/RemoteView.d.ts +2 -2
  143. package/Rendering/Misc/RenderWindowWithControlBar.d.ts +1 -1
  144. package/Rendering/Misc/SynchronizableRenderWindow.d.ts +2 -2
  145. package/Rendering/Misc/TextureLODsDownloader.d.ts +3 -3
  146. package/Rendering/OpenGL/OrderIndependentTranslucentPass.js +5 -1
  147. package/Rendering/OpenGL/PolyDataMapper2D.js +1 -1
  148. package/Rendering/OpenGL/RenderWindow.d.ts +7 -7
  149. package/Rendering/OpenGL/Texture.js +1 -1
  150. package/Rendering/OpenGL/VolumeMapper.js +1 -1
  151. package/Rendering/SceneGraph/RenderPass.d.ts +1 -1
  152. package/Rendering/SceneGraph/ViewNode.d.ts +1 -1
  153. package/Rendering/SceneGraph/ViewNode.js +28 -2
  154. package/Rendering/SceneGraph/ViewNodeFactory.d.ts +1 -1
  155. package/Rendering/WebGPU/CellArrayMapper.js +629 -0
  156. package/Rendering/WebGPU/FullScreenQuad.js +4 -6
  157. package/Rendering/WebGPU/Glyph3DMapper.js +60 -27
  158. package/Rendering/WebGPU/ImageMapper.js +23 -60
  159. package/Rendering/WebGPU/OrderIndependentTranslucentPass.js +4 -6
  160. package/Rendering/WebGPU/Pipeline.js +12 -0
  161. package/Rendering/WebGPU/PolyDataMapper.js +49 -623
  162. package/Rendering/WebGPU/RenderEncoder.js +34 -0
  163. package/Rendering/WebGPU/Renderer.js +4 -62
  164. package/Rendering/WebGPU/ShaderDescription.js +6 -6
  165. package/Rendering/WebGPU/{MapperHelper.js → SimpleMapper.js} +64 -38
  166. package/Rendering/WebGPU/SphereMapper.js +41 -37
  167. package/Rendering/WebGPU/StickMapper.js +35 -30
  168. package/Rendering/WebGPU/StorageBuffer.js +2 -2
  169. package/Rendering/WebGPU/UniformBuffer.js +1 -1
  170. package/Rendering/WebGPU/Volume.js +1 -14
  171. package/Rendering/WebGPU/VolumePass.js +15 -19
  172. package/Rendering/WebGPU/VolumePassFSQ.js +19 -25
  173. package/Widgets/Manipulators/LineManipulator.d.ts +1 -1
  174. package/Widgets/Manipulators/LineManipulator.js +1 -1
  175. package/Widgets/Manipulators/PlaneManipulator.d.ts +1 -1
  176. package/Widgets/Manipulators/TrackballManipulator.d.ts +1 -1
  177. package/Widgets/Representations/PolyLineRepresentation.js +1 -1
  178. package/Widgets/Representations/ResliceCursorContextRepresentation.js +1 -1
  179. package/Widgets/Representations/WidgetRepresentation.d.ts +1 -1
  180. package/Widgets/Widgets3D/AngleWidget.js +1 -1
  181. package/Widgets/Widgets3D/LineWidget/helpers.js +1 -1
  182. package/Widgets/Widgets3D/ResliceCursorWidget/behavior.js +1 -1
  183. package/Widgets/Widgets3D/ResliceCursorWidget/helpers.js +1 -1
  184. package/Widgets/Widgets3D/ResliceCursorWidget.js +1 -1
  185. package/Widgets/Widgets3D/ShapeWidget/behavior.js +1 -1
  186. package/Widgets/Widgets3D/SphereWidget.d.ts +2 -2
  187. package/index.d.ts +2 -2
  188. package/interfaces.d.ts +2 -2
  189. package/macros.d.ts +1 -1
  190. package/package.json +1 -1
  191. package/types.d.ts +1 -1
  192. package/tsconfig.json +0 -8
@@ -0,0 +1,629 @@
1
+ import { mat3, mat4 } from 'gl-matrix';
2
+ import { newInstance as newInstance$1, 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';
6
+ import vtkWebGPUBufferManager from './BufferManager.js';
7
+ import vtkWebGPUShaderCache from './ShaderCache.js';
8
+ import vtkWebGPUUniformBuffer from './UniformBuffer.js';
9
+ import vtkWebGPUSimpleMapper from './SimpleMapper.js';
10
+
11
+ var BufferUsage = vtkWebGPUBufferManager.BufferUsage,
12
+ PrimitiveTypes = vtkWebGPUBufferManager.PrimitiveTypes;
13
+ var Representation = vtkProperty.Representation;
14
+ var ScalarMode = vtkMapper.ScalarMode;
15
+ 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";
16
+ 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";
17
+
18
+ function isEdges(hash) {
19
+ // edge pipelines have "edge" in them
20
+ return hash.indexOf('edge') >= 0;
21
+ } // ----------------------------------------------------------------------------
22
+ // vtkWebGPUCellArrayMapper methods
23
+ // ----------------------------------------------------------------------------
24
+
25
+
26
+ function vtkWebGPUCellArrayMapper(publicAPI, model) {
27
+ // Set our className
28
+ model.classHierarchy.push('vtkWebGPUCellArrayMapper');
29
+
30
+ publicAPI.buildPass = function (prepass) {
31
+ if (prepass) {
32
+ model.WebGPUActor = publicAPI.getFirstAncestorOfType('vtkWebGPUActor');
33
+ model.WebGPURenderer = model.WebGPUActor.getFirstAncestorOfType('vtkWebGPURenderer');
34
+ model.WebGPURenderWindow = model.WebGPURenderer.getParent();
35
+ model.device = model.WebGPURenderWindow.getDevice();
36
+ }
37
+ }; // Renders myself
38
+
39
+
40
+ publicAPI.translucentPass = function (prepass) {
41
+ if (prepass) {
42
+ publicAPI.prepareToDraw(model.WebGPURenderer.getRenderEncoder());
43
+ model.renderEncoder.registerDrawCallback(model.pipeline, publicAPI.draw);
44
+ }
45
+ };
46
+
47
+ publicAPI.opaquePass = function (prepass) {
48
+ if (prepass) {
49
+ publicAPI.prepareToDraw(model.WebGPURenderer.getRenderEncoder());
50
+ model.renderEncoder.registerDrawCallback(model.pipeline, publicAPI.draw);
51
+ }
52
+ };
53
+
54
+ publicAPI.updateUBO = function () {
55
+ // make sure the data is up to date
56
+ var actor = model.WebGPUActor.getRenderable();
57
+ var ppty = actor.getProperty();
58
+ var utime = model.UBO.getSendTime();
59
+
60
+ if (publicAPI.getMTime() > utime || ppty.getMTime() > utime || model.renderable.getMTime() > utime) {
61
+ var keyMats = model.WebGPUActor.getKeyMatrices(model.WebGPURenderer);
62
+ model.UBO.setArray('BCWCMatrix', keyMats.bcwc);
63
+ model.UBO.setArray('BCSCMatrix', keyMats.bcsc);
64
+ model.UBO.setArray('MCWCNormals', keyMats.normalMatrix);
65
+ var aColor = ppty.getAmbientColorByReference();
66
+ model.UBO.setValue('AmbientIntensity', ppty.getAmbient());
67
+ model.UBO.setArray('AmbientColor', [aColor[0], aColor[1], aColor[2], 1.0]);
68
+ model.UBO.setValue('DiffuseIntensity', ppty.getDiffuse());
69
+ aColor = ppty.getDiffuseColorByReference();
70
+ model.UBO.setArray('DiffuseColor', [aColor[0], aColor[1], aColor[2], 1.0]);
71
+ model.UBO.setValue('SpecularIntensity', ppty.getSpecular());
72
+ model.UBO.setValue('SpecularPower', ppty.getSpecularPower());
73
+ aColor = ppty.getSpecularColorByReference();
74
+ model.UBO.setArray('SpecularColor', [aColor[0], aColor[1], aColor[2], 1.0]);
75
+ model.UBO.setValue('LineWidth', ppty.getLineWidth());
76
+ aColor = ppty.getEdgeColorByReference();
77
+ model.UBO.setArray('EdgeColor', [aColor[0], aColor[1], aColor[2], 1.0]);
78
+ model.UBO.setValue('Opacity', ppty.getOpacity());
79
+ model.UBO.setValue('PropID', model.WebGPUActor.getPropID());
80
+ var device = model.WebGPURenderWindow.getDevice();
81
+ model.UBO.sendIfNeeded(device);
82
+ }
83
+ };
84
+
85
+ publicAPI.haveWideLines = function () {
86
+ var actor = model.WebGPUActor.getRenderable();
87
+ var representation = actor.getProperty().getRepresentation();
88
+
89
+ if (actor.getProperty().getLineWidth() <= 1.0) {
90
+ return false;
91
+ }
92
+
93
+ if (model.primitiveType === PrimitiveTypes.Verts) {
94
+ return false;
95
+ }
96
+
97
+ if (model.primitiveType === PrimitiveTypes.Triangles || model.primitiveType === PrimitiveTypes.TriangleStrips) {
98
+ return representation === Representation.WIREFRAME;
99
+ }
100
+
101
+ return true;
102
+ };
103
+
104
+ publicAPI.replaceShaderPosition = function (hash, pipeline, vertexInput) {
105
+ var vDesc = pipeline.getShaderDescription('vertex');
106
+ vDesc.addBuiltinOutput('vec4<f32>', '@builtin(position) Position');
107
+ var code = vDesc.getCode();
108
+
109
+ if (publicAPI.haveWideLines()) {
110
+ vDesc.addBuiltinInput('u32', '@builtin(instance_index) instanceIndex'); // widen the edge
111
+
112
+ code = vtkWebGPUShaderCache.substitute(code, '//VTK::Position::Impl', [' var tmpPos: vec4<f32> = rendererUBO.SCPCMatrix*mapperUBO.BCSCMatrix*vertexBC;', ' var numSteps: f32 = ceil(mapperUBO.LineWidth - 1.0);', ' var offset: f32 = (mapperUBO.LineWidth - 1.0) * (f32(input.instanceIndex / 2u) - numSteps/2.0) / numSteps;', ' var tmpPos2: vec3<f32> = tmpPos.xyz / tmpPos.w;', ' tmpPos2.x = tmpPos2.x + 2.0 * (f32(input.instanceIndex) % 2.0) * offset / rendererUBO.viewportSize.x;', ' tmpPos2.y = tmpPos2.y + 2.0 * (f32(input.instanceIndex + 1u) % 2.0) * offset / rendererUBO.viewportSize.y;', ' tmpPos2.z = tmpPos2.z + 0.00001;', // could become a setting
113
+ ' output.Position = vec4<f32>(tmpPos2.xyz * tmpPos.w, tmpPos.w);']).result;
114
+ } else {
115
+ code = vtkWebGPUShaderCache.substitute(code, '//VTK::Position::Impl', [' output.Position = rendererUBO.SCPCMatrix*mapperUBO.BCSCMatrix*vertexBC;']).result;
116
+ }
117
+
118
+ vDesc.setCode(code);
119
+ };
120
+
121
+ model.shaderReplacements.set('replaceShaderPosition', publicAPI.replaceShaderPosition);
122
+
123
+ publicAPI.replaceShaderNormal = function (hash, pipeline, vertexInput) {
124
+ if (vertexInput.hasAttribute('normalMC')) {
125
+ var vDesc = pipeline.getShaderDescription('vertex');
126
+ vDesc.addOutput('vec3<f32>', 'normalVC');
127
+ var code = vDesc.getCode();
128
+ code = vtkWebGPUShaderCache.substitute(code, '//VTK::Normal::Impl', [' output.normalVC = normalize((rendererUBO.WCVCNormals * mapperUBO.MCWCNormals * normalMC).xyz);']).result;
129
+ vDesc.setCode(code);
130
+ var fDesc = pipeline.getShaderDescription('fragment');
131
+ code = fDesc.getCode();
132
+ code = vtkWebGPUShaderCache.substitute(code, '//VTK::Normal::Impl', [' var normal: vec3<f32> = input.normalVC;', ' if (!input.frontFacing) { normal = -normal; }']).result;
133
+ fDesc.setCode(code);
134
+ }
135
+ };
136
+
137
+ model.shaderReplacements.set('replaceShaderNormal', publicAPI.replaceShaderNormal); // we only apply lighting when there is a "var normal" declaration in the
138
+ // fragment shader code. That is the lighting trigger.
139
+
140
+ publicAPI.replaceShaderLight = function (hash, pipeline, vertexInput) {
141
+ var fDesc = pipeline.getShaderDescription('fragment');
142
+ var code = fDesc.getCode();
143
+
144
+ if (code.includes('var normal')) {
145
+ 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;
146
+ fDesc.setCode(code);
147
+ } else {
148
+ code = vtkWebGPUShaderCache.substitute(code, '//VTK::Light::Impl', [' var diffuse: vec3<f32> = diffuseColor.rgb;', ' var specular: vec3<f32> = mapperUBO.SpecularColor.rgb * mapperUBO.SpecularColor.a;']).result;
149
+ fDesc.setCode(code);
150
+ }
151
+ };
152
+
153
+ model.shaderReplacements.set('replaceShaderLight', publicAPI.replaceShaderLight);
154
+
155
+ publicAPI.replaceShaderColor = function (hash, pipeline, vertexInput) {
156
+ if (isEdges(hash)) {
157
+ var _fDesc = pipeline.getShaderDescription('fragment');
158
+
159
+ var _code = _fDesc.getCode();
160
+
161
+ _code = vtkWebGPUShaderCache.substitute(_code, '//VTK::Color::Impl', ['ambientColor = mapperUBO.EdgeColor;', 'diffuseColor = mapperUBO.EdgeColor;']).result;
162
+
163
+ _fDesc.setCode(_code);
164
+
165
+ return;
166
+ }
167
+
168
+ if (!vertexInput.hasAttribute('colorVI')) return;
169
+ var vDesc = pipeline.getShaderDescription('vertex');
170
+ vDesc.addOutput('vec4<f32>', 'color');
171
+ var code = vDesc.getCode();
172
+ code = vtkWebGPUShaderCache.substitute(code, '//VTK::Color::Impl', [' output.color = colorVI;']).result;
173
+ vDesc.setCode(code);
174
+ var fDesc = pipeline.getShaderDescription('fragment');
175
+ code = fDesc.getCode();
176
+ code = vtkWebGPUShaderCache.substitute(code, '//VTK::Color::Impl', ['ambientColor = input.color;', 'diffuseColor = input.color;', 'opacity = mapperUBO.Opacity * input.color.a;']).result;
177
+ fDesc.setCode(code);
178
+ };
179
+
180
+ model.shaderReplacements.set('replaceShaderColor', publicAPI.replaceShaderColor);
181
+
182
+ publicAPI.replaceShaderTCoord = function (hash, pipeline, vertexInput) {
183
+ if (!vertexInput.hasAttribute('tcoord')) return;
184
+ var vDesc = pipeline.getShaderDescription('vertex');
185
+ vDesc.addOutput('vec2<f32>', 'tcoordVS');
186
+ var code = vDesc.getCode();
187
+ code = vtkWebGPUShaderCache.substitute(code, '//VTK::TCoord::Impl', [' output.tcoordVS = tcoord;']).result;
188
+ vDesc.setCode(code);
189
+ var fDesc = pipeline.getShaderDescription('fragment');
190
+ code = fDesc.getCode(); // todo handle multiple textures? Blend multiply ?
191
+
192
+ if (model.textures.length) {
193
+ code = vtkWebGPUShaderCache.substitute(code, '//VTK::TCoord::Impl', ['var tcolor: vec4<f32> = textureSample(Texture0, Texture0Sampler, input.tcoordVS);', 'computedColor = computedColor*tcolor;']).result;
194
+ }
195
+
196
+ fDesc.setCode(code);
197
+ };
198
+
199
+ model.shaderReplacements.set('replaceShaderTCoord', publicAPI.replaceShaderTCoord);
200
+
201
+ publicAPI.replaceShaderSelect = function (hash, pipeline, vertexInput) {
202
+ if (hash.includes('sel')) {
203
+ var fDesc = pipeline.getShaderDescription('fragment');
204
+ var code = fDesc.getCode(); // by default there are no composites, so just 0
205
+
206
+ code = vtkWebGPUShaderCache.substitute(code, '//VTK::Select::Impl', [' var compositeID: u32 = 0u;']).result;
207
+ fDesc.setCode(code);
208
+ }
209
+ };
210
+
211
+ model.shaderReplacements.set('replaceShaderSelect', publicAPI.replaceShaderSelect);
212
+
213
+ publicAPI.getUsage = function (rep, i) {
214
+ if (rep === Representation.POINTS || i === PrimitiveTypes.Points) {
215
+ return BufferUsage.Verts;
216
+ }
217
+
218
+ if (i === PrimitiveTypes.Lines) {
219
+ return BufferUsage.Lines;
220
+ }
221
+
222
+ if (rep === Representation.WIREFRAME) {
223
+ if (i === PrimitiveTypes.Triangles) {
224
+ return BufferUsage.LinesFromTriangles;
225
+ }
226
+
227
+ return BufferUsage.LinesFromStrips;
228
+ }
229
+
230
+ if (i === PrimitiveTypes.Triangles) {
231
+ return BufferUsage.Triangles;
232
+ }
233
+
234
+ if (i === PrimitiveTypes.TriangleStrips) {
235
+ return BufferUsage.Strips;
236
+ }
237
+
238
+ if (i === PrimitiveTypes.TriangleEdges) {
239
+ return BufferUsage.LinesFromTriangles;
240
+ } // only strip edges left which are lines
241
+
242
+
243
+ return BufferUsage.LinesFromStrips;
244
+ };
245
+
246
+ publicAPI.getHashFromUsage = function (usage) {
247
+ return "pt".concat(usage);
248
+ };
249
+
250
+ publicAPI.getTopologyFromUsage = function (usage) {
251
+ switch (usage) {
252
+ case BufferUsage.Triangles:
253
+ return 'triangle-list';
254
+
255
+ case BufferUsage.Verts:
256
+ return 'point-list';
257
+
258
+ case BufferUsage.Lines:
259
+ default:
260
+ return 'line-list';
261
+ }
262
+ };
263
+
264
+ publicAPI.buildVertexInput = function () {
265
+ var pd = model.currentInput;
266
+ var cells = model.cellArray;
267
+ var primType = model.primitiveType;
268
+ var actor = model.WebGPUActor.getRenderable();
269
+ var representation = actor.getProperty().getRepresentation();
270
+ var device = model.WebGPURenderWindow.getDevice();
271
+ var edges = false;
272
+
273
+ if (primType === PrimitiveTypes.TriangleEdges) {
274
+ edges = true;
275
+ representation = Representation.WIREFRAME;
276
+ }
277
+
278
+ var vertexInput = model.vertexInput;
279
+ var hash = "R".concat(representation, "P").concat(primType); // hash = all things that can change the values on the buffer
280
+ // since mtimes are unique we can use
281
+ // - cells mtime - because cells drive how we pack
282
+ // - rep (point/wireframe/surface) - again because of packing
283
+ // - relevant dataArray mtime - the source data
284
+ // - shift - not currently captured
285
+ // - scale - not currently captured
286
+ // - format
287
+ // - usage
288
+ // - packExtra - covered by format
289
+ // - prim type (vert/lines/polys/strips) - covered by cells mtime
290
+ // points
291
+
292
+ var points = pd.getPoints();
293
+
294
+ if (points) {
295
+ var shift = model.WebGPUActor.getBufferShift(model.WebGPURenderer);
296
+ var buffRequest = {
297
+ owner: points,
298
+ usage: BufferUsage.PointArray,
299
+ format: 'float32x4',
300
+ time: Math.max(points.getMTime(), cells.getMTime(), model.WebGPUActor.getKeyMatricesTime().getMTime()),
301
+ hash: hash,
302
+ dataArray: points,
303
+ cells: cells,
304
+ primitiveType: primType,
305
+ representation: representation,
306
+ shift: shift,
307
+ packExtra: true
308
+ };
309
+ var buff = device.getBufferManager().getBuffer(buffRequest);
310
+ vertexInput.addBuffer(buff, ['vertexBC']);
311
+ } else {
312
+ vertexInput.removeBufferIfPresent('vertexBC');
313
+ } // normals, only used for surface rendering
314
+
315
+
316
+ var usage = publicAPI.getUsage(representation, primType);
317
+
318
+ if (usage === BufferUsage.Triangles || usage === BufferUsage.Strips) {
319
+ var normals = pd.getPointData().getNormals();
320
+ var _buffRequest = {
321
+ format: 'snorm8x4',
322
+ hash: hash,
323
+ cells: cells,
324
+ representation: representation,
325
+ primitiveType: primType,
326
+ packExtra: true,
327
+ shift: 0,
328
+ scale: 127
329
+ };
330
+
331
+ if (normals) {
332
+ _buffRequest.owner = normals;
333
+ _buffRequest.dataArray = normals;
334
+ _buffRequest.time = Math.max(normals.getMTime(), cells.getMTime());
335
+ _buffRequest.usage = BufferUsage.PointArray;
336
+
337
+ var _buff = device.getBufferManager().getBuffer(_buffRequest);
338
+
339
+ vertexInput.addBuffer(_buff, ['normalMC']);
340
+ } else if (primType === PrimitiveTypes.Triangles) {
341
+ _buffRequest.owner = points;
342
+ _buffRequest.dataArray = points;
343
+ _buffRequest.time = Math.max(points.getMTime(), cells.getMTime());
344
+ _buffRequest.usage = BufferUsage.NormalsFromPoints;
345
+
346
+ var _buff2 = device.getBufferManager().getBuffer(_buffRequest);
347
+
348
+ vertexInput.addBuffer(_buff2, ['normalMC']);
349
+ } else {
350
+ vertexInput.removeBufferIfPresent('normalMC');
351
+ }
352
+ } else {
353
+ vertexInput.removeBufferIfPresent('normalMC');
354
+ } // deal with colors but only if modified
355
+
356
+
357
+ var haveColors = false;
358
+
359
+ if (model.renderable.getScalarVisibility()) {
360
+ var c = model.renderable.getColorMapColors();
361
+
362
+ if (c && !edges) {
363
+ var scalarMode = model.renderable.getScalarMode();
364
+ var haveCellScalars = false; // We must figure out how the scalars should be mapped to the polydata.
365
+
366
+ 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) {
367
+ haveCellScalars = true;
368
+ }
369
+
370
+ var _buffRequest2 = {
371
+ owner: c,
372
+ usage: BufferUsage.PointArray,
373
+ format: 'unorm8x4',
374
+ time: Math.max(c.getMTime(), cells.getMTime(), points.getMTime()),
375
+ hash: hash + haveCellScalars,
376
+ dataArray: c,
377
+ cells: cells,
378
+ primitiveType: primType,
379
+ representation: representation,
380
+ cellData: haveCellScalars,
381
+ cellOffset: 0
382
+ };
383
+
384
+ var _buff3 = device.getBufferManager().getBuffer(_buffRequest2);
385
+
386
+ vertexInput.addBuffer(_buff3, ['colorVI']);
387
+ haveColors = true;
388
+ }
389
+ }
390
+
391
+ if (!haveColors) {
392
+ vertexInput.removeBufferIfPresent('colorVI');
393
+ }
394
+
395
+ var tcoords = null;
396
+
397
+ if (model.renderable.getInterpolateScalarsBeforeMapping() && model.renderable.getColorCoordinates()) {
398
+ tcoords = model.renderable.getColorCoordinates();
399
+ } else {
400
+ tcoords = pd.getPointData().getTCoords();
401
+ }
402
+
403
+ if (tcoords && !edges) {
404
+ // console.log(`tcoords ${tcoords.getMTime()}`);
405
+ var _buffRequest3 = {
406
+ owner: tcoords,
407
+ usage: BufferUsage.PointArray,
408
+ format: 'float32x2',
409
+ time: Math.max(tcoords.getMTime(), cells.getMTime()),
410
+ hash: hash,
411
+ dataArray: tcoords,
412
+ cells: cells,
413
+ primitiveType: primType,
414
+ representation: representation
415
+ };
416
+
417
+ var _buff4 = device.getBufferManager().getBuffer(_buffRequest3);
418
+
419
+ vertexInput.addBuffer(_buff4, ['tcoord']);
420
+ } else {
421
+ vertexInput.removeBufferIfPresent('tcoord');
422
+ }
423
+ };
424
+
425
+ publicAPI.updateTextures = function () {
426
+ // we keep track of new and used textures so
427
+ // that we can clean up any unused textures so we don't hold onto them
428
+ var usedTextures = [];
429
+ var newTextures = []; // do we have a scalar color texture
430
+
431
+ var idata = model.renderable.getColorTextureMap(); // returns an imagedata
432
+
433
+ if (idata) {
434
+ if (!model.colorTexture) {
435
+ model.colorTexture = vtkTexture.newInstance({
436
+ label: 'polyDataColor'
437
+ });
438
+ }
439
+
440
+ model.colorTexture.setInputData(idata);
441
+ newTextures.push(model.colorTexture);
442
+ } // actor textures?
443
+
444
+
445
+ var actor = model.WebGPUActor.getRenderable();
446
+ var textures = actor.getTextures();
447
+
448
+ for (var i = 0; i < textures.length; i++) {
449
+ if (textures[i].getInputData() || textures[i].getJsImageData() || textures[i].getCanvas()) {
450
+ newTextures.push(textures[i]);
451
+ }
452
+
453
+ if (textures[i].getImage() && textures[i].getImageLoaded()) {
454
+ newTextures.push(textures[i]);
455
+ }
456
+ }
457
+
458
+ var usedCount = 0;
459
+
460
+ for (var _i = 0; _i < newTextures.length; _i++) {
461
+ var srcTexture = newTextures[_i];
462
+ var treq = {
463
+ time: srcTexture.getMTime()
464
+ };
465
+
466
+ if (srcTexture.getInputData()) {
467
+ treq.imageData = srcTexture.getInputData();
468
+ treq.owner = treq.imageData.getPointData().getScalars();
469
+ } else if (srcTexture.getImage()) {
470
+ treq.image = srcTexture.getImage();
471
+ treq.owner = treq.image;
472
+ } else if (srcTexture.getJsImageData()) {
473
+ treq.jsImageData = srcTexture.getJsImageData();
474
+ treq.owner = treq.jsImageData;
475
+ } else if (srcTexture.getCanvas()) {
476
+ treq.canvas = srcTexture.getCanvas();
477
+ treq.owner = treq.canvas;
478
+ }
479
+
480
+ var newTex = model.device.getTextureManager().getTexture(treq);
481
+
482
+ if (newTex.getReady()) {
483
+ // is this a new texture
484
+ var found = false;
485
+
486
+ for (var t = 0; t < model.textures.length; t++) {
487
+ if (model.textures[t] === newTex) {
488
+ usedCount++;
489
+ found = true;
490
+ usedTextures[t] = true;
491
+ }
492
+ }
493
+
494
+ if (!found) {
495
+ usedTextures[model.textures.length] = true;
496
+ var tview = newTex.createView("Texture".concat(usedCount++));
497
+ model.textures.push(newTex);
498
+ model.textureViews.push(tview);
499
+ var interpolate = srcTexture.getInterpolate() ? 'linear' : 'nearest';
500
+ tview.addSampler(model.device, {
501
+ minFilter: interpolate,
502
+ magFilter: interpolate
503
+ });
504
+ }
505
+ }
506
+ } // remove unused textures
507
+
508
+
509
+ for (var _i2 = model.textures.length - 1; _i2 >= 0; _i2--) {
510
+ if (!usedTextures[_i2]) {
511
+ model.textures.splice(_i2, 1);
512
+ model.textureViews.splice(_i2, 1);
513
+ }
514
+ }
515
+ }; // compute a unique hash for a pipeline, this needs to be unique enough to
516
+ // capture any pipeline code changes (which includes shader changes)
517
+ // or vertex input changes/ bind groups/ etc
518
+
519
+
520
+ publicAPI.computePipelineHash = function () {
521
+ var pipelineHash = 'pd';
522
+
523
+ if (model.primitiveType === PrimitiveTypes.TriangleEdges || model.primitiveType === PrimitiveTypes.TriangleStripEdges) {
524
+ pipelineHash += 'edge';
525
+ } else {
526
+ if (model.vertexInput.hasAttribute("normalMC")) {
527
+ pipelineHash += "n";
528
+ }
529
+
530
+ if (model.vertexInput.hasAttribute("colorVI")) {
531
+ pipelineHash += "c";
532
+ }
533
+
534
+ if (model.vertexInput.hasAttribute("tcoord")) {
535
+ pipelineHash += "t";
536
+ }
537
+
538
+ if (model.textures.length) {
539
+ pipelineHash += "tx".concat(model.textures.length);
540
+ }
541
+ }
542
+
543
+ if (model.SSBO) {
544
+ pipelineHash += "ssbo";
545
+ }
546
+
547
+ var uhash = publicAPI.getHashFromUsage(model.usage);
548
+ pipelineHash += uhash;
549
+ pipelineHash += model.renderEncoder.getPipelineHash();
550
+ model.pipelineHash = pipelineHash;
551
+ };
552
+
553
+ publicAPI.updateBuffers = function () {
554
+ // handle textures if not edges
555
+ if (model.primitiveType !== PrimitiveTypes.TriangleEdges && model.primitiveType !== PrimitiveTypes.TriangleStripEdges) {
556
+ publicAPI.updateTextures();
557
+ }
558
+
559
+ var actor = model.WebGPUActor.getRenderable();
560
+ var rep = actor.getProperty().getRepresentation(); // handle per primitive type
561
+
562
+ model.usage = publicAPI.getUsage(rep, model.primitiveType);
563
+ publicAPI.buildVertexInput();
564
+ var vbo = model.vertexInput.getBuffer('vertexBC');
565
+ publicAPI.setNumberOfVertices(vbo.getSizeInBytes() / vbo.getStrideInBytes());
566
+ publicAPI.setTopology(publicAPI.getTopologyFromUsage(model.usage));
567
+ publicAPI.updateUBO();
568
+
569
+ if (publicAPI.haveWideLines()) {
570
+ var ppty = actor.getProperty();
571
+ publicAPI.setNumberOfInstances(Math.ceil(ppty.getLineWidth() * 2.0));
572
+ }
573
+ };
574
+ } // ----------------------------------------------------------------------------
575
+ // Object factory
576
+ // ----------------------------------------------------------------------------
577
+
578
+
579
+ var DEFAULT_VALUES = {
580
+ cellArray: null,
581
+ currentInput: null,
582
+ cellOffset: 0,
583
+ primitiveType: 0,
584
+ colorTexture: null,
585
+ renderEncoder: null,
586
+ textures: null
587
+ }; // ----------------------------------------------------------------------------
588
+
589
+ function extend(publicAPI, model) {
590
+ var initialValues = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {};
591
+ Object.assign(model, DEFAULT_VALUES, initialValues); // Inheritance
592
+
593
+ vtkWebGPUSimpleMapper.extend(publicAPI, model, initialValues);
594
+ model.fragmentShaderTemplate = vtkWebGPUPolyDataFS;
595
+ model.vertexShaderTemplate = vtkWebGPUPolyDataVS;
596
+ model._tmpMat3 = mat3.identity(new Float64Array(9));
597
+ model._tmpMat4 = mat4.identity(new Float64Array(16));
598
+ model.UBO = vtkWebGPUUniformBuffer.newInstance({
599
+ label: 'mapperUBO'
600
+ });
601
+ model.UBO.addEntry('BCWCMatrix', 'mat4x4<f32>');
602
+ model.UBO.addEntry('BCSCMatrix', 'mat4x4<f32>');
603
+ model.UBO.addEntry('MCWCNormals', 'mat4x4<f32>');
604
+ model.UBO.addEntry('AmbientColor', 'vec4<f32>');
605
+ model.UBO.addEntry('DiffuseColor', 'vec4<f32>');
606
+ model.UBO.addEntry('EdgeColor', 'vec4<f32>');
607
+ model.UBO.addEntry('SpecularColor', 'vec4<f32>');
608
+ model.UBO.addEntry('AmbientIntensity', 'f32');
609
+ model.UBO.addEntry('DiffuseIntensity', 'f32');
610
+ model.UBO.addEntry('SpecularIntensity', 'f32');
611
+ model.UBO.addEntry('LineWidth', 'f32');
612
+ model.UBO.addEntry('Opacity', 'f32');
613
+ model.UBO.addEntry('SpecularPower', 'f32');
614
+ model.UBO.addEntry('PropID', 'u32'); // Build VTK API
615
+
616
+ setGet(publicAPI, model, ['cellArray', 'currentInput', 'cellOffset', 'primitiveType', 'renderEncoder']);
617
+ model.textures = []; // Object methods
618
+
619
+ vtkWebGPUCellArrayMapper(publicAPI, model);
620
+ } // ----------------------------------------------------------------------------
621
+
622
+ var newInstance = newInstance$1(extend, 'vtkWebGPUCellArrayMapper'); // ----------------------------------------------------------------------------
623
+
624
+ var vtkWebGPUCellArrayMapper$1 = {
625
+ newInstance: newInstance,
626
+ extend: extend
627
+ };
628
+
629
+ export { vtkWebGPUCellArrayMapper$1 as default, extend, newInstance };
@@ -1,6 +1,6 @@
1
1
  import macro from '../../macros.js';
2
2
  import vtkWebGPUShaderCache from './ShaderCache.js';
3
- import vtkWebGPUMapperHelper from './MapperHelper.js';
3
+ import vtkWebGPUSimpleMapper from './SimpleMapper.js';
4
4
 
5
5
  // vtkWebGPUFullScreenQuad methods
6
6
  // ----------------------------------------------------------------------------
@@ -18,13 +18,11 @@ function vtkWebGPUFullScreenQuad(publicAPI, model) {
18
18
  };
19
19
 
20
20
  model.shaderReplacements.set('replaceShaderPosition', publicAPI.replaceShaderPosition);
21
- var superclassBuild = publicAPI.build;
22
21
 
23
- publicAPI.build = function (renderEncoder, device) {
24
- var buff = device.getBufferManager().getFullScreenQuadBuffer();
22
+ publicAPI.updateBuffers = function () {
23
+ var buff = model.device.getBufferManager().getFullScreenQuadBuffer();
25
24
  model.vertexInput.addBuffer(buff, ['vertexBC']);
26
25
  model.numberOfVertices = 6;
27
- superclassBuild(renderEncoder, device);
28
26
  };
29
27
  } // ----------------------------------------------------------------------------
30
28
  // Object factory
@@ -37,7 +35,7 @@ function extend(publicAPI, model) {
37
35
  var initialValues = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {};
38
36
  Object.assign(model, DEFAULT_VALUES, initialValues); // Inheritance
39
37
 
40
- vtkWebGPUMapperHelper.extend(publicAPI, model, initialValues); // Object methods
38
+ vtkWebGPUSimpleMapper.extend(publicAPI, model, initialValues); // Object methods
41
39
 
42
40
  vtkWebGPUFullScreenQuad(publicAPI, model);
43
41
  } // ----------------------------------------------------------------------------