]> Creatis software - bbtk.git/blob - packages/wxvtk/src/bbwxvtkViewer3D.cxx
Changes to define the background color of the Viewer3D
[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                 std::vector<double> bckgrndColor(3);
188                 bckgrndColor[0] = 0.1;
189                 bckgrndColor[1] = 0.1;
190                 bckgrndColor[2] = 0.2;
191                 bbSetInputBackgroundColor(bckgrndColor);
192         }
193         
194         //-----------------------------------------------------------------     
195         void Viewer3D::bbUserInitializeProcessing()
196         {
197         }
198         
199         //-----------------------------------------------------------------     
200         void Viewer3D::bbUserFinalizeProcessing()
201         {  
202           DisableObservers();
203         }
204
205         void Viewer3D::DisableObservers()
206         {  
207           Viewer3DWidget* w = (Viewer3DWidget*)bbGetOutputWidget();
208           if (w!=NULL)
209             { 
210               vtkRenderWindowInteractor *interactor = w->GetInteractor();
211               if (interactor!=NULL)
212                 {
213                   if (bbGetInputObs1()!=NULL) 
214                     {
215                       if (bbGetInputObs1()->GetInteractor()!=NULL)
216                         bbGetInputObs1()->EnabledOff();
217                     }
218                   if (bbGetInputObs2()!=NULL) 
219                     {
220                       if (bbGetInputObs2()->GetInteractor()!=NULL)
221                   //bbGetInputObs2()->SetInteractor(NULL);
222                       bbGetInputObs2()->EnabledOff();
223                     }
224                   if (bbGetInputObs3()!=NULL) 
225                     {
226                      if (bbGetInputObs3()->GetInteractor()!=NULL)
227                    //bbGetInputObs3()->SetInteractor(NULL);
228                       bbGetInputObs3()->EnabledOff();
229                     }
230                   if (bbGetInputObs4()!=NULL) 
231                     {
232                      if (bbGetInputObs4()->GetInteractor()!=NULL)
233                    //bbGetInputObs4()->SetInteractor(NULL);
234                       bbGetInputObs4()->EnabledOff();
235                     }
236                   if (bbGetInputObs5()!=NULL) 
237                     {
238                    if (bbGetInputObs5()->GetInteractor()!=NULL)
239                      //bbGetInputObs5()->SetInteractor(NULL);
240                       bbGetInputObs5()->EnabledOff();
241                     }
242                 }       
243             }
244         }
245         
246         //--------------------------------------------------------------------------
247   void Viewer3D::Process() 
248   { 
249           
250     if (!bbIsShown()) return;
251 //EED     
252 //        Viewer3DWidget* w = (Viewer3DWidget*)bbGetOutputWidget();
253 //        if (w)   w->Update();
254
255
256           
257     Viewer3DWidget* w = (Viewer3DWidget*)bbGetOutputWidget();
258           if ((firsttime==true) && (w!=NULL)){ 
259                   firsttime=false;
260                   
261                   vtkRenderWindowInteractor *interactor = w->GetInteractor();
262                   if (interactor!=NULL)
263                   {
264
265                           if (bbGetInputObs1()!=NULL) 
266                           {
267                                   bbGetInputObs1()->SetInteractor(interactor);
268                                   bbGetInputObs1()->EnabledOn();
269                           }
270                           if (bbGetInputObs2()!=NULL) 
271                           {
272                                   bbGetInputObs2()->SetInteractor(interactor);
273                                   bbGetInputObs2()->EnabledOn();
274                           }
275                           if (bbGetInputObs3()!=NULL) 
276                           {
277                                   bbGetInputObs3()->SetInteractor(interactor);
278                                   bbGetInputObs3()->EnabledOn();
279                           }
280                           if (bbGetInputObs4()!=NULL) 
281                           {
282                                   bbGetInputObs4()->SetInteractor(interactor);
283                                   bbGetInputObs4()->EnabledOn();
284                           }
285                           if (bbGetInputObs5()!=NULL) 
286                           {
287                                   bbGetInputObs5()->SetInteractor(interactor);
288                                   bbGetInputObs5()->EnabledOn();
289                           }
290                           bbSetOutputInteractor(  w->GetInteractor() );
291                   } // interactor
292         
293                   vtkRenderer *renderer = w->GetRenderer();
294                   if (renderer!=NULL)
295                   {
296                           std::vector<double> bckgrndColor = bbGetInputBackgroundColor();
297                           renderer->SetBackground(bckgrndColor[0], bckgrndColor[1], bckgrndColor[2]);
298                           bbSetOutputRenderer( renderer );
299                           
300                           /*if (bbGetInputIn1()!=NULL) {renderer->AddActor( bbGetInputIn1() ); }
301                           if (bbGetInputIn2()!=NULL) {renderer->AddActor( bbGetInputIn2() ); }
302                           if (bbGetInputIn3()!=NULL) {renderer->AddActor( bbGetInputIn3() ); }
303                           if (bbGetInputIn4()!=NULL) {renderer->AddActor( bbGetInputIn4() ); }
304                           if (bbGetInputIn5()!=NULL) {renderer->AddActor( bbGetInputIn5() ); }
305                           renderer->ResetCamera();
306                           double bounds[6];
307                           renderer->ComputeVisiblePropBounds(bounds);
308                           renderer->ResetCameraClippingRange(bounds);*/
309                           
310                   } // renderer
311                   
312                                   
313           } // w && firsttime
314
315           if(bbGetOutputRenderer()!=NULL){
316                    vtkRenderer *renderer = w->GetRenderer();
317                   if (bbGetInputIn1()!=NULL) {renderer->AddActor( bbGetInputIn1() ); }
318                   if (bbGetInputIn2()!=NULL) {renderer->AddActor( bbGetInputIn2() ); }
319                   if (bbGetInputIn3()!=NULL) {renderer->AddActor( bbGetInputIn3() ); }
320                   if (bbGetInputIn4()!=NULL) {renderer->AddActor( bbGetInputIn4() ); }
321                   if (bbGetInputIn5()!=NULL) {renderer->AddActor( bbGetInputIn5() ); }
322                   renderer->ResetCamera();
323                   double bounds[6];
324                   renderer->ComputeVisiblePropBounds(bounds);
325                   renderer->ResetCameraClippingRange(bounds);
326
327           }
328
329           if (w!=NULL)   w->Update();
330
331   }
332   
333
334   /**
335    * \brief  Create Widget . 
336    *
337    *
338    */ 
339   void Viewer3D::CreateWidget(wxWindow* parent)
340   {
341  
342     bbtkDebugMessageInc("Core",9,"Viewer3D::CreateWidget()"<<std::endl);
343
344     Viewer3DWidget* w = new Viewer3DWidget(this,
345                                            parent,
346                                            //bbGetWxParent(),
347                                            bbGetInputStereo());
348     //EED  w->Update();
349     //...
350           
351     bbSetOutputWidget(w);
352     
353     bbtkDebugDecTab("Core",9);
354     
355   }
356
357   // This callback is necessary to get actual processing of the view 
358   // when window is shown
359   void  Viewer3D::OnShowWidget()
360   {
361     Process();
362         //    Viewer3DWidget* w = (Viewer3DWidget*)bbGetOutputWidget();
363     //    if (w) w->Update();
364   }
365
366
367 }//namespace bbwxvtk
368
369 #endif
370