Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
30 changes: 22 additions & 8 deletions Sources/Rendering/Core/Renderer/index.js
Original file line number Diff line number Diff line change
Expand Up @@ -13,6 +13,26 @@ function notImplemented(method) {
return () => vtkErrorMacro(`vtkRenderer::${method} - NOT IMPLEMENTED`);
}

// Props may return an array or a single object (e.g. vtkImageSlice).
// Append array elements individually; append other values as one element.
function collectFromProps(props, getFromProp) {
const collected = [];
props.forEach((prop) => {
const items = getFromProp(prop);
if (Array.isArray(items)) {
for (let j = 0; j < items.length; j++) {
collected.push(items[j]);
}
} else {
collected.push(items);
}
});
return collected;
}

const getPropActors = (prop) => prop.getActors();
const getPropVolumes = (prop) => prop.getVolumes();

// ----------------------------------------------------------------------------
// vtkRenderer methods
// ----------------------------------------------------------------------------
Expand Down Expand Up @@ -138,10 +158,7 @@ function vtkRenderer(publicAPI, model) {
};

publicAPI.getActors = () => {
model.actors = [];
model.props.forEach((prop) => {
model.actors = model.actors.concat(prop.getActors());
});
model.actors = collectFromProps(model.props, getPropActors);
return model.actors;
};
publicAPI.addActor = publicAPI.addViewProp;
Expand All @@ -160,10 +177,7 @@ function vtkRenderer(publicAPI, model) {
};

publicAPI.getVolumes = () => {
model.volumes = [];
model.props.forEach((prop) => {
model.volumes = model.volumes.concat(prop.getVolumes());
});
model.volumes = collectFromProps(model.props, getPropVolumes);
return model.volumes;
};
publicAPI.addVolume = publicAPI.addViewProp;
Expand Down
35 changes: 35 additions & 0 deletions Sources/Rendering/Core/Renderer/test/testPropCollection.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,35 @@
import { expect, it } from 'vitest';
import testUtils from 'vtk.js/Sources/Testing/testUtils';

import vtkActor from 'vtk.js/Sources/Rendering/Core/Actor';
import vtkImageSlice from 'vtk.js/Sources/Rendering/Core/ImageSlice';
import vtkRenderer from 'vtk.js/Sources/Rendering/Core/Renderer';
import vtkVolume from 'vtk.js/Sources/Rendering/Core/Volume';

it.each([
['getActors', vtkActor, vtkImageSlice],
['getVolumes', vtkVolume, vtkVolume],
])('%s collects props into fresh snapshots', (method, type, singleType) => {
const gc = testUtils.createGarbageCollector();
const renderer = gc.registerResource(vtkRenderer.newInstance());
const first = gc.registerResource(type.newInstance());
const second = gc.registerResource(type.newInstance());
const single = gc.registerResource(singleType.newInstance());
const composite = { [method]: () => [first, second] };

renderer.addViewProp(composite);
renderer.addViewProp({ [method]: () => [] });
renderer.addViewProp({ [method]: () => single });
const snapshot = renderer[method]();
expect(snapshot).toEqual([first, second, single]);
expect(renderer[method]()).not.toBe(snapshot);

renderer.removeViewProp(composite);
renderer.addViewProp(first);
const current = renderer[method]();
expect(current).toEqual([single, first]);
expect(renderer[`${method}ByReference`]()).toBe(current);
expect(snapshot).toEqual([first, second, single]);

gc.releaseResources();
});
Loading