@niivue/niivue 0.44.1 → 0.44.2-dev.2
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.
- package/README.md +9 -0
- package/build/index.d.ts +31 -6
- package/build/index.js +531 -135
- package/build/index.js.map +1 -1
- package/build/index.min.js +1 -1
- package/dist/index.d.ts +106 -18
- package/dist/index.js +26377 -30692
- package/dist/index.js.map +1 -1
- package/dist/index.min.js +1 -1
- package/package.json +18 -17
- package/src/index.html +46 -7
- package/src/index_segment.html +233 -0
- package/src/index_sync.html +333 -0
- package/src/niivue/index.ts +1054 -147
- package/src/niivue.css +0 -1
- package/src/nvdocument.ts +40 -5
- package/src/nvimage/index.ts +4 -1
- package/src/nvimage/utils.ts +61 -42
- package/src/nvlabel.ts +34 -1
- package/src/nvmesh-loaders.ts +24 -1
- package/src/shader-srcs.ts +84 -3
- package/src/types.ts +13 -0
- package/dist/niivue.umd.js +0 -1792
package/dist/index.d.ts
CHANGED
|
@@ -107,6 +107,18 @@ declare enum LabelLineTerminator {
|
|
|
107
107
|
CIRCLE = "circle",
|
|
108
108
|
RING = "ring"
|
|
109
109
|
}
|
|
110
|
+
declare enum LabelAnchorPoint {
|
|
111
|
+
NONE = 0,
|
|
112
|
+
TOPLEFT = 9,
|
|
113
|
+
TOPCENTER = 10,
|
|
114
|
+
TOPRIGHT = 12,
|
|
115
|
+
MIDDLELEFT = 17,
|
|
116
|
+
MIDDLECENTER = 18,
|
|
117
|
+
MIDDLERIGHT = 20,
|
|
118
|
+
BOTTOMLEFT = 33,
|
|
119
|
+
BOTTOMCENTER = 34,
|
|
120
|
+
BOTTOMRIGHT = 36
|
|
121
|
+
}
|
|
110
122
|
/**
|
|
111
123
|
* Class representing label style.
|
|
112
124
|
* @ignore
|
|
@@ -140,12 +152,14 @@ declare class NVLabel3D {
|
|
|
140
152
|
text: string;
|
|
141
153
|
style: NVLabel3DStyle;
|
|
142
154
|
points?: number[] | number[][];
|
|
155
|
+
anchor: LabelAnchorPoint;
|
|
156
|
+
onClick?: (label: NVLabel3D) => void;
|
|
143
157
|
/**
|
|
144
158
|
* @param text - The text of the label
|
|
145
159
|
* @param style - The style of the label
|
|
146
160
|
* @param points - An array of points label for label lines
|
|
147
161
|
*/
|
|
148
|
-
constructor(text: string, style: NVLabel3DStyle, points?: number[] | number[][]);
|
|
162
|
+
constructor(text: string, style: NVLabel3DStyle, points?: number[] | number[][], anchor?: LabelAnchorPoint, onClick?: (label: NVLabel3D) => void);
|
|
149
163
|
}
|
|
150
164
|
|
|
151
165
|
/**
|
|
@@ -584,7 +598,8 @@ declare enum DRAG_MODE {
|
|
|
584
598
|
measurement = 2,
|
|
585
599
|
pan = 3,
|
|
586
600
|
slicer3D = 4,
|
|
587
|
-
callbackOnly = 5
|
|
601
|
+
callbackOnly = 5,
|
|
602
|
+
roiSelection = 6
|
|
588
603
|
}
|
|
589
604
|
/**
|
|
590
605
|
* NVConfigOptions
|
|
@@ -619,6 +634,7 @@ type NVConfigOptions = {
|
|
|
619
634
|
isOrientCube: boolean;
|
|
620
635
|
multiplanarPadPixels: number;
|
|
621
636
|
multiplanarForceRender: boolean;
|
|
637
|
+
multiplanarEqualSize: boolean;
|
|
622
638
|
multiplanarShowRender: SHOW_RENDER;
|
|
623
639
|
isRadiologicalConvention: boolean;
|
|
624
640
|
meshThicknessOn2D: number | string;
|
|
@@ -653,13 +669,23 @@ type NVConfigOptions = {
|
|
|
653
669
|
renderOverlayBlend: number;
|
|
654
670
|
sliceMosaicString: string;
|
|
655
671
|
centerMosaic: boolean;
|
|
672
|
+
penSize: number;
|
|
656
673
|
clickToSegment: boolean;
|
|
657
674
|
clickToSegmentRadius: number;
|
|
658
|
-
clickToSegmentSteps: number;
|
|
659
675
|
clickToSegmentBright: boolean;
|
|
676
|
+
clickToSegmentAutoIntensity: boolean;
|
|
677
|
+
clickToSegmentIntensityMax: number;
|
|
678
|
+
clickToSegmentIntensityMin: number;
|
|
679
|
+
clickToSegmentPercent: number;
|
|
680
|
+
clickToSegmentMaxDistanceMM: number;
|
|
681
|
+
clickToSegmentIs2D: boolean;
|
|
682
|
+
selectionBoxLineThickness: number;
|
|
683
|
+
selectionBoxIsOutline: boolean;
|
|
684
|
+
scrollRequiresFocus: boolean;
|
|
660
685
|
};
|
|
661
686
|
declare const DEFAULT_OPTIONS: NVConfigOptions;
|
|
662
687
|
type SceneData = {
|
|
688
|
+
gamma: number;
|
|
663
689
|
azimuth: number;
|
|
664
690
|
elevation: number;
|
|
665
691
|
crosshairPos: vec3;
|
|
@@ -672,6 +698,7 @@ type SceneData = {
|
|
|
672
698
|
clipVolumeHigh: number[];
|
|
673
699
|
};
|
|
674
700
|
declare const INITIAL_SCENE_DATA: {
|
|
701
|
+
gamma: number;
|
|
675
702
|
azimuth: number;
|
|
676
703
|
elevation: number;
|
|
677
704
|
crosshairPos: vec3;
|
|
@@ -696,6 +723,7 @@ type Scene = {
|
|
|
696
723
|
pan2Dxyzmm: vec4;
|
|
697
724
|
_elevation?: number;
|
|
698
725
|
_azimuth?: number;
|
|
726
|
+
gamma?: number;
|
|
699
727
|
};
|
|
700
728
|
type DocumentData = {
|
|
701
729
|
title: string;
|
|
@@ -958,6 +986,18 @@ type NiiVueLocation = {
|
|
|
958
986
|
vox: vec3;
|
|
959
987
|
xy: [number, number];
|
|
960
988
|
};
|
|
989
|
+
type SyncOpts = {
|
|
990
|
+
'3d'?: boolean;
|
|
991
|
+
'2d'?: boolean;
|
|
992
|
+
zoomPan?: boolean;
|
|
993
|
+
cal_min?: boolean;
|
|
994
|
+
cal_max?: boolean;
|
|
995
|
+
gamma?: boolean;
|
|
996
|
+
useSliceOffset?: boolean;
|
|
997
|
+
sliceType?: boolean;
|
|
998
|
+
crosshair?: boolean;
|
|
999
|
+
clipPlane?: boolean;
|
|
1000
|
+
};
|
|
961
1001
|
|
|
962
1002
|
type ValuesArray = Array<{
|
|
963
1003
|
id: string;
|
|
@@ -1506,6 +1546,7 @@ declare class NVMeshLoaders {
|
|
|
1506
1546
|
static readLayer(name: string, buffer: ArrayBuffer, nvmesh: NVMesh, opacity?: number, colormap?: string, colormapNegative?: string, useNegativeCmap?: boolean, cal_min?: number | null, cal_max?: number | null, outlineBorder?: number): NVMeshLayer | undefined;
|
|
1507
1547
|
static readSMP(buffer: ArrayBuffer, n_vert: number): Float32Array;
|
|
1508
1548
|
static readSTC(buffer: ArrayBuffer, n_vert: number): Float32Array;
|
|
1549
|
+
static isCurv(buffer: ArrayBuffer): boolean;
|
|
1509
1550
|
static readCURV(buffer: ArrayBuffer, n_vert: number): Float32Array;
|
|
1510
1551
|
static readANNOT(buffer: ArrayBuffer, n_vert: number, isReadColortables?: boolean): ANNOT;
|
|
1511
1552
|
static readNV(buffer: ArrayBuffer): DefaultMeshType;
|
|
@@ -1593,6 +1634,7 @@ type Descriptive = {
|
|
|
1593
1634
|
cal_max: number;
|
|
1594
1635
|
robust_min: number;
|
|
1595
1636
|
robust_max: number;
|
|
1637
|
+
area: number | null;
|
|
1596
1638
|
};
|
|
1597
1639
|
type SliceScale = {
|
|
1598
1640
|
volScale: number[];
|
|
@@ -1664,6 +1706,9 @@ declare class Niivue {
|
|
|
1664
1706
|
drawUndoBitmaps: Uint8Array[];
|
|
1665
1707
|
drawLut: LUT;
|
|
1666
1708
|
drawOpacity: number;
|
|
1709
|
+
clickToSegmentIsGrowing: boolean;
|
|
1710
|
+
clickToSegmentGrowingBitmap: Uint8Array | null;
|
|
1711
|
+
clickToSegmentXY: number[];
|
|
1667
1712
|
renderDrawAmbientOcclusion: number;
|
|
1668
1713
|
colorbarHeight: number;
|
|
1669
1714
|
drawPenLocation: number[];
|
|
@@ -1677,6 +1722,7 @@ declare class Niivue {
|
|
|
1677
1722
|
orientCubeShader?: Shader;
|
|
1678
1723
|
orientCubeShaderVAO: WebGLVertexArrayObject | null;
|
|
1679
1724
|
rectShader?: Shader;
|
|
1725
|
+
rectOutlineShader?: Shader;
|
|
1680
1726
|
renderShader?: Shader;
|
|
1681
1727
|
lineShader?: Shader;
|
|
1682
1728
|
line3DShader?: Shader;
|
|
@@ -1721,7 +1767,7 @@ declare class Niivue {
|
|
|
1721
1767
|
extentsMin?: vec3;
|
|
1722
1768
|
extentsMax?: vec3;
|
|
1723
1769
|
private resizeObserver;
|
|
1724
|
-
syncOpts:
|
|
1770
|
+
syncOpts: SyncOpts;
|
|
1725
1771
|
readyForSync: boolean;
|
|
1726
1772
|
uiData: UIData;
|
|
1727
1773
|
back: NVImage | null;
|
|
@@ -1742,7 +1788,7 @@ declare class Niivue {
|
|
|
1742
1788
|
screen2frac?: number[];
|
|
1743
1789
|
}>;
|
|
1744
1790
|
cuboidVertexBuffer?: WebGLBuffer;
|
|
1745
|
-
otherNV: Niivue
|
|
1791
|
+
otherNV: Niivue[] | null;
|
|
1746
1792
|
volumeObject3D: NiivueObject3D | null;
|
|
1747
1793
|
pivot3D: number[];
|
|
1748
1794
|
furthestFromPivot: number;
|
|
@@ -1997,7 +2043,7 @@ declare class Niivue {
|
|
|
1997
2043
|
* @deprecated use broadcastTo instead
|
|
1998
2044
|
* @see {@link https://niivue.github.io/niivue/features/sync.mesh.html | live demo usage}
|
|
1999
2045
|
*/
|
|
2000
|
-
syncWith(otherNV: Niivue, syncOpts?: {
|
|
2046
|
+
syncWith(otherNV: Niivue | Niivue[], syncOpts?: {
|
|
2001
2047
|
'2d': boolean;
|
|
2002
2048
|
'3d': boolean;
|
|
2003
2049
|
}): void;
|
|
@@ -2016,6 +2062,15 @@ declare class Niivue {
|
|
|
2016
2062
|
'2d': boolean;
|
|
2017
2063
|
'3d': boolean;
|
|
2018
2064
|
}): void;
|
|
2065
|
+
doSync3d(otherNV: Niivue): void;
|
|
2066
|
+
doSync2d(otherNV: Niivue): void;
|
|
2067
|
+
doSyncGamma(otherNV: Niivue): void;
|
|
2068
|
+
doSyncZoomPan(otherNV: Niivue): void;
|
|
2069
|
+
doSyncCrosshair(otherNV: Niivue): void;
|
|
2070
|
+
doSyncCalMin(otherNV: Niivue): void;
|
|
2071
|
+
doSyncCalMax(otherNV: Niivue): void;
|
|
2072
|
+
doSyncSliceType(otherNV: Niivue): void;
|
|
2073
|
+
doSyncClipPlane(otherNV: Niivue): void;
|
|
2019
2074
|
/**
|
|
2020
2075
|
* Sync the scene controls (orientation, crosshair location, etc.) from one Niivue instance to another. useful for using one canvas to drive another.
|
|
2021
2076
|
* @internal
|
|
@@ -2676,9 +2731,17 @@ declare class Niivue {
|
|
|
2676
2731
|
drawGrowCut(): void;
|
|
2677
2732
|
drawPt(x: number, y: number, z: number, penValue: number): void;
|
|
2678
2733
|
drawPenLine(ptA: number[], ptB: number[], penValue: number): void;
|
|
2734
|
+
/**
|
|
2735
|
+
* Performs a 1-voxel binary dilation on a connected cluster within the drawing mask using the drawFloodFillCore function.
|
|
2736
|
+
*
|
|
2737
|
+
* @param seedXYZ - voxel index of the seed voxel in the mask array.
|
|
2738
|
+
* @param neighbors - Number of neighbors to consider for connectivity and dilation (6, 18, or 26).
|
|
2739
|
+
*/
|
|
2740
|
+
drawingBinaryDilationWithSeed(seedXYZ: number[], // seed voxel x,y,z
|
|
2741
|
+
neighbors?: 6 | 18 | 26): void;
|
|
2679
2742
|
drawFloodFillCore(img: Uint8Array, seedVx: number, neighbors?: number): void;
|
|
2680
2743
|
drawFloodFill(seedXYZ: number[], newColor?: number, growSelectedCluster?: number, // if non-zero, growth based on background intensity POSITIVE_INFINITY for selected or bright, NEGATIVE_INFINITY for selected or darker
|
|
2681
|
-
forceMin?: number, forceMax?: number, neighbors?: number): void;
|
|
2744
|
+
forceMin?: number, forceMax?: number, neighbors?: number, maxDistanceMM?: number, is2D?: boolean): void;
|
|
2682
2745
|
drawPenFilled(): void;
|
|
2683
2746
|
/**
|
|
2684
2747
|
* close drawing: make sure you have saved any changes before calling this!
|
|
@@ -2692,7 +2755,7 @@ declare class Niivue {
|
|
|
2692
2755
|
* @example niivue.refreshDrawing();
|
|
2693
2756
|
* @see {@link https://niivue.github.io/niivue/features/cactus.html | live demo usage}
|
|
2694
2757
|
*/
|
|
2695
|
-
refreshDrawing(isForceRedraw?: boolean): void;
|
|
2758
|
+
refreshDrawing(isForceRedraw?: boolean, useClickToSegmentBitmap?: boolean): void;
|
|
2696
2759
|
r8Tex(texID: WebGLTexture | null, activeID: number, dims: number[], isInit?: boolean): WebGLTexture | null;
|
|
2697
2760
|
rgbaTex(texID: WebGLTexture | null, activeID: number, dims: number[], isInit?: boolean): WebGLTexture | null;
|
|
2698
2761
|
requestCORSIfNotSameOrigin(img: HTMLImageElement, url: string): void;
|
|
@@ -2807,13 +2870,33 @@ declare class Niivue {
|
|
|
2807
2870
|
updateGLVolume(): void;
|
|
2808
2871
|
/**
|
|
2809
2872
|
* basic statistics for selected voxel-based image
|
|
2810
|
-
* @param
|
|
2811
|
-
*
|
|
2812
|
-
*
|
|
2813
|
-
*
|
|
2873
|
+
* @param options - an object containing the following properties:
|
|
2874
|
+
* - layer: selects image to describe
|
|
2875
|
+
* - masks: optional binary images to filter voxels
|
|
2876
|
+
* - drawingIsMask: a boolean indicating if the drawing is used as a mask
|
|
2877
|
+
* - roiIsMask: a boolean indicating if the ROI is used as a mask
|
|
2878
|
+
* - startVox: the starting voxel coordinates
|
|
2879
|
+
* - endVox: the ending voxel coordinates
|
|
2880
|
+
* @returns numeric values to describe image or regions of images
|
|
2881
|
+
* @example
|
|
2882
|
+
* niivue.getDescriptives({
|
|
2883
|
+
* layer: 0,
|
|
2884
|
+
* masks: [],
|
|
2885
|
+
* drawingIsMask: true, // drawingIsMask and roiIsMask are mutually exclusive
|
|
2886
|
+
* roiIsMask: false,
|
|
2887
|
+
* startVox: [10, 20, 30], // ignored if roiIsMask is false
|
|
2888
|
+
* endVox: [40, 50, 60] // ignored if roiIsMask is false
|
|
2889
|
+
* });
|
|
2814
2890
|
* @see {@link https://niivue.github.io/niivue/features/draw2.html | live demo usage}
|
|
2815
2891
|
*/
|
|
2816
|
-
getDescriptives(
|
|
2892
|
+
getDescriptives(options: {
|
|
2893
|
+
layer?: number;
|
|
2894
|
+
masks?: number[];
|
|
2895
|
+
drawingIsMask?: boolean;
|
|
2896
|
+
roiIsMask?: boolean;
|
|
2897
|
+
startVox?: number[];
|
|
2898
|
+
endVox?: number[];
|
|
2899
|
+
}): Descriptive;
|
|
2817
2900
|
refreshLayers(overlayItem: NVImage, layer: number): void;
|
|
2818
2901
|
/**
|
|
2819
2902
|
* query all available color maps that can be applied to volumes
|
|
@@ -2931,6 +3014,8 @@ declare class Niivue {
|
|
|
2931
3014
|
sliceScroll3D(posChange?: number): void;
|
|
2932
3015
|
deleteThumbnail(): void;
|
|
2933
3016
|
inGraphTile(x: number, y: number): boolean;
|
|
3017
|
+
updateBitmapFromClickToSegment(): void;
|
|
3018
|
+
sumBitmap(img: Uint8Array): number;
|
|
2934
3019
|
mouseClick(x: number, y: number, posChange?: number, isDelta?: boolean): void;
|
|
2935
3020
|
drawRuler(): void;
|
|
2936
3021
|
drawRuler10cm(startXYendXY: number[]): void;
|
|
@@ -2945,6 +3030,7 @@ declare class Niivue {
|
|
|
2945
3030
|
effectiveCanvasHeight(): number;
|
|
2946
3031
|
effectiveCanvasWidth(): number;
|
|
2947
3032
|
getAllLabels(): NVLabel3D[];
|
|
3033
|
+
getConnectomeLabels(): NVLabel3D[];
|
|
2948
3034
|
getBulletMarginWidth(): number;
|
|
2949
3035
|
getLegendPanelWidth(): number;
|
|
2950
3036
|
getLegendPanelHeight(): number;
|
|
@@ -2976,9 +3062,10 @@ declare class Niivue {
|
|
|
2976
3062
|
screenFieldOfViewMM(axCorSag?: number, forceSliceMM?: boolean): vec3;
|
|
2977
3063
|
screenFieldOfViewExtendedVox(axCorSag?: number): MM;
|
|
2978
3064
|
screenFieldOfViewExtendedMM(axCorSag?: number): MM;
|
|
2979
|
-
drawSliceOrientationText(leftTopWidthHeight: number[], axCorSag: SLICE_TYPE): void;
|
|
3065
|
+
drawSliceOrientationText(leftTopWidthHeight: number[], axCorSag: SLICE_TYPE, padLeftTop?: number[]): void;
|
|
2980
3066
|
xyMM2xyzMM(axCorSag: SLICE_TYPE, sliceFrac: number): number[];
|
|
2981
|
-
|
|
3067
|
+
draw2DMain(leftTopWidthHeight: number[], axCorSag: SLICE_TYPE, customMM?: number): void;
|
|
3068
|
+
draw2D(leftTopWidthHeight: number[], axCorSag: SLICE_TYPE, customMM?: number, imageWidthHeight?: number[]): void;
|
|
2982
3069
|
calculateMvpMatrix(_unused: unknown, leftTopWidthHeight: number[], azimuth: number, elevation: number): mat4[];
|
|
2983
3070
|
calculateModelMatrix(azimuth: number, elevation: number): mat4;
|
|
2984
3071
|
calculateRayDirection(azimuth: number, elevation: number): vec3;
|
|
@@ -2997,12 +3084,13 @@ declare class Niivue {
|
|
|
2997
3084
|
* @param style - label style
|
|
2998
3085
|
* @param point - 3D point on the model
|
|
2999
3086
|
*/
|
|
3000
|
-
addLabel(text: string, style: NVLabel3DStyle, points?: number[] | number[][]): NVLabel3D;
|
|
3087
|
+
addLabel(text: string, style: NVLabel3DStyle, points?: number[] | number[][], anchor?: LabelAnchorPoint, onClick?: (label: NVLabel3D) => void): NVLabel3D;
|
|
3001
3088
|
calculateScreenPoint(point: [number, number, number], mvpMatrix: mat4, leftTopWidthHeight: number[]): vec4;
|
|
3002
3089
|
getLabelAtPoint(screenPoint: [number, number]): NVLabel3D | null;
|
|
3003
3090
|
drawLabelLine(label: NVLabel3D, pos: vec2, mvpMatrix: mat4, leftTopWidthHeight: number[], secondPass?: boolean): void;
|
|
3004
|
-
draw3DLabel(label: NVLabel3D, pos: vec2, mvpMatrix
|
|
3091
|
+
draw3DLabel(label: NVLabel3D, pos: vec2, mvpMatrix?: mat4, leftTopWidthHeight?: number[], bulletMargin?: number, legendWidth?: number, secondPass?: boolean): void;
|
|
3005
3092
|
draw3DLabels(mvpMatrix: mat4, leftTopWidthHeight: number[], secondPass?: boolean): void;
|
|
3093
|
+
drawAnchoredLabels(): void;
|
|
3006
3094
|
draw3D(leftTopWidthHeight?: number[], mvpMatrix?: mat4 | null, modelMatrix?: mat4 | null, normalMatrix?: mat4 | null, azimuth?: number | null, elevation?: number): string | undefined;
|
|
3007
3095
|
drawMesh3D(isDepthTest?: boolean, alpha?: number, m?: mat4, modelMtx?: mat4, normMtx?: mat4): void;
|
|
3008
3096
|
drawCrosshairs3D(isDepthTest?: boolean, alpha?: number, mvpMtx?: mat4 | null, is2DView?: boolean, isSliceMM?: boolean): void;
|
|
@@ -3042,4 +3130,4 @@ declare class Niivue {
|
|
|
3042
3130
|
set gl(gl: WebGL2RenderingContext | null);
|
|
3043
3131
|
}
|
|
3044
3132
|
|
|
3045
|
-
export { type Connectome, type ConnectomeOptions, DEFAULT_OPTIONS, DRAG_MODE, type DocumentData, type DragReleaseParams, type ExportDocumentData, INITIAL_SCENE_DATA, LabelLineTerminator, LabelTextAlignment, type LegacyConnectome, type LegacyNodes, MULTIPLANAR_TYPE, type NVConfigOptions, type NVConnectomeEdge, type NVConnectomeNode, NVController, NVDocument, NVImage, NVImageFromUrlOptions, NVLabel3D, NVLabel3DStyle, NVMesh, NVMeshFromUrlOptions, NVMeshLayerDefaults, NVMeshLoaders, NVMeshUtilities, NVUtilities, type NiftiHeader, type NiiVueLocation, type NiiVueLocationValue, Niivue, type Point, SHOW_RENDER, SLICE_TYPE, type Scene, type Volume, cmapper, ColorTables as colortables };
|
|
3133
|
+
export { type Connectome, type ConnectomeOptions, DEFAULT_OPTIONS, DRAG_MODE, type DocumentData, type DragReleaseParams, type ExportDocumentData, INITIAL_SCENE_DATA, LabelAnchorPoint, LabelLineTerminator, LabelTextAlignment, type LegacyConnectome, type LegacyNodes, MULTIPLANAR_TYPE, type NVConfigOptions, type NVConnectomeEdge, type NVConnectomeNode, NVController, NVDocument, NVImage, NVImageFromUrlOptions, NVLabel3D, NVLabel3DStyle, NVMesh, NVMeshFromUrlOptions, NVMeshLayerDefaults, NVMeshLoaders, NVMeshUtilities, NVUtilities, type NiftiHeader, type NiiVueLocation, type NiiVueLocationValue, Niivue, type Point, SHOW_RENDER, SLICE_TYPE, type Scene, type SyncOpts, type Volume, cmapper, ColorTables as colortables };
|