Преглед на файлове

Merge branch 'ctkvtkabstractview-fps'

* ctkvtkabstractview-fps:
  Add ctkVTKAbstractView::FPSVisible to show fps in view
Julien Finet преди 12 години
родител
ревизия
a9e4b6fe65

+ 58 - 0
Libs/Visualization/VTK/Widgets/ctkVTKAbstractView.cpp

@@ -48,6 +48,9 @@ ctkVTKAbstractViewPrivate::ctkVTKAbstractViewPrivate(ctkVTKAbstractView& object)
   this->CornerAnnotation = vtkSmartPointer<vtkCornerAnnotation>::New();
   this->RequestTimer = 0;
   this->RenderEnabled = true;
+  this->FPSVisible = false;
+  this->FPSTimer = 0;
+  this->FPS = 0;
 }
 
 // --------------------------------------------------------------------------
@@ -68,6 +71,11 @@ void ctkVTKAbstractViewPrivate::init()
   QObject::connect(this->RequestTimer, SIGNAL(timeout()),
                    q, SLOT(forceRender()));
 
+  this->FPSTimer = new QTimer(q);
+  this->FPSTimer->setInterval(1000);
+  QObject::connect(this->FPSTimer, SIGNAL(timeout()),
+                   q, SLOT(updateFPS()));
+
   this->setupCornerAnnotation();
   this->setupRendering();
 
@@ -376,3 +384,53 @@ bool ctkVTKAbstractView::gradientBackground()const
   vtkRenderer* firstRenderer = d->firstRenderer();
   return firstRenderer ? firstRenderer->GetGradientBackground() : false;
 }
+
+//----------------------------------------------------------------------------
+void ctkVTKAbstractView::setFPSVisible(bool show)
+{
+  Q_D(ctkVTKAbstractView);
+  if (d->FPSVisible == show)
+    {
+    return;
+    }
+  d->FPSVisible = show;
+  vtkRenderer* renderer = d->firstRenderer();
+  if (d->FPSVisible)
+    {
+    d->FPSTimer->start();
+    qvtkConnect(renderer,
+                vtkCommand::EndEvent, this, SLOT(onRender()));
+    }
+  else
+    {
+    d->FPSTimer->stop();
+    qvtkDisconnect(renderer,
+                   vtkCommand::EndEvent, this, SLOT(onRender()));
+    d->CornerAnnotation->SetText(1, "");
+    }
+}
+
+//----------------------------------------------------------------------------
+bool ctkVTKAbstractView::isFPSVisible()const
+{
+  Q_D(const ctkVTKAbstractView);
+  return d->FPSVisible;
+}
+
+//----------------------------------------------------------------------------
+void ctkVTKAbstractView::onRender()
+{
+  Q_D(ctkVTKAbstractView);
+  ++d->FPS;
+}
+
+//----------------------------------------------------------------------------
+void ctkVTKAbstractView::updateFPS()
+{
+  Q_D(ctkVTKAbstractView);
+  vtkRenderer* renderer = d->firstRenderer();
+  double lastRenderTime = renderer ? renderer->GetLastRenderTimeInSeconds() : 0.;
+  QString fpsString = tr("FPS: %1(%2s)").arg(d->FPS).arg(lastRenderTime);
+  d->FPS = 0;
+  d->CornerAnnotation->SetText(1, fpsString.toLatin1());
+}

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

@@ -47,6 +47,10 @@ class CTK_VISUALIZATION_VTK_WIDGETS_EXPORT ctkVTKAbstractView : public QWidget
   Q_PROPERTY(QColor backgroundColor2 READ backgroundColor2 WRITE setBackgroundColor)
   Q_PROPERTY(bool gradientBackground READ gradientBackground WRITE setGradientBackground)
   Q_PROPERTY(bool renderEnabled READ renderEnabled WRITE setRenderEnabled)
+  /// This property controls whether a corner annotation is visible with the
+  /// last FPS value.
+  /// false by default.
+  Q_PROPERTY(bool fpsVisible READ isFPSVisible WRITE setFPSVisible)
 public:
 
   typedef QWidget Superclass;
@@ -82,6 +86,9 @@ public Q_SLOTS:
   /// Set corner annotation \a text
   virtual void setCornerAnnotationText(const QString& text);
 
+  /// Show/Hide the FPS annotation
+  void setFPSVisible(bool show);
+
 public:
   /// Get underlying RenderWindow
   Q_INVOKABLE vtkRenderWindow* renderWindow()const;
@@ -116,11 +123,21 @@ public:
   /// Return if rendering is enabled
   bool renderEnabled() const;
 
+  /// Return true if the FPS annotation is visible, false otherwise.
+  bool isFPSVisible() const;
+
+  /// Return the current FPS
+  double fps()const;
+
   virtual QSize minimumSizeHint()const;
   virtual QSize sizeHint()const;
   virtual bool hasHeightForWidth()const;
   virtual int heightForWidth(int width)const;
 
+protected Q_SLOTS:
+  void onRender();
+  void updateFPS();
+
 protected:
   QScopedPointer<ctkVTKAbstractViewPrivate> d_ptr;
   ctkVTKAbstractView(ctkVTKAbstractViewPrivate* pimpl, QWidget* parent);

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

@@ -62,6 +62,9 @@ public:
   QTimer*                                       RequestTimer;
   QTime                                         RequestTime;
   bool                                          RenderEnabled;
+  bool                                          FPSVisible;
+  QTimer*                                       FPSTimer;
+  int                                           FPS;
 
   vtkSmartPointer<vtkCornerAnnotation>          CornerAnnotation;
 };