ctkVTKRenderView.cpp 12 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383
  1. /*=========================================================================
  2. Library: CTK
  3. Copyright (c) 2010 Kitware Inc.
  4. Licensed under the Apache License, Version 2.0 (the "License");
  5. you may not use this file except in compliance with the License.
  6. You may obtain a copy of the License at
  7. http://www.commontk.org/LICENSE
  8. Unless required by applicable law or agreed to in writing, software
  9. distributed under the License is distributed on an "AS IS" BASIS,
  10. WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
  11. See the License for the specific language governing permissions and
  12. limitations under the License.
  13. =========================================================================*/
  14. // Qt includes
  15. #include <QTimer>
  16. #include <QVBoxLayout>
  17. // CTK includes
  18. #include "ctkVTKRenderView.h"
  19. #include "ctkVTKRenderView_p.h"
  20. #include "ctkLogger.h"
  21. // VTK includes
  22. #include <vtkRendererCollection.h>
  23. #include <vtkRenderWindowInteractor.h>
  24. #include <vtkTextProperty.h>
  25. #include <vtkCamera.h>
  26. //--------------------------------------------------------------------------
  27. static ctkLogger logger("org.commontk.visualization.vtk.widgets.ctkVTKRenderView");
  28. //--------------------------------------------------------------------------
  29. // --------------------------------------------------------------------------
  30. // ctkVTKRenderViewPrivate methods
  31. // --------------------------------------------------------------------------
  32. ctkVTKRenderViewPrivate::ctkVTKRenderViewPrivate()
  33. {
  34. this->Renderer = vtkSmartPointer<vtkRenderer>::New();
  35. this->RenderWindow = vtkSmartPointer<vtkRenderWindow>::New();
  36. this->Axes = vtkSmartPointer<vtkAxesActor>::New();
  37. this->Orientation = vtkSmartPointer<vtkOrientationMarkerWidget>::New();
  38. this->CornerAnnotation = vtkSmartPointer<vtkCornerAnnotation>::New();
  39. this->RenderPending = false;
  40. this->RenderEnabled = false;
  41. this->ZoomFactor = 0.05;
  42. this->RotateDegrees = 5;
  43. this->PitchDirection = ctkVTKRenderView::PitchUp;
  44. this->RollDirection = ctkVTKRenderView::RollRight;
  45. this->YawDirection = ctkVTKRenderView::YawLeft;
  46. }
  47. // --------------------------------------------------------------------------
  48. void ctkVTKRenderViewPrivate::setupCornerAnnotation()
  49. {
  50. logger.trace("setupCornerAnnotation");
  51. if (!this->Renderer->HasViewProp(this->CornerAnnotation))
  52. {
  53. this->Renderer->AddViewProp(this->CornerAnnotation);
  54. this->CornerAnnotation->SetMaximumLineHeight(0.07);
  55. vtkTextProperty *tprop = this->CornerAnnotation->GetTextProperty();
  56. tprop->ShadowOn();
  57. }
  58. this->CornerAnnotation->ClearAllTexts();
  59. }
  60. //---------------------------------------------------------------------------
  61. void ctkVTKRenderViewPrivate::setupRendering()
  62. {
  63. logger.trace("setupRendering");
  64. Q_ASSERT(this->RenderWindow);
  65. this->RenderWindow->SetAlphaBitPlanes(1);
  66. this->RenderWindow->SetMultiSamples(0);
  67. this->RenderWindow->StereoCapableWindowOn();
  68. this->RenderWindow->GetRenderers()->RemoveAllItems();
  69. // Add renderer
  70. this->RenderWindow->AddRenderer(this->Renderer);
  71. // Setup the corner annotation
  72. this->setupCornerAnnotation();
  73. this->VTKWidget->SetRenderWindow(this->RenderWindow);
  74. }
  75. //---------------------------------------------------------------------------
  76. void ctkVTKRenderViewPrivate::setupDefaultInteractor()
  77. {
  78. logger.trace("setupDefaultInteractor");
  79. CTK_P(ctkVTKRenderView);
  80. p->setInteractor(this->RenderWindow->GetInteractor());
  81. }
  82. //----------------------------------------------------------------------------
  83. void ctkVTKRenderViewPrivate::zoom(double zoomFactor)
  84. {
  85. Q_ASSERT(this->Renderer->IsActiveCameraCreated());
  86. vtkCamera * camera = this->Renderer->GetActiveCamera();
  87. if (camera->GetParallelProjection())
  88. {
  89. camera->SetParallelScale(camera->GetParallelScale() / (1 + zoomFactor));
  90. }
  91. else
  92. {
  93. camera->Dolly(1 + zoomFactor);
  94. this->Renderer->ResetCameraClippingRange();
  95. this->Renderer->UpdateLightsGeometryToFollowCamera();
  96. }
  97. }
  98. //---------------------------------------------------------------------------
  99. // ctkVTKRenderView methods
  100. // --------------------------------------------------------------------------
  101. ctkVTKRenderView::ctkVTKRenderView(QWidget* _parent) : Superclass(_parent)
  102. {
  103. CTK_INIT_PRIVATE(ctkVTKRenderView);
  104. CTK_D(ctkVTKRenderView);
  105. d->VTKWidget = new QVTKWidget(this);
  106. this->setLayout(new QVBoxLayout);
  107. this->layout()->setMargin(0);
  108. this->layout()->setSpacing(0);
  109. this->layout()->addWidget(d->VTKWidget);
  110. d->setupRendering();
  111. d->setupDefaultInteractor();
  112. }
  113. //----------------------------------------------------------------------------
  114. void ctkVTKRenderView::scheduleRender()
  115. {
  116. CTK_D(ctkVTKRenderView);
  117. logger.trace(QString("scheduleRender - RenderEnabled: %1 - RenderPending: %2").
  118. arg(d->RenderEnabled).arg(d->RenderPending));
  119. if (!d->RenderEnabled)
  120. {
  121. return;
  122. }
  123. if (!d->RenderPending)
  124. {
  125. d->RenderPending = true;
  126. QTimer::singleShot(0, this, SLOT(forceRender()));
  127. }
  128. }
  129. //----------------------------------------------------------------------------
  130. void ctkVTKRenderView::forceRender()
  131. {
  132. CTK_D(ctkVTKRenderView);
  133. logger.trace(QString("forceRender - RenderEnabled: %1").arg(d->RenderEnabled));
  134. if (!d->RenderEnabled)
  135. {
  136. return;
  137. }
  138. d->RenderWindow->Render();
  139. d->RenderPending = false;
  140. }
  141. //----------------------------------------------------------------------------
  142. CTK_GET_CXX(ctkVTKRenderView, vtkRenderWindow*, renderWindow, RenderWindow);
  143. //----------------------------------------------------------------------------
  144. CTK_GET_CXX(ctkVTKRenderView, vtkRenderWindowInteractor*, interactor, CurrentInteractor);
  145. //----------------------------------------------------------------------------
  146. void ctkVTKRenderView::setInteractor(vtkRenderWindowInteractor* newInteractor)
  147. {
  148. CTK_D(ctkVTKRenderView);
  149. logger.trace("setInteractor");
  150. d->RenderWindow->SetInteractor(newInteractor);
  151. d->Orientation->SetOrientationMarker(d->Axes);
  152. d->Orientation->SetInteractor(newInteractor);
  153. d->Orientation->SetEnabled(1);
  154. d->Orientation->InteractiveOff();
  155. d->CurrentInteractor = newInteractor;
  156. }
  157. //----------------------------------------------------------------------------
  158. vtkInteractorObserver* ctkVTKRenderView::interactorStyle()
  159. {
  160. CTK_D(ctkVTKRenderView);
  161. if (d->CurrentInteractor)
  162. {
  163. return d->CurrentInteractor->GetInteractorStyle();
  164. }
  165. else
  166. {
  167. return 0;
  168. }
  169. }
  170. //----------------------------------------------------------------------------
  171. void ctkVTKRenderView::setCornerAnnotationText(const QString& text)
  172. {
  173. CTK_D(ctkVTKRenderView);
  174. logger.trace(QString("setCornerAnnotationText: %1").arg(text));
  175. d->CornerAnnotation->ClearAllTexts();
  176. d->CornerAnnotation->SetText(2, text.toLatin1());
  177. }
  178. //----------------------------------------------------------------------------
  179. QString ctkVTKRenderView::cornerAnnotationText() const
  180. {
  181. CTK_D(const ctkVTKRenderView);
  182. return QLatin1String(d->CornerAnnotation->GetText(2));
  183. }
  184. // --------------------------------------------------------------------------
  185. void ctkVTKRenderView::setBackgroundColor(const QColor& newBackgroundColor)
  186. {
  187. CTK_D(ctkVTKRenderView);
  188. logger.trace(QString("setBackgroundColor: %1").arg(newBackgroundColor.name()));
  189. d->Renderer->SetBackground(newBackgroundColor.redF(),
  190. newBackgroundColor.greenF(),
  191. newBackgroundColor.blueF());
  192. }
  193. //----------------------------------------------------------------------------
  194. QColor ctkVTKRenderView::backgroundColor() const
  195. {
  196. CTK_D(const ctkVTKRenderView);
  197. double color[3] = {0, 0, 0};
  198. d->Renderer->GetBackground(color);
  199. return QColor::fromRgbF(color[0], color[1], color[2]);
  200. }
  201. //----------------------------------------------------------------------------
  202. void ctkVTKRenderView::setOrientationWidgetVisible(bool visible)
  203. {
  204. CTK_D(ctkVTKRenderView);
  205. d->Orientation->SetEnabled(visible);
  206. }
  207. //----------------------------------------------------------------------------
  208. bool ctkVTKRenderView::orientationWidgetVisible()
  209. {
  210. CTK_D(ctkVTKRenderView);
  211. return d->Orientation->GetEnabled();
  212. }
  213. //----------------------------------------------------------------------------
  214. vtkCamera* ctkVTKRenderView::activeCamera()
  215. {
  216. CTK_D(ctkVTKRenderView);
  217. if (d->Renderer->IsActiveCameraCreated())
  218. {
  219. return d->Renderer->GetActiveCamera();
  220. }
  221. else
  222. {
  223. return 0;
  224. }
  225. }
  226. //----------------------------------------------------------------------------
  227. void ctkVTKRenderView::resetCamera()
  228. {
  229. CTK_D(ctkVTKRenderView);
  230. logger.trace("resetCamera");
  231. d->Renderer->ResetCamera();
  232. }
  233. //----------------------------------------------------------------------------
  234. CTK_GET_CXX(ctkVTKRenderView, vtkRenderer*, renderer, Renderer);
  235. //----------------------------------------------------------------------------
  236. CTK_SET_CXX(ctkVTKRenderView, bool, setRenderEnabled, RenderEnabled);
  237. CTK_GET_CXX(ctkVTKRenderView, bool, renderEnabled, RenderEnabled);
  238. //----------------------------------------------------------------------------
  239. CTK_GET_CXX(ctkVTKRenderView, int, rotateDegrees, RotateDegrees);
  240. //----------------------------------------------------------------------------
  241. void ctkVTKRenderView::setRotateDegrees(int newRotateDegrees)
  242. {
  243. CTK_D(ctkVTKRenderView);
  244. d->RotateDegrees = qAbs(newRotateDegrees);
  245. }
  246. //----------------------------------------------------------------------------
  247. CTK_GET_CXX(ctkVTKRenderView, ctkVTKRenderView::PitchDirection, pitchDirection, PitchDirection);
  248. CTK_SET_CXX(ctkVTKRenderView, ctkVTKRenderView::PitchDirection, setPitchDirection, PitchDirection);
  249. //----------------------------------------------------------------------------
  250. CTK_GET_CXX(ctkVTKRenderView, ctkVTKRenderView::RollDirection, rollDirection, RollDirection);
  251. CTK_SET_CXX(ctkVTKRenderView, ctkVTKRenderView::RollDirection, setRollDirection, RollDirection);
  252. //----------------------------------------------------------------------------
  253. CTK_GET_CXX(ctkVTKRenderView, ctkVTKRenderView::YawDirection, yawDirection, YawDirection);
  254. CTK_SET_CXX(ctkVTKRenderView, ctkVTKRenderView::YawDirection, setYawDirection, YawDirection);
  255. //----------------------------------------------------------------------------
  256. void ctkVTKRenderView::pitch()
  257. {
  258. CTK_D(ctkVTKRenderView);
  259. if (!d->Renderer->IsActiveCameraCreated())
  260. {
  261. return;
  262. }
  263. vtkCamera *cam = d->Renderer->GetActiveCamera();
  264. cam->Elevation(d->PitchDirection == Self::PitchDown ? d->RotateDegrees : -d->RotateDegrees);
  265. cam->OrthogonalizeViewUp();
  266. d->Renderer->UpdateLightsGeometryToFollowCamera();
  267. }
  268. //----------------------------------------------------------------------------
  269. void ctkVTKRenderView::roll()
  270. {
  271. CTK_D(ctkVTKRenderView);
  272. if (!d->Renderer->IsActiveCameraCreated())
  273. {
  274. return;
  275. }
  276. vtkCamera *cam = d->Renderer->GetActiveCamera();
  277. cam->Roll(d->RollDirection == Self::RollLeft ? d->RotateDegrees : -d->RotateDegrees);
  278. cam->OrthogonalizeViewUp();
  279. d->Renderer->UpdateLightsGeometryToFollowCamera();
  280. }
  281. //----------------------------------------------------------------------------
  282. void ctkVTKRenderView::yaw()
  283. {
  284. CTK_D(ctkVTKRenderView);
  285. if (!d->Renderer->IsActiveCameraCreated())
  286. {
  287. return;
  288. }
  289. vtkCamera *cam = d->Renderer->GetActiveCamera();
  290. cam->Azimuth(d->YawDirection == Self::YawLeft ? d->RotateDegrees : -d->RotateDegrees);
  291. cam->OrthogonalizeViewUp();
  292. d->Renderer->UpdateLightsGeometryToFollowCamera();
  293. }
  294. //----------------------------------------------------------------------------
  295. void ctkVTKRenderView::setZoomFactor(double newZoomFactor)
  296. {
  297. CTK_D(ctkVTKRenderView);
  298. d->ZoomFactor = qBound(0.0, qAbs(newZoomFactor), 1.0);
  299. }
  300. //----------------------------------------------------------------------------
  301. CTK_GET_CXX(ctkVTKRenderView, double, zoomFactor, ZoomFactor);
  302. //----------------------------------------------------------------------------
  303. void ctkVTKRenderView::zoomIn()
  304. {
  305. CTK_D(ctkVTKRenderView);
  306. if (!d->Renderer->IsActiveCameraCreated())
  307. {
  308. return;
  309. }
  310. d->zoom(d->ZoomFactor);
  311. }
  312. //----------------------------------------------------------------------------
  313. void ctkVTKRenderView::zoomOut()
  314. {
  315. CTK_D(ctkVTKRenderView);
  316. if (!d->Renderer->IsActiveCameraCreated())
  317. {
  318. return;
  319. }
  320. d->zoom(-d->ZoomFactor);
  321. }