refactor using pimpl and fix test
This commit is contained in:
@@ -67,25 +67,33 @@ vtkStandardNewMacro(vtkInteractorStyleNoSpin);
|
||||
namespace uLib {
|
||||
namespace Vtk {
|
||||
|
||||
struct ViewerData {
|
||||
vtkRenderWindow *m_RenderWindow;
|
||||
vtkSmartPointer<vtkButtonWidget> m_GridButton;
|
||||
|
||||
ViewerData() : m_RenderWindow(vtkRenderWindow::New()) {}
|
||||
~ViewerData() { m_RenderWindow->Delete(); }
|
||||
};
|
||||
|
||||
////////////////////////////////////////////////////////////////////////////////
|
||||
///// VTK VIEWER //////////////////////////////////////////////////////////////
|
||||
////////////////////////////////////////////////////////////////////////////////
|
||||
Viewer::Viewer()
|
||||
: Viewport(), m_RenderWindow(vtkRenderWindow::New()) {
|
||||
: Viewport(), d(new ViewerData()) {
|
||||
InstallPipe();
|
||||
}
|
||||
|
||||
Viewer::~Viewer() {
|
||||
UninstallPipe();
|
||||
m_RenderWindow->Delete();
|
||||
delete d;
|
||||
}
|
||||
|
||||
void Viewer::InstallPipe() {
|
||||
m_RenderWindow->AddRenderer(m_Renderer);
|
||||
m_RenderWindow->SetSize(600,600);
|
||||
d->m_RenderWindow->AddRenderer(this->GetRenderer());
|
||||
d->m_RenderWindow->SetSize(600,600);
|
||||
vtkSmartPointer<vtkRenderWindowInteractor> renderWindowInteractor =
|
||||
vtkSmartPointer<vtkRenderWindowInteractor>::New();
|
||||
renderWindowInteractor->SetRenderWindow(m_RenderWindow);
|
||||
renderWindowInteractor->SetRenderWindow(d->m_RenderWindow);
|
||||
|
||||
// Common setup
|
||||
Viewport::SetupPipeline(renderWindowInteractor);
|
||||
@@ -99,21 +107,21 @@ void Viewer::InstallPipe() {
|
||||
renderWindowInteractor->SetInteractorStyle(style);
|
||||
|
||||
// Must be rendered here in Vtk-6.0 or seg-fault //
|
||||
m_RenderWindow->Render();
|
||||
d->m_RenderWindow->Render();
|
||||
}
|
||||
|
||||
void Viewer::UninstallPipe() {
|
||||
if (m_Renderer) {
|
||||
m_Renderer->RemoveAllViewProps();
|
||||
if (GetRenderer()) {
|
||||
GetRenderer()->RemoveAllViewProps();
|
||||
}
|
||||
}
|
||||
|
||||
void Viewer::Render() {
|
||||
if (m_RenderWindow)
|
||||
m_RenderWindow->Render();
|
||||
if (d->m_RenderWindow)
|
||||
d->m_RenderWindow->Render();
|
||||
}
|
||||
|
||||
vtkSmartPointer<vtkCameraOrientationWidget>
|
||||
vtkCameraOrientationWidget *
|
||||
Viewer::MakeCameraOrientationWidget(vtkRenderWindowInteractor *interactor,
|
||||
vtkRenderer *renderer) {
|
||||
vtkSmartPointer<vtkCameraOrientationWidget> widget =
|
||||
@@ -125,7 +133,7 @@ Viewer::MakeCameraOrientationWidget(vtkRenderWindowInteractor *interactor,
|
||||
}
|
||||
|
||||
void Viewer::SetupGridButton() {
|
||||
if (!m_RenderWindow || !m_RenderWindow->GetInteractor()) return;
|
||||
if (!d->m_RenderWindow || !d->m_RenderWindow->GetInteractor()) return;
|
||||
|
||||
// Create procedural textures for the button using canvas
|
||||
vtkNew<vtkImageCanvasSource2D> canvas;
|
||||
@@ -158,9 +166,9 @@ void Viewer::SetupGridButton() {
|
||||
rep->SetButtonTexture(0, imgOff);
|
||||
rep->SetButtonTexture(1, imgOn);
|
||||
|
||||
m_GridButton = vtkSmartPointer<vtkButtonWidget>::New();
|
||||
m_GridButton->SetInteractor(m_RenderWindow->GetInteractor());
|
||||
m_GridButton->SetRepresentation(rep);
|
||||
d->m_GridButton = vtkSmartPointer<vtkButtonWidget>::New();
|
||||
d->m_GridButton->SetInteractor(d->m_RenderWindow->GetInteractor());
|
||||
d->m_GridButton->SetRepresentation(rep);
|
||||
|
||||
// Position it initially
|
||||
UpdateGridButtonPosition();
|
||||
@@ -172,7 +180,7 @@ void Viewer::SetupGridButton() {
|
||||
auto* v = static_cast<Viewer*>(clientdata);
|
||||
v->UpdateGridButtonPosition();
|
||||
});
|
||||
m_RenderWindow->AddObserver(vtkCommand::ModifiedEvent, resizeCallback);
|
||||
d->m_RenderWindow->AddObserver(vtkCommand::ModifiedEvent, resizeCallback);
|
||||
|
||||
// Callback for state change
|
||||
vtkNew<vtkCallbackCommand> stateCallback;
|
||||
@@ -184,19 +192,19 @@ void Viewer::SetupGridButton() {
|
||||
v->SetGridVisible(r->GetState() == 1);
|
||||
});
|
||||
|
||||
m_GridButton->AddObserver(vtkCommand::StateChangedEvent, stateCallback);
|
||||
m_GridButton->On();
|
||||
d->m_GridButton->AddObserver(vtkCommand::StateChangedEvent, stateCallback);
|
||||
d->m_GridButton->On();
|
||||
|
||||
// Set initial state
|
||||
rep->SetState(GetGridVisible() ? 1 : 0);
|
||||
}
|
||||
|
||||
void Viewer::UpdateGridButtonPosition() {
|
||||
if (!m_GridButton || !m_RenderWindow) return;
|
||||
auto* rep = vtkTexturedButtonRepresentation2D::SafeDownCast(m_GridButton->GetRepresentation());
|
||||
if (!d->m_GridButton || !d->m_RenderWindow) return;
|
||||
auto* rep = vtkTexturedButtonRepresentation2D::SafeDownCast(d->m_GridButton->GetRepresentation());
|
||||
if (!rep) return;
|
||||
|
||||
int *sz = m_RenderWindow->GetSize();
|
||||
int *sz = d->m_RenderWindow->GetSize();
|
||||
if (sz[0] == 0 || sz[1] == 0) return; // Window not yet sized or hidden
|
||||
|
||||
int margin_rigth = 23;
|
||||
@@ -207,12 +215,12 @@ void Viewer::UpdateGridButtonPosition() {
|
||||
rep->PlaceWidget(bds);
|
||||
}
|
||||
|
||||
void Viewer::Start() { m_RenderWindow->GetInteractor()->Start(); }
|
||||
void Viewer::Start() { d->m_RenderWindow->GetInteractor()->Start(); }
|
||||
|
||||
vtkRenderWindow *Viewer::GetRenderWindow() { return m_RenderWindow; }
|
||||
vtkRenderWindow *Viewer::GetRenderWindow() { return d->m_RenderWindow; }
|
||||
|
||||
vtkRenderWindowInteractor *Viewer::GetInteractor() {
|
||||
return m_RenderWindow->GetInteractor();
|
||||
return d->m_RenderWindow->GetInteractor();
|
||||
}
|
||||
|
||||
} // namespace Vtk
|
||||
|
||||
Reference in New Issue
Block a user