#include "precomp.hpp"
+
/////////////////////////////////////////////////////////////////////////////////////////////
-cv::viz::Viz3d::VizImpl::VizImpl(const String &name) : spin_once_state_(false), widget_actor_map_(new WidgetActorMap)
+cv::viz::Viz3d::VizImpl::VizImpl(const String &name) : spin_once_state_(false),
+ window_position_(Vec2i(std::numeric_limits<int>::min())), widget_actor_map_(new WidgetActorMap)
{
renderer_ = vtkSmartPointer<vtkRenderer>::New();
+ window_name_ = VizStorage::generateWindowName(name);
// Create render window
window_ = vtkSmartPointer<vtkRenderWindow>::New();
- window_name_ = VizStorage::generateWindowName(name);
-
cv::Vec2i window_size = cv::Vec2i(window_->GetScreenSize()) / 2;
window_->SetSize(window_size.val);
- window_->AddRenderer(renderer_);
- window_->AlphaBitPlanesOff();
- window_->PointSmoothingOff();
- window_->LineSmoothingOff();
- window_->PolygonSmoothingOff();
- window_->SwapBuffersOn();
- window_->SetStereoTypeToAnaglyph();
// Create the interactor style
style_ = vtkSmartPointer<InteractorStyle>::New();
interactor_->TerminateApp(); // This tends to close the window...
}
+void cv::viz::Viz3d::VizImpl::recreateRenderWindow()
+{
+ //recreating is workaround for Ubuntu -- a crash in x-server
+ Vec2i window_size(window_->GetSize());
+ int fullscreen = window_->GetFullScreen();
+
+ window_ = vtkSmartPointer<vtkRenderWindow>::New();
+ if (window_position_[0] != std::numeric_limits<int>::min()) //also workaround
+ window_->SetPosition(window_position_.val);
+
+ window_->SetSize(window_size.val);
+ window_->SetFullScreen(fullscreen);
+ window_->AddRenderer(renderer_);
+ window_->AlphaBitPlanesOff();
+ window_->PointSmoothingOff();
+ window_->LineSmoothingOff();
+ window_->PolygonSmoothingOff();
+ window_->SwapBuffersOn();
+ window_->SetStereoTypeToAnaglyph();
+}
+
+
/////////////////////////////////////////////////////////////////////////////////////////////
void cv::viz::Viz3d::VizImpl::spin()
{
+ recreateRenderWindow();
interactor_ = vtkSmartPointer<vtkRenderWindowInteractor>::New();
interactor_->SetRenderWindow(window_);
interactor_->SetInteractorStyle(style_);
if (interactor_ == 0)
{
spin_once_state_ = true;
+ recreateRenderWindow();
interactor_ = vtkSmartPointer<vtkRenderWindowInteractor>::New();
interactor_->SetRenderWindow(window_);
interactor_->SetInteractorStyle(style_);
camera.SetViewUp(up_vec.val);
renderer_->ResetCameraClippingRange();
- renderer_->Render();
}
/////////////////////////////////////////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////////////////////////////////////////
cv::String cv::viz::Viz3d::VizImpl::getWindowName() const { return window_name_; }
void cv::viz::Viz3d::VizImpl::setFullScreen(bool mode) { window_->SetFullScreen(mode); }
-void cv::viz::Viz3d::VizImpl::setWindowPosition(const Point& position) { window_->SetPosition(position.x, position.y); }
+void cv::viz::Viz3d::VizImpl::setWindowPosition(const Point& position) { window_position_ = position; window_->SetPosition(position.x, position.y); }
void cv::viz::Viz3d::VizImpl::setWindowSize(const Size& window_size) { window_->SetSize(window_size.width, window_size.height); }
cv::Size cv::viz::Viz3d::VizImpl::getWindowSize() const { return Size(Point(Vec2i(window_->GetSize()))); }