]> Creatis software - bbtk.git/blob - packages/wxvtk/src/bbwxvtkViewer3D.cxx
no message
[bbtk.git] / packages / wxvtk / src / bbwxvtkViewer3D.cxx
1 /*=========================================================================
2                                                                                 
3   Program:   bbtk
4   Module:    $RCSfile: bbwxvtkViewer3D.cxx,v $
5   Language:  C++
6   Date:      $Date: 2012/05/30 17:17:02 $
7   Version:   $Revision: 1.22 $
8                                                                                 
9   Copyright (c) CREATIS (Centre de Recherche et d'Applications en Traitement de
10   l'Image). All rights reserved. See Doc/License.txt or
11   http://www.creatis.insa-lyon.fr/Public/bbtk/License.html for details.
12                                                                                 
13      This software is distributed WITHOUT ANY WARRANTY; without even
14      the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
15      PURPOSE.  See the above copyright notices for more information.
16                                                                                 
17 =========================================================================*/
18 /**
19  *  \file 
20  *  \brief 
21  */
22
23
24 #ifdef _USE_WXWIDGETS_
25
26
27 #include "bbwxvtkViewer3D.h"
28 #include "bbwxvtkPackage.h"
29
30 #include "vtkCamera.h"
31
32
33
34 namespace bbwxvtk
35 {
36   BBTK_ADD_BLACK_BOX_TO_PACKAGE(wxvtk,Viewer3D);
37   
38   //-------------------------------------------------------------------------
39   Viewer3DWidget::Viewer3DWidget(Viewer3D* box, wxWindow *parent, bool stereo)
40     : 
41     wxPanel( parent, -1, wxDefaultPosition, wxDefaultSize, wxTAB_TRAVERSAL),
42     mBox(box)
43   {
44     wxPanel *panel = this;
45
46     wxvtkrenderwindowinteractor = new wxVTKRenderWindowInteractor(panel,-1);
47     wxvtkrenderwindowinteractor->UseCaptureMouseOn();
48
49    renderer     = vtkRenderer::New();
50    renderwindow = vtkRenderWindow::New();
51
52    renderwindow->AddRenderer(renderer);
53
54    if (stereo==true){
55       renderwindow->SetStereoCapableWindow(1);
56            
57 //      renderwindow->SetStereoTypeToCrystalEyes();  
58 //      renderwindow->SetStereoTypeToRedBlue();         // OK 2.
59            
60            renderwindow->SetAnaglyphColorMask(4,3);
61            renderwindow->SetAnaglyphColorSaturation(0.65);
62            renderwindow->SetStereoTypeToAnaglyph();         // OK 1.
63            
64 //         renderwindow->SetStereoTypeToInterlaced();      // ??
65 //         renderwindow->SetStereoTypeToCheckerboard();
66 //         renderwindow->SetStereoTypeToDresden();
67                 
68       renderwindow->SetStereoRender(1);
69    }
70
71    wxvtkrenderwindowinteractor->SetRenderWindow(renderwindow);
72    
73    interactorstyle = vtkInteractorStyleTrackballCamera ::New();
74    interactorstyle->SetInteractor (  wxvtkrenderwindowinteractor );
75    wxvtkrenderwindowinteractor->SetInteractorStyle( interactorstyle );
76    
77    int x1=0,x2=200,y1=0,y2=200,z1=0,z2=200;
78    double spx=1,spy=1,spz=1;
79    vtkCamera *camera = renderer->GetActiveCamera();
80    camera->SetViewUp ( spx*0, -spy*1, spz*0);
81    camera->SetPosition( spx*(x1+x2)/2, spy*(y1+y2)/2, -spz*10000000); 
82    camera->SetFocalPoint        ( spx*(x1+x2)/2 , spy*(y1+y2)/2 , spz*0); 
83           
84           
85    //           camera->SetParallelScale(  spx*(x2-x1)/2.0 );
86    renderer->ResetCamera(x1,x2,y1,y2,z1,z2);
87    
88    renderer->SetBackground(0.1, 0.1, 0.2);
89   
90    wxBoxSizer *sizer = new wxBoxSizer(wxVERTICAL);
91    sizer->Add( wxvtkrenderwindowinteractor , 1, wxEXPAND, 0);
92    panel->SetSizer(sizer);
93    panel->SetAutoLayout(true);
94    panel->Layout();
95   
96   }
97   //-------------------------------------------------------------------------
98
99   //-------------------------------------------------------------------------
100   Viewer3DWidget::~Viewer3DWidget()
101   {
102     mBox->DisableObservers();
103     mBox->bbSetOutputWidget(NULL);
104     renderwindow->Delete();
105     renderer->Delete();
106     interactorstyle->Delete();
107     delete wxvtkrenderwindowinteractor;
108   }
109   //-------------------------------------------------------------------------
110   
111   //-------------------------------------------------------------------------
112   void Viewer3DWidget::Update()
113   {
114     //    wxvtkrenderwindowinteractor->Update();
115     wxvtkrenderwindowinteractor->Render();
116     renderer->ResetCameraClippingRange();
117   }
118   //-------------------------------------------------------------------------
119
120   //-------------------------------------------------------------------------
121   vtkRenderer *Viewer3DWidget::GetRenderer()
122   {
123      return renderer;
124   }
125   //-------------------------------------------------------------------------
126
127   //-------------------------------------------------------------------------
128   wxVTKRenderWindowInteractor * Viewer3DWidget::GetInteractor()
129   {
130     return wxvtkrenderwindowinteractor;
131   }
132   //-------------------------------------------------------------------------
133
134 void Viewer3DWidget::Refresh(bool eraseBackground , const wxRect* rect )
135 {
136 //  wxPanel::Refresh(false,rect);
137 }
138
139
140
141   //--------------------------------------------------------------------------
142   //-------------------------------------------------------------------------
143   //--------------------------------------------------------------------------
144   //--------------------------------------------------------------------------
145
146
147   BBTK_BLACK_BOX_IMPLEMENTATION(Viewer3D,bbtk::WxBlackBox);
148
149         
150         //-----------------------------------------------------------------     
151         void Viewer3D::bbUserSetDefaultValues()
152         { 
153                 firsttime=true;
154                 bbSetInputIn1(NULL);
155                 bbSetInputIn2(NULL);
156                 bbSetInputIn3(NULL);
157                 bbSetInputIn4(NULL);
158                 bbSetInputIn5(NULL);
159                 bbSetInputObs1(NULL);
160                 bbSetInputObs2(NULL);
161                 bbSetInputObs3(NULL);
162                 bbSetInputObs4(NULL);
163                 bbSetInputObs5(NULL);
164                 bbSetInputStereo(false);
165                 bbSetOutputRenderer( NULL );
166                 bbSetOutputInteractor( NULL );
167                 bbSetOutputWidget(NULL);
168         }
169         
170         //-----------------------------------------------------------------     
171         void Viewer3D::bbUserInitializeProcessing()
172         {
173         }
174         
175         //-----------------------------------------------------------------     
176         void Viewer3D::bbUserFinalizeProcessing()
177         {  
178           DisableObservers();
179         }
180
181         void Viewer3D::DisableObservers()
182         {  
183           Viewer3DWidget* w = (Viewer3DWidget*)bbGetOutputWidget();
184           if (w!=NULL)
185             { 
186               vtkRenderWindowInteractor *interactor = w->GetInteractor();
187               if (interactor!=NULL)
188                 {
189                   if (bbGetInputObs1()!=NULL) 
190                     {
191                       if (bbGetInputObs1()->GetInteractor()!=NULL)
192                         bbGetInputObs1()->EnabledOff();
193                     }
194                   if (bbGetInputObs2()!=NULL) 
195                     {
196                       if (bbGetInputObs2()->GetInteractor()!=NULL)
197                   //bbGetInputObs2()->SetInteractor(NULL);
198                       bbGetInputObs2()->EnabledOff();
199                     }
200                   if (bbGetInputObs3()!=NULL) 
201                     {
202                      if (bbGetInputObs3()->GetInteractor()!=NULL)
203                    //bbGetInputObs3()->SetInteractor(NULL);
204                       bbGetInputObs3()->EnabledOff();
205                     }
206                   if (bbGetInputObs4()!=NULL) 
207                     {
208                      if (bbGetInputObs4()->GetInteractor()!=NULL)
209                    //bbGetInputObs4()->SetInteractor(NULL);
210                       bbGetInputObs4()->EnabledOff();
211                     }
212                   if (bbGetInputObs5()!=NULL) 
213                     {
214                    if (bbGetInputObs5()->GetInteractor()!=NULL)
215                      //bbGetInputObs5()->SetInteractor(NULL);
216                       bbGetInputObs5()->EnabledOff();
217                     }
218                 }       
219             }
220         }
221         
222         //--------------------------------------------------------------------------
223   void Viewer3D::Process() 
224   { 
225           
226     if (!bbIsShown()) return;
227 //EED     
228 //        Viewer3DWidget* w = (Viewer3DWidget*)bbGetOutputWidget();
229 //        if (w)   w->Update();
230
231           
232           
233     Viewer3DWidget* w = (Viewer3DWidget*)bbGetOutputWidget();
234           if ((firsttime==true) && (w!=NULL)){ 
235                   firsttime=false;
236                   
237                   vtkRenderWindowInteractor *interactor = w->GetInteractor();
238                   if (interactor!=NULL)
239                   {
240
241                           if (bbGetInputObs1()!=NULL) 
242                           {
243                                   bbGetInputObs1()->SetInteractor(interactor);
244                                   bbGetInputObs1()->EnabledOn();
245                           }
246                           if (bbGetInputObs2()!=NULL) 
247                           {
248                                   bbGetInputObs2()->SetInteractor(interactor);
249                                   bbGetInputObs2()->EnabledOn();
250                           }
251                           if (bbGetInputObs3()!=NULL) 
252                           {
253                                   bbGetInputObs3()->SetInteractor(interactor);
254                                   bbGetInputObs3()->EnabledOn();
255                           }
256                           if (bbGetInputObs4()!=NULL) 
257                           {
258                                   bbGetInputObs4()->SetInteractor(interactor);
259                                   bbGetInputObs4()->EnabledOn();
260                           }
261                           if (bbGetInputObs5()!=NULL) 
262                           {
263                                   bbGetInputObs5()->SetInteractor(interactor);
264                                   bbGetInputObs5()->EnabledOn();
265                           }
266                           bbSetOutputInteractor(  w->GetInteractor() );
267                   } // interactor
268         
269                   vtkRenderer *renderer = w->GetRenderer();
270                   if (renderer!=NULL)
271                   {
272                           bbSetOutputRenderer( renderer );
273                           
274                           /*if (bbGetInputIn1()!=NULL) {renderer->AddActor( bbGetInputIn1() ); }
275                           if (bbGetInputIn2()!=NULL) {renderer->AddActor( bbGetInputIn2() ); }
276                           if (bbGetInputIn3()!=NULL) {renderer->AddActor( bbGetInputIn3() ); }
277                           if (bbGetInputIn4()!=NULL) {renderer->AddActor( bbGetInputIn4() ); }
278                           if (bbGetInputIn5()!=NULL) {renderer->AddActor( bbGetInputIn5() ); }
279                           renderer->ResetCamera();
280                           double bounds[6];
281                           renderer->ComputeVisiblePropBounds(bounds);
282                           renderer->ResetCameraClippingRange(bounds);*/
283                           
284                   } // renderer
285                   
286                                   
287           } // w && firsttime
288
289           if(bbGetOutputRenderer()!=NULL){
290                    vtkRenderer *renderer = w->GetRenderer();
291                   if (bbGetInputIn1()!=NULL) {renderer->AddActor( bbGetInputIn1() ); }
292                   if (bbGetInputIn2()!=NULL) {renderer->AddActor( bbGetInputIn2() ); }
293                   if (bbGetInputIn3()!=NULL) {renderer->AddActor( bbGetInputIn3() ); }
294                   if (bbGetInputIn4()!=NULL) {renderer->AddActor( bbGetInputIn4() ); }
295                   if (bbGetInputIn5()!=NULL) {renderer->AddActor( bbGetInputIn5() ); }
296                   renderer->ResetCamera();
297                   double bounds[6];
298                   renderer->ComputeVisiblePropBounds(bounds);
299                   renderer->ResetCameraClippingRange(bounds);
300
301           }
302
303           if (w!=NULL)   w->Update();
304
305   }
306   
307
308   /**
309    * \brief  Create Widget . 
310    *
311    *
312    */ 
313   void Viewer3D::CreateWidget(wxWindow* parent)
314   {
315  
316     bbtkDebugMessageInc("Core",9,"Viewer3D::CreateWidget()"<<std::endl);
317
318     Viewer3DWidget* w = new Viewer3DWidget(this,
319                                            parent,
320                                            //bbGetWxParent(),
321                                            bbGetInputStereo());
322     //EED  w->Update();
323     //...
324           
325     bbSetOutputWidget(w);
326     
327     bbtkDebugDecTab("Core",9);
328     
329   }
330
331   // This callback is necessary to get actual processing of the view 
332   // when window is shown
333   void  Viewer3D::OnShowWidget()
334   {
335     Process();
336         //    Viewer3DWidget* w = (Viewer3DWidget*)bbGetOutputWidget();
337     //    if (w) w->Update();
338   }
339
340
341 }//namespace bbwxvtk
342
343 #endif
344