UNPKG

@kitware/vtk.js

Version:

Visualization Toolkit for the Web

602 lines (527 loc) 19 kB
import vtkPiecewiseFunction from './../../Common/DataModel/PiecewiseFunction'; import { vtkObject } from './../../interfaces'; import { Extent, Nullable } from './../../types'; import vtkColorTransferFunction from './ColorTransferFunction'; import { ColorMixPreset, InterpolationType, OpacityMode } from './VolumeProperty/Constants'; export interface IVolumePropertyInitialValues { independentComponents?: boolean; shade?: boolean; ambient?: number; diffuse?: number; specular?: number; specularPower?: number; useLabelOutline?: boolean; labelOutlineThickness?: number | number[]; colorMixPreset?: ColorMixPreset; } export interface vtkVolumeProperty extends vtkObject { /** * Get the ambient lighting coefficient. */ getAmbient(): number; /** * Return the `Modified Time` which is a monotonic increasing integer * global for all vtkObjects. * * This allow to solve a question such as: * - Is that object created/modified after another one? * - Do I need to re-execute this filter, or not? ... * * @return {Number} the global modified time. */ getMTime(): number; /** * * @param {Number} index */ getColorChannels(index: number): number; /** * Get the diffuse lighting coefficient. */ getDiffuse(): number; /** * * @param {Number} index */ getGradientOpacityMaximumOpacity(index: number): number; /** * * @param {Number} index */ getGradientOpacityMaximumValue(index: number): number; /** * * @param {Number} index */ getGradientOpacityMinimumOpacity(index: number): number; /** * * @param {Number} index */ getGradientOpacityMinimumValue(index: number): number; /** * */ getColorMixPreset(): ColorMixPreset; /** * */ getIndependentComponents(): boolean; /** * Get the unit distance on which the scalar opacity transfer function is defined. * @param {Number} index */ getScalarOpacityUnitDistance(index: number): number; /** * Get the currently set gray transfer function. Create one if none set. * @param {Number} index */ getGrayTransferFunction(index: number): vtkPiecewiseFunction; /** * * @default FRACTIONAL */ getOpacityMode(index: number): OpacityMode; /** * gets the label outline thickness */ getLabelOutlineThickness(): number; /** * Get the currently set RGB transfer function. Create one if none set. * @param {Number} index */ getRGBTransferFunction(index: number): vtkColorTransferFunction; /** * Get the scalar opacity transfer function. Create one if none set. * @param {Number} index */ getScalarOpacity(index: number): vtkPiecewiseFunction; /** * Get the shading of a volume. */ getShade(): boolean; /** * */ getSpecular(): number; /** * Get the specular power. */ getSpecularPower(): number; /** * * @param {Number} index */ getUseGradientOpacity(index: number): boolean; /** * @see setForceNearestInterpolation * @param {Number} index */ getForceNearestInterpolation(index: number): boolean; /** * */ getUseLabelOutline(): boolean; /** * Set the ambient lighting coefficient. * @param {Number} ambient The ambient lighting coefficient. */ setAmbient(ambient: number): boolean; /** * Set the diffuse lighting coefficient. * @param {Number} diffuse The diffuse lighting coefficient. */ setDiffuse(diffuse: number): boolean; /** * * @param {Number} index * @param {Number} value */ setGradientOpacityMaximumOpacity(index: number, value: number): boolean; /** * * @param {Number} index * @param {Number} value */ setGradientOpacityMaximumValue(index: number, value: number): boolean; /** * * @param {Number} index * @param {Number} value */ setGradientOpacityMinimumOpacity(index: number, value: number): boolean; /** * * @param {Number} index * @param {Number} value */ setGradientOpacityMinimumValue(index: number, value: number): boolean; /** * Set the color of a volume to a gray transfer function * @param {Number} index * @param {vtkPiecewiseFunction} func */ setGrayTransferFunction(index: number, func: vtkPiecewiseFunction): boolean; /** * Set the color mix code to a preset value * Defaults to ColorMixPreset.DEFAULT * See the test `testColorMix` for an example on how to use this preset. * * If set to `CUSTOM`, a tag `//VTK::CustomColorMix` is made available to the * user who can user shader replacements to put its own code. The given code * will be used to mix the colors from each component. * Each component is available as a rgba vec4: `comp0`, `comp1`... * There are other useful functions or variable available. To find them, * see `//VTK::CustomColorMix` tag in `vtkVolumeFS.glsl`. */ setColorMixPreset(preset: ColorMixPreset): boolean; /** * Does the data have independent components, or do some define color only? * If IndependentComponents is On (the default) then each component will be * independently passed through a lookup table to determine RGBA, shaded. * * Some volume Mappers can handle 1 to 4 component unsigned char or unsigned * short data (see each mapper header file to determine functionality). If * IndependentComponents is Off, then you must have either 2 or 4 component * data. For 2 component data, the first is passed through the first color * transfer function and the second component is passed through the first * scalar opacity (and gradient opacity) transfer function. Normals will be * generated off of the second component. When using gradient based opacity * modulation, the gradients are computed off of the second component. For 4 * component data, the first three will directly represent RGB (no lookup * table). The fourth component will be passed through the first scalar * opacity transfer function for opacity and first gradient opacity transfer * function for gradient based opacity modulation. Normals will be generated * from the fourth component. When using gradient based opacity modulation, * the gradients are computed off of the fourth component. * @param {Boolean} independentComponents */ setIndependentComponents(independentComponents: boolean): boolean; /** * It will set the label outline thickness for the labelmaps. It can accept * a single number or an array of numbers. If a single number is provided, * it will be used for all the segments. If an array is provided, it indicates * the thickness for each segment index. For instance if you have a labelmap * with 3 segments (0: background 1: liver 2: tumor), you can set the thickness * to [2,4] to have a thicker outline for the tumor (thickness 4). It should be * noted that the thickness is in pixel and also the first array value will * control the default thickness for all labels when 0 or not specified. * * @param {Number | Number[]} labelOutlineThickness */ setLabelOutlineThickness(labelOutlineThickness: number | number[]): boolean; /** * * @param {Number} index * @param {Number} value */ setOpacityMode(index: number, value: number): boolean; /** * Set the unit distance on which the scalar opacity transfer function is * defined. * @param {Number} index * @param {Number} value */ setScalarOpacityUnitDistance(index: number, value: number): boolean; /** * Set the shading of a volume. * * If shading is turned off, then the mapper for the volume will not perform * shading calculations. If shading is turned on, the mapper may perform * shading calculations - in some cases shading does not apply (for example, * in a maximum intensity projection) and therefore shading will not be * performed even if this flag is on. For a compositing type of mapper, * turning shading off is generally the same as setting ambient=1, * diffuse=0, specular=0. Shading can be independently turned on/off per * component. * @param {Boolean} shade */ setShade(shade: boolean): boolean; /** * * @param {Number} specular */ setSpecular(specular: number): boolean; /** * Set the specular power. * @param {Number} specularPower */ setSpecularPower(specularPower: number): boolean; /** * * @param {Number} index * @param {Boolean} value */ setUseGradientOpacity(index: number, value: boolean): boolean; /** * * @param {Boolean} useLabelOutline */ setUseLabelOutline(useLabelOutline: boolean): boolean; /** * Set the color of a volume to an RGB transfer function * @param {Number} index * @param {vtkColorTransferFunction} func */ setRGBTransferFunction( index: number, func?: Nullable<vtkColorTransferFunction> ): boolean; /** * Set the scalar opacity of a volume to a transfer function * @param {Number} index * @param {vtkPiecewiseFunction} func */ setScalarOpacity( index: number, func?: Nullable<vtkPiecewiseFunction> ): boolean; /** * Set the scalar component weights. * @param {Number} index * @param {Number} value */ setComponentWeight(index: number, value: number): boolean; /** * Force the nearest neighbor interpolation of one or more of the components * The interpolation for the rest of the volume is set using `setInterpolationType` * @see setInterpolationType * @param {Number} index * @param {Boolean} value */ setForceNearestInterpolation(index: number, value: boolean): boolean; /** * Get the scalar component weights. * @param {Number} index */ getComponentWeight(index: number): number; /** * Set the interpolation type for sampling a volume. * @param {InterpolationType} interpolationType */ setInterpolationType(interpolationType: InterpolationType): boolean; /** * Set interpolation type to NEAREST */ setInterpolationTypeToNearest(): boolean; /** * Set interpolation type to LINEAR */ setInterpolationTypeToLinear(): boolean; /** * Set interpolation type to FAST_LINEAR */ setInterpolationTypeToFastLinear(): boolean; /** * Get the interpolation type for sampling a volume. */ getInterpolationType(): InterpolationType; /** * Get the interpolation type for sampling a volume as a string. */ getInterpolationTypeAsString(): string; /** * */ getAverageIPScalarRange(): Range; /** * */ getAverageIPScalarRangeByReference(): Range; /** * Get the blending coefficient that interpolates between surface and volume rendering * @default 0.0 */ getVolumetricScatteringBlending(): number; /** * Get the global illumination reach of volume shadow * @default 0.0 */ getGlobalIlluminationReach(): number; /** * Get anisotropy of volume shadow scatter * @default 0.0 */ getAnisotropy(): number; /** * Get local ambient occlusion flag * @default false */ getLocalAmbientOcclusion(): boolean; /** * Get kernel size for local ambient occlusion * @default 15 */ getLAOKernelSize(): number; /** * Get kernel radius for local ambient occlusion * @default 7 */ getLAOKernelRadius(): number; /** * * @param x * @param y */ setAverageIPScalarRange(x: number, y: number): boolean; /** * * @param {Range} averageIPScalarRange */ setAverageIPScalarRangeFrom(averageIPScalarRange: Range): boolean; /** * Set the normal computation to be dependent on the transfer function. * By default, the mapper relies on the scalar gradient for computing normals at sample locations * for lighting calculations. This is an approximation and can lead to inaccurate results. * When enabled, this property makes the mapper compute normals based on the accumulated opacity * at sample locations. This can generate a more accurate representation of edge structures in the * data but adds an overhead and drops frame rate. * @param computeNormalFromOpacity */ setComputeNormalFromOpacity(computeNormalFromOpacity: boolean): boolean; /** * Set the blending coefficient that determines the interpolation between surface and volume rendering. * Default value of 0.0 means shadow effect is computed with phong model. * Value of 1.0 means shadow is created by volume occlusion. * @param volumeScatterBlendCoef */ setVolumetricScatteringBlending(volumeScatterBlendCoef: number): void; /** * Set the global illumination reach of volume shadow. This function is only effective when volumeScatterBlendCoef is greater than 0. * Default value of 0.0 means only the neighboring voxel is considered when creating global shadow. * Value of 1.0 means the shadow ray traverses through the entire volume. * @param globalIlluminationReach */ setGlobalIlluminationReach(globalIlluminationReach: number): void; /** * Set anisotropy of volume shadow scatter. This function is only effective when volumeScatterBlendCoef is greater than 0. * Default value of 0.0 means light scatters uniformly in all directions. * Value of -1.0 means light scatters backward, value of 1.0 means light scatters forward. * @param anisotropy */ setAnisotropy(anisotropy: number): void; /** * Set whether to turn on local ambient occlusion (LAO). LAO is only effective if shading is on and volumeScatterBlendCoef is set to 0. * LAO effect is added to ambient lighting, so the ambient component of the actor needs to be great than 0. * @param localAmbientOcclusion */ setLocalAmbientOcclusion(localAmbientOcclusion: boolean): void; /** * Set kernel size for local ambient occlusion. It specifies the number of rays that are randomly sampled in the hemisphere. * Value is clipped between 1 and 32. * @param LAOKernelSize */ setLAOKernelSize(LAOKernelSize: number): void; /** * Set kernel radius for local ambient occlusion. It specifies the number of samples that are considered on each random ray. * Value must be greater than or equal to 1. * @param LAOKernelRadius */ setLAOKernelRadius(LAOKernelRadius: number): void; /** * Informs the mapper to only update the specified extents at the next render. * * If there are zero extents, the mapper updates the entire volume texture. * Otherwise, the mapper will only update the texture by the specified extents * during the next render call. * * This array is cleared after a successful render. * @param extents */ setUpdatedExtents(extents: Extent[]): boolean; /** * Retrieves the updated extents. * * This array is cleared after every successful render. */ getUpdatedExtents(): Extent[]; } /** * Method use to decorate a given object (publicAPI+model) with vtkVolumeProperty characteristics. * * @param publicAPI object on which methods will be bounds (public) * @param model object on which data structure will be bounds (protected) * @param {IVolumePropertyInitialValues} [initialValues] (default: {}) */ export function extend( publicAPI: object, model: object, initialValues?: IVolumePropertyInitialValues ): void; /** * Method use to create a new instance of vtkVolumeProperty */ export function newInstance( initialValues?: IVolumePropertyInitialValues ): vtkVolumeProperty; /** * vtkVolumeProperty is used to represent common properties associated * with volume rendering. This includes properties for determining the type * of interpolation to use when sampling a volume, the color of a volume, * the scalar opacity of a volume, the gradient opacity of a volume, and the * shading parameters of a volume. * When the scalar opacity or the gradient opacity of a volume is not set, * then the function is defined to be a constant value of 1.0. When a * scalar and gradient opacity are both set simultaneously, then the opacity * is defined to be the product of the scalar opacity and gradient opacity * transfer functions. * * Most properties can be set per "component" for volume mappers that * support multiple independent components. If you are using 2 component * data as LV or 4 component data as RGBV (as specified in the mapper) * only the first scalar opacity and gradient opacity transfer functions * will be used (and all color functions will be ignored). Omitting the * index parameter on the Set/Get methods will access index = 0. * * When independent components is turned on, a separate feature (useful * for volume rendering labelmaps) is available. By default all components * have an "opacityMode" of `FRACTIONAL`, which results in the usual * addition of that components scalar opacity function value to the final * opacity of the fragment. By setting one or more components to have a * `PROPORTIONAL` "opacityMode" instead, the scalar opacity lookup value * for those components will not be used to adjust the fragment opacity, * but rather used to multiply the color of that fragment. This kind of * rendering makes sense for labelmap components because the gradient of * those fields is meaningless and should not be used in opacity * computation. At the same time, multiplying the color value by the * piecewise scalar opacity function value provides an opportunity to * design piecewise constant opacity functions (step functions) that can * highlight any subset of label values. * * vtkColorTransferFunction is a color mapping in RGB or HSV space that * uses piecewise hermite functions to allow interpolation that can be * piecewise constant, piecewise linear, or somewhere in-between * (a modified piecewise hermite function that squishes the function * according to a sharpness parameter). The function also allows for * the specification of the midpoint (the place where the function * reaches the average of the two bounding nodes) as a normalize distance * between nodes. * * See the description of class vtkPiecewiseFunction for an explanation of * midpoint and sharpness. * * @example * ```js * // create color and opacity transfer functions * const ctfun = vtkColorTransferFunction.newInstance(); * ctfun.addRGBPoint(200.0, 1.0, 1.0, 1.0); * ctfun.addRGBPoint(2000.0, 0.0, 0.0, 0.0); * const ofun = vtkPiecewiseFunction.newInstance(); * ofun.addPoint(200.0, 0.0); * ofun.addPoint(1200.0, 0.2); * ofun.addPoint(4000.0, 0.4); * * // set them on the property * volume.getProperty().setRGBTransferFunction(0, ctfun); * volume.getProperty().setScalarOpacity(0, ofun); * volume.getProperty().setScalarOpacityUnitDistance(0, 4.5); * volume.getProperty().setInterpolationTypeToLinear(); * ``` */ export declare const vtkVolumeProperty: { newInstance: typeof newInstance; extend: typeof extend; InterpolationType: typeof InterpolationType; OpacityMode: typeof OpacityMode; }; export default vtkVolumeProperty;