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