]> Creatis software - bbtk.git/blob - packages/wxvtk/src/bbwxvtkViewer3D.cxx
icons bbStudio
[bbtk.git] / packages / wxvtk / src / bbwxvtkViewer3D.cxx
1 /*=========================================================================
2                                                                                 
3   Program:   bbtk
4   Module:    $RCSfile: bbwxvtkViewer3D.cxx,v $
5   Language:  C++
6   Date:      $Date: 2009/04/15 15:45:57 $
7   Version:   $Revision: 1.15 $
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       //renderwindow->SetStereoTypeToCrystalEyes();  
57       renderwindow->SetStereoTypeToRedBlue();
58       renderwindow->SetStereoRender(1);
59    }
60
61    wxvtkrenderwindowinteractor->SetRenderWindow(renderwindow);
62    
63    interactorstyle = vtkInteractorStyleTrackballCamera ::New();
64    interactorstyle->SetInteractor (  wxvtkrenderwindowinteractor );
65    wxvtkrenderwindowinteractor->SetInteractorStyle( interactorstyle );
66    
67    int x1=0,x2=200,y1=0,y2=200,z1=0,z2=200;
68    double spx=1,spy=1,spz=1;
69    vtkCamera *camera = renderer->GetActiveCamera();
70    camera->SetViewUp ( spx*0, -spy*1, spz*0);
71    camera->SetPosition( spx*(x1+x2)/2, spy*(y1+y2)/2, -spz*10000000); 
72    camera->SetFocalPoint        ( spx*(x1+x2)/2 , spy*(y1+y2)/2 , spz*0); 
73    //           camera->SetParallelScale(  spx*(x2-x1)/2.0 );
74    renderer->ResetCamera(x1,x2,y1,y2,z1,z2);
75    
76    renderer->SetBackground(0.1, 0.1, 0.2);
77   
78    wxBoxSizer *sizer = new wxBoxSizer(wxVERTICAL);
79    sizer->Add( wxvtkrenderwindowinteractor , 1, wxEXPAND, 0);
80    panel->SetSizer(sizer);
81    panel->SetAutoLayout(true);
82    panel->Layout();
83   
84   }
85   //-------------------------------------------------------------------------
86
87   //-------------------------------------------------------------------------
88   Viewer3DWidget::~Viewer3DWidget()
89   {
90     renderwindow->Delete();
91     renderer->Delete();
92     interactorstyle->Delete();
93     delete wxvtkrenderwindowinteractor;
94   }
95   //-------------------------------------------------------------------------
96   
97   //-------------------------------------------------------------------------
98   void Viewer3DWidget::Update()
99   {
100     //    wxvtkrenderwindowinteractor->Update();
101     wxvtkrenderwindowinteractor->Render();
102     renderer->ResetCameraClippingRange();
103   }
104   //-------------------------------------------------------------------------
105
106   //-------------------------------------------------------------------------
107   vtkRenderer *Viewer3DWidget::GetRenderer()
108   {
109      return renderer;
110   }
111   //-------------------------------------------------------------------------
112
113   //-------------------------------------------------------------------------
114   wxVTKRenderWindowInteractor * Viewer3DWidget::GetInteractor()
115   {
116     return wxvtkrenderwindowinteractor;
117   }
118   //-------------------------------------------------------------------------
119
120 void Viewer3DWidget::Refresh(bool eraseBackground , const wxRect* rect )
121 {
122 //  wxPanel::Refresh(false,rect);
123 }
124
125
126
127   //--------------------------------------------------------------------------
128   //-------------------------------------------------------------------------
129   //--------------------------------------------------------------------------
130   //--------------------------------------------------------------------------
131
132
133   BBTK_BLACK_BOX_IMPLEMENTATION(Viewer3D,bbtk::WxBlackBox);
134
135   void Viewer3D::bbUserConstructor() 
136   { 
137           firsttime=true;
138     bbSetInputIn1(NULL);
139     bbSetInputIn2(NULL);
140     bbSetInputIn3(NULL);
141     bbSetInputIn4(NULL);
142     bbSetInputIn5(NULL);
143     bbSetInputObs1(NULL);
144     bbSetInputObs2(NULL);
145     bbSetInputObs3(NULL);
146     bbSetInputObs4(NULL);
147     bbSetInputObs5(NULL);
148     bbSetInputStereo(false);
149     bbSetOutputRenderer( NULL );
150     bbSetOutputInteractor( NULL );
151     bbSetOutputWidget(NULL);
152   }
153
154
155   void Viewer3D::Process() 
156   { 
157           
158 //EED     
159 //        Viewer3DWidget* w = (Viewer3DWidget*)bbGetOutputWidget();
160 //        if (w)   w->Update();
161
162           
163           
164     Viewer3DWidget* w = (Viewer3DWidget*)bbGetOutputWidget();
165           if ((firsttime==true) && (w!=NULL)){ 
166                   firsttime=false;
167                   
168                   vtkRenderWindowInteractor *interactor = w->GetInteractor();
169                   if (interactor!=NULL)
170                   {
171                           if (bbGetInputObs1()!=NULL) 
172                           {
173                                   bbGetInputObs1()->SetInteractor(interactor);
174                                   bbGetInputObs1()->EnabledOn();
175                           }
176                           if (bbGetInputObs2()!=NULL) 
177                           {
178                                   bbGetInputObs2()->SetInteractor(interactor);
179                                   bbGetInputObs2()->EnabledOn();
180                           }
181                           if (bbGetInputObs3()!=NULL) 
182                           {
183                                   bbGetInputObs3()->SetInteractor(interactor);
184                                   bbGetInputObs3()->EnabledOn();
185                           }
186                           if (bbGetInputObs4()!=NULL) 
187                           {
188                                   bbGetInputObs4()->SetInteractor(interactor);
189                                   bbGetInputObs4()->EnabledOn();
190                           }
191                           if (bbGetInputObs5()!=NULL) 
192                           {
193                                   bbGetInputObs5()->SetInteractor(interactor);
194                                   bbGetInputObs5()->EnabledOn();
195                           }
196                           bbSetOutputInteractor(  w->GetInteractor() );
197                   } // interactor
198         
199                   vtkRenderer *renderer = w->GetRenderer();
200                   if (renderer!=NULL)
201                   {
202                           bbSetOutputRenderer( renderer );
203                           
204                           if (bbGetInputIn1()!=NULL) {renderer->AddActor( bbGetInputIn1() ); }
205                           if (bbGetInputIn2()!=NULL) {renderer->AddActor( bbGetInputIn2() ); }
206                           if (bbGetInputIn3()!=NULL) {renderer->AddActor( bbGetInputIn3() ); }
207                           if (bbGetInputIn4()!=NULL) {renderer->AddActor( bbGetInputIn4() ); }
208                           if (bbGetInputIn5()!=NULL) {renderer->AddActor( bbGetInputIn5() ); }
209                           renderer->ResetCamera();
210                           double bounds[6];
211                           renderer->ComputeVisiblePropBounds(bounds);
212                           renderer->ResetCameraClippingRange(bounds);
213                           
214                   } // renderer
215                   
216                                   
217           } // w && firsttime
218
219           if (w!=NULL)   w->Update();
220
221   }
222   
223
224   /**
225    * \brief  Create Widget . 
226    *
227    *
228    */ 
229   void Viewer3D::CreateWidget(wxWindow* parent)
230   {
231  
232     bbtkDebugMessageInc("Core",9,"Viewer3D::CreateWidget()"<<std::endl);
233
234     Viewer3DWidget* w = new Viewer3DWidget(this,parent,
235                                                                                    //bbGetWxParent(),
236                                                                                    bbGetInputStereo());
237   //EED  w->Update();
238   //...
239           
240     bbSetOutputWidget(w);
241     
242     bbtkDebugDecTab("Core",9);
243     
244   }
245
246   // This callback is necessary to get actual processing of the view 
247   // when window is shown
248   void  Viewer3D::OnShowWidget()
249   {
250           
251         //    Viewer3DWidget* w = (Viewer3DWidget*)bbGetOutputWidget();
252     //    if (w) w->Update();
253   }
254
255
256 }//namespace bbwxvtk
257
258 #endif
259