Skip to content

Commit 61a1d47

Browse files
bruyeretfinetjul
authored andcommitted
refactor: Factorize the computation of transfer function hash
1 parent 74326c9 commit 61a1d47

File tree

6 files changed

+61
-63
lines changed

6 files changed

+61
-63
lines changed

Sources/Rendering/OpenGL/ImageCPRMapper/index.js

Lines changed: 6 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,8 @@ import vtkReplacementShaderMapper from 'vtk.js/Sources/Rendering/OpenGL/Replacem
1212
import vtkShaderProgram from 'vtk.js/Sources/Rendering/OpenGL/ShaderProgram';
1313
import vtkViewNode from 'vtk.js/Sources/Rendering/SceneGraph/ViewNode';
1414

15+
import { getTransferFunctionHash } from 'vtk.js/Sources/Rendering/OpenGL/RenderWindow/resourceSharingHelper';
16+
1517
import vtkPolyDataVS from 'vtk.js/Sources/Rendering/OpenGL/glsl/vtkPolyDataVS.glsl';
1618
import vtkPolyDataFS from 'vtk.js/Sources/Rendering/OpenGL/glsl/vtkPolyDataFS.glsl';
1719

@@ -20,19 +22,6 @@ import { Resolve } from 'vtk.js/Sources/Rendering/Core/Mapper/CoincidentTopology
2022

2123
const { vtkErrorMacro } = macro;
2224

23-
// ----------------------------------------------------------------------------
24-
// helper methods
25-
// ----------------------------------------------------------------------------
26-
27-
function computeFnToString(property, fn, numberOfComponents) {
28-
const pwfun = fn.apply(property);
29-
if (pwfun) {
30-
const iComps = property.getIndependentComponents();
31-
return `${property.getMTime()}-${iComps}-${numberOfComponents}`;
32-
}
33-
return '0';
34-
}
35-
3625
// ----------------------------------------------------------------------------
3726
// vtkOpenGLImageCPRMapper methods
3827
// ----------------------------------------------------------------------------
@@ -252,9 +241,9 @@ function vtkOpenGLImageCPRMapper(publicAPI, model) {
252241
const textureHeight = iComps ? 2 * numIComps : 1;
253242

254243
const colorTransferFunc = ppty.getRGBTransferFunction();
255-
const colorTextureHash = computeFnToString(
256-
ppty,
257-
ppty.getRGBTransferFunction,
244+
const colorTextureHash = getTransferFunctionHash(
245+
colorTransferFunc,
246+
iComps,
258247
numIComps
259248
);
260249

@@ -337,11 +326,7 @@ function vtkOpenGLImageCPRMapper(publicAPI, model) {
337326
// for component weighting or opacity, depending on whether we're
338327
// rendering components independently or not.
339328
const pwFunc = ppty.getPiecewiseFunction();
340-
const pwfTextureHash = computeFnToString(
341-
ppty,
342-
ppty.getPiecewiseFunction,
343-
numIComps
344-
);
329+
const pwfTextureHash = getTransferFunctionHash(pwFunc, iComps, numIComps);
345330
const cachedPwfEntry =
346331
model._openGLRenderWindow.getGraphicsResourceForObject(pwFunc);
347332
const reBuildPwf =

Sources/Rendering/OpenGL/ImageMapper/index.js

Lines changed: 5 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,8 @@ import {
1515
} from 'vtk.js/Sources/Rendering/OpenGL/Texture/Constants';
1616
import { InterpolationType } from 'vtk.js/Sources/Rendering/Core/ImageProperty/Constants';
1717

18+
import { getTransferFunctionHash } from 'vtk.js/Sources/Rendering/OpenGL/RenderWindow/resourceSharingHelper';
19+
1820
import vtkPolyDataVS from 'vtk.js/Sources/Rendering/OpenGL/glsl/vtkPolyDataVS.glsl';
1921
import vtkPolyDataFS from 'vtk.js/Sources/Rendering/OpenGL/glsl/vtkPolyDataFS.glsl';
2022
import vtkReplacementShaderMapper from 'vtk.js/Sources/Rendering/OpenGL/ReplacementShaderMapper';
@@ -30,14 +32,6 @@ const { SlicingMode } = Constants;
3032
// helper methods
3133
// ----------------------------------------------------------------------------
3234

33-
function computeFnToString(property, pwfun, numberOfComponents) {
34-
if (pwfun) {
35-
const iComps = property.getIndependentComponents();
36-
return `${pwfun.getMTime()}-${iComps}-${numberOfComponents}`;
37-
}
38-
return '0';
39-
}
40-
4135
function splitStringOnEnter(inputString) {
4236
// Split the input string into an array of lines based on "Enter" (newline) characters
4337
// Remove any leading or trailing whitespace from each line and filter out empty lines
@@ -947,9 +941,9 @@ function vtkOpenGLImageMapper(publicAPI, model) {
947941
const textureHeight = iComps ? 2 * numIComps : 1;
948942

949943
const colorTransferFunc = actorProperty.getRGBTransferFunction();
950-
const cfunToString = computeFnToString(
951-
actorProperty,
944+
const cfunToString = getTransferFunctionHash(
952945
colorTransferFunc,
946+
iComps,
953947
numIComps
954948
);
955949
const cTex =
@@ -1041,7 +1035,7 @@ function vtkOpenGLImageMapper(publicAPI, model) {
10411035
// for component weighting or opacity, depending on whether we're
10421036
// rendering components independently or not.
10431037
const pwFunc = actorProperty.getPiecewiseFunction();
1044-
const pwfunToString = computeFnToString(actorProperty, pwFunc, numIComps);
1038+
const pwfunToString = getTransferFunctionHash(pwFunc, iComps, numIComps);
10451039
const pwfTex =
10461040
model._openGLRenderWindow.getGraphicsResourceForObject(pwFunc);
10471041
// rebuild opacity tfun?

Sources/Rendering/OpenGL/ImageResliceMapper/index.js

Lines changed: 17 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,8 @@ import vtkShaderProgram from 'vtk.js/Sources/Rendering/OpenGL/ShaderProgram';
1616
import vtkTransform from 'vtk.js/Sources/Common/Transform/Transform';
1717
import vtkViewNode from 'vtk.js/Sources/Rendering/SceneGraph/ViewNode';
1818

19+
import { getTransferFunctionHash } from 'vtk.js/Sources/Rendering/OpenGL/RenderWindow/resourceSharingHelper';
20+
1921
import vtkImageResliceMapperVS from 'vtk.js/Sources/Rendering/OpenGL/glsl/vtkImageResliceMapperVS.glsl';
2022
import vtkImageResliceMapperFS from 'vtk.js/Sources/Rendering/OpenGL/glsl/vtkImageResliceMapperFS.glsl';
2123

@@ -32,14 +34,6 @@ const { vtkErrorMacro } = macro;
3234
// helper methods
3335
// ----------------------------------------------------------------------------
3436

35-
function computeFnToString(property, pwfun, numberOfComponents) {
36-
if (pwfun) {
37-
const iComps = property.getIndependentComponents();
38-
return `${pwfun.getMTime()}-${iComps}-${numberOfComponents}`;
39-
}
40-
return '0';
41-
}
42-
4337
function safeMatrixMultiply(matrixArray, matrixType, tmpMat) {
4438
matrixType.identity(tmpMat);
4539
return matrixArray.reduce((res, matrix, index) => {
@@ -251,24 +245,22 @@ function vtkOpenGLImageResliceMapper(publicAPI, model) {
251245
dims[2],
252246
scalars
253247
);
254-
if (scalars) {
255-
model._openGLRenderWindow.setGraphicsResourceForObject(
248+
model._openGLRenderWindow.setGraphicsResourceForObject(
249+
scalars,
250+
model.openGLTexture,
251+
toString
252+
);
253+
if (scalars !== model._scalars) {
254+
model._openGLRenderWindow.registerGraphicsResourceUser(
256255
scalars,
257-
model.openGLTexture,
258-
toString
256+
publicAPI
257+
);
258+
model._openGLRenderWindow.unregisterGraphicsResourceUser(
259+
model._scalars,
260+
publicAPI
259261
);
260-
if (scalars !== model._scalars) {
261-
model._openGLRenderWindow.registerGraphicsResourceUser(
262-
scalars,
263-
publicAPI
264-
);
265-
model._openGLRenderWindow.unregisterGraphicsResourceUser(
266-
model._scalars,
267-
publicAPI
268-
);
269-
}
270-
model._scalars = scalars;
271262
}
263+
model._scalars = scalars;
272264
} else {
273265
model.openGLTexture = tex.oglObject;
274266
}
@@ -279,7 +271,7 @@ function vtkOpenGLImageResliceMapper(publicAPI, model) {
279271
const textureHeight = iComps ? 2 * numIComps : 1;
280272

281273
const colorTransferFunc = ppty.getRGBTransferFunction();
282-
toString = computeFnToString(ppty, colorTransferFunc, numIComps);
274+
toString = getTransferFunctionHash(colorTransferFunc, iComps, numIComps);
283275
const cTex =
284276
model._openGLRenderWindow.getGraphicsResourceForObject(colorTransferFunc);
285277
const reBuildC = !cTex?.oglObject?.getHandle() || cTex?.hash !== toString;
@@ -357,7 +349,7 @@ function vtkOpenGLImageResliceMapper(publicAPI, model) {
357349
// for component weighting or opacity, depending on whether we're
358350
// rendering components independently or not.
359351
const pwFunc = ppty.getPiecewiseFunction();
360-
toString = computeFnToString(ppty, pwFunc, numIComps);
352+
toString = getTransferFunctionHash(pwFunc, iComps, numIComps);
361353
const pwfTex =
362354
model._openGLRenderWindow.getGraphicsResourceForObject(pwFunc);
363355
// rebuild opacity tfun?
Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,16 @@
1+
import { vtkObject } from "../../../interfaces";
2+
3+
/**
4+
* Compute and return a hash than can be used for caching resources
5+
*
6+
* @param transferFunction The transfer function, it can be any vtkObject, but is usually a vtkTransferFunction
7+
* @param useIndependentComponents A boolean taken from the image or volume property, using getIndependentComponents()
8+
* @param numberOfComponents Taken from the data array, using getNumberOfComponents()
9+
*/
10+
export function getTransferFunctionHash(transferFunction: vtkObject | undefined, useIndependentComponents: boolean, numberOfComponents: number): string;
11+
12+
declare const defaultExport: {
13+
getTransferFunctionHash: typeof getTransferFunctionHash;
14+
};
15+
16+
export default defaultExport;
Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,13 @@
1+
// See typescript header for documentation
2+
3+
export function getTransferFunctionHash(
4+
transferFunction,
5+
useIndependentComponents,
6+
numberOfComponents
7+
) {
8+
return transferFunction
9+
? `${transferFunction.getMTime()}-${useIndependentComponents}-${numberOfComponents}`
10+
: '0';
11+
}
12+
13+
export default { getTransferFunctionHash };

Sources/Rendering/OpenGL/VolumeMapper/index.js

Lines changed: 4 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,8 @@ import {
2424
} from 'vtk.js/Sources/Rendering/Core/VolumeProperty/Constants';
2525
import { BlendMode } from 'vtk.js/Sources/Rendering/Core/VolumeMapper/Constants';
2626

27+
import { getTransferFunctionHash } from 'vtk.js/Sources/Rendering/OpenGL/RenderWindow/resourceSharingHelper';
28+
2729
import vtkVolumeVS from 'vtk.js/Sources/Rendering/OpenGL/glsl/vtkVolumeVS.glsl';
2830
import vtkVolumeFS from 'vtk.js/Sources/Rendering/OpenGL/glsl/vtkVolumeFS.glsl';
2931

@@ -35,10 +37,6 @@ const { vtkWarningMacro, vtkErrorMacro } = macro;
3537
// helper methods
3638
// ----------------------------------------------------------------------------
3739

38-
function computeFnToString(pwfun, useIComps, numberOfComponents) {
39-
return pwfun ? `${pwfun.getMTime()}-${useIComps}-${numberOfComponents}` : '0';
40-
}
41-
4240
function getColorCodeFromPreset(colorMixPreset) {
4341
switch (colorMixPreset) {
4442
case ColorMixPreset.CUSTOM:
@@ -1555,7 +1553,7 @@ function vtkOpenGLVolumeMapper(publicAPI, model) {
15551553
const scalarOpacityFunc = vprop.getScalarOpacity();
15561554
const opTex =
15571555
model._openGLRenderWindow.getGraphicsResourceForObject(scalarOpacityFunc);
1558-
let toString = computeFnToString(
1556+
let toString = getTransferFunctionHash(
15591557
scalarOpacityFunc,
15601558
useIndependentComps,
15611559
numIComps
@@ -1643,7 +1641,7 @@ function vtkOpenGLVolumeMapper(publicAPI, model) {
16431641

16441642
// rebuild color tfun?
16451643
const colorTransferFunc = vprop.getRGBTransferFunction();
1646-
toString = computeFnToString(
1644+
toString = getTransferFunctionHash(
16471645
colorTransferFunc,
16481646
useIndependentComps,
16491647
numIComps

0 commit comments

Comments
 (0)