Explorar el Código

Added static method to set multisampling.

This allows setting a static boolean variable in the ctkVTKAbstractView
class that determines whether or not future instances have
multisampling (FSAA) enabled by default. This is necessary because,
at least in some circumstances, the multisamples OpenGL property must
be set before the OpenGL context is created -- and this happens during
class initialization. Closes #463.
Eric Larson hace 11 años
padre
commit
b39d95edd9

+ 22 - 5
Libs/Visualization/VTK/Widgets/ctkVTKAbstractView.cpp

@@ -37,6 +37,8 @@
 //--------------------------------------------------------------------------
 static ctkLogger logger("org.commontk.visualization.vtk.widgets.ctkVTKAbstractView");
 //--------------------------------------------------------------------------
+bool ctkVTKAbstractViewPrivate::UseMultiSamples = false;  // Default for static var
+//--------------------------------------------------------------------------
 
 // --------------------------------------------------------------------------
 // ctkVTKAbstractViewPrivate methods
@@ -98,7 +100,9 @@ void ctkVTKAbstractViewPrivate::setupRendering()
 {
   Q_ASSERT(this->RenderWindow);
   this->RenderWindow->SetAlphaBitPlanes(1);
-  this->RenderWindow->SetMultiSamples(0);
+  const int maxSamples = vtkOpenGLRenderWindow::GetGlobalMaximumNumberOfMultiSamples();
+  this->RenderWindow->SetMultiSamples(
+      ctkVTKAbstractView::useMultiSamples() ? maxSamples : 0);
   this->RenderWindow->StereoCapableWindowOn();
 
   this->VTKWidget->SetRenderWindow(this->RenderWindow);
@@ -445,7 +449,7 @@ bool ctkVTKAbstractView::useDepthPeeling()const
 }
 
 //----------------------------------------------------------------------------
-void ctkVTKAbstractView::setUseDepthPeeling(bool use)
+void ctkVTKAbstractView::setUseDepthPeeling(bool useDepthPeeling)
 {
   Q_D(ctkVTKAbstractView);
   vtkRenderer* renderer = d->firstRenderer();
@@ -453,8 +457,21 @@ void ctkVTKAbstractView::setUseDepthPeeling(bool use)
     {
     return;
     }
-  this->renderWindow()->SetAlphaBitPlanes( use ? 1 : 0);
+  this->renderWindow()->SetAlphaBitPlanes( useDepthPeeling ? 1 : 0);
+  const int maxSamples = vtkOpenGLRenderWindow::GetGlobalMaximumNumberOfMultiSamples();
   this->renderWindow()->SetMultiSamples(
-    use ? 0 : vtkOpenGLRenderWindow::GetGlobalMaximumNumberOfMultiSamples());
-  renderer->SetUseDepthPeeling(use ? 1 : 0);
+    (useDepthPeeling || !ctkVTKAbstractView::useMultiSamples()) ? 0 : maxSamples);
+  renderer->SetUseDepthPeeling(useDepthPeeling ? 1 : 0);
+}
+
+//----------------------------------------------------------------------------
+bool ctkVTKAbstractView::useMultiSamples()
+{
+  return ctkVTKAbstractViewPrivate::UseMultiSamples;
+}
+
+//----------------------------------------------------------------------------
+void ctkVTKAbstractView::setUseMultiSamples(bool use)
+{
+  ctkVTKAbstractViewPrivate::UseMultiSamples = use;
 }

+ 12 - 0
Libs/Visualization/VTK/Widgets/ctkVTKAbstractView.h

@@ -141,6 +141,18 @@ public:
   /// \sa useDepthPeeling
   bool useDepthPeeling()const;
 
+  /// Set multisampling default.
+  /// WARNING: Multisampling should be set *before* creation of the
+  /// OpenGL context (e.g., initializing the rendering window) in order
+  /// to have an effect. Consider using setUseMultisamples before
+  /// instantiating ctkVTKAbstractView objects.
+  /// \sa useMultiSamples
+  static void setUseMultiSamples(bool);
+
+  /// Return the current multisamples default
+  /// \sa setUseMultiSamples()
+  static bool useMultiSamples();
+
   virtual QSize minimumSizeHint()const;
   virtual QSize sizeHint()const;
   virtual bool hasHeightForWidth()const;

+ 1 - 0
Libs/Visualization/VTK/Widgets/ctkVTKAbstractView_p.h

@@ -65,6 +65,7 @@ public:
   bool                                          FPSVisible;
   QTimer*                                       FPSTimer;
   int                                           FPS;
+  static bool                                   UseMultiSamples;
 
   vtkSmartPointer<vtkCornerAnnotation>          CornerAnnotation;
 };