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