@idetik/core 0.28.0 → 0.29.1

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 (67) hide show
  1. package/README.md +34 -9
  2. package/dist/assets/worker_kernel-CBlE4MBI.js.map +1 -1
  3. package/dist/index.d.ts +122 -4
  4. package/dist/index.js +1921 -1870
  5. package/dist/index.js.map +1 -1
  6. package/dist/index.umd.cjs +34 -34
  7. package/dist/index.umd.cjs.map +1 -1
  8. package/dist/types/src/core/channel.d.ts +1 -0
  9. package/dist/types/src/core/channel.d.ts.map +1 -1
  10. package/dist/types/src/core/image_source_policy.d.ts +4 -0
  11. package/dist/types/src/core/image_source_policy.d.ts.map +1 -1
  12. package/dist/types/src/core/layer.d.ts +17 -0
  13. package/dist/types/src/core/layer.d.ts.map +1 -1
  14. package/dist/types/src/data/chunk.d.ts +2 -0
  15. package/dist/types/src/data/chunk.d.ts.map +1 -1
  16. package/dist/types/src/data/chunk_manager.d.ts +7 -1
  17. package/dist/types/src/data/chunk_manager.d.ts.map +1 -1
  18. package/dist/types/src/data/chunk_queue.d.ts +1 -1
  19. package/dist/types/src/data/chunk_queue.d.ts.map +1 -1
  20. package/dist/types/src/data/ome_zarr/image_loader.d.ts +2 -0
  21. package/dist/types/src/data/ome_zarr/image_loader.d.ts.map +1 -1
  22. package/dist/types/src/data/ome_zarr/image_source.d.ts +5 -1
  23. package/dist/types/src/data/ome_zarr/image_source.d.ts.map +1 -1
  24. package/dist/types/src/data/ome_zarr/metadata_loaders.d.ts +4 -0
  25. package/dist/types/src/data/ome_zarr/metadata_loaders.d.ts.map +1 -1
  26. package/dist/types/src/idetik.d.ts +18 -0
  27. package/dist/types/src/idetik.d.ts.map +1 -1
  28. package/dist/types/src/index.d.ts +7 -1
  29. package/dist/types/src/index.d.ts.map +1 -1
  30. package/dist/types/src/layers/axes_layer.d.ts +1 -0
  31. package/dist/types/src/layers/axes_layer.d.ts.map +1 -1
  32. package/dist/types/src/layers/image_layer.d.ts +15 -0
  33. package/dist/types/src/layers/image_layer.d.ts.map +1 -1
  34. package/dist/types/src/layers/label_layer.d.ts +1 -0
  35. package/dist/types/src/layers/label_layer.d.ts.map +1 -1
  36. package/dist/types/src/layers/volume_layer.d.ts +1 -0
  37. package/dist/types/src/layers/volume_layer.d.ts.map +1 -1
  38. package/dist/types/src/math/color.d.ts +2 -0
  39. package/dist/types/src/math/color.d.ts.map +1 -1
  40. package/dist/types/src/objects/cameras/controls.d.ts +1 -0
  41. package/dist/types/src/objects/cameras/controls.d.ts.map +1 -1
  42. package/dist/types/src/objects/cameras/orbit_controls.d.ts +1 -0
  43. package/dist/types/src/objects/cameras/orbit_controls.d.ts.map +1 -1
  44. package/dist/types/src/objects/cameras/orthographic_camera.d.ts +23 -0
  45. package/dist/types/src/objects/cameras/orthographic_camera.d.ts.map +1 -1
  46. package/dist/types/src/objects/cameras/perspective_camera.d.ts +1 -0
  47. package/dist/types/src/objects/cameras/perspective_camera.d.ts.map +1 -1
  48. package/dist/types/src/objects/renderable/image_renderable.d.ts +1 -0
  49. package/dist/types/src/objects/renderable/image_renderable.d.ts.map +1 -1
  50. package/dist/types/src/objects/renderable/label_color_map.d.ts +1 -0
  51. package/dist/types/src/objects/renderable/label_color_map.d.ts.map +1 -1
  52. package/dist/types/src/objects/renderable/label_image_renderable.d.ts +1 -0
  53. package/dist/types/src/objects/renderable/label_image_renderable.d.ts.map +1 -1
  54. package/dist/types/src/objects/renderable/points.d.ts +1 -0
  55. package/dist/types/src/objects/renderable/points.d.ts.map +1 -1
  56. package/dist/types/src/objects/renderable/projected_line.d.ts +1 -0
  57. package/dist/types/src/objects/renderable/projected_line.d.ts.map +1 -1
  58. package/dist/types/src/objects/renderable/volume_renderable.d.ts +1 -0
  59. package/dist/types/src/objects/renderable/volume_renderable.d.ts.map +1 -1
  60. package/dist/types/src/objects/textures/texture.d.ts +2 -0
  61. package/dist/types/src/objects/textures/texture.d.ts.map +1 -1
  62. package/dist/types/src/renderers/webgl_textures.d.ts +1 -3
  63. package/dist/types/src/renderers/webgl_textures.d.ts.map +1 -1
  64. package/dist/types/src/renderers/webgpu/webgpu_renderer.d.ts.map +1 -1
  65. package/dist/types/src/renderers/webgpu/webgpu_texture_pool.d.ts +4 -0
  66. package/dist/types/src/renderers/webgpu/webgpu_texture_pool.d.ts.map +1 -1
  67. package/package.json +11 -3
package/dist/index.d.ts CHANGED
@@ -33,6 +33,7 @@ declare abstract class Texture extends Node {
33
33
  releaseCpuData(): void;
34
34
  abstract get width(): number;
35
35
  abstract get height(): number;
36
+ get depth(): number;
36
37
  get type(): string;
37
38
  }
38
39
 
@@ -95,6 +96,7 @@ type SourceDimensionLod = {
95
96
  scale: number;
96
97
  translation: number;
97
98
  };
99
+ /** @group Layer Configuration */
98
100
  type SliceCoordinates = {
99
101
  z?: number;
100
102
  c?: number[];
@@ -105,6 +107,7 @@ type ChunkSource = {
105
107
  };
106
108
  type ChunkLoader = {
107
109
  getSourceDimensionMap(): SourceDimensionMap;
110
+ getBytesPerElement(): number;
108
111
  loadChunkData(chunk: Chunk, signal: AbortSignal): Promise<void>;
109
112
  };
110
113
 
@@ -141,9 +144,13 @@ type ImageSourcePolicy = Readonly<{
141
144
  bias: number;
142
145
  };
143
146
  }>;
147
+ /** @group Layer Configuration */
144
148
  declare function createImageSourcePolicy(config: ImageSourcePolicyConfig): ImageSourcePolicy;
149
+ /** @group Layer Configuration */
145
150
  declare function createExplorationPolicy(overrides?: Partial<ImageSourcePolicyConfig>): ImageSourcePolicy;
151
+ /** @group Layer Configuration */
146
152
  declare function createPlaybackPolicy(overrides?: Partial<ImageSourcePolicyConfig>): ImageSourcePolicy;
153
+ /** @group Layer Configuration */
147
154
  declare function createNoPrefetchPolicy(overrides?: Partial<ImageSourcePolicyConfig>): ImageSourcePolicy;
148
155
 
149
156
  declare class ChunkStore {
@@ -251,7 +258,11 @@ declare class ChunkManager {
251
258
  private readonly queue_;
252
259
  private readonly uploadTexture_?;
253
260
  private readonly disposeTexture_?;
254
- constructor(uploadTexture?: (texture: Texture) => void, disposeTexture?: (texture: Texture) => void);
261
+ private readonly getGpuResidentBytes_;
262
+ private readonly memoryLimitBytes_;
263
+ private readonly maxGpuUploadsPerUpdate_;
264
+ constructor(uploadTexture?: (texture: Texture) => void, disposeTexture?: (texture: Texture) => void, getGpuResidentBytes?: () => number, memoryLimitBytes?: number, maxConcurrentRequests?: number, maxGpuUploadsPerUpdate?: number);
265
+ get memoryLimitBytes(): number;
255
266
  get queueStats(): QueueStats;
256
267
  get memoryStats(): {
257
268
  cpuChunkBytes: number;
@@ -259,6 +270,8 @@ declare class ChunkManager {
259
270
  };
260
271
  addView(source: ChunkSource, policy: ImageSourcePolicy): ChunkStoreView;
261
272
  update(): void;
273
+ private enqueueWithinBudget;
274
+ private chunkBytes;
262
275
  private uploadLoadedChunks;
263
276
  private disposeChunkTexture;
264
277
  }
@@ -334,7 +347,9 @@ declare class TrsTransform {
334
347
 
335
348
  type Shader = "floatScalarImage" | "floatVolume" | "intScalarImage" | "intVolume" | "labelImage" | "points" | "projectedLine" | "uintScalarImage" | "uintVolume" | "wireframe";
336
349
 
350
+ /** @group Layer Configuration */
337
351
  type ColorLike = Color | vec3 | vec4 | string;
352
+ /** @group Layer Configuration */
338
353
  declare class Color {
339
354
  static readonly RED: Color;
340
355
  static readonly GREEN: Color;
@@ -446,11 +461,34 @@ declare class EventDispatcher {
446
461
  private readonly handleEvent;
447
462
  }
448
463
 
464
+ /**
465
+ * A camera using an orthographic (parallel) projection.
466
+ *
467
+ * Orthographic projection has no perspective foreshortening, so object size is
468
+ * independent of distance from the camera. This is the camera to use for 2D
469
+ * image viewing, where it pairs naturally with {@link PanZoomControls}. The
470
+ * initial frame is given in world coordinates; zoom and pan are applied as
471
+ * scale and translation on top of that frame.
472
+ *
473
+ * @see {@link PerspectiveCamera} for 3D scenes with perspective projection.
474
+ *
475
+ * @group Cameras & Controls
476
+ */
449
477
  declare class OrthographicCamera extends Camera {
450
478
  private width_;
451
479
  private height_;
452
480
  private viewportAspectRatio_;
453
481
  private viewportSize_;
482
+ /**
483
+ * Creates an orthographic camera framing the given world-space rectangle.
484
+ *
485
+ * @param left - Left edge of the view frame, in world units.
486
+ * @param right - Right edge of the view frame, in world units.
487
+ * @param top - Top edge of the view frame, in world units.
488
+ * @param bottom - Bottom edge of the view frame, in world units.
489
+ * @param near - Near clipping plane distance. Defaults to `0.0`.
490
+ * @param far - Far clipping plane distance. Defaults to `100.0`.
491
+ */
454
492
  constructor(left: number, right: number, top: number, bottom: number, near?: number, far?: number);
455
493
  get viewportSize(): [number, number];
456
494
  setAspectRatio(aspectRatio: number): void;
@@ -466,6 +504,7 @@ interface CameraControls {
466
504
  onUpdate(dt: number): void;
467
505
  onEvent(event: EventContext): void;
468
506
  }
507
+ /** @group Cameras & Controls */
469
508
  declare class PanZoomControls implements CameraControls {
470
509
  private readonly camera_;
471
510
  private dragActive_;
@@ -519,6 +558,7 @@ declare class Viewport {
519
558
  private updateAspectRatio;
520
559
  }
521
560
 
561
+ /** @group Layers */
522
562
  type LayerState = "initialized" | "loading" | "ready";
523
563
  type BlendMode = "none" | "normal" | "additive" | "subtractive" | "multiply" | "premultiplied";
524
564
  type StateChangeCallback = (newState: LayerState, prevState?: LayerState) => void;
@@ -526,6 +566,22 @@ interface LayerOptions {
526
566
  opacity?: number;
527
567
  blendMode?: BlendMode;
528
568
  }
569
+ /**
570
+ * Abstract base class for everything that can be added to a viewport.
571
+ *
572
+ * A `Layer` owns a set of renderable objects and contributes them to the scene
573
+ * each frame. Subclasses (e.g. {@link ImageLayer}, {@link VolumeLayer},
574
+ * {@link LabelLayer}) implement {@link Layer.update} to build or refresh those
575
+ * objects for the current view, and may override the `attach`/`detach` hooks to
576
+ * acquire and release resources when the layer joins or leaves a viewport.
577
+ *
578
+ * Layers carry shared presentation state — {@link Layer.opacity} and blend mode —
579
+ * and expose a lifecycle {@link LayerState} (`initialized` → `loading` → `ready`)
580
+ * that observers can subscribe to. A layer instance may be attached to only one
581
+ * viewport at a time.
582
+ *
583
+ * @group Layers
584
+ */
529
585
  declare abstract class Layer {
530
586
  abstract readonly type: string;
531
587
  private objects_;
@@ -585,18 +641,24 @@ declare abstract class Renderer {
585
641
  set backgroundColor(color: ColorLike);
586
642
  }
587
643
 
644
+ /** @group Runtime */
588
645
  type Overlay = {
589
646
  update(idetik: Idetik): void;
590
647
  };
648
+ /** @inline */
591
649
  type IdetikParams = {
592
650
  canvas: HTMLCanvasElement;
593
651
  viewports?: ViewportConfig[];
594
652
  overlays?: Overlay[];
595
653
  showStats?: boolean;
654
+ memoryLimitMB?: number;
655
+ maxConcurrentRequests?: number;
656
+ maxGpuUploadsPerUpdate?: number;
596
657
  };
597
658
  type IdetikContext = {
598
659
  chunkManager: ChunkManager;
599
660
  };
661
+ /** @group Runtime */
600
662
  type MemoryStats = {
601
663
  cpuChunkBytes: number;
602
664
  cpuChunkCount: number;
@@ -605,6 +667,18 @@ type MemoryStats = {
605
667
  jsHeapUsedBytes?: number;
606
668
  jsHeapLimitBytes?: number;
607
669
  };
670
+ /**
671
+ * The top-level entry point for an Idetik visualization.
672
+ *
673
+ * An `Idetik` instance owns the renderer, the shared chunk manager, and one or
674
+ * more viewports. Each viewport pairs a camera, its controls, and a stack of
675
+ * layers and draws into a region of the canvas. Call {@link Idetik.start} to
676
+ * begin the render loop and {@link Idetik.stop} to halt it.
677
+ *
678
+ * @see {@link Layer} for the data layers rendered within a viewport.
679
+ *
680
+ * @group Runtime
681
+ */
608
682
  declare class Idetik {
609
683
  private readonly chunkManager_;
610
684
  private readonly context_;
@@ -975,8 +1049,10 @@ declare class OmeZarrImageLoader {
975
1049
  private readonly arrays_;
976
1050
  private readonly arrayParams_;
977
1051
  private readonly dimensions_;
1052
+ private readonly bytesPerElement_;
978
1053
  constructor(props: OmeZarrImageLoaderProps);
979
1054
  getSourceDimensionMap(): SourceDimensionMap;
1055
+ getBytesPerElement(): number;
980
1056
  loadChunkData(chunk: Chunk, signal: AbortSignal): Promise<void>;
981
1057
  }
982
1058
 
@@ -1284,11 +1360,15 @@ type Version = (typeof versions)[number];
1284
1360
  type AdaptedOme<T> = T & {
1285
1361
  originalVersion: Version;
1286
1362
  };
1363
+ /** @group Data Loading */
1287
1364
  declare function loadOmeZarrPlate(url: string, version?: Version): Promise<AdaptedOme<Plate["ome"]>>;
1365
+ /** @group Data Loading */
1288
1366
  declare function loadOmeZarrWell(url: string, path: string, version?: Version): Promise<AdaptedOme<Well["ome"]>>;
1289
1367
  type OmeroMetadata = NonNullable<Image$1["ome"]["omero"]>;
1290
1368
  type OmeroChannel = OmeroMetadata["channels"][number];
1369
+ /** @group Data Loading */
1291
1370
  declare function loadOmeroChannels(source: OmeZarrImageSource): Promise<OmeroChannel[]>;
1371
+ /** @group Data Loading */
1292
1372
  declare function loadOmeroDefaults(source: OmeZarrImageSource): Promise<OmeroMetadata["rdefs"]>;
1293
1373
 
1294
1374
  type HttpOmeZarrImageSourceProps = {
@@ -1300,7 +1380,11 @@ type FileSystemOmeZarrImageSourceProps = {
1300
1380
  version?: Version;
1301
1381
  path?: `/${string}`;
1302
1382
  };
1303
- /** Opens an OME-Zarr multiscale image Zarr group from either a URL or local directory. */
1383
+ /**
1384
+ * Opens an OME-Zarr multiscale image Zarr group from either a URL or local directory.
1385
+ *
1386
+ * @group Data Loading
1387
+ */
1304
1388
  declare class OmeZarrImageSource {
1305
1389
  readonly location: Location<Readable>;
1306
1390
  readonly version?: Version;
@@ -1329,6 +1413,7 @@ declare class OmeZarrImageSource {
1329
1413
  static fromFileSystem(props: FileSystemOmeZarrImageSourceProps): Promise<OmeZarrImageSource>;
1330
1414
  }
1331
1415
 
1416
+ /** @group Layers */
1332
1417
  declare class AxesLayer extends Layer {
1333
1418
  readonly type = "AxesLayer";
1334
1419
  constructor(params: {
@@ -1338,6 +1423,7 @@ declare class AxesLayer extends Layer {
1338
1423
  update(): void;
1339
1424
  }
1340
1425
 
1426
+ /** @group Layer Configuration */
1341
1427
  type ChannelProps = {
1342
1428
  visible?: boolean;
1343
1429
  color?: ColorLike;
@@ -1358,6 +1444,7 @@ interface PointPickingResult {
1358
1444
  value: number;
1359
1445
  }
1360
1446
 
1447
+ /** @inline */
1361
1448
  type ImageLayerProps = LayerOptions & {
1362
1449
  source: ChunkSource;
1363
1450
  sliceCoords: SliceCoordinates;
@@ -1365,6 +1452,20 @@ type ImageLayerProps = LayerOptions & {
1365
1452
  channelProps?: ChannelProps[];
1366
1453
  onPickValue?: (info: PointPickingResult) => void;
1367
1454
  };
1455
+ /**
1456
+ * A layer that renders a 2D slice of a chunked, multi-channel image source.
1457
+ *
1458
+ * `ImageLayer` streams chunks from a `ChunkSource` (e.g.
1459
+ * {@link OmeZarrImageSource}) according to the supplied `ImageSourcePolicy`,
1460
+ * which decides which resolution levels and chunks to load for the current
1461
+ * view. Per-channel appearance (contrast limits,
1462
+ * color, visibility) is controlled via {@link ChannelProps}, and the visible
1463
+ * slice is selected with {@link SliceCoordinates}.
1464
+ *
1465
+ * @see {@link VolumeLayer} for 3D volume rendering of the same data.
1466
+ *
1467
+ * @group Layers
1468
+ */
1368
1469
  declare class ImageLayer extends Layer implements ChannelsEnabled {
1369
1470
  readonly type = "ImageLayer";
1370
1471
  private readonly source_;
@@ -1421,6 +1522,7 @@ type VolumeLayerProps = {
1421
1522
  policy: ImageSourcePolicy;
1422
1523
  channelProps?: ChannelProps[];
1423
1524
  };
1525
+ /** @group Layers */
1424
1526
  declare class VolumeLayer extends Layer implements ChannelsEnabled {
1425
1527
  readonly type = "VolumeLayer";
1426
1528
  private readonly source_;
@@ -1464,6 +1566,7 @@ type LabelColorMapProps = {
1464
1566
  lookupTable?: ReadonlyMap<number, ColorLike>;
1465
1567
  cycle?: ColorLike[];
1466
1568
  };
1569
+ /** @group Renderable Objects */
1467
1570
  declare class LabelColorMap {
1468
1571
  readonly lookupTable: ReadonlyMap<number, Color>;
1469
1572
  readonly cycle: ReadonlyArray<Color>;
@@ -1478,6 +1581,7 @@ type LabelLayerProps = LayerOptions & {
1478
1581
  onPickValue?: (info: PointPickingResult) => void;
1479
1582
  outlineSelected?: boolean;
1480
1583
  };
1584
+ /** @group Layers */
1481
1585
  declare class LabelLayer extends Layer {
1482
1586
  readonly type = "LabelLayer";
1483
1587
  private readonly source_;
@@ -1528,6 +1632,7 @@ type UniformValues = {
1528
1632
  u_valueScale: number;
1529
1633
  u_zTexCoord: number;
1530
1634
  };
1635
+ /** @group Renderable Objects */
1531
1636
  declare class ImageRenderable extends RenderableObject {
1532
1637
  private channels_;
1533
1638
  zTexCoord: number;
@@ -1546,6 +1651,7 @@ type LabelImageRenderableProps = {
1546
1651
  outlineSelected?: boolean;
1547
1652
  selectedValue?: number | null;
1548
1653
  };
1654
+ /** @group Renderable Objects */
1549
1655
  declare class LabelImageRenderable extends RenderableObject {
1550
1656
  private outlineSelected_;
1551
1657
  private selectedValue_;
@@ -1573,6 +1679,7 @@ type PointProperties = {
1573
1679
  size: number;
1574
1680
  marker: Marker;
1575
1681
  };
1682
+ /** @group Renderable Objects */
1576
1683
  declare class Points extends RenderableObject {
1577
1684
  constructor(points: PointProperties[]);
1578
1685
  get type(): string;
@@ -1589,6 +1696,7 @@ type LineParameters = {
1589
1696
  color: ColorLike;
1590
1697
  width: number;
1591
1698
  };
1699
+ /** @group Renderable Objects */
1592
1700
  declare class ProjectedLine extends RenderableObject {
1593
1701
  private color_;
1594
1702
  private width_;
@@ -1604,6 +1712,7 @@ declare class ProjectedLine extends RenderableObject {
1604
1712
  };
1605
1713
  }
1606
1714
 
1715
+ /** @group Renderable Objects */
1607
1716
  declare class VolumeRenderable extends RenderableObject {
1608
1717
  voxelScale: vec3;
1609
1718
  private channels_;
@@ -1632,6 +1741,7 @@ type PerspectiveCameraOptions = {
1632
1741
  far?: number;
1633
1742
  position?: vec3;
1634
1743
  };
1744
+ /** @group Cameras & Controls */
1635
1745
  declare class PerspectiveCamera extends Camera {
1636
1746
  private fov_;
1637
1747
  private aspectRatio_;
@@ -1650,6 +1760,7 @@ type OrbitParams = {
1650
1760
  target?: vec3;
1651
1761
  dampingFactor?: number;
1652
1762
  };
1763
+ /** @group Cameras & Controls */
1653
1764
  declare class OrbitControls implements CameraControls {
1654
1765
  private readonly camera_;
1655
1766
  private readonly orbitVelocity_;
@@ -1875,5 +1986,12 @@ declare const Image: z.ZodObject<{
1875
1986
  }>;
1876
1987
  type Image = z.infer<typeof Image>;
1877
1988
 
1878
- export { AxesLayer, Color, Idetik, ImageLayer, ImageRenderable, LabelColorMap, LabelImageRenderable, LabelLayer, Layer, Image as OmeZarrImage, OmeZarrImageSource, OrbitControls, OrthographicCamera, PanZoomControls, PerspectiveCamera, Points, ProjectedLine, VolumeLayer, VolumeRenderable, createExplorationPolicy, createImageSourcePolicy, createNoPrefetchPolicy, createPlaybackPolicy, loadOmeZarrPlate, loadOmeZarrWell, loadOmeroChannels, loadOmeroDefaults };
1879
- export type { ChannelProps, ColorLike, LayerState, MemoryStats, Overlay, SliceCoordinates };
1989
+ /**
1990
+ * Parsed OME-Zarr (OME-NGFF 0.4) image metadata.
1991
+ *
1992
+ * @group Data Loading
1993
+ */
1994
+ type OmeZarrImage = Image;
1995
+
1996
+ export { AxesLayer, Color, Idetik, ImageLayer, ImageRenderable, LabelColorMap, LabelImageRenderable, LabelLayer, Layer, OmeZarrImageSource, OrbitControls, OrthographicCamera, PanZoomControls, PerspectiveCamera, Points, ProjectedLine, VolumeLayer, VolumeRenderable, createExplorationPolicy, createImageSourcePolicy, createNoPrefetchPolicy, createPlaybackPolicy, loadOmeZarrPlate, loadOmeZarrWell, loadOmeroChannels, loadOmeroDefaults };
1997
+ export type { ChannelProps, ColorLike, LayerState, MemoryStats, OmeZarrImage, Overlay, SliceCoordinates };