]> 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: 2011/05/05 16:07:19 $
7   Version:   $Revision: 1.21 $
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    //           camera->SetParallelScale(  spx*(x2-x1)/2.0 );
84    renderer->ResetCamera(x1,x2,y1,y2,z1,z2);
85    
86    renderer->SetBackground(0.1, 0.1, 0.2);
87   
88    wxBoxSizer *sizer = new wxBoxSizer(wxVERTICAL);
89    sizer->Add( wxvtkrenderwindowinteractor , 1, wxEXPAND, 0);
90    panel->SetSizer(sizer);
91    panel->SetAutoLayout(true);
92    panel->Layout();
93   
94   }
95   //-------------------------------------------------------------------------
96
97   //-------------------------------------------------------------------------
98   Viewer3DWidget::~Viewer3DWidget()
99   {
100     mBox->DisableObservers();
101     mBox->bbSetOutputWidget(NULL);
102     renderwindow->Delete();
103     renderer->Delete();
104     interactorstyle->Delete();
105     delete wxvtkrenderwindowinteractor;
106   }
107   //-------------------------------------------------------------------------
108   
109   //-------------------------------------------------------------------------
110   void Viewer3DWidget::Update()
111   {
112     //    wxvtkrenderwindowinteractor->Update();
113     wxvtkrenderwindowinteractor->Render();
114     renderer->ResetCameraClippingRange();
115   }
116   //-------------------------------------------------------------------------
117
118   //-------------------------------------------------------------------------
119   vtkRenderer *Viewer3DWidget::GetRenderer()
120   {
121      return renderer;
122   }
123   //-------------------------------------------------------------------------
124
125   //-------------------------------------------------------------------------
126   wxVTKRenderWindowInteractor * Viewer3DWidget::GetInteractor()
127   {
128     return wxvtkrenderwindowinteractor;
129   }
130   //-------------------------------------------------------------------------
131
132 void Viewer3DWidget::Refresh(bool eraseBackground , const wxRect* rect )
133 {
134 //  wxPanel::Refresh(false,rect);
135 }
136
137
138
139   //--------------------------------------------------------------------------
140   //-------------------------------------------------------------------------
141   //--------------------------------------------------------------------------
142   //--------------------------------------------------------------------------
143
144
145   BBTK_BLACK_BOX_IMPLEMENTATION(Viewer3D,bbtk::WxBlackBox);
146
147         
148         //-----------------------------------------------------------------     
149         void Viewer3D::bbUserSetDefaultValues()
150         { 
151                 firsttime=true;
152                 bbSetInputIn1(NULL);
153                 bbSetInputIn2(NULL);
154                 bbSetInputIn3(NULL);
155                 bbSetInputIn4(NULL);
156                 bbSetInputIn5(NULL);
157                 bbSetInputObs1(NULL);
158                 bbSetInputObs2(NULL);
159                 bbSetInputObs3(NULL);
160                 bbSetInputObs4(NULL);
161                 bbSetInputObs5(NULL);
162                 bbSetInputStereo(false);
163                 bbSetOutputRenderer( NULL );
164                 bbSetOutputInteractor( NULL );
165                 bbSetOutputWidget(NULL);
166         }
167         
168         //-----------------------------------------------------------------     
169         void Viewer3D::bbUserInitializeProcessing()
170         {
171         }
172         
173         //-----------------------------------------------------------------     
174         void Viewer3D::bbUserFinalizeProcessing()
175         {  
176           DisableObservers();
177         }
178
179         void Viewer3D::DisableObservers()
180         {  
181           Viewer3DWidget* w = (Viewer3DWidget*)bbGetOutputWidget();
182           if (w!=NULL)
183             { 
184               vtkRenderWindowInteractor *interactor = w->GetInteractor();
185               if (interactor!=NULL)
186                 {
187                   if (bbGetInputObs1()!=NULL) 
188                     {
189                       if (bbGetInputObs1()->GetInteractor()!=NULL)
190                         bbGetInputObs1()->EnabledOff();
191                     }
192                   if (bbGetInputObs2()!=NULL) 
193                     {
194                       if (bbGetInputObs2()->GetInteractor()!=NULL)
195                   //bbGetInputObs2()->SetInteractor(NULL);
196                       bbGetInputObs2()->EnabledOff();
197                     }
198                   if (bbGetInputObs3()!=NULL) 
199                     {
200                      if (bbGetInputObs3()->GetInteractor()!=NULL)
201                    //bbGetInputObs3()->SetInteractor(NULL);
202                       bbGetInputObs3()->EnabledOff();
203                     }
204                   if (bbGetInputObs4()!=NULL) 
205                     {
206                      if (bbGetInputObs4()->GetInteractor()!=NULL)
207                    //bbGetInputObs4()->SetInteractor(NULL);
208                       bbGetInputObs4()->EnabledOff();
209                     }
210                   if (bbGetInputObs5()!=NULL) 
211                     {
212                    if (bbGetInputObs5()->GetInteractor()!=NULL)
213                      //bbGetInputObs5()->SetInteractor(NULL);
214                       bbGetInputObs5()->EnabledOff();
215                     }
216                 }       
217             }
218         }
219         
220         //--------------------------------------------------------------------------
221   void Viewer3D::Process() 
222   { 
223           
224     if (!bbIsShown()) return;
225 //EED     
226 //        Viewer3DWidget* w = (Viewer3DWidget*)bbGetOutputWidget();
227 //        if (w)   w->Update();
228
229           
230           
231     Viewer3DWidget* w = (Viewer3DWidget*)bbGetOutputWidget();
232           if ((firsttime==true) && (w!=NULL)){ 
233                   firsttime=false;
234                   
235                   vtkRenderWindowInteractor *interactor = w->GetInteractor();
236                   if (interactor!=NULL)
237                   {
238
239                           if (bbGetInputObs1()!=NULL) 
240                           {
241                                   bbGetInputObs1()->SetInteractor(interactor);
242                                   bbGetInputObs1()->EnabledOn();
243                           }
244                           if (bbGetInputObs2()!=NULL) 
245                           {
246                                   bbGetInputObs2()->SetInteractor(interactor);
247                                   bbGetInputObs2()->EnabledOn();
248                           }
249                           if (bbGetInputObs3()!=NULL) 
250                           {
251                                   bbGetInputObs3()->SetInteractor(interactor);
252                                   bbGetInputObs3()->EnabledOn();
253                           }
254                           if (bbGetInputObs4()!=NULL) 
255                           {
256                                   bbGetInputObs4()->SetInteractor(interactor);
257                                   bbGetInputObs4()->EnabledOn();
258                           }
259                           if (bbGetInputObs5()!=NULL) 
260                           {
261                                   bbGetInputObs5()->SetInteractor(interactor);
262                                   bbGetInputObs5()->EnabledOn();
263                           }
264                           bbSetOutputInteractor(  w->GetInteractor() );
265                   } // interactor
266         
267                   vtkRenderer *renderer = w->GetRenderer();
268                   if (renderer!=NULL)
269                   {
270                           bbSetOutputRenderer( renderer );
271                           
272                           /*if (bbGetInputIn1()!=NULL) {renderer->AddActor( bbGetInputIn1() ); }
273                           if (bbGetInputIn2()!=NULL) {renderer->AddActor( bbGetInputIn2() ); }
274                           if (bbGetInputIn3()!=NULL) {renderer->AddActor( bbGetInputIn3() ); }
275                           if (bbGetInputIn4()!=NULL) {renderer->AddActor( bbGetInputIn4() ); }
276                           if (bbGetInputIn5()!=NULL) {renderer->AddActor( bbGetInputIn5() ); }
277                           renderer->ResetCamera();
278                           double bounds[6];
279                           renderer->ComputeVisiblePropBounds(bounds);
280                           renderer->ResetCameraClippingRange(bounds);*/
281                           
282                   } // renderer
283                   
284                                   
285           } // w && firsttime
286
287           if(bbGetOutputRenderer()!=NULL){
288                    vtkRenderer *renderer = w->GetRenderer();
289                   if (bbGetInputIn1()!=NULL) {renderer->AddActor( bbGetInputIn1() ); }
290                   if (bbGetInputIn2()!=NULL) {renderer->AddActor( bbGetInputIn2() ); }
291                   if (bbGetInputIn3()!=NULL) {renderer->AddActor( bbGetInputIn3() ); }
292                   if (bbGetInputIn4()!=NULL) {renderer->AddActor( bbGetInputIn4() ); }
293                   if (bbGetInputIn5()!=NULL) {renderer->AddActor( bbGetInputIn5() ); }
294                   renderer->ResetCamera();
295                   double bounds[6];
296                   renderer->ComputeVisiblePropBounds(bounds);
297                   renderer->ResetCameraClippingRange(bounds);
298
299           }
300
301           if (w!=NULL)   w->Update();
302
303   }
304   
305
306   /**
307    * \brief  Create Widget . 
308    *
309    *
310    */ 
311   void Viewer3D::CreateWidget(wxWindow* parent)
312   {
313  
314     bbtkDebugMessageInc("Core",9,"Viewer3D::CreateWidget()"<<std::endl);
315
316     Viewer3DWidget* w = new Viewer3DWidget(this,
317                                            parent,
318                                            //bbGetWxParent(),
319                                            bbGetInputStereo());
320     //EED  w->Update();
321     //...
322           
323     bbSetOutputWidget(w);
324     
325     bbtkDebugDecTab("Core",9);
326     
327   }
328
329   // This callback is necessary to get actual processing of the view 
330   // when window is shown
331   void  Viewer3D::OnShowWidget()
332   {
333     Process();
334         //    Viewer3DWidget* w = (Viewer3DWidget*)bbGetOutputWidget();
335     //    if (w) w->Update();
336   }
337
338
339 }//namespace bbwxvtk
340
341 #endif
342