40 callback(vtkSmartPointer<vtkCallbackCommand>::New())
42 callback->SetClientData(
this);
43 callback->SetCallback([](vtkObject*,
unsigned long,
void* data,
void*)
47 observer = renderer->AddObserver(vtkCommand::StartEvent, callback);
79 if(translations.empty())
83 std::set<vtkActor*> copies;
84 for(
const auto& entry : images)
86 for(
const auto& copy : entry.second.copies)
91 std::set<vtkActor*> sources;
92 auto* props = renderer->GetViewProps();
93 vtkCollectionSimpleIterator iterator;
94 props->InitTraversal(iterator);
95 while(
auto* prop = props->GetNextProp(iterator))
97 auto* actor = vtkActor::SafeDownCast(prop);
99 if(actor && actor->GetMapper() && !actor->IsA(
"vtkCubeAxesActor") && !copies.count(actor))
101 sources.insert(actor);
104 for(
auto it = images.begin(); it != images.end();)
106 if(!sources.count(it->first))
108 for(
auto& copy : it->second.copies)
110 renderer->RemoveActor(copy);
112 it = images.erase(it);
119 for(
auto* source : sources)
121 auto& entry = images[source];
122 entry.source = source;
123 if(entry.copies.empty())
125 for(
size_t i = 0;
i < translations.size(); ++
i)
127 auto copy = vtkSmartPointer<vtkActor>::New();
128 renderer->AddActor(copy);
129 entry.copies.push_back(copy);
132 for(
size_t i = 0;
i < translations.size(); ++
i)
134 auto& copy = entry.copies[
i];
135 copy->ShallowCopy(source);
137 auto matrix = vtkSmartPointer<vtkMatrix4x4>::New();
138 matrix->DeepCopy(source->GetMatrix());
139 for(
int row = 0; row < 3; ++row)
141 matrix->SetElement(row, 3,
matrix->GetElement(row, 3) + translations[
i][row]);
143 copy->SetOrigin(0, 0, 0);
144 copy->SetPosition(0, 0, 0);
145 copy->SetOrientation(0, 0, 0);
146 copy->SetScale(1, 1, 1);
147 copy->SetUserMatrix(
matrix);