@vitessce/spatial-accelerated 3.8.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (47) hide show
  1. package/LICENSE +21 -0
  2. package/dist/index.js +52925 -0
  3. package/dist-tsc/SpatialWrapper.d.ts +2 -0
  4. package/dist-tsc/SpatialWrapper.d.ts.map +1 -0
  5. package/dist-tsc/SpatialWrapper.js +45 -0
  6. package/dist-tsc/VolumeDataManager.d.ts +170 -0
  7. package/dist-tsc/VolumeDataManager.d.ts.map +1 -0
  8. package/dist-tsc/VolumeDataManager.js +1273 -0
  9. package/dist-tsc/VolumeDataManager.test.d.ts +2 -0
  10. package/dist-tsc/VolumeDataManager.test.d.ts.map +1 -0
  11. package/dist-tsc/VolumeDataManager.test.js +164 -0
  12. package/dist-tsc/VolumeRenderManager.d.ts +265 -0
  13. package/dist-tsc/VolumeRenderManager.d.ts.map +1 -0
  14. package/dist-tsc/VolumeRenderManager.js +396 -0
  15. package/dist-tsc/VolumeShader.d.ts +262 -0
  16. package/dist-tsc/VolumeShader.d.ts.map +1 -0
  17. package/dist-tsc/VolumeShader.js +73 -0
  18. package/dist-tsc/VolumeView.d.ts +2 -0
  19. package/dist-tsc/VolumeView.d.ts.map +1 -0
  20. package/dist-tsc/VolumeView.js +521 -0
  21. package/dist-tsc/index.d.ts +2 -0
  22. package/dist-tsc/index.d.ts.map +1 -0
  23. package/dist-tsc/index.js +1 -0
  24. package/dist-tsc/shaders/GaussianFragmentShader.d.ts +2 -0
  25. package/dist-tsc/shaders/GaussianFragmentShader.d.ts.map +1 -0
  26. package/dist-tsc/shaders/GaussianFragmentShader.js +242 -0
  27. package/dist-tsc/shaders/GaussianVertexShader.d.ts +2 -0
  28. package/dist-tsc/shaders/GaussianVertexShader.d.ts.map +1 -0
  29. package/dist-tsc/shaders/GaussianVertexShader.js +51 -0
  30. package/dist-tsc/shaders/VolumeFragmentShader.d.ts +2 -0
  31. package/dist-tsc/shaders/VolumeFragmentShader.d.ts.map +1 -0
  32. package/dist-tsc/shaders/VolumeFragmentShader.js +1817 -0
  33. package/dist-tsc/shaders/VolumeVertexShader.d.ts +2 -0
  34. package/dist-tsc/shaders/VolumeVertexShader.d.ts.map +1 -0
  35. package/dist-tsc/shaders/VolumeVertexShader.js +110 -0
  36. package/package.json +63 -0
  37. package/src/SpatialWrapper.js +60 -0
  38. package/src/VolumeDataManager.js +1515 -0
  39. package/src/VolumeDataManager.test.js +180 -0
  40. package/src/VolumeRenderManager.js +589 -0
  41. package/src/VolumeShader.js +74 -0
  42. package/src/VolumeView.js +651 -0
  43. package/src/index.js +1 -0
  44. package/src/shaders/GaussianFragmentShader.js +243 -0
  45. package/src/shaders/GaussianVertexShader.js +52 -0
  46. package/src/shaders/VolumeFragmentShader.js +1818 -0
  47. package/src/shaders/VolumeVertexShader.js +111 -0
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=VolumeDataManager.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"VolumeDataManager.test.d.ts","sourceRoot":"","sources":["../src/VolumeDataManager.test.js"],"names":[],"mappings":""}
@@ -0,0 +1,164 @@
1
+ import { describe, it, expect } from 'vitest';
2
+ import { _initMRMCPT, _resolutionStatsToBrickLayout, _packPT, _ptToZarr, _requestBufferToRequestObjects, } from './VolumeDataManager.js';
3
+ describe('spatial-accelerated data utils', () => {
4
+ describe('initialization of page table and brick cache', () => {
5
+ it('Can compute brick layout per resolution', () => {
6
+ // TODO: also add test for calculation of brick layout from zarr metadata
7
+ const multiResolutionStats = [
8
+ {
9
+ height: 3181,
10
+ width: 4045,
11
+ depth: 194,
12
+ },
13
+ {
14
+ height: 1590,
15
+ width: 2022,
16
+ depth: 194,
17
+ },
18
+ {
19
+ height: 795,
20
+ width: 1011,
21
+ depth: 194,
22
+ },
23
+ {
24
+ height: 398,
25
+ width: 506,
26
+ depth: 194,
27
+ },
28
+ {
29
+ height: 199,
30
+ width: 253,
31
+ depth: 194,
32
+ },
33
+ {
34
+ height: 99,
35
+ width: 126,
36
+ depth: 97,
37
+ },
38
+ {
39
+ height: 50,
40
+ width: 63,
41
+ depth: 48,
42
+ },
43
+ {
44
+ height: 25,
45
+ width: 32,
46
+ depth: 24,
47
+ },
48
+ ];
49
+ const zarrStoreBrickLayout = [
50
+ [7, 100, 127],
51
+ [7, 50, 64],
52
+ [7, 25, 32],
53
+ [7, 13, 16],
54
+ [7, 7, 8],
55
+ [4, 4, 4],
56
+ [2, 2, 2],
57
+ [1, 1, 1],
58
+ ];
59
+ const result = _resolutionStatsToBrickLayout(multiResolutionStats);
60
+ expect(result).toEqual(zarrStoreBrickLayout);
61
+ });
62
+ it('Initializes page table based on data extent', () => {
63
+ const zarrStoreBrickLayout = [
64
+ [7, 100, 127],
65
+ [7, 50, 64],
66
+ [7, 25, 32],
67
+ [7, 13, 16],
68
+ [7, 7, 8],
69
+ [4, 4, 4],
70
+ [2, 2, 2],
71
+ [1, 1, 1],
72
+ ];
73
+ const channelsZarrMappingsLength = 7;
74
+ const { PT, ptTHREE, bcTHREE } = _initMRMCPT(zarrStoreBrickLayout, channelsZarrMappingsLength);
75
+ expect(PT).toEqual({
76
+ channelOffsets: [
77
+ [0, 0, 1],
78
+ [0, 1, 0],
79
+ [0, 1, 1],
80
+ [1, 0, 0],
81
+ [1, 0, 1],
82
+ [1, 1, 0],
83
+ [1, 1, 1],
84
+ ],
85
+ anchors: [
86
+ [0, 0, 36],
87
+ [64, 53, 29],
88
+ [32, 28, 22],
89
+ [16, 15, 15],
90
+ [8, 8, 8],
91
+ [4, 4, 4],
92
+ [2, 2, 2],
93
+ [1, 1, 1],
94
+ ],
95
+ offsets: [],
96
+ xExtent: 128,
97
+ yExtent: 103,
98
+ zExtent: 36,
99
+ z0Extent: 7,
100
+ zTotal: 85,
101
+ lowestDataRes: 7,
102
+ });
103
+ expect(ptTHREE.isTexture).toEqual(true);
104
+ expect(ptTHREE.source.data.width).toEqual(128);
105
+ expect(ptTHREE.source.data.height).toEqual(103);
106
+ expect(ptTHREE.source.data.depth).toEqual(85);
107
+ expect(ptTHREE.source.data.data).toBeInstanceOf(Uint32Array);
108
+ expect(ptTHREE.source.data.data.length).toEqual(1120640);
109
+ expect(bcTHREE.isTexture).toEqual(true);
110
+ expect(bcTHREE.source.data.width).toEqual(2048);
111
+ expect(bcTHREE.source.data.height).toEqual(2048);
112
+ expect(bcTHREE.source.data.depth).toEqual(128);
113
+ expect(bcTHREE.source.data.data).toBeInstanceOf(Uint8Array);
114
+ expect(bcTHREE.source.data.data.length).toEqual(536870912);
115
+ });
116
+ });
117
+ describe('_packPT packs page table properties for a brick', () => {
118
+ it('correctly packs the properties', () => {
119
+ expect(_packPT(0, 80, 1, 0, 0)).toEqual(3223847936);
120
+ expect(_packPT(0, 56, 2, 0, 0)).toEqual(3223062528);
121
+ expect(_packPT(0, 0, 27, 0, 0)).toEqual(3221253120);
122
+ expect(_packPT(0, 111, 61, 0, 0)).toEqual(3224892416);
123
+ expect(_packPT(0, 3, 14, 1, 0)).toEqual(3221305360);
124
+ expect(_packPT(0, 41, 60, 1, 0)).toEqual(3222597648);
125
+ });
126
+ });
127
+ describe('_ptToZarr returns channel, res., xyz coordinates for a page table coord.', () => {
128
+ it('correctly converts page table coordinates to image pyramid chunk keys', () => {
129
+ const ptInfo = {
130
+ PT_zExtent: 36,
131
+ PT_z0Extent: 7,
132
+ PT_anchors: [
133
+ [0, 0, 36],
134
+ [64, 53, 29],
135
+ [32, 28, 22],
136
+ [16, 15, 15],
137
+ [8, 8, 8],
138
+ [4, 4, 4],
139
+ [2, 2, 2],
140
+ [1, 1, 1],
141
+ ],
142
+ };
143
+ expect(_ptToZarr(4, 1, 13, ptInfo)).toEqual({ channel: 0, resolution: 4, x: 4, y: 1, z: 5 });
144
+ expect(_ptToZarr(7, 1, 14, ptInfo)).toEqual({ channel: 0, resolution: 4, x: 7, y: 1, z: 6 });
145
+ expect(_ptToZarr(2, 1, 4, ptInfo)).toEqual({ channel: 0, resolution: 5, x: 2, y: 1, z: 0 });
146
+ expect(_ptToZarr(0, 4, 14, ptInfo)).toEqual({ channel: 0, resolution: 4, x: 0, y: 4, z: 6 });
147
+ });
148
+ });
149
+ describe('_requestBufferToRequestObjects', () => {
150
+ it('correctly converts a buffer to request objects', () => {
151
+ const buffer = new Uint8Array([
152
+ 0, 0, 0, 0,
153
+ 0, 0, 0, 0,
154
+ 0, 128, 16, 13,
155
+ 0, 0, 0, 0,
156
+ ]);
157
+ const k = 40;
158
+ const { requests: result } = _requestBufferToRequestObjects(buffer, k);
159
+ expect(result).toEqual([
160
+ { x: 2, y: 1, z: 13 },
161
+ ]);
162
+ });
163
+ });
164
+ });
@@ -0,0 +1,265 @@
1
+ /**
2
+ * Manages the volume rendering state, shader setup, and uniform management
3
+ * Serves as a replacement for many functions from three-utils.js
4
+ */
5
+ export class VolumeRenderManager {
6
+ uniforms: any;
7
+ shader: {
8
+ uniforms: {
9
+ u_size: {
10
+ value: import("three").Vector3;
11
+ };
12
+ clim0: {
13
+ value: Vector2;
14
+ };
15
+ clim1: {
16
+ value: Vector2;
17
+ };
18
+ clim2: {
19
+ value: Vector2;
20
+ };
21
+ clim3: {
22
+ value: Vector2;
23
+ };
24
+ clim4: {
25
+ value: Vector2;
26
+ };
27
+ clim5: {
28
+ value: Vector2;
29
+ };
30
+ clim6: {
31
+ value: Vector2;
32
+ };
33
+ clim7: {
34
+ value: Vector2;
35
+ };
36
+ xClip: {
37
+ value: Vector2;
38
+ };
39
+ yClip: {
40
+ value: Vector2;
41
+ };
42
+ zClip: {
43
+ value: Vector2;
44
+ };
45
+ u_window_size: {
46
+ value: Vector2;
47
+ };
48
+ u_vol_scale: {
49
+ value: import("three").Vector3;
50
+ };
51
+ u_renderstyle: {
52
+ value: number;
53
+ };
54
+ brickCacheTex: {
55
+ type: string;
56
+ value: null;
57
+ };
58
+ pageTableTex: {
59
+ type: string;
60
+ value: null;
61
+ };
62
+ color0: {
63
+ value: import("three").Vector4;
64
+ };
65
+ color1: {
66
+ value: import("three").Vector4;
67
+ };
68
+ color2: {
69
+ value: import("three").Vector4;
70
+ };
71
+ color3: {
72
+ value: import("three").Vector4;
73
+ };
74
+ color4: {
75
+ value: import("three").Vector4;
76
+ };
77
+ color5: {
78
+ value: import("three").Vector4;
79
+ };
80
+ color6: {
81
+ value: import("three").Vector4;
82
+ };
83
+ channelMapping: {
84
+ value: number[];
85
+ };
86
+ resGlobal: {
87
+ value: Vector2;
88
+ };
89
+ res0: {
90
+ value: Vector2;
91
+ };
92
+ res1: {
93
+ value: Vector2;
94
+ };
95
+ res2: {
96
+ value: Vector2;
97
+ };
98
+ res3: {
99
+ value: Vector2;
100
+ };
101
+ res4: {
102
+ value: Vector2;
103
+ };
104
+ res5: {
105
+ value: Vector2;
106
+ };
107
+ res6: {
108
+ value: Vector2;
109
+ };
110
+ maxChannels: {
111
+ value: number;
112
+ };
113
+ lodFactor: {
114
+ value: number;
115
+ };
116
+ near: {
117
+ value: number;
118
+ };
119
+ far: {
120
+ value: number;
121
+ };
122
+ opacity: {
123
+ value: number;
124
+ };
125
+ volumeCount: {
126
+ value: number;
127
+ };
128
+ boxSize: {
129
+ value: import("three").Vector3;
130
+ };
131
+ renderRes: {
132
+ value: number;
133
+ };
134
+ voxelExtents: {
135
+ value: import("three").Vector3;
136
+ };
137
+ anchor0: {
138
+ value: import("three").Vector3;
139
+ };
140
+ anchor1: {
141
+ value: import("three").Vector3;
142
+ };
143
+ anchor2: {
144
+ value: import("three").Vector3;
145
+ };
146
+ anchor3: {
147
+ value: import("three").Vector3;
148
+ };
149
+ anchor4: {
150
+ value: import("three").Vector3;
151
+ };
152
+ anchor5: {
153
+ value: import("three").Vector3;
154
+ };
155
+ anchor6: {
156
+ value: import("three").Vector3;
157
+ };
158
+ anchor7: {
159
+ value: import("three").Vector3;
160
+ };
161
+ anchor8: {
162
+ value: import("three").Vector3;
163
+ };
164
+ anchor9: {
165
+ value: import("three").Vector3;
166
+ };
167
+ scale0: {
168
+ value: import("three").Vector3;
169
+ };
170
+ scale1: {
171
+ value: import("three").Vector3;
172
+ };
173
+ scale2: {
174
+ value: import("three").Vector3;
175
+ };
176
+ scale3: {
177
+ value: import("three").Vector3;
178
+ };
179
+ scale4: {
180
+ value: import("three").Vector3;
181
+ };
182
+ scale5: {
183
+ value: import("three").Vector3;
184
+ };
185
+ scale6: {
186
+ value: import("three").Vector3;
187
+ };
188
+ scale7: {
189
+ value: import("three").Vector3;
190
+ };
191
+ scale8: {
192
+ value: import("three").Vector3;
193
+ };
194
+ scale9: {
195
+ value: import("three").Vector3;
196
+ };
197
+ };
198
+ vertexShader: string;
199
+ fragmentShader: string;
200
+ } | null;
201
+ meshScale: number[];
202
+ geometrySize: number[];
203
+ boxSize: number[];
204
+ zarrInit: boolean;
205
+ channelsVisible: any[];
206
+ channelTargetC: any[];
207
+ zarrStoreNumResolutions: any;
208
+ channelMaxResolutionIndex: any[];
209
+ colors: any[];
210
+ contrastLimits: any[];
211
+ layerTransparency: number;
212
+ xSlice: Vector2;
213
+ ySlice: Vector2;
214
+ zSlice: Vector2;
215
+ originalScale: number[];
216
+ physicalDimensions: number[];
217
+ maxResolution: number[];
218
+ maxRange: number;
219
+ maxRangeSet: boolean;
220
+ /**
221
+ * Initialize shader and uniform objects
222
+ */
223
+ initializeShader(): void;
224
+ /**
225
+ * Extract rendering settings from coordination props
226
+ * @param {Object} props - Component props
227
+ * @returns {Object} Extracted rendering settings
228
+ */
229
+ extractRenderingSettingsFromProps(props: Object): Object;
230
+ /**
231
+ * Update the render settings from the given props
232
+ * @param {Object} props - Component props
233
+ * @returns {boolean} True if settings were successfully updated
234
+ */
235
+ updateFromProps(props: Object): boolean;
236
+ renderingMode: any;
237
+ /**
238
+ * Update the rendering based on the current volume data from the data manager
239
+ * @param {object} volumeDataManagerProps - Params derived from the volume data manager
240
+ * @returns {Object|null} Updated rendering settings or null if rendering is not possible
241
+ */
242
+ updateRendering({ zarrStoreShapes, originalScaleXYZ, physicalDimensionsXYZ, maxResolutionXYZ, boxDimensionsXYZ, normalizedScaleXYZ, bcTHREE, ptTHREE, }: object): Object | null;
243
+ normalizedScale: any;
244
+ /**
245
+ * Update shader uniforms with current rendering values
246
+ * @param {Array} textures - List of 3D textures
247
+ * @param {Object} dimensions - Dimensions object
248
+ * @param {number} renderstyle - Rendering mode value
249
+ * @param {Array} contrastLimits - List of contrast limits for each channel
250
+ * @param {Array} colors - List of colors for each channel
251
+ * @param {number} layerTransparency - Overall transparency value
252
+ * @param {Vector2} xSlice - X clipping plane
253
+ * @param {Vector2} ySlice - Y clipping plane
254
+ * @param {Vector2} zSlice - Z clipping plane
255
+ */
256
+ updateUniforms(textures: any[], dimensions: Object, renderstyle: number, contrastLimits: any[], colors: any[], layerTransparency: number, xSlice: Vector2, ySlice: Vector2, zSlice: Vector2, brickCacheTexture: any, pageTableTexture: any): void;
257
+ /**
258
+ * Sets the processing render target
259
+ * @param {WebGLMultipleRenderTargets} mrt - Multiple render targets object with 3 attachments
260
+ */
261
+ setChannelMapping(channelMapping: any): void;
262
+ setZarrUniforms(zarrStore: any, PT: any): void;
263
+ }
264
+ import { Vector2 } from 'three';
265
+ //# sourceMappingURL=VolumeRenderManager.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"VolumeRenderManager.d.ts","sourceRoot":"","sources":["../src/VolumeRenderManager.js"],"names":[],"mappings":"AA4BA;;;GAGG;AACH;IAII,cAAoB;IACpB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;aAAkB;IAClB,oBAA0B;IAC1B,uBAA6B;IAC7B,kBAAwB;IACxB,kBAAqB;IAGrB,uBAAyB;IACzB,sBAAwB;IACxB,6BAAmC;IACnC,iCAAmC;IACnC,cAAgB;IAChB,sBAAwB;IACxB,0BAA4B;IAC5B,gBAAqC;IACrC,gBAAqC;IACrC,gBAAqC;IACrC,wBAA8B;IAC9B,6BAAmC;IACnC,wBAA8B;IAE9B,iBAAmB;IACnB,qBAAwB;IAS1B;;OAEG;IACH,yBAIC;IAED;;;;OAIG;IACH,yCAHW,MAAM,GACJ,MAAM,CAqIlB;IAED;;;;OAIG;IACH,uBAHW,MAAM,GACJ,OAAO,CAsBnB;IAPC,mBAA2C;IAS7C;;;;OAIG;IACH,yJAHW,MAAM,GACJ,MAAM,GAAC,IAAI,CAsIvB;IAzCG,qBAAyC;IA2C7C;;;;;;;;;;;OAWG;IACH,4CATW,MAAM,eACN,MAAM,2DAGN,MAAM,UACN,OAAO,UACP,OAAO,UACP,OAAO,uDA4HjB;IAED;;;OAGG;IAQH,6CAIC;IAKD,+CAkDC;CACF;wBAxkBM,OAAO"}