@aics/vole-core 3.12.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 (141) hide show
  1. package/LICENSE.txt +26 -0
  2. package/README.md +119 -0
  3. package/es/Atlas2DSlice.js +224 -0
  4. package/es/Channel.js +264 -0
  5. package/es/FileSaver.js +31 -0
  6. package/es/FusedChannelData.js +192 -0
  7. package/es/Histogram.js +250 -0
  8. package/es/ImageInfo.js +127 -0
  9. package/es/Light.js +74 -0
  10. package/es/Lut.js +500 -0
  11. package/es/MarchingCubes.js +507 -0
  12. package/es/MeshVolume.js +334 -0
  13. package/es/NaiveSurfaceNets.js +251 -0
  14. package/es/PathTracedVolume.js +482 -0
  15. package/es/RayMarchedAtlasVolume.js +250 -0
  16. package/es/RenderToBuffer.js +31 -0
  17. package/es/ThreeJsPanel.js +633 -0
  18. package/es/Timing.js +28 -0
  19. package/es/TrackballControls.js +538 -0
  20. package/es/View3d.js +848 -0
  21. package/es/Volume.js +352 -0
  22. package/es/VolumeCache.js +161 -0
  23. package/es/VolumeDims.js +16 -0
  24. package/es/VolumeDrawable.js +702 -0
  25. package/es/VolumeMaker.js +101 -0
  26. package/es/VolumeRenderImpl.js +1 -0
  27. package/es/VolumeRenderSettings.js +203 -0
  28. package/es/constants/basicShaders.js +29 -0
  29. package/es/constants/colors.js +59 -0
  30. package/es/constants/denoiseShader.js +43 -0
  31. package/es/constants/lights.js +42 -0
  32. package/es/constants/materials.js +85 -0
  33. package/es/constants/pathtraceOutputShader.js +13 -0
  34. package/es/constants/scaleBarSVG.js +21 -0
  35. package/es/constants/time.js +34 -0
  36. package/es/constants/volumePTshader.js +153 -0
  37. package/es/constants/volumeRayMarchShader.js +123 -0
  38. package/es/constants/volumeSliceShader.js +115 -0
  39. package/es/index.js +21 -0
  40. package/es/loaders/IVolumeLoader.js +131 -0
  41. package/es/loaders/JsonImageInfoLoader.js +255 -0
  42. package/es/loaders/OmeZarrLoader.js +495 -0
  43. package/es/loaders/OpenCellLoader.js +65 -0
  44. package/es/loaders/RawArrayLoader.js +89 -0
  45. package/es/loaders/TiffLoader.js +219 -0
  46. package/es/loaders/VolumeLoadError.js +44 -0
  47. package/es/loaders/VolumeLoaderUtils.js +221 -0
  48. package/es/loaders/index.js +40 -0
  49. package/es/loaders/zarr_utils/ChunkPrefetchIterator.js +143 -0
  50. package/es/loaders/zarr_utils/WrappedStore.js +51 -0
  51. package/es/loaders/zarr_utils/types.js +24 -0
  52. package/es/loaders/zarr_utils/utils.js +225 -0
  53. package/es/loaders/zarr_utils/validation.js +49 -0
  54. package/es/test/ChunkPrefetchIterator.test.js +208 -0
  55. package/es/test/RequestQueue.test.js +442 -0
  56. package/es/test/SubscribableRequestQueue.test.js +244 -0
  57. package/es/test/VolumeCache.test.js +118 -0
  58. package/es/test/VolumeRenderSettings.test.js +71 -0
  59. package/es/test/lut.test.js +671 -0
  60. package/es/test/num_utils.test.js +140 -0
  61. package/es/test/volume.test.js +98 -0
  62. package/es/test/zarr_utils.test.js +358 -0
  63. package/es/types/Atlas2DSlice.d.ts +41 -0
  64. package/es/types/Channel.d.ts +44 -0
  65. package/es/types/FileSaver.d.ts +6 -0
  66. package/es/types/FusedChannelData.d.ts +26 -0
  67. package/es/types/Histogram.d.ts +57 -0
  68. package/es/types/ImageInfo.d.ts +87 -0
  69. package/es/types/Light.d.ts +27 -0
  70. package/es/types/Lut.d.ts +67 -0
  71. package/es/types/MarchingCubes.d.ts +53 -0
  72. package/es/types/MeshVolume.d.ts +40 -0
  73. package/es/types/NaiveSurfaceNets.d.ts +11 -0
  74. package/es/types/PathTracedVolume.d.ts +65 -0
  75. package/es/types/RayMarchedAtlasVolume.d.ts +41 -0
  76. package/es/types/RenderToBuffer.d.ts +17 -0
  77. package/es/types/ThreeJsPanel.d.ts +107 -0
  78. package/es/types/Timing.d.ts +11 -0
  79. package/es/types/TrackballControls.d.ts +51 -0
  80. package/es/types/View3d.d.ts +357 -0
  81. package/es/types/Volume.d.ts +152 -0
  82. package/es/types/VolumeCache.d.ts +43 -0
  83. package/es/types/VolumeDims.d.ts +28 -0
  84. package/es/types/VolumeDrawable.d.ts +108 -0
  85. package/es/types/VolumeMaker.d.ts +49 -0
  86. package/es/types/VolumeRenderImpl.d.ts +22 -0
  87. package/es/types/VolumeRenderSettings.d.ts +98 -0
  88. package/es/types/constants/basicShaders.d.ts +4 -0
  89. package/es/types/constants/colors.d.ts +2 -0
  90. package/es/types/constants/denoiseShader.d.ts +40 -0
  91. package/es/types/constants/lights.d.ts +38 -0
  92. package/es/types/constants/materials.d.ts +20 -0
  93. package/es/types/constants/pathtraceOutputShader.d.ts +11 -0
  94. package/es/types/constants/scaleBarSVG.d.ts +2 -0
  95. package/es/types/constants/time.d.ts +19 -0
  96. package/es/types/constants/volumePTshader.d.ts +137 -0
  97. package/es/types/constants/volumeRayMarchShader.d.ts +117 -0
  98. package/es/types/constants/volumeSliceShader.d.ts +109 -0
  99. package/es/types/glsl.d.js +0 -0
  100. package/es/types/index.d.ts +28 -0
  101. package/es/types/loaders/IVolumeLoader.d.ts +113 -0
  102. package/es/types/loaders/JsonImageInfoLoader.d.ts +80 -0
  103. package/es/types/loaders/OmeZarrLoader.d.ts +87 -0
  104. package/es/types/loaders/OpenCellLoader.d.ts +9 -0
  105. package/es/types/loaders/RawArrayLoader.d.ts +33 -0
  106. package/es/types/loaders/TiffLoader.d.ts +45 -0
  107. package/es/types/loaders/VolumeLoadError.d.ts +18 -0
  108. package/es/types/loaders/VolumeLoaderUtils.d.ts +38 -0
  109. package/es/types/loaders/index.d.ts +22 -0
  110. package/es/types/loaders/zarr_utils/ChunkPrefetchIterator.d.ts +22 -0
  111. package/es/types/loaders/zarr_utils/WrappedStore.d.ts +24 -0
  112. package/es/types/loaders/zarr_utils/types.d.ts +94 -0
  113. package/es/types/loaders/zarr_utils/utils.d.ts +23 -0
  114. package/es/types/loaders/zarr_utils/validation.d.ts +7 -0
  115. package/es/types/test/ChunkPrefetchIterator.test.d.ts +1 -0
  116. package/es/types/test/RequestQueue.test.d.ts +1 -0
  117. package/es/types/test/SubscribableRequestQueue.test.d.ts +1 -0
  118. package/es/types/test/VolumeCache.test.d.ts +1 -0
  119. package/es/types/test/VolumeRenderSettings.test.d.ts +1 -0
  120. package/es/types/test/lut.test.d.ts +1 -0
  121. package/es/types/test/num_utils.test.d.ts +1 -0
  122. package/es/types/test/volume.test.d.ts +1 -0
  123. package/es/types/test/zarr_utils.test.d.ts +1 -0
  124. package/es/types/types.d.ts +115 -0
  125. package/es/types/utils/RequestQueue.d.ts +112 -0
  126. package/es/types/utils/SubscribableRequestQueue.d.ts +52 -0
  127. package/es/types/utils/num_utils.d.ts +43 -0
  128. package/es/types/workers/VolumeLoaderContext.d.ts +106 -0
  129. package/es/types/workers/types.d.ts +101 -0
  130. package/es/types/workers/util.d.ts +3 -0
  131. package/es/types.js +75 -0
  132. package/es/typings.d.js +0 -0
  133. package/es/utils/RequestQueue.js +267 -0
  134. package/es/utils/SubscribableRequestQueue.js +187 -0
  135. package/es/utils/num_utils.js +231 -0
  136. package/es/workers/FetchTiffWorker.js +153 -0
  137. package/es/workers/VolumeLoadWorker.js +129 -0
  138. package/es/workers/VolumeLoaderContext.js +271 -0
  139. package/es/workers/types.js +41 -0
  140. package/es/workers/util.js +8 -0
  141. package/package.json +83 -0
@@ -0,0 +1,6 @@
1
+ export default class FileSaver {
2
+ static save(blob: Blob, fname: string): void;
3
+ static saveString(s: string, fname: string): void;
4
+ static saveBinary(s: ArrayBuffer, fname: string): void;
5
+ static saveArrayBuffer(buffer: BlobPart, filename: string): void;
6
+ }
@@ -0,0 +1,26 @@
1
+ import { DataTexture, WebGLRenderer, Texture } from "three";
2
+ import Channel from "./Channel.js";
3
+ import type { FuseChannel } from "./types.js";
4
+ export default class FusedChannelData {
5
+ width: number;
6
+ height: number;
7
+ maskTexture: DataTexture;
8
+ private fuseRequested;
9
+ private channelsDataToFuse;
10
+ private fuseGeometry;
11
+ private fuseMaterialF;
12
+ private fuseMaterialUI;
13
+ private fuseMaterialI;
14
+ private fuseMaterialProps;
15
+ private fuseScene;
16
+ private quadCamera;
17
+ private fuseRenderTarget;
18
+ constructor(atlasX: number, atlasY: number);
19
+ private setupFuseMaterial;
20
+ getFusedTexture(): Texture;
21
+ cleanup(): void;
22
+ private getShader;
23
+ fuse(combination: FuseChannel[], channels: Channel[]): void;
24
+ gpuFuse(renderer: WebGLRenderer): void;
25
+ setChannelAsMask(idx: number, channel: Channel): boolean;
26
+ }
@@ -0,0 +1,57 @@
1
+ import type { TypedArray, NumberType } from "./types.js";
2
+ /**
3
+ * Builds a histogram with 256 bins from a data array. Assume data is 8 bit single channel grayscale.
4
+ * @class
5
+ * @param {Array.<number>} data
6
+ */
7
+ export default class Histogram {
8
+ private bins;
9
+ /** Min value in the original raw data. */
10
+ private min;
11
+ /** Max value in the original raw data. */
12
+ private max;
13
+ /** Size of each histogram bin in the scale of the original data. */
14
+ private binSize;
15
+ /** Index of the first bin (other than 0) with at least 1 value. */
16
+ private dataMinBin;
17
+ /** Index of the last bin (other than 0) with at least 1 value. */
18
+ private dataMaxBin;
19
+ private pixelCount;
20
+ maxBin: number;
21
+ constructor(data: TypedArray<NumberType>);
22
+ static findBin(dataValue: number, dataMin: number, binSize: number, numBins: number): number;
23
+ findBinOfValue(value: number): number;
24
+ /**
25
+ * Return the min data value
26
+ * @return {number}
27
+ */
28
+ getDataMin(): number;
29
+ /**
30
+ * Return the max data value
31
+ * @return {number}
32
+ */
33
+ getDataMax(): number;
34
+ /**
35
+ * Returns the first bin index with at least 1 value, other than the 0th bin.
36
+ * @return {number}
37
+ */
38
+ getMin(): number;
39
+ /**
40
+ * Returns the last bin index with at least 1 value, other than the 0th bin.
41
+ * @return {number}
42
+ */
43
+ getMax(): number;
44
+ getNumBins(): number;
45
+ getBin(i: number): number;
46
+ getBinRange(i: number): [number, number];
47
+ /**
48
+ * Find the bin that contains the percentage of pixels below it
49
+ * @return {number}
50
+ * @param {number} pct
51
+ */
52
+ findBinOfPercentile(pct: number): number;
53
+ findBestFitBins(): [number, number];
54
+ findAutoIJBins(): [number, number];
55
+ findAutoMinMax(): [number, number];
56
+ private static calculateHistogram;
57
+ }
@@ -0,0 +1,87 @@
1
+ import { type VolumeDims } from "./VolumeDims.js";
2
+ import { Vector3, Vector2 } from "three";
3
+ export type ImageInfo = Readonly<{
4
+ name: string;
5
+ /**
6
+ * XY dimensions of the texture atlas used by `RayMarchedAtlasVolume` and `Atlas2DSlice`, in number of z-slice
7
+ * tiles (not pixels). Chosen by the loader to lay out the 3D volume in the squarest possible 2D texture atlas.
8
+ */
9
+ atlasTileDims: [number, number];
10
+ /** Size of the currently loaded subregion, in pixels, in XYZ order */
11
+ subregionSize: [number, number, number];
12
+ /** Offset of the loaded subregion into the total volume, in pixels, in XYZ order */
13
+ subregionOffset: [number, number, number];
14
+ /** Number of channels in the image, accounting for convergence of multiple sources.
15
+ * Because of multiple sources, which is not accounted for in ImageInfo,
16
+ * that this could be different than the number of channels in the multiscaleLevelDims.
17
+ * NOTE Currently there is one ImageInfo per Volume, not per source.
18
+ */
19
+ combinedNumChannels: number;
20
+ /** The names of each channel */
21
+ channelNames: string[];
22
+ /** Optional overrides to default channel colors, in 0-255 range, RGB order */
23
+ channelColors?: [number, number, number][];
24
+ /** Dimensions of each scale level, at original size, from the first data source */
25
+ multiscaleLevelDims: VolumeDims[];
26
+ /** The scale level from which this image was loaded, between `0` and `numMultiscaleLevels-1` */
27
+ multiscaleLevel: number;
28
+ /**
29
+ * An *optional* transform which may be supplied by image metadata. It is *not* applied by
30
+ * default, but may be read and fed to `View3d` methods: `setVolumeTransform`,
31
+ * `setVolumeRotation`, `setVolumeScale`.
32
+ */
33
+ transform: {
34
+ /** Translation of the volume from the center of space, in volume voxels in XYZ order */
35
+ translation: [number, number, number];
36
+ /** Rotation of the volume in Euler angles, applied in XYZ order */
37
+ rotation: [number, number, number];
38
+ /** Scale of the volume relative to its size as derived from `multiscaleLevelDims`, in XYZ order */
39
+ scale: [number, number, number];
40
+ };
41
+ /** Arbitrary additional metadata not captured by other `ImageInfo` properties */
42
+ userData?: Record<string, unknown>;
43
+ }>;
44
+ export declare function defaultImageInfo(): ImageInfo;
45
+ export declare class CImageInfo {
46
+ imageInfo: ImageInfo;
47
+ constructor(imageInfo?: ImageInfo);
48
+ get currentLevelDims(): VolumeDims;
49
+ /** Number of channels in the image */
50
+ get numChannels(): number;
51
+ /** XYZ size of the *original* (not downsampled) volume, in pixels */
52
+ get originalSize(): Vector3;
53
+ /** Size of the volume, in pixels */
54
+ get volumeSize(): Vector3;
55
+ /** Size of a single *original* (not downsampled) pixel, in spatial units */
56
+ get physicalPixelSize(): Vector3;
57
+ /** Symbol of physical spatial unit used by `physicalPixelSize` */
58
+ get spatialUnit(): string;
59
+ /** Number of timesteps in the time series, or 1 if the image is not a time series */
60
+ get times(): number;
61
+ /** Size of each timestep in temporal units */
62
+ get timeScale(): number;
63
+ /** Symbol of physical time unit used by `timeScale` */
64
+ get timeUnit(): string;
65
+ /** Number of scale levels available for this volume */
66
+ get numMultiscaleLevels(): number;
67
+ /** The names of each channel */
68
+ get channelNames(): string[];
69
+ /** Optional overrides to default channel colors, in 0-255 range */
70
+ get channelColors(): [number, number, number][] | undefined;
71
+ /** Size of the currently loaded subregion, in pixels */
72
+ get subregionSize(): Vector3;
73
+ /** Offset of the loaded subregion into the total volume, in pixels */
74
+ get subregionOffset(): Vector3;
75
+ get multiscaleLevel(): number;
76
+ /**
77
+ * XY dimensions of the texture atlas used by `RayMarchedAtlasVolume` and `Atlas2DSlice`, in number of z-slice
78
+ * tiles (not pixels). Chosen by the loader to lay out the 3D volume in the squarest possible 2D texture atlas.
79
+ */
80
+ get atlasTileDims(): Vector2;
81
+ get transform(): {
82
+ translation: Vector3;
83
+ rotation: Vector3;
84
+ scale: Vector3;
85
+ };
86
+ }
87
+ export declare function computeAtlasSize(imageInfo: ImageInfo): [number, number];
@@ -0,0 +1,27 @@
1
+ import { Vector3, Matrix4 } from "three";
2
+ export declare const AREA_LIGHT = 0;
3
+ export declare const SKY_LIGHT = 1;
4
+ export declare class Light {
5
+ mTheta: number;
6
+ mPhi: number;
7
+ mWidth: number;
8
+ mHeight: number;
9
+ mDistance: number;
10
+ mSkyRadius: number;
11
+ mP: Vector3;
12
+ mTarget: Vector3;
13
+ mArea: number;
14
+ mColor: Vector3;
15
+ mColorTop: Vector3;
16
+ mColorMiddle: Vector3;
17
+ mColorBottom: Vector3;
18
+ mT: number;
19
+ mN: Vector3;
20
+ mU: Vector3;
21
+ mV: Vector3;
22
+ mHalfWidth: number;
23
+ mHalfHeight: number;
24
+ private mAreaPdf;
25
+ constructor(type: number);
26
+ update(targetPoint: Vector3, cameraMatrix?: Matrix4): void;
27
+ }
@@ -0,0 +1,67 @@
1
+ import Histogram from "./Histogram.js";
2
+ export declare const LUT_ENTRIES = 256;
3
+ export declare const LUT_ARRAY_LENGTH: number;
4
+ /**
5
+ * @typedef {Object} ControlPoint Used for the TF (transfer function) editor GUI.
6
+ * Need to be converted to LUT for rendering.
7
+ * @property {number} x The X Coordinate: an intensity value, normalized to the 0-255 range
8
+ * @property {number} opacity The Opacity, from 0 to 1
9
+ * @property {Array.<number>} color The Color, 3 numbers from 0-255 for r,g,b
10
+ */
11
+ export type ControlPoint = {
12
+ x: number;
13
+ opacity: number;
14
+ color: [number, number, number];
15
+ };
16
+ /**
17
+ * @typedef {Object} Lut Used for rendering. The start and end of the Lut represent the min and max of the data.
18
+ * @property {Array.<number>} lut LUT_ARRAY_LENGTH element lookup table as array
19
+ * (maps scalar intensity to a rgb color plus alpha, with each value from 0-255)
20
+ * @property {Array.<ControlPoint>} controlPoints
21
+ */
22
+ export declare class Lut {
23
+ lut: Uint8Array;
24
+ controlPoints: ControlPoint[];
25
+ constructor();
26
+ /**
27
+ * Generate a piecewise linear lookup table that ramps up from 0 to 1 over the b to e domain.
28
+ * If e === b, then we use a step function with f(b) = 0 and f(b + 1) = 1
29
+ * |
30
+ * 1| +---------+-----
31
+ * | /
32
+ * | /
33
+ * | /
34
+ * | /
35
+ * | /
36
+ * 0+=========+---------------+-----
37
+ * 0 b e 255
38
+ * @return {Lut}
39
+ * @param {number} b
40
+ * @param {number} e
41
+ */
42
+ createFromMinMax(b: number, e: number): Lut;
43
+ createFullRange(): Lut;
44
+ /**
45
+ * Generate a Window/level lookup table
46
+ * @return {Lut}
47
+ * @param {number} wnd in 0..1 range
48
+ * @param {number} lvl in 0..1 range
49
+ */
50
+ createFromWindowLevel(wnd: number, lvl: number): Lut;
51
+ createFromControlPoints(controlPoints: ControlPoint[]): Lut;
52
+ /**
53
+ * Generate an "equalized" lookup table
54
+ * @return {Lut}
55
+ */
56
+ createFromEqHistogram(histogram: Histogram): Lut;
57
+ /**
58
+ * Generate a lookup table with a different color per intensity value.
59
+ * This translates to a unique color per histogram bin with more than zero pixels.
60
+ * TODO THIS IS NOT THE EFFECT WE WANT. Colorize should operate on actual data values, not histogram bins.
61
+ * @return {Lut}
62
+ */
63
+ createLabelColors(histogram: Histogram): Lut;
64
+ remapDomains(oldMin: number, oldMax: number, newMin: number, newMax: number): void;
65
+ }
66
+ export declare function remapLut(lut: Uint8Array, oldMin: number, oldMax: number, newMin: number, newMax: number): Uint8Array;
67
+ export declare function remapControlPoints(controlPoints: ControlPoint[], oldMin: number, oldMax: number, newMin: number, newMax: number, nudgeEndPoints?: boolean): ControlPoint[];
@@ -0,0 +1,53 @@
1
+ /**
2
+ * Port of http://webglsamples.org/blob/blob.html
3
+ */
4
+ import { BufferGeometry, Material, Mesh } from "three";
5
+ import type { TypedArray, NumberType } from "./types.js";
6
+ declare class MarchingCubes extends Mesh {
7
+ isovalue: number;
8
+ enableUvs: boolean;
9
+ enableColors: boolean;
10
+ enableNormals: boolean;
11
+ dirty: boolean;
12
+ resolution: [number, number, number];
13
+ stepSizeX: number;
14
+ stepSizeY: number;
15
+ stepSizeZ: number;
16
+ sizeX: number;
17
+ sizeY: number;
18
+ sizeZ: number;
19
+ sizeXY: number;
20
+ sizeXYZ: number;
21
+ size3: number;
22
+ halfsizeX: number;
23
+ halfsizeY: number;
24
+ halfsizeZ: number;
25
+ deltaX: number;
26
+ deltaY: number;
27
+ deltaZ: number;
28
+ yd: number;
29
+ zd: number;
30
+ field: TypedArray<NumberType>;
31
+ normal_cache: Float32Array;
32
+ maxCount: number;
33
+ count: number;
34
+ hasPositions: boolean;
35
+ hasNormals: boolean;
36
+ hasColors: boolean;
37
+ hasUvs: boolean;
38
+ positionArray: Float32Array;
39
+ normalArray: Float32Array;
40
+ uvArray: Float32Array;
41
+ colorArray: Float32Array;
42
+ private init;
43
+ private begin;
44
+ private end;
45
+ private reset;
46
+ render: (renderCallback: (mc: MarchingCubes) => void) => void;
47
+ generateGeometry: () => BufferGeometry[] | undefined;
48
+ constructor(resolution: [number, number, number], material: Material, enableUvs: boolean, enableColors: boolean, enableNormals: boolean, volumeFieldRef: TypedArray<NumberType>);
49
+ }
50
+ declare const edgeTable: Int32Array;
51
+ declare const triTable: Int32Array;
52
+ export { MarchingCubes, edgeTable, triTable };
53
+ export default MarchingCubes;
@@ -0,0 +1,40 @@
1
+ import { BufferGeometry, Euler, Object3D, Vector3, Group, Material } from "three";
2
+ import Volume from "./Volume.js";
3
+ export default class MeshVolume {
4
+ private volume;
5
+ private meshRoot;
6
+ private meshPivot;
7
+ private meshrep;
8
+ private channelColors;
9
+ private channelOpacities;
10
+ private bounds;
11
+ private scale;
12
+ constructor(volume: Volume);
13
+ cleanup(): void;
14
+ setVisible(isVisible: boolean): void;
15
+ doRender(): void;
16
+ get3dObject(): Group;
17
+ setScale(scale: Vector3, position?: Vector3): void;
18
+ setFlipAxes(flipX: number, flipY: number, flipZ: number): void;
19
+ setTranslation(vec3xyz: Vector3): void;
20
+ setRotation(eulerXYZ: Euler): void;
21
+ setResolution(_x: number, _y: number): void;
22
+ setOrthoThickness(_value: number): void;
23
+ setAxisClip(axis: "x" | "y" | "z", minval: number, maxval: number, _isOrthoAxis: boolean): void;
24
+ updateMeshColors(channelColors: [number, number, number][]): void;
25
+ createMaterialForChannel(rgb: [number, number, number], alpha: number, _transp: boolean): Material;
26
+ createMeshForChannel(channelIndex: number, colorrgb: [number, number, number], isovalue: number, alpha: number, transp: boolean): Group;
27
+ updateIsovalue(channel: number, value: number): void;
28
+ getIsovalue(channel: number): number | undefined;
29
+ getOpacity(channel: number): number | undefined;
30
+ updateClipRegion(xmin: number, xmax: number, ymin: number, ymax: number, zmin: number, zmax: number): void;
31
+ updateClipFromBounds(): void;
32
+ updateOpacity(channel: number, value: number): void;
33
+ hasIsosurface(channel: number): boolean;
34
+ createIsosurface(channel: number, color: [number, number, number], value?: number, alpha?: number, transp?: boolean): void;
35
+ destroyIsosurface(channel: number): void;
36
+ saveChannelIsosurface(channelIndex: number, type: string, namePrefix: string): void;
37
+ exportSTL(input: Object3D, fname: string): void;
38
+ exportGLTF(input: Object3D, fname: string): void;
39
+ generateIsosurfaceGeometry(channelIndex: number, isovalue: number): BufferGeometry[];
40
+ }
@@ -0,0 +1,11 @@
1
+ declare namespace _default {
2
+ export { SurfaceNets as surfaceNets };
3
+ export { ConstructTHREEGeometry as constructTHREEGeometry };
4
+ }
5
+ export default _default;
6
+ declare function SurfaceNets(data: any, dims: any, isovalue: any): {
7
+ vertices: number[][];
8
+ faces: number[][];
9
+ };
10
+ declare function ConstructTHREEGeometry(surfaceNetResult: any): BufferGeometry[];
11
+ import { BufferGeometry } from "three/src/core/BufferGeometry";
@@ -0,0 +1,65 @@
1
+ import { Matrix4, Mesh, PerspectiveCamera, OrthographicCamera, WebGLRenderer } from "three";
2
+ import Volume from "./Volume.js";
3
+ import { type FuseChannel } from "./types.js";
4
+ import { Light } from "./Light.js";
5
+ import type { VolumeRenderImpl } from "./VolumeRenderImpl.js";
6
+ import { VolumeRenderSettings, SettingsFlags } from "./VolumeRenderSettings.js";
7
+ import Channel from "./Channel.js";
8
+ export default class PathTracedVolume implements VolumeRenderImpl {
9
+ private settings;
10
+ private volume;
11
+ private viewChannels;
12
+ private volumeTexture;
13
+ private cameraIsMoving;
14
+ private sampleCounter;
15
+ private frameCounter;
16
+ private pathTracingUniforms;
17
+ private pathTracingRenderToBuffer;
18
+ private pathTracingRenderTarget;
19
+ private screenTextureRenderToBuffer;
20
+ private screenTextureRenderTarget;
21
+ private denoiseShaderUniforms;
22
+ private screenOutputShaderUniforms;
23
+ private screenOutputDenoiseMaterial;
24
+ private screenOutputMaterial;
25
+ private screenOutputGeometry;
26
+ private screenOutputMesh;
27
+ private gradientDelta;
28
+ private renderUpdateListener?;
29
+ /**
30
+ * Creates a new PathTracedVolume.
31
+ * @param volume The volume that this renderer should render data from.
32
+ * @param settings Optional settings object. If set, updates the renderer with
33
+ * the given settings. Otherwise, uses the default VolumeRenderSettings.
34
+ */
35
+ constructor(volume: Volume, settings?: VolumeRenderSettings);
36
+ cleanup(): void;
37
+ setRenderUpdateListener(callback?: (iteration: number) => void): void;
38
+ resetProgress(): void;
39
+ private getNormVolumeSize;
40
+ /**
41
+ * If the new settings have changed, applies all changes to this volume renderer.
42
+ * @param newSettings
43
+ * @returns
44
+ */
45
+ updateSettings(newSettings: VolumeRenderSettings, dirtyFlags?: number | SettingsFlags): void;
46
+ updateVolumeDimensions(): void;
47
+ doRender(renderer: WebGLRenderer, camera: PerspectiveCamera | OrthographicCamera): void;
48
+ get3dObject(): Mesh;
49
+ onStartControls(): void;
50
+ onChangeControls(): void;
51
+ onEndControls(): void;
52
+ viewpointMoved(): void;
53
+ updateActiveChannels(channelColors: FuseChannel[], channelData: Channel[]): void;
54
+ updateVolumeData4(): void;
55
+ updateLuts(channelColors: FuseChannel[], channelData: Channel[]): void;
56
+ updateMaterial(): void;
57
+ updateShadingMethod(brdf: number): void;
58
+ updateShowLights(showlights: number): void;
59
+ updateExposure(e: number): void;
60
+ updateCamera(fov: number, focalDistance: number, apertureSize: number): void;
61
+ updateLights(state: Light[]): void;
62
+ updateLightsSecondary(cameraMatrix?: Matrix4): void;
63
+ updateClipRegion(xmin: number, xmax: number, ymin: number, ymax: number, zmin: number, zmax: number): void;
64
+ setZSlice(_slice: number): boolean;
65
+ }
@@ -0,0 +1,41 @@
1
+ import { DepthTexture, Group, OrthographicCamera, PerspectiveCamera, Texture, WebGLRenderer } from "three";
2
+ import { Volume } from "./index.js";
3
+ import Channel from "./Channel.js";
4
+ import type { VolumeRenderImpl } from "./VolumeRenderImpl.js";
5
+ import type { FuseChannel } from "./types.js";
6
+ import { VolumeRenderSettings, SettingsFlags } from "./VolumeRenderSettings.js";
7
+ export default class RayMarchedAtlasVolume implements VolumeRenderImpl {
8
+ private settings;
9
+ volume: Volume;
10
+ private geometry;
11
+ private geometryMesh;
12
+ private boxHelper;
13
+ private tickMarksMesh;
14
+ private geometryTransformNode;
15
+ private uniforms;
16
+ private channelData;
17
+ private emptyPositionTex;
18
+ /**
19
+ * Creates a new RayMarchedAtlasVolume.
20
+ * @param volume The volume that this renderer should render data from.
21
+ * @param settings Optional settings object. If set, updates the renderer with
22
+ * the given settings. Otherwise, uses the default VolumeRenderSettings.
23
+ */
24
+ constructor(volume: Volume, settings?: VolumeRenderSettings);
25
+ updateVolumeDimensions(): void;
26
+ viewpointMoved(): void;
27
+ updateSettings(newSettings: VolumeRenderSettings, dirtyFlags?: number | SettingsFlags): void;
28
+ /**
29
+ * Creates the geometry mesh and material for rendering the volume.
30
+ * @param uniforms object containing uniforms to pass to the shader material.
31
+ * @returns the new geometry and geometry mesh.
32
+ */
33
+ private createGeometry;
34
+ private createTickMarks;
35
+ cleanup(): void;
36
+ doRender(renderer: WebGLRenderer, camera: PerspectiveCamera | OrthographicCamera, depthTexture?: DepthTexture | Texture): void;
37
+ get3dObject(): Group;
38
+ private setUniform;
39
+ updateActiveChannels(channelcolors: FuseChannel[], channeldata: Channel[]): void;
40
+ setRenderUpdateListener(_listener?: ((iteration: number) => void) | undefined): void;
41
+ }
@@ -0,0 +1,17 @@
1
+ import { IUniform, Mesh, OrthographicCamera, PlaneGeometry, WebGLRenderer, Scene, ShaderMaterial, WebGLRenderTarget } from "three";
2
+ /**
3
+ * Helper for render passes that just require a fragment shader: accepts a fragment shader and its
4
+ * uniforms, and handles the ceremony of rendering a fullscreen quad with a simple vertex shader.
5
+ */
6
+ export default class RenderToBuffer {
7
+ scene: Scene;
8
+ geometry: PlaneGeometry;
9
+ material: ShaderMaterial;
10
+ mesh: Mesh;
11
+ camera: OrthographicCamera;
12
+ constructor(fragmentSrc: string, uniforms: {
13
+ [key: string]: IUniform;
14
+ });
15
+ /** Renders this pass to `target` using `renderer`, or to the canvas if no `target` is given. */
16
+ render(renderer: WebGLRenderer, target?: WebGLRenderTarget): void;
17
+ }
@@ -0,0 +1,107 @@
1
+ import { Color, Event, EventListener, OrthographicCamera, PerspectiveCamera, WebGLRenderer, Scene, DepthTexture } from "three";
2
+ import TrackballControls from "./TrackballControls.js";
3
+ import { ViewportCorner } from "./types.js";
4
+ export declare const VOLUME_LAYER = 0;
5
+ export declare const MESH_LAYER = 1;
6
+ export type CameraState = {
7
+ position: [number, number, number];
8
+ up: [number, number, number];
9
+ target: [number, number, number];
10
+ /** Full vertical FOV in degrees, from bottom to top of the view frustum. Defined only for perspective cameras. */
11
+ fov?: number;
12
+ /** The scale value for the orthographic camera controls; undefined for perspective cameras. */
13
+ orthoScale?: number;
14
+ };
15
+ export declare class ThreeJsPanel {
16
+ containerdiv: HTMLDivElement;
17
+ private canvas;
18
+ scene: Scene;
19
+ private meshRenderTarget;
20
+ private meshRenderToBuffer;
21
+ animateFuncs: ((renderer: WebGLRenderer, camera: PerspectiveCamera | OrthographicCamera, depthTexture?: DepthTexture) => void)[];
22
+ private inRenderLoop;
23
+ private requestedRender;
24
+ hasWebGL2: boolean;
25
+ renderer: WebGLRenderer;
26
+ private timer;
27
+ private fov;
28
+ private perspectiveCamera;
29
+ private perspectiveControls;
30
+ private orthographicCameraX;
31
+ private orthoControlsX;
32
+ private orthographicCameraY;
33
+ private orthoControlsY;
34
+ private orthographicCameraZ;
35
+ private orthoControlsZ;
36
+ camera: PerspectiveCamera | OrthographicCamera;
37
+ private viewMode;
38
+ controls: TrackballControls;
39
+ private controlEndHandler?;
40
+ private controlChangeHandler?;
41
+ private controlStartHandler?;
42
+ showAxis: boolean;
43
+ private axisScale;
44
+ private axisOffset;
45
+ private axisHelperScene;
46
+ private axisHelperObject;
47
+ private axisCamera;
48
+ private scaleBarContainerElement;
49
+ private orthoScaleBarElement;
50
+ showOrthoScaleBar: boolean;
51
+ private perspectiveScaleBarElement;
52
+ showPerspectiveScaleBar: boolean;
53
+ private timestepIndicatorElement;
54
+ showTimestepIndicator: boolean;
55
+ private dataurlcallback?;
56
+ constructor(parentElement: HTMLElement | undefined, _useWebGL2: boolean);
57
+ updateCameraFocus(fov: number, _focalDistance: number, _apertureSize: number): void;
58
+ resetPerspectiveCamera(): void;
59
+ resetOrthographicCameraX(): void;
60
+ resetOrthographicCameraY(): void;
61
+ resetOrthographicCameraZ(): void;
62
+ requestCapture(dataurlcallback: (name: string) => void): void;
63
+ isVR(): boolean;
64
+ resetToPerspectiveCamera(): void;
65
+ resetCamera(): void;
66
+ setupAxisHelper(): void;
67
+ setAxisPosition(marginX: number, marginY: number, corner: ViewportCorner): void;
68
+ orthoScreenPixelsToPhysicalUnits(pixels: number, physicalUnitsPerWorldUnit: number): number;
69
+ setupIndicatorElements(): void;
70
+ updateOrthoScaleBar(scale: number, unit?: string): void;
71
+ updatePerspectiveScaleBar(length: number, unit?: string): void;
72
+ updateTimestepIndicator(progress: number, total: number, unit: string): void;
73
+ setPerspectiveScaleBarColor(color: [number, number, number]): void;
74
+ updateScaleBarVisibility(): void;
75
+ setShowOrthoScaleBar(visible: boolean): void;
76
+ setShowPerspectiveScaleBar(visible: boolean): void;
77
+ setShowTimestepIndicator(visible: boolean): void;
78
+ setIndicatorPosition(timestep: boolean, marginX: number, marginY: number, corner: ViewportCorner): void;
79
+ setAutoRotate(rotate: boolean): void;
80
+ getAutoRotate(): boolean;
81
+ replaceCamera(newCam: PerspectiveCamera | OrthographicCamera): void;
82
+ replaceControls(newControls: TrackballControls): void;
83
+ switchViewMode(mode: string): void;
84
+ getMeshDepthTexture(): DepthTexture;
85
+ resize(comp: HTMLElement | null, w?: number, h?: number, _ow?: number, _oh?: number, _eOpts?: unknown): void;
86
+ setClearColor(color: Color, alpha: number): void;
87
+ getWidth(): number;
88
+ getHeight(): number;
89
+ getCameraState(): CameraState;
90
+ /**
91
+ * Updates the camera's state, including the position, up vector, target position,
92
+ * scaling, and FOV. If values are missing from `state`, they will be left unchanged.
93
+ *
94
+ * @param state Partial `CameraState` object.
95
+ *
96
+ * If an OrthographicCamera is used, the camera's position will be constrained to match
97
+ * the `target` position along the current view mode.
98
+ */
99
+ setCameraState(state: Partial<CameraState>): void;
100
+ render(): void;
101
+ redraw(): void;
102
+ onAnimationLoop(): void;
103
+ startRenderLoop(): void;
104
+ stopRenderLoop(): void;
105
+ removeControlHandlers(): void;
106
+ setControlHandlers(onstart: EventListener<Event, "start", TrackballControls>, onchange: EventListener<Event, "change", TrackballControls>, onend: EventListener<Event, "end", TrackballControls>): void;
107
+ }
@@ -0,0 +1,11 @@
1
+ export default class Timing {
2
+ private beginTime;
3
+ private prevTime;
4
+ private frames;
5
+ lastFrameMs: number;
6
+ private lastFPS;
7
+ constructor();
8
+ begin(): void;
9
+ end(): number;
10
+ update(): void;
11
+ }
@@ -0,0 +1,51 @@
1
+ export default TrackballControls;
2
+ declare class TrackballControls extends EventDispatcher<import("three").Event> {
3
+ constructor(object: any, domElement: any);
4
+ object: any;
5
+ domElement: any;
6
+ enabled: boolean;
7
+ screen: {
8
+ left: number;
9
+ top: number;
10
+ width: number;
11
+ height: number;
12
+ };
13
+ length: number;
14
+ scale: number;
15
+ scale0: number;
16
+ aspect: number;
17
+ rotateSpeed: number;
18
+ zoomSpeed: number;
19
+ panSpeed: number;
20
+ noRotate: boolean;
21
+ noZoom: boolean;
22
+ noPan: boolean;
23
+ staticMoving: boolean;
24
+ dynamicDampingFactor: number;
25
+ minDistance: number;
26
+ maxDistance: number;
27
+ keys: string[];
28
+ mouseButtons: {
29
+ LEFT: MOUSE;
30
+ MIDDLE: MOUSE;
31
+ RIGHT: MOUSE;
32
+ };
33
+ autoRotate: boolean;
34
+ autoRotateSpeed: number;
35
+ target: Vector3;
36
+ target0: Vector3;
37
+ position0: any;
38
+ up0: any;
39
+ zoom0: any;
40
+ handleResize: () => void;
41
+ rotateCamera: (delta: any) => void;
42
+ zoomCamera: () => void;
43
+ panCamera: () => void;
44
+ checkDistances: () => void;
45
+ update: (delta: any) => void;
46
+ reset: () => void;
47
+ dispose: () => void;
48
+ }
49
+ import { EventDispatcher } from "three/src/core/EventDispatcher";
50
+ import { MOUSE } from "three/src/constants";
51
+ import { Vector3 } from "three/src/math/Vector3";