e898711c22746ebdcfbb7d7c42b40187e887f784
[occt.git] / samples / qt / VoxelDemo / src / Viewer.cpp
1 #include "Viewer.h"
2 #include "Timer.h"
3
4 #include <QApplication.h>
5 #include <QCursor.h>
6 #include <QMessagebox.h>
7
8 #include <QMouseEvent>
9
10 #include <WNT_Window.hxx>
11
12 #include <Voxel_Prs.hxx>
13 #include <AIS_ListOfInteractive.hxx>
14 #include <AIS_ListIteratorOfListOfInteractive.hxx>
15 #include <Aspect_DisplayConnection.hxx>
16 #include <Graphic3d.hxx>
17 #include <Graphic3d_GraphicDriver.hxx>
18
19 static Handle(Graphic3d_GraphicDriver) Viewer_aGraphicDriver;
20
21 Viewer::Viewer(QWidget* parent):QWidget(parent)
22 {
23     if (myGraphicDriver.IsNull())
24     {
25       if (Viewer_aGraphicDriver.IsNull())
26       {
27         Handle(Aspect_DisplayConnection) aDisplayConnection;
28         Viewer_aGraphicDriver = Graphic3d::InitGraphicDriver (aDisplayConnection);
29       }
30       myGraphicDriver = Handle(OpenGl_GraphicDriver)::DownCast(Viewer_aGraphicDriver);
31     }
32
33         Handle(V3d_Viewer) aViewer = new V3d_Viewer(myGraphicDriver, TCollection_ExtendedString("Visu3D").ToExtString(), "",
34                                                 1000, V3d_XposYnegZpos,
35                                                 Quantity_NOC_GRAY30, V3d_ZBUFFER, V3d_GOURAUD, V3d_WAIT,
36                                                 true, true, V3d_TEX_NONE);
37
38         aViewer->SetDefaultBackgroundColor(Quantity_NOC_BLACK);
39
40     myView = aViewer->CreateView();
41     myIC = new AIS_InteractiveContext(aViewer);
42     myIC->SetDeviationCoefficient(1.e-3);
43
44     Aspect_Handle aWindowHandle = (Aspect_Handle )winId();
45     Handle(WNT_Window) hWnd = new WNT_Window (aWindowHandle);
46
47     myView->SetWindow(hWnd);
48     if(!hWnd->IsMapped())
49         hWnd->Map();
50
51     myView->MustBeResized();
52     myView->SetSurfaceDetail(V3d_TEX_NONE);
53     myView->SetTransparency(Standard_True);
54     myView->SetSize(10000.0);
55     myView->SetZSize(10000.0);
56     myView->SetViewMappingDefault();
57
58     myZoom = false;
59     myPan = false;
60     myRotate = false;
61     setMouseTracking(true);
62
63     setMinimumSize(400, 200);
64     
65     myView->ZBufferTriedronSetup();
66     myView->TriedronDisplay(Aspect_TOTP_LEFT_LOWER, Quantity_NOC_BLACK, 0.1, V3d_ZBUFFER);
67
68     mySelector.Init(myView);
69
70         setBackgroundRole( QPalette::NoRole );//NoBackground );
71         // set focus policy to threat QContextMenuEvent from keyboard  
72         setFocusPolicy( Qt::StrongFocus );
73         setAttribute( Qt::WA_PaintOnScreen );
74         setAttribute( Qt::WA_NoSystemBackground );
75 }
76
77 Viewer::~Viewer()
78 {
79
80 }
81
82 void Viewer::paintEvent(QPaintEvent * pEvent)
83 {
84     if (!myView.IsNull())
85         myView->Redraw();
86 }
87
88
89 /*!
90   Get paint engine for the OpenGL viewer. [ virtual public ]
91 */
92 QPaintEngine* Viewer::paintEngine() const
93 {
94   return 0;
95 }
96
97 void Viewer::resizeEvent(QResizeEvent * e)
98 {
99     if (!myView.IsNull())
100     {
101         myView->MustBeResized();
102     }
103 }
104
105 void Viewer::mousePressEvent(QMouseEvent * mpEvent)
106 {
107     // Memorize start point
108     myStartPnt.setX(mpEvent->x());
109     myStartPnt.setY(mpEvent->y());
110     
111     // Inform IC that the mouse cursor is at the point
112     myIC->MoveTo(myStartPnt.x(), myStartPnt.y(), myView);
113
114     // In case of rotation, define the start rotation point
115     if ((mpEvent->modifiers() & Qt::ControlModifier) && (mpEvent->buttons() & Qt::RightButton))
116     {
117         myView->StartRotation(myStartPnt.x(), myStartPnt.y());
118     }
119
120     // Start degenerate mode
121     setDegenerateMode(true);
122
123     emit mousePressed(mpEvent->modifiers(), mpEvent->x(), mpEvent->y());
124 }
125
126 void Viewer::mouseMoveEvent(QMouseEvent * mmEvent)
127 {
128     QPoint currentPnt(mmEvent->x(), mmEvent->y());
129
130     if (mmEvent->modifiers() & Qt::ControlModifier)
131     {
132         if (mmEvent->buttons() & Qt::LeftButton)
133         {
134             myView->Zoom(myStartPnt.x(), myStartPnt.y(), currentPnt.x(), currentPnt.y());
135             myStartPnt = currentPnt;
136         }
137         else if (mmEvent->buttons() & Qt::MidButton)
138         {
139             myView->Pan(currentPnt.x() - myStartPnt.x(), myStartPnt.y() - currentPnt.y());
140             myStartPnt = currentPnt;
141         }
142         else if (mmEvent->buttons() & Qt::RightButton)
143         {
144             myView->Rotation(currentPnt.x(), currentPnt.y());
145         }
146     }
147     else
148     {
149         myIC->MoveTo(currentPnt.x(), currentPnt.y(), myView);
150     }
151
152     emit mouseMoved(mmEvent->modifiers(), currentPnt.x(), currentPnt.y());
153 }
154
155 void Viewer::mouseReleaseEvent(QMouseEvent * mrEvent)
156 {
157     if(mrEvent->button() == Qt::LeftButton)
158     {
159         if(!myZoom && !myPan && !myRotate)
160         {
161             if(mrEvent->modifiers() & Qt::ShiftModifier)
162                 myIC->ShiftSelect();
163             else
164                 myIC->Select();
165
166             // Select a voxel
167             int ix = -1, iy = -1, iz = -1;
168             bool detected = mySelector.Detect(mrEvent->x(), mrEvent->y(), ix, iy, iz);
169             if (detected)
170             {
171                 cout<<"("<<ix<<", "<<iy<<", "<<iz<<")"<<endl;
172             }
173             if (!myPrs.IsNull())
174                 myPrs->Highlight(ix, iy, iz);
175         }
176     }
177     else if(mrEvent->button() == Qt::RightButton)
178     {
179         // Popup menu:
180
181     
182         }
183
184     // Finish degenerate mode
185     setDegenerateMode(false);
186     
187     emit mouseReleased(mrEvent->modifiers(), mrEvent->x(), mrEvent->y());
188 }
189
190 void Viewer::mouseDoubleClickEvent(QMouseEvent * mdcEvent)
191 {
192     emit mouseDoubleClick(mdcEvent->modifiers(), mdcEvent->x(), mdcEvent->y());
193 }
194
195 void Viewer::setDegenerateMode(const bool on)
196 {
197     AIS_ListOfInteractive displayed;
198     myIC->DisplayedObjects(displayed);
199     AIS_ListIteratorOfListOfInteractive itri(displayed);
200     for (; itri.More(); itri.Next())
201     {
202         if (itri.Value()->DynamicType() == STANDARD_TYPE(Voxel_Prs))
203         {
204             Handle(Voxel_Prs) prs = Handle(Voxel_Prs)::DownCast(itri.Value());
205             prs->SetDegenerateMode(on);
206             myView->Redraw();
207             break;
208         }
209     }
210 }