0021985: Vista/WIndows 7 compatibility issues reported by the community
[occt.git] / samples / mfc / standard / 09_Animation / src / AnimationView3D.cpp
1 // AnimationView3D.cpp : implementation of the CAnimationView3D class
2 //
3
4 #include "stdafx.h"
5
6 #include "AnimationView3D.h"
7
8 #include "AnimationApp.h"
9 #include "ShadingDialog.h"
10 #include "AnimationDoc.h"
11
12 #include "Sensitivity.h"
13
14 #ifdef _DEBUG
15 //#define new DEBUG_NEW by CasCade
16 #undef THIS_FILE
17 static char THIS_FILE[] = __FILE__;
18 #endif
19 static int rotCount = 0;
20
21 // for elastic bean selection
22 #define ValZWMin 1
23
24
25 /////////////////////////////////////////////////////////////////////////////
26 // CAnimationView3D
27
28 IMPLEMENT_DYNCREATE(CAnimationView3D, CView)
29
30 BEGIN_MESSAGE_MAP(CAnimationView3D, CView)
31         //{{AFX_MSG_MAP(CAnimationView3D)
32         ON_COMMAND(ID_BUTTONAxo, OnBUTTONAxo)
33         ON_COMMAND(ID_BUTTONBack, OnBUTTONBack)
34         ON_COMMAND(ID_BUTTONBottom, OnBUTTONBottom)
35         ON_COMMAND(ID_BUTTONFront, OnBUTTONFront)
36         ON_COMMAND(ID_BUTTONHlrOff, OnBUTTONHlrOff)
37         ON_COMMAND(ID_BUTTONHlrOn, OnBUTTONHlrOn)
38         ON_COMMAND(ID_BUTTONLeft, OnBUTTONLeft)
39         ON_COMMAND(ID_BUTTONPan, OnBUTTONPan)
40         ON_COMMAND(ID_BUTTONPanGlo, OnBUTTONPanGlo)
41         ON_COMMAND(ID_BUTTONReset, OnBUTTONReset)
42         ON_COMMAND(ID_BUTTONRight, OnBUTTONRight)
43         ON_COMMAND(ID_BUTTONRot, OnBUTTONRot)
44         ON_COMMAND(ID_BUTTONTop, OnBUTTONTop)
45         ON_COMMAND(ID_BUTTONZoomAll, OnBUTTONZoomAll)
46     ON_COMMAND(ID_FILE_EXPORT_IMAGE, OnFileExportImage)
47         ON_WM_SIZE()
48         ON_COMMAND(ID_BUTTONZoomProg, OnBUTTONZoomProg)
49         ON_COMMAND(ID_BUTTONZoomWin, OnBUTTONZoomWin)
50         ON_WM_LBUTTONDOWN()
51         ON_WM_LBUTTONUP()
52         ON_WM_MBUTTONDOWN()
53         ON_WM_MBUTTONUP()
54         ON_WM_MOUSEMOVE()
55         ON_WM_RBUTTONDOWN()
56         ON_WM_RBUTTONUP()
57         ON_UPDATE_COMMAND_UI(ID_BUTTONHlrOff, OnUpdateBUTTONHlrOff)
58         ON_UPDATE_COMMAND_UI(ID_BUTTONHlrOn, OnUpdateBUTTONHlrOn)
59         ON_UPDATE_COMMAND_UI(ID_BUTTONPanGlo, OnUpdateBUTTONPanGlo)
60         ON_UPDATE_COMMAND_UI(ID_BUTTONPan, OnUpdateBUTTONPan)
61         ON_UPDATE_COMMAND_UI(ID_BUTTONZoomProg, OnUpdateBUTTONZoomProg)
62         ON_UPDATE_COMMAND_UI(ID_BUTTONZoomWin, OnUpdateBUTTONZoomWin)
63         ON_UPDATE_COMMAND_UI(ID_BUTTONRot, OnUpdateBUTTONRot)
64
65         ON_COMMAND(ID_Modify_ChangeBackground     , OnChangeBackground)
66         ON_WM_TIMER()
67         ON_COMMAND(ID_STOP, OnStop)
68         ON_COMMAND(ID_RESTART, OnRestart)
69
70         ON_COMMAND(ID_SENSITIVITY, OnSensitivity)
71         ON_COMMAND(ID_BUTTONFly, OnBUTTONFly)
72         ON_COMMAND(ID_BUTTONTurn, OnBUTTONTurn)
73         ON_UPDATE_COMMAND_UI(ID_BUTTONFly, OnUpdateBUTTONFly)
74         ON_UPDATE_COMMAND_UI(ID_BUTTONTurn, OnUpdateBUTTONTurn)
75         ON_COMMAND(ID_VIEW_DISPLAYSTATUS, OnViewDisplaystatus)
76         ON_UPDATE_COMMAND_UI(ID_VIEW_DISPLAYSTATUS, OnUpdateViewDisplaystatus)
77         //}}AFX_MSG_MAP
78 // CasCade
79
80 END_MESSAGE_MAP()
81
82 /////////////////////////////////////////////////////////////////////////////
83 // CAnimationView3D construction/destruction
84
85 CAnimationView3D::CAnimationView3D()
86 {
87         // TODO: add construction code here
88
89     myXmin=0;
90     myYmin=0;  
91     myXmax=0;
92     myYmax=0;
93     myCurZoom=0;
94     // will be set in OnInitial update, but, for more security :
95     myCurrentMode = CurrentAction3d_Nothing;
96     myDegenerateModeIsOn=Standard_True;
97     m_Pen = NULL;
98
99         myXmin=0;
100     myYmin=0;  
101     myXmax=0;
102     myYmax=0;
103     myCurZoom=0;
104
105     // will be set in OnInitial update, but, for more security :
106         m_FlySens = 500. ;
107         m_TurnSens = M_PI / 40. ;
108 }
109
110 CAnimationView3D::~CAnimationView3D()
111 {
112     myView->Remove();
113     if (m_Pen) delete m_Pen;
114 }
115
116 BOOL CAnimationView3D::PreCreateWindow(CREATESTRUCT& cs)
117 {
118         // TODO: Modify the Window class or styles here by modifying
119         //  the CREATESTRUCT cs
120
121         return CView::PreCreateWindow(cs);
122 }
123
124 /////////////////////////////////////////////////////////////////////////////
125 // CAnimationView3D drawing
126
127 void CAnimationView3D::OnDraw(CDC* pDC)
128 {
129         CAnimationDoc* pDoc = GetDocument();
130         ASSERT_VALID(pDoc);
131
132         // TODO: add draw code for native data here
133
134           myView->Redraw();
135
136 }
137 void CAnimationView3D::OnInitialUpdate() 
138 {
139         CView::OnInitialUpdate();
140
141         // TODO: Add your specialized code here and/or call the base class
142             // TODO: Add your specialized code here and/or call the base class
143 //      myView = GetDocument()->GetViewer()->CreateView();
144
145         Handle(V3d_Viewer) aViewer ;
146         
147     aViewer = GetDocument()->GetViewer() ;
148         aViewer->DefaultPerspectiveView () ;
149         aViewer->SetDefaultTypeOfView ( V3d_PERSPECTIVE ) ;
150     myView = aViewer->CreateView();
151
152     // store for restore state after rotation (witch is in Degenerated mode)
153     myDegenerateModeIsOn = myView->DegenerateModeIsOn();
154
155         Handle(Graphic3d_WNTGraphicDevice) theGraphicDevice = 
156                 ((CAnimationApp*)AfxGetApp())->GetGraphicDevice();
157     
158     Handle(WNT_Window) aWNTWindow = new WNT_Window(theGraphicDevice,GetSafeHwnd ());
159     myView->SetWindow(aWNTWindow);
160     if (!aWNTWindow->IsMapped()) aWNTWindow->Map();
161
162     // store the mode ( nothing , dynamic zooming, dynamic ... )
163     myCurrentMode = CurrentAction3d_Nothing;
164         CFrameWnd* pParentFrm = GetParentFrame();
165         pParentFrm->ActivateFrame(SW_SHOWMAXIMIZED);
166
167         Standard_Integer w=100 , h=100 ;   /* Debug Matrox                         */
168         aWNTWindow->Size (w,h) ;           /* Keeps me unsatisfied (rlb).....      */
169                                            /* Resize is not supposed to be done on */
170                                            /* Matrox                               */
171                                            /* I suspect another problem elsewhere  */
172         ::PostMessage ( GetSafeHwnd () , WM_SIZE , SIZE_RESTORED , w + h*65536 ) ;
173
174         myPView = Handle(V3d_PerspectiveView)::DownCast (myView);
175
176         m_Tune.Create ( IDD_TUNE , NULL ) ;
177         
178         RECT dlgrect;
179         m_Tune.GetWindowRect(&dlgrect);
180         LONG width = dlgrect.right-dlgrect.left;
181         LONG height = dlgrect.bottom-dlgrect.top;
182         RECT MainWndRect;
183         AfxGetApp()->m_pMainWnd->GetWindowRect(&MainWndRect);
184         LONG left = MainWndRect.left+3;
185         LONG top = MainWndRect.top + 112;
186         m_Tune.MoveWindow(left,top,width,height);
187         
188         m_Tune.m_pView = this ;
189
190         m_Tune.ShowWindow ( SW_HIDE );
191
192     // store the mode ( nothing , dynamic zooming, dynamic ... )
193
194     myCurrentMode = CurrentAction3d_Nothing;
195
196         ReloadData () ;
197
198 }
199
200 void CAnimationView3D::DisplayTuneDialog()
201 {
202         m_Tune.Create ( IDD_TUNE , NULL ) ;
203         
204         RECT dlgrect;
205         m_Tune.GetWindowRect(&dlgrect);
206         LONG width = dlgrect.right-dlgrect.left;
207         LONG height = dlgrect.bottom-dlgrect.top;
208         RECT MainWndRect;
209         AfxGetApp()->m_pMainWnd->GetWindowRect(&MainWndRect);
210         LONG left = MainWndRect.left+3;
211         LONG top = MainWndRect.top + 112;
212         m_Tune.MoveWindow(left,top,width,height);
213         
214         m_Tune.m_pView = this ;
215 }
216
217
218 /////////////////////////////////////////////////////////////////////////////
219 // CAnimationView3D diagnostics
220
221 #ifdef _DEBUG
222 void CAnimationView3D::AssertValid() const
223 {
224         CView::AssertValid();
225 }
226
227 void CAnimationView3D::Dump(CDumpContext& dc) const
228 {
229         CView::Dump(dc);
230 }
231
232 CAnimationDoc* CAnimationView3D::GetDocument() // non-debug version is inline
233 {
234         ASSERT(m_pDocument->IsKindOf(RUNTIME_CLASS(CAnimationDoc)));
235         return (CAnimationDoc*)m_pDocument;
236 }
237 #endif //_DEBUG
238
239 /////////////////////////////////////////////////////////////////////////////
240 // CAnimationView3D message handlers
241 void CAnimationView3D::OnFileExportImage()
242 {
243   CFileDialog dlg(FALSE,_T("*.BMP"),NULL,OFN_HIDEREADONLY | OFN_OVERWRITEPROMPT,
244                   _T("BMP Files (*.BMP)|*.bmp |GIF Files (*.GIF)|*.gif | PNG Files (*.PNG)|*.png"
245                      "|JPEG Files (*.JPEG)|*.jpeg | PPM Files (*.PPM)|*.ppm | TIFF Files (*.TIFF)"
246                      "|*.tiff | TGA Files (*.TGA)|*.tga | EXR Files (*.EXR)|*.exr||"), 
247                   NULL );
248
249   if (dlg.DoModal() == IDOK) 
250   {
251     SetCursor(AfxGetApp()->LoadStandardCursor(IDC_WAIT));
252     CString aFileName = dlg.GetPathName();
253     myView->Dump(aFileName);
254     SetCursor(AfxGetApp()->LoadStandardCursor(IDC_ARROW));
255   }
256 }
257
258 void CAnimationView3D::OnSize(UINT nType, int cx, int cy) 
259 {
260         m_cx = cx ;
261         m_cy = cy ;
262         if (!myView.IsNull())
263                 myView->MustBeResized();
264 }
265
266 void CAnimationView3D::OnBUTTONBack() 
267 { myView->SetProj(V3d_Xneg); } // See the back View
268 void CAnimationView3D::OnBUTTONFront() 
269 { myView->SetProj(V3d_Xpos); } // See the front View
270
271 void CAnimationView3D::OnBUTTONBottom() 
272 { myView->SetProj(V3d_Zneg); } // See the bottom View
273 void CAnimationView3D::OnBUTTONTop() 
274 { myView->SetProj(V3d_Zpos); } // See the top View      
275
276 void CAnimationView3D::OnBUTTONLeft() 
277 { myView->SetProj(V3d_Ypos); } // See the left View     
278 void CAnimationView3D::OnBUTTONRight() 
279 { myView->SetProj(V3d_Yneg); } // See the right View
280
281 void CAnimationView3D::OnBUTTONAxo() 
282 { myView->SetProj(V3d_XposYnegZpos); } // See the axonometric View
283
284 void CAnimationView3D::OnBUTTONHlrOff() 
285 {
286   myView->SetDegenerateModeOn();
287   myDegenerateModeIsOn = Standard_True;
288 }
289
290 void CAnimationView3D::OnBUTTONHlrOn() 
291 {
292   SetCursor(AfxGetApp()->LoadStandardCursor(IDC_WAIT));
293   myView->SetDegenerateModeOff();
294   myDegenerateModeIsOn = Standard_False;
295   SetCursor(AfxGetApp()->LoadStandardCursor(IDC_ARROW));
296 }
297
298 void CAnimationView3D::OnBUTTONPan() 
299 {  
300         myCurrentMode = CurrentAction3d_DynamicPanning; 
301 }
302
303 void CAnimationView3D::OnBUTTONPanGlo() 
304 {
305   // save the current zoom value 
306   myCurZoom = myView->Scale();
307   // Do a Global Zoom 
308   myView->FitAll();
309   // Set the mode 
310   myCurrentMode = CurrentAction3d_GlobalPanning;
311 }
312
313 void CAnimationView3D::OnBUTTONReset() 
314 {   myView->Reset(); 
315         ReloadData();
316 }
317
318 void CAnimationView3D::OnBUTTONRot() 
319 {   myCurrentMode = CurrentAction3d_DynamicRotation; }
320
321
322 void CAnimationView3D::OnBUTTONZoomAll() 
323 {
324         SetDimensions();
325         myView->FitAll();
326         myView->ZFitAll();
327 }
328
329 void CAnimationView3D::OnBUTTONZoomProg() 
330 {  myCurrentMode = CurrentAction3d_DynamicZooming; }
331
332 void CAnimationView3D::OnBUTTONZoomWin() 
333 {  myCurrentMode = CurrentAction3d_WindowZooming; }
334
335 void CAnimationView3D::OnBUTTONFly() 
336 {  myCurrentMode = CurrentAction3d_Fly; }
337
338 void CAnimationView3D::OnBUTTONTurn() 
339 {  myCurrentMode = CurrentAction3d_Turn; }
340
341
342 void CAnimationView3D::OnLButtonDown(UINT nFlags, CPoint point) 
343 {
344   //  save the current mouse coordinate in min 
345   myXmin=point.x;  myYmin=point.y;
346   myXmax=point.x;  myYmax=point.y;
347
348   if ( nFlags & MK_CONTROL ) 
349           {
350             // Button MB1 down Control :start zomming 
351         // SetCursor(AfxGetApp()->LoadStandardCursor());
352           }
353         else // if ( Ctrl )
354           {
355         switch (myCurrentMode)
356         {
357          case CurrentAction3d_Nothing : // start a drag
358            if (nFlags & MK_SHIFT)
359                 GetDocument()->ShiftDragEvent(myXmax,myYmax,-1,myView);
360            else
361                 GetDocument()->DragEvent(myXmax,myYmax,-1,myView);
362         break;
363          break;
364          case CurrentAction3d_DynamicZooming : // noting
365              // SetCursor(AfxGetApp()->LoadStandardCursor());
366          break;
367          case CurrentAction3d_WindowZooming : // noting
368          break;
369          case CurrentAction3d_DynamicPanning :// noting
370          break;
371          case CurrentAction3d_GlobalPanning :// noting
372         break;
373         case  CurrentAction3d_DynamicRotation :
374                         if (!myDegenerateModeIsOn)
375                           myView->SetDegenerateModeOn();
376                         myView->StartRotation(point.x,point.y);  
377         break;
378                 case  CurrentAction3d_Fly :
379                         KillTimer (1) ;
380                         SetTimer ( 1 , 100 , NULL ) ;
381                 break ;
382         case  CurrentAction3d_Turn :
383                         KillTimer (1) ;
384                         SetTimer ( 1 , 100 , NULL ) ;
385                 break ;
386         default :
387            Standard_Failure::Raise(" incompatible Current Mode ");
388         break;
389         }
390     }
391 }
392
393 void CAnimationView3D::OnLButtonUp(UINT nFlags, CPoint point) 
394 {
395    if ( nFlags & MK_CONTROL ) 
396           {
397         return;
398           }
399         else // if ( Ctrl )
400           {
401         switch (myCurrentMode)
402         {
403          case CurrentAction3d_Nothing :
404          if (point.x == myXmin && point.y == myYmin)
405          { // no offset between down and up --> selectEvent
406             myXmax=point.x;  
407             myYmax=point.y;
408             if (nFlags & MK_SHIFT )
409               GetDocument()->ShiftInputEvent(point.x,point.y,myView);
410             else
411               GetDocument()->InputEvent     (point.x,point.y,myView);
412          } else
413          {
414             DrawRectangle(myXmin,myYmin,myXmax,myYmax,Standard_False);
415             myXmax=point.x;  
416             myYmax=point.y;
417                     if (nFlags & MK_SHIFT)
418                                 GetDocument()->ShiftDragEvent(point.x,point.y,1,myView);
419                         else
420                                 GetDocument()->DragEvent(point.x,point.y,1,myView);
421          }
422          break;
423          case CurrentAction3d_DynamicZooming :
424              // SetCursor(AfxGetApp()->LoadStandardCursor());         
425                myCurrentMode = CurrentAction3d_Nothing;
426          break;
427          case CurrentAction3d_WindowZooming :
428            myXmax=point.x;            myYmax=point.y;
429             DrawRectangle(myXmin,myYmin,myXmax,myYmax,Standard_False,LongDash);
430                if ((abs(myXmin-myXmax)>ValZWMin) || (abs(myYmin-myYmax)>ValZWMin))
431                                          // Test if the zoom window is greater than a minimale window.
432                         {
433                           // Do the zoom window between Pmin and Pmax
434                           myView->WindowFitAll(myXmin,myYmin,myXmax,myYmax);  
435                         }  
436                myCurrentMode = CurrentAction3d_Nothing;
437          break;
438          case CurrentAction3d_DynamicPanning :
439            myCurrentMode = CurrentAction3d_Nothing;
440          break;
441          case CurrentAction3d_GlobalPanning :
442                myView->Place(point.x,point.y,myCurZoom); 
443                myCurrentMode = CurrentAction3d_Nothing;
444         break;
445         case  CurrentAction3d_DynamicRotation :
446                myCurrentMode = CurrentAction3d_Nothing;
447         break;
448                 case  CurrentAction3d_Fly :
449                         KillTimer ( 1 ) ;
450         case  CurrentAction3d_Turn :
451                         KillTimer ( 1 ) ;
452                 break;
453         default :
454            Standard_Failure::Raise(" incompatible Current Mode ");
455         break;
456         } //switch (myCurrentMode)
457     } //        else // if ( Ctrl )
458 }
459
460 void CAnimationView3D::OnMButtonDown(UINT nFlags, CPoint point) 
461 {
462    if ( nFlags & MK_CONTROL ) 
463           {
464         // Button MB2 down Control : panning init  
465         // SetCursor(AfxGetApp()->LoadStandardCursor());   
466           }
467 }
468
469 void CAnimationView3D::OnMButtonUp(UINT nFlags, CPoint point) 
470 {
471    if ( nFlags & MK_CONTROL ) 
472           {
473         // Button MB2 down Control : panning init  
474         // SetCursor(AfxGetApp()->LoadStandardCursor());   
475           }
476 }
477
478 void CAnimationView3D::OnRButtonDown(UINT nFlags, CPoint point) 
479 {
480    if ( nFlags & MK_CONTROL ) 
481           {
482         // SetCursor(AfxGetApp()->LoadStandardCursor());   
483             if (!myDegenerateModeIsOn)
484               myView->SetDegenerateModeOn();
485               myView->StartRotation(point.x,point.y);  
486           }
487         else // if ( Ctrl )
488           {
489             GetDocument()->Popup(point.x,point.y,myView);
490       } 
491 }
492
493 void CAnimationView3D::OnRButtonUp(UINT nFlags, CPoint point) 
494 {
495     SetCursor(AfxGetApp()->LoadStandardCursor(IDC_WAIT));
496     if (!myDegenerateModeIsOn)
497     {  
498       myView->SetDegenerateModeOff();
499       myDegenerateModeIsOn = Standard_False;
500     } else
501     {
502       myView->SetDegenerateModeOn();
503       myDegenerateModeIsOn = Standard_True;
504     }
505     SetCursor(AfxGetApp()->LoadStandardCursor(IDC_ARROW));
506 }
507
508 void CAnimationView3D::OnMouseMove(UINT nFlags, CPoint point) 
509 {
510     //   ============================  LEFT BUTTON =======================
511   m_curx = point.x ;
512   m_cury = point.y ;
513
514   if ( nFlags & MK_LBUTTON)
515     {
516      if ( nFlags & MK_CONTROL ) 
517           {
518             // move with MB1 and Control : on the dynamic zooming  
519             // Do the zoom in function of mouse's coordinates  
520             myView->Zoom(myXmax,myYmax,point.x,point.y); 
521             // save the current mouse coordinate in min 
522                 myXmax = point.x; 
523         myYmax = point.y;       
524           }
525           else // if ( Ctrl )
526           {
527         switch (myCurrentMode)
528         {
529          case CurrentAction3d_Nothing :
530                    myXmax = point.x;            myYmax = point.y;
531             DrawRectangle(myXmin,myYmin,myXmax,myYmax,Standard_False);
532            if (nFlags & MK_SHIFT)               
533              GetDocument()->ShiftDragEvent(myXmax,myYmax,0,myView);
534            else
535              GetDocument()->DragEvent(myXmax,myYmax,0,myView);
536             DrawRectangle(myXmin,myYmin,myXmax,myYmax,Standard_True);
537           break;
538          case CurrentAction3d_DynamicZooming :
539                myView->Zoom(myXmax,myYmax,point.x,point.y); 
540                // save the current mouse coordinate in min \n";
541                myXmax=point.x;  myYmax=point.y;
542          break;
543          case CurrentAction3d_WindowZooming :
544                    myXmax = point.x; myYmax = point.y;  
545             DrawRectangle(myXmin,myYmin,myXmax,myYmax,Standard_False,LongDash);
546             DrawRectangle(myXmin,myYmin,myXmax,myYmax,Standard_True,LongDash);
547          break;
548          case CurrentAction3d_DynamicPanning :
549                    myView->Pan(point.x-myXmax,myYmax-point.y); // Realize the panning
550                    myXmax = point.x; myYmax = point.y;  
551          break;
552          case CurrentAction3d_GlobalPanning : // nothing           
553         break;
554         case  CurrentAction3d_DynamicRotation :
555           myView->Rotation(point.x,point.y);
556               myView->Redraw();
557         break;
558                 case CurrentAction3d_Fly :
559                         break ;
560                 case CurrentAction3d_Turn :
561                         break ;
562         default :
563            Standard_Failure::Raise(" incompatible Current Mode ");
564         break;
565         }//  switch (myCurrentMode)
566       }// if ( nFlags & MK_CONTROL )  else 
567     } else //   if ( nFlags & MK_LBUTTON) 
568     //   ============================  MIDDLE BUTTON =======================
569     if ( nFlags & MK_MBUTTON)
570     {
571      if ( nFlags & MK_CONTROL ) 
572           {
573                 myView->Pan(point.x-myXmax,myYmax-point.y); // Realize the panning
574                 myXmax = point.x; myYmax = point.y;     
575
576           }
577     } else //  if ( nFlags & MK_MBUTTON)
578     //   ============================  RIGHT BUTTON =======================
579     if ( nFlags & MK_RBUTTON)
580     {
581      if ( nFlags & MK_CONTROL ) 
582           {
583              rotCount++;
584          myView->Rotation(point.x,point.y);
585           }
586     }else //if ( nFlags & MK_RBUTTON)
587     //   ============================  NO BUTTON =======================
588     {  // No buttons 
589           myXmax = point.x; myYmax = point.y;   
590           if (nFlags & MK_SHIFT)
591                 GetDocument()->ShiftMoveEvent(point.x,point.y,myView);
592           else
593                 GetDocument()->MoveEvent(point.x,point.y,myView);
594    }
595 }
596
597 void CAnimationView3D::OnUpdateBUTTONHlrOff(CCmdUI* pCmdUI) 
598 {
599     pCmdUI->SetCheck (myDegenerateModeIsOn);
600         pCmdUI->Enable   (!myDegenerateModeIsOn);       
601 }
602
603 void CAnimationView3D::OnUpdateBUTTONHlrOn(CCmdUI* pCmdUI) 
604 {
605     pCmdUI->SetCheck (!myDegenerateModeIsOn);
606         pCmdUI->Enable   (myDegenerateModeIsOn);        
607 }
608
609 void CAnimationView3D::OnUpdateBUTTONPanGlo(CCmdUI* pCmdUI) 
610 {
611     pCmdUI->SetCheck (myCurrentMode == CurrentAction3d_GlobalPanning);
612         pCmdUI->Enable   (myCurrentMode != CurrentAction3d_GlobalPanning);      
613         
614 }
615
616 void CAnimationView3D::OnUpdateBUTTONPan(CCmdUI* pCmdUI) 
617 {
618     pCmdUI->SetCheck (myCurrentMode == CurrentAction3d_DynamicPanning);
619         pCmdUI->Enable   (myCurrentMode != CurrentAction3d_DynamicPanning );    
620 }
621
622 void CAnimationView3D::OnUpdateBUTTONZoomProg(CCmdUI* pCmdUI) 
623 {
624     pCmdUI->SetCheck (myCurrentMode == CurrentAction3d_DynamicZooming );
625         pCmdUI->Enable   (myCurrentMode != CurrentAction3d_DynamicZooming);     
626 }
627
628 void CAnimationView3D::OnUpdateBUTTONZoomWin(CCmdUI* pCmdUI) 
629 {
630     pCmdUI->SetCheck (myCurrentMode == CurrentAction3d_WindowZooming);
631         pCmdUI->Enable   (myCurrentMode != CurrentAction3d_WindowZooming);      
632 }
633
634 void CAnimationView3D::OnUpdateBUTTONRot(CCmdUI* pCmdUI) 
635 {
636     pCmdUI->SetCheck (myCurrentMode == CurrentAction3d_DynamicRotation);
637         pCmdUI->Enable   (myCurrentMode != CurrentAction3d_DynamicRotation);    
638 }
639
640 void CAnimationView3D::OnUpdateBUTTONFly(CCmdUI* pCmdUI) 
641 {
642         pCmdUI->Enable(GetDocument()->m_bIsGridLoaded);
643     pCmdUI->SetCheck (myCurrentMode == CurrentAction3d_Fly);
644 }
645
646 void CAnimationView3D::OnUpdateBUTTONTurn(CCmdUI* pCmdUI) 
647 {
648         pCmdUI->Enable(GetDocument()->m_bIsGridLoaded);
649     pCmdUI->SetCheck (myCurrentMode == CurrentAction3d_Turn);
650 }
651
652 void CAnimationView3D::OnChangeBackground() 
653 {
654         Standard_Real R1;
655         Standard_Real G1;
656         Standard_Real B1;
657     myView->BackgroundColor(Quantity_TOC_RGB,R1,G1,B1);
658         COLORREF m_clr ;
659         m_clr = RGB(R1*255,G1*255,B1*255);
660
661         CColorDialog dlgColor(m_clr);
662         if (dlgColor.DoModal() == IDOK)
663         {
664                 m_clr = dlgColor.GetColor();
665                 R1 = GetRValue(m_clr)/255.;
666                 G1 = GetGValue(m_clr)/255.;
667                 B1 = GetBValue(m_clr)/255.;
668         myView->SetBackgroundColor(Quantity_TOC_RGB,R1,G1,B1);
669         }
670     myView->Redraw();
671 }
672
673 //==========================================================================================
674 //==========================================================================================
675 //==========================================================================================
676
677 //-----------------------------------------------------------------------------------------
678 //
679 //-----------------------------------------------------------------------------------------
680 void CAnimationView3D::DrawRectangle(const Standard_Integer  MinX    ,
681                                                             const Standard_Integer  MinY    ,
682                                         const Standard_Integer  MaxX ,
683                                                             const Standard_Integer  MaxY ,
684                                                             const Standard_Boolean  Draw , 
685                                         const LineStyle aLineStyle)
686 {
687     static int m_DrawMode;
688     if  (!m_Pen && aLineStyle ==Solid )
689         {m_Pen = new CPen(PS_SOLID, 1, RGB(0,0,0)); m_DrawMode = R2_MERGEPENNOT;}
690     else if (!m_Pen && aLineStyle ==Dot )
691         {m_Pen = new CPen(PS_DOT, 1, RGB(0,0,0));   m_DrawMode = R2_XORPEN;}
692     else if (!m_Pen && aLineStyle == ShortDash)
693         {m_Pen = new CPen(PS_DASH, 1, RGB(255,0,0));    m_DrawMode = R2_XORPEN;}
694     else if (!m_Pen && aLineStyle == LongDash)
695         {m_Pen = new CPen(PS_DASH, 1, RGB(0,0,0));      m_DrawMode = R2_NOTXORPEN;}
696     else if (aLineStyle == Default) 
697         { m_Pen = NULL; m_DrawMode = R2_MERGEPENNOT;}
698
699     CPen* aOldPen;
700     CClientDC clientDC(this);
701     if (m_Pen) aOldPen = clientDC.SelectObject(m_Pen);
702     clientDC.SetROP2(m_DrawMode);
703
704     static              Standard_Integer StoredMinX, StoredMaxX, StoredMinY, StoredMaxY;
705     static              Standard_Boolean m_IsVisible;
706
707     if ( m_IsVisible && !Draw) // move or up  : erase at the old position 
708     {
709      clientDC.MoveTo(StoredMinX,StoredMinY); clientDC.LineTo(StoredMinX,StoredMaxY); 
710      clientDC.LineTo(StoredMaxX,StoredMaxY); 
711          clientDC.LineTo(StoredMaxX,StoredMinY); clientDC.LineTo(StoredMinX,StoredMinY);
712      m_IsVisible = false;
713     }
714
715     StoredMinX = min ( MinX, MaxX );
716     StoredMinY = min ( MinY, MaxY );
717     StoredMaxX = max ( MinX, MaxX );
718     StoredMaxY = max ( MinY, MaxY);
719
720     if (Draw) // move : draw
721     {
722      clientDC.MoveTo(StoredMinX,StoredMinY); clientDC.LineTo(StoredMinX,StoredMaxY); 
723      clientDC.LineTo(StoredMaxX,StoredMaxY); 
724          clientDC.LineTo(StoredMaxX,StoredMinY); clientDC.LineTo(StoredMinX,StoredMinY);
725      m_IsVisible = true;
726    }
727
728    if (m_Pen) 
729        clientDC.SelectObject(aOldPen);
730 }
731 void CAnimationView3D::OnStop() 
732 {
733         KillTimer(GetDocument()->myCount);            
734 }
735
736 void CAnimationView3D::OnRestart() 
737 {
738         KillTimer(GetDocument()->myCount);            
739         SetTimer(GetDocument()->myCount, 1 , NULL); 
740 }
741
742 /*
743 void CAnimationView3D::OnTimer(UINT nIDEvent) 
744 {
745         // TODO: Add your message handler code here and/or call default
746         GetDocument()->OnMyTimer();
747         CView::OnTimer(nIDEvent);
748 }
749 */
750
751
752 /*********************************************************************************
753 **************  W A L K  T H R O U G H  ******************************************
754 /********************************************************************************/
755
756 void CAnimationView3D::OnTimer(UINT_PTR nIDEvent) 
757 {
758         if ( !GetDocument()->m_bIsGridLoaded )
759         {
760                 // TODO: Add your message handler code here and/or call default
761                 GetDocument()->OnMyTimer();
762                 CView::OnTimer(nIDEvent);
763         }
764         else
765         {
766                 CView::OnTimer(nIDEvent);
767                 if ( nIDEvent == 1 ) {
768                   myView->SetImmediateUpdate ( Standard_False ) ;
769                   if ( myCurrentMode == CurrentAction3d_Fly ) {
770
771                          Fly  ( m_curx , m_cury ) ;
772                          if ( m_bShift )
773                            Roll ( m_curx , m_cury ) ;
774                          else
775                            Turn ( m_curx , m_cury ) ;
776
777                         myView->SetAt  ( m_Atx  , m_Aty  , m_Atz  ) ;
778                         myView->SetEye ( m_Eyex , m_Eyey , m_Eyez ) ;
779
780                   }
781                   else if ( myCurrentMode == CurrentAction3d_Turn ) {
782                            Twist ( m_curx , m_cury ) ;
783                   }
784                   else
785                           KillTimer (1) ;
786
787
788                   myView->SetImmediateUpdate ( Standard_True ) ;
789
790                   myView->Update ();
791                 }
792
793                 ReloadData () ;
794         }
795 }
796
797 void CAnimationView3D::OnSensitivity() 
798 {
799         CSensitivity dial ;
800
801         dial.m_SensFly   = m_FlySens  ;
802         dial.m_SensTurn  = m_TurnSens ;
803         if ( dial.DoModal () ) {
804                 m_FlySens  = dial.m_SensFly   ;
805         m_TurnSens = dial.m_SensTurn  ;
806         }
807 }
808
809 void CAnimationView3D::Fly (int x , int y)
810 {
811         double v [3] ;
812         double l ;
813         double sens ;
814         int    i     ;
815
816         sens = (double) myYmin - (double) y ;
817         sens /= (double) m_cy ;
818         sens *= m_FlySens ;
819
820         v [0] = m_Atx - m_Eyex ;
821         v [1] = m_Aty - m_Eyey ;
822         v [2] = m_Atz - m_Eyez ;
823         l = sqrt ( v[0]*v[0] + v[1]*v[1] + v[2]*v[2] ) ;
824         if ( l > 1.e-3 ) {
825                 for ( i=0 ; i<3 ; i++ )
826           v [i] = v [i] / l * sens ;
827
828                 m_Atx += v [0] ;
829                 m_Aty += v [1] ;
830                 m_Atz += v [2] ;
831
832                 m_Eyex += v [0] ;
833                 m_Eyey += v [1] ;
834                 m_Eyez += v [2] ;
835
836         }
837 }
838
839 /* Rotation */
840
841 void CAnimationView3D::Turn (int x , int y)
842 {
843         gp_Vec z (0.,0.,1.) ;
844
845         double v [3] ;
846         double sens ;
847         double aX , aY , aZ ;
848
849         sens = (double) x - (double) myXmin ;
850         sens /= (double) m_cx ;
851         sens *= m_TurnSens ;
852
853         v [0] = m_Atx - m_Eyex ;
854         v [1] = m_Aty - m_Eyey ;
855         v [2] = m_Atz - m_Eyez ;
856
857         gp_Pnt eye ( m_Eyex , m_Eyey , m_Eyez ) ;
858
859         gp_Vec reg (v[0],v[1],v[2] );
860
861         gp_Vec vert = reg ^ z ;
862         gp_Vec haut = vert ^ reg ;
863
864         gp_Dir dh (haut) ;
865         gp_Ax1 rot (eye,dh);
866
867         reg.Rotate (rot,sens) ;
868
869         reg.Coord ( aX , aY , aZ ) ;
870
871         m_Atx = m_Eyex + aX ;
872         m_Aty = m_Eyey + aY ;
873         m_Atz = m_Eyez + aZ ;
874 }
875
876 void CAnimationView3D::Roll (int x , int y)
877 {
878         gp_Vec z (0.,0.,1.) ;
879
880         double v [3] ;
881         double sens ;
882         double aX , aY , aZ ;
883
884         sens = (double) x - (double) myXmin ;
885         sens /= (double) m_cx ;
886         sens *= m_TurnSens ;
887
888         v [0] = m_Atx - m_Eyex ;
889         v [1] = m_Aty - m_Eyey ;
890         v [2] = m_Atz - m_Eyez ;
891
892         gp_Pnt eye ( m_Eyex , m_Eyey , m_Eyez ) ;
893
894         gp_Vec reg (v[0],v[1],v[2] );
895
896         gp_Vec vert = reg ^ z ;
897
898         gp_Dir dh (vert) ;
899         gp_Ax1 rot (eye,dh);
900
901         reg.Rotate (rot,sens) ;
902
903         reg.Coord ( aX , aY , aZ ) ;
904
905         m_Atx = m_Eyex + aX ;
906         m_Aty = m_Eyey + aY ;
907         m_Atz = m_Eyez + aZ ;
908 }
909
910 void CAnimationView3D::Twist (int x , int y)
911 {
912         double sens ;
913         double a ;
914         
915         a = myView->Twist () ;
916
917         sens = (double) x - (double) myXmin ;
918         sens /= (double) m_cx ;
919         sens *= m_TurnSens ;
920
921         a += sens ;
922
923         myView->SetTwist (a) ;
924 }
925
926 void CAnimationView3D::SetFocal(double dFocus,double dAngle)
927 {
928         double v [3] ;
929         double l ;
930         int    i     ;
931
932         v [0] = m_Atx - m_Eyex ;
933         v [1] = m_Aty - m_Eyey ;
934         v [2] = m_Atz - m_Eyez ;
935
936         l = sqrt ( v[0]*v[0] + v[1]*v[1] + v[2]*v[2] ) ;
937         if ( l > 1.e-3 ) {
938                 for ( i=0 ; i<3 ; i++ )
939           v [i] = v [i] / l * dFocus ;
940
941                 m_Focus = dFocus ;
942
943                 m_Atx = v [0] + m_Eyex ;
944                 m_Aty = v [1] + m_Eyey ;
945                 m_Atz = v [2] + m_Eyez ;
946
947         myView->SetImmediateUpdate ( Standard_False ) ;
948                 myView->SetAt  ( m_Atx  , m_Aty  , m_Atz  ) ;
949                 m_dAngle = dAngle ;
950                 dAngle = dAngle * M_PI / 180. ;
951         myPView->SetAngle ( dAngle ) ;
952                 dAngle = myPView->Angle () ;
953
954         myView->SetImmediateUpdate ( Standard_True ) ;
955         myView->Update ();
956         }
957 }
958
959 void CAnimationView3D::ReloadData()
960 {
961         char szMsg [128] ;
962         double dTwist ;
963
964         myView->At  ( m_Atx  , m_Aty  , m_Atz  ) ;
965         myView->Eye ( m_Eyex , m_Eyey , m_Eyez ) ;
966
967         dTwist = myView->Twist () ;
968         dTwist = dTwist * 180. / M_PI ;
969
970         sprintf_s ( szMsg , "%lf" , m_Atx ) ;
971         (m_Tune.GetDlgItem ( IDC_XAT ))->SetWindowText ( szMsg ) ;
972         sprintf_s ( szMsg , "%lf" , m_Aty ) ;
973         (m_Tune.GetDlgItem ( IDC_YAT ))->SetWindowText ( szMsg ) ;
974         sprintf_s ( szMsg , "%lf" , m_Atz ) ;
975         (m_Tune.GetDlgItem ( IDC_ZAT ))->SetWindowText ( szMsg ) ;
976
977         sprintf_s ( szMsg , "%lf" , m_Eyex ) ;
978         (m_Tune.GetDlgItem ( IDC_XEYE ))->SetWindowText ( szMsg ) ;
979         sprintf_s ( szMsg , "%lf" , m_Eyey ) ;
980         (m_Tune.GetDlgItem ( IDC_YEYE ))->SetWindowText ( szMsg ) ;
981         sprintf_s ( szMsg , "%lf" , m_Eyez ) ;
982         (m_Tune.GetDlgItem ( IDC_ZEYE ))->SetWindowText ( szMsg ) ;
983
984         sprintf_s ( szMsg , "%lf" , dTwist ) ;
985         (m_Tune.GetDlgItem ( IDC_TWIST ))->SetWindowText ( szMsg ) ;
986
987         double dx,dy,dz ;
988         dx = m_Atx - m_Eyex ;
989         dy = m_Aty - m_Eyey ;
990         dz = m_Atz - m_Eyez ;
991
992     m_Focus = sqrt ( dx * dx + dy * dy + dz * dz ) ;
993         m_dAngle = myPView->Angle () ;
994         m_dAngle = m_dAngle * 180. / M_PI ;
995
996         m_Tune.m_dAngle = m_dAngle ;
997         m_Tune.m_dFocus = m_Focus  ;
998         m_Tune.UpdateData ( FALSE ) ;
999 }
1000
1001 void CAnimationView3D::SetDimensions()
1002 {
1003
1004   CAnimationDoc* pDoc = GetDocument();
1005
1006   myView->SetImmediateUpdate ( Standard_False ) ;
1007
1008   m_Atx  = ( pDoc->m_Xmin + pDoc->m_Xmax ) / 2. ;
1009   m_Aty  = ( pDoc->m_Ymin + pDoc->m_Ymax ) / 2. ;
1010   m_Atz  = ( pDoc->m_Zmin + pDoc->m_Zmax ) / 2. ;
1011   m_Eyex = pDoc->m_Xmax ;
1012   m_Eyey = pDoc->m_Ymax ;
1013   m_Eyez = pDoc->m_Zmax ;
1014
1015   myView->SetAt    ( m_Atx  , m_Aty  , m_Atz  ) ;
1016   myView->SetEye   ( m_Eyex , m_Eyey , m_Eyez ) ;
1017   myView->SetTwist (0.) ;
1018
1019   myView->SetImmediateUpdate ( Standard_False ) ;
1020   myView->FitAll();
1021   myView->SetImmediateUpdate ( Standard_False ) ;
1022   myView->ZFitAll();
1023
1024   myView->SetImmediateUpdate ( Standard_True ) ;
1025
1026   ReloadData () ;
1027   myView->Update ();
1028 }
1029
1030 void CAnimationView3D::OnViewDisplaystatus() 
1031 {
1032         // TODO: Add your command handler code here
1033
1034         if ( m_Tune.IsWindowVisible () ) {
1035
1036         }
1037         else {
1038                 m_Tune.ShowWindow ( SW_SHOWNORMAL ) ;
1039         }
1040 }
1041
1042 void CAnimationView3D::OnUpdateViewDisplaystatus(CCmdUI* pCmdUI) 
1043 {
1044         // TODO: Add your command update UI handler code here
1045
1046         if ( m_Tune.IsWindowVisible () ) {
1047                 pCmdUI->SetCheck ( 1 ) ;
1048         }
1049         else {
1050                 pCmdUI->SetCheck ( 0 ) ;
1051         }
1052 }