Skip to content

Commit c50a9e2

Browse files
committed
fix(TextActor): add support for property change
fixes #3445
1 parent 9d00695 commit c50a9e2

3 files changed

Lines changed: 81 additions & 8 deletions

File tree

Sources/Rendering/Core/Actor2D/index.js

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -45,13 +45,15 @@ function vtkActor2D(publicAPI, model) {
4545

4646
publicAPI.makeProperty = vtkProperty2D.newInstance;
4747

48-
publicAPI.getProperty = () => {
48+
publicAPI.ensureProperty = () => {
4949
if (model.property === null) {
50-
model.property = publicAPI.makeProperty();
50+
publicAPI.setProperty(publicAPI.makeProperty());
5151
}
5252
return model.property;
5353
};
5454

55+
publicAPI.getProperty = () => publicAPI.ensureProperty();
56+
5557
//----------------------------------------------------------------------------
5658
// Set the Prop2D's position in display coordinates.
5759
publicAPI.setDisplayPosition = (XPos, YPos) => {

Sources/Rendering/Core/TextActor/example/index.js

Lines changed: 31 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -37,6 +37,16 @@ const params = {
3737
text: 'Hello World!',
3838
x: window.innerWidth / 4,
3939
y: window.innerHeight / 4,
40+
color: [0, 0, 0],
41+
fontFamily: 'Arial',
42+
fontSize: actor.getProperty().getResolution(),
43+
};
44+
45+
const fonts = {
46+
Arial: 'Arial',
47+
Verdana: 'Verdana',
48+
Tahoma: 'Tahoma',
49+
Times: 'Times New Roman',
4050
};
4151

4252
gui
@@ -46,6 +56,27 @@ gui
4656
actor.setInput(value);
4757
renderWindow.render();
4858
});
59+
gui
60+
.add(params, 'fontFamily', fonts)
61+
.name('Font')
62+
.onChange((value) => {
63+
actor.getProperty().setFontFamily(value);
64+
renderWindow.render();
65+
});
66+
gui
67+
.add(params, 'fontSize', 50, 400, 1)
68+
.name('Font Size')
69+
.onChange((value) => {
70+
actor.getProperty().setResolution(value);
71+
renderWindow.render();
72+
});
73+
gui
74+
.addColor(params, 'color')
75+
.name('Font Color')
76+
.onChange((value) => {
77+
actor.getProperty().setFontColor(value[0], value[1], value[2]);
78+
renderWindow.render();
79+
});
4980
gui
5081
.add(params, 'x')
5182
.name('X Position')

Sources/Rendering/Core/TextActor/index.js

Lines changed: 46 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,8 @@ function vtkTextActor(publicAPI, model) {
1414
// Set our className
1515
model.classHierarchy.push('vtkTextActor');
1616

17+
const superClass = { ...publicAPI };
18+
1719
publicAPI.makeProperty = vtkTextProperty.newInstance;
1820

1921
const texture = vtkTexture.newInstance({
@@ -38,7 +40,7 @@ function vtkTextActor(publicAPI, model) {
3840
const backgroundColor = publicAPI.getProperty().getBackgroundColor();
3941

4042
const dpr = Math.max(window.devicePixelRatio || 1, 1);
41-
const ctx = canvas.getContext('2d');
43+
const ctx = canvas.getContext('2d', { willReadFrequently: true });
4244

4345
// Set the text properties to measure
4446
const textSize = fontSizeScale(resolution) * dpr;
@@ -110,21 +112,55 @@ function vtkTextActor(publicAPI, model) {
110112
return ImageHelper.canvasToImageData(canvas);
111113
}
112114

115+
function updateTexture() {
116+
const image = createImageData(model.input);
117+
texture.setInputData(image, 0);
118+
model.textureBuildTime.modified();
119+
}
120+
121+
function updateTextureIfNeeded() {
122+
if (model.input === undefined) {
123+
return;
124+
}
125+
126+
const propertyMTime = publicAPI.getProperty().getMTime();
127+
if (
128+
model.textureBuildTime.getMTime() < propertyMTime ||
129+
model.textureBuildTime.getMTime() < model.textureUpdateTime.getMTime()
130+
) {
131+
updateTexture();
132+
}
133+
}
134+
113135
mapper.setInputConnection(plane.getOutputPort());
114136

115137
publicAPI.setMapper(mapper);
116138
publicAPI.addTexture(texture);
117139

118-
model._onInputChanged = (_publicAPI, _model, value) => {
119-
const image = createImageData(value);
120-
texture.setInputData(image, 0);
140+
publicAPI.setProperty = (property) => {
141+
const changed = superClass.setProperty(property);
142+
if (changed) {
143+
model.textureUpdateTime.modified();
144+
}
145+
return changed;
146+
};
147+
148+
publicAPI.getTextures = () => {
149+
updateTextureIfNeeded();
150+
return superClass.getTextures();
151+
};
152+
153+
publicAPI.delete = () => superClass.delete();
154+
155+
model._onInputChanged = () => {
156+
model.textureUpdateTime.modified();
121157
};
122158
}
123159

124160
// Default property values
125161
const DEFAULT_VALUES = {
126-
mapper: null,
127-
property: null,
162+
textureBuildTime: null,
163+
textureUpdateTime: null,
128164
};
129165

130166
export function extend(publicAPI, model, initialValues = {}) {
@@ -135,6 +171,10 @@ export function extend(publicAPI, model, initialValues = {}) {
135171

136172
// Build VTK API
137173
macro.setGet(publicAPI, model, ['input']);
174+
model.textureBuildTime = {};
175+
macro.obj(model.textureBuildTime, { mtime: 0 });
176+
model.textureUpdateTime = {};
177+
macro.obj(model.textureUpdateTime, { mtime: 0 });
138178

139179
// Object methods
140180
vtkTextActor(publicAPI, model);

0 commit comments

Comments
 (0)