0029938: Visualization - SelectMgr_ViewerSelector::PickedPoint() should return point...
[occt.git] / src / SelectMgr / SelectMgr_BaseFrustum.cxx
1 // Created on: 2014-05-22
2 // Created by: Varvara POSKONINA
3 // Copyright (c) 2005-2014 OPEN CASCADE SAS
4 //
5 // This file is part of Open CASCADE Technology software library.
6 //
7 // This library is free software; you can redistribute it and/or modify it under
8 // the terms of the GNU Lesser General Public License version 2.1 as published
9 // by the Free Software Foundation, with special exception defined in the file
10 // OCCT_LGPL_EXCEPTION.txt. Consult the file LICENSE_LGPL_21.txt included in OCCT
11 // distribution for complete text of the license and disclaimer of any warranty.
12 //
13 // Alternatively, this file may be used under the terms of Open CASCADE
14 // commercial license or contractual agreement.
15
16 #include <SelectMgr_BaseFrustum.hxx>
17
18 IMPLEMENT_STANDARD_RTTIEXT(SelectMgr_BaseFrustum,Standard_Transient)
19
20 //=======================================================================
21 // function : SelectMgr_SelectingVolume
22 // purpose  : Creates new selecting volume with pixel toletance set to 2,
23 //            orthographic camera and empty frustum builder
24 //=======================================================================
25 SelectMgr_BaseFrustum::SelectMgr_BaseFrustum()
26 : myPixelTolerance (2),
27   myIsOrthographic (Standard_True)
28 {
29   myBuilder = new SelectMgr_FrustumBuilder();
30 }
31
32 //=======================================================================
33 // function : SetCamera
34 // purpose  : Passes camera projection and orientation matrices to builder
35 //=======================================================================
36 void SelectMgr_BaseFrustum::SetCamera (const Handle(Graphic3d_Camera)& theCamera)
37 {
38   myCamera = theCamera;
39   myBuilder->SetWorldViewMatrix (theCamera->OrientationMatrix());
40   myBuilder->SetProjectionMatrix (theCamera->ProjectionMatrix());
41   myBuilder->SetWorldViewProjState (theCamera->WorldViewProjState());
42   myIsOrthographic = theCamera->IsOrthographic();
43   myBuilder->InvalidateViewport();
44 }
45
46 //=======================================================================
47 // function : SetCamera
48 // purpose  : Passes camera projection and orientation matrices to builder
49 //=======================================================================
50 void SelectMgr_BaseFrustum::SetCamera (const Graphic3d_Mat4d& theProjection,
51                                        const Graphic3d_Mat4d& theWorldView,
52                                        const Standard_Boolean theIsOrthographic,
53                                        const Graphic3d_WorldViewProjState& theWVPState)
54 {
55   myCamera.Nullify();
56   myBuilder->SetWorldViewMatrix (theWorldView);
57   myBuilder->SetProjectionMatrix (theProjection);
58   myBuilder->SetWorldViewProjState (theWVPState);
59   myIsOrthographic = theIsOrthographic;
60 }
61
62 //=======================================================================
63 // function : ProjectionMatrix
64 // purpose  : Returns current camera projection transformation common for
65 //            all selecting volumes
66 //=======================================================================
67 const Graphic3d_Mat4d& SelectMgr_BaseFrustum::ProjectionMatrix() const
68 {
69   return myBuilder->ProjectionMatrix();
70 }
71
72 //=======================================================================
73 // function : WorldViewMatrix
74 // purpose  : Returns current camera world view transformation common for
75 //            all selecting volumes
76 //=======================================================================
77 const Graphic3d_Mat4d& SelectMgr_BaseFrustum::WorldViewMatrix() const
78 {
79   return myBuilder->WorldViewMatrix();
80 }
81
82 //=======================================================================
83 // function : WorldViewProjState
84 // purpose  : Returns current camera world view projection transformation
85 //            state
86 //=======================================================================
87 const Graphic3d_WorldViewProjState& SelectMgr_BaseFrustum::WorldViewProjState() const
88 {
89   return myBuilder->WorldViewProjState();
90 }
91
92 //=======================================================================
93 // function : SetViewport
94 // purpose  : Passes viewport parameters to builder
95 //=======================================================================
96 void SelectMgr_BaseFrustum::SetViewport (const Standard_Real theX,
97                                          const Standard_Real theY,
98                                          const Standard_Real theWidth,
99                                          const Standard_Real theHeight)
100 {
101   myBuilder->SetViewport (theX, theY, theWidth, theHeight);
102 }
103
104 //=======================================================================
105 // function : SetPixelTolerance
106 // purpose  :
107 //=======================================================================
108 void SelectMgr_BaseFrustum::SetPixelTolerance (const Standard_Integer theTol)
109 {
110   myPixelTolerance = theTol;
111 }
112
113 //=======================================================================
114 // function : SetWindowSize
115 // purpose  :
116 //=======================================================================
117 void SelectMgr_BaseFrustum::SetWindowSize (const Standard_Integer theWidth, const Standard_Integer theHeight)
118 {
119   myBuilder->SetWindowSize (theWidth, theHeight);
120 }
121
122 //=======================================================================
123 // function : WindowSize
124 // purpose  :
125 //=======================================================================
126 void SelectMgr_BaseFrustum::WindowSize (Standard_Integer& theWidth,
127                                         Standard_Integer& theHeight) const
128 {
129   myBuilder->WindowSize (theWidth, theHeight);
130 }
131
132 //=======================================================================
133 // function : SetBuilder
134 // purpose  :
135 //=======================================================================
136 void SelectMgr_BaseFrustum::SetBuilder (const Handle(SelectMgr_FrustumBuilder)& theBuilder)
137 {
138   myBuilder.Nullify();
139   myBuilder = theBuilder;
140 }
141
142 //=======================================================================
143 // function : Overlaps
144 // purpose  : SAT intersection test between defined volume and
145 //            given axis-aligned box
146 //=======================================================================
147 Standard_Boolean SelectMgr_BaseFrustum::Overlaps (const SelectMgr_Vec3& /*theBoxMin*/,
148                                                   const SelectMgr_Vec3& /*theBoxMax*/,
149                                                   SelectBasics_PickResult& /*thePickResult*/)
150 {
151   return Standard_False;
152 }
153
154 //=======================================================================
155 // function : Overlaps
156 // purpose  : Intersection test between defined volume and given point
157 //=======================================================================
158 Standard_Boolean SelectMgr_BaseFrustum::Overlaps (const SelectMgr_Vec3& /*theBoxMin*/,
159                                                   const SelectMgr_Vec3& /*theBoxMax*/,
160                                                   Standard_Boolean*     /*theInside*/)
161 {
162   return Standard_False;
163 }
164
165 //=======================================================================
166 // function : Overlaps
167 // purpose  : Intersection test between defined volume and given point
168 //=======================================================================
169 Standard_Boolean SelectMgr_BaseFrustum::Overlaps (const gp_Pnt& /*thePnt*/,
170                                                   SelectBasics_PickResult& )
171 {
172   return Standard_False;
173 }
174
175 //=======================================================================
176 // function : Overlaps
177 // purpose  : Intersection test between defined volume and given point
178 //=======================================================================
179 Standard_Boolean SelectMgr_BaseFrustum::Overlaps (const gp_Pnt& /*thePnt*/)
180 {
181   return Standard_False;
182 }
183
184 //=======================================================================
185 // function : Overlaps
186 // purpose  : SAT intersection test between defined volume and given
187 //            ordered set of points, representing line segments. The test
188 //            may be considered of interior part or boundary line defined
189 //            by segments depending on given sensitivity type
190 //=======================================================================
191 Standard_Boolean SelectMgr_BaseFrustum::Overlaps (const TColgp_Array1OfPnt& /*theArrayOfPnts*/,
192                                                   Select3D_TypeOfSensitivity /*theSensType*/,
193                                                   SelectBasics_PickResult& )
194 {
195   return Standard_False;
196 }
197
198 //=======================================================================
199 // function : Overlaps
200 // purpose  : SAT intersection test between defined volume and given
201 //            triangle. The test may be considered of interior part or
202 //            boundary line defined by triangle vertices depending on
203 //            given sensitivity type
204 //=======================================================================
205 Standard_Boolean SelectMgr_BaseFrustum::Overlaps (const gp_Pnt& /*thePt1*/,
206                                                   const gp_Pnt& /*thePt2*/,
207                                                   const gp_Pnt& /*thePt3*/,
208                                                   Select3D_TypeOfSensitivity /*theSensType*/,
209                                                   SelectBasics_PickResult& )
210 {
211   return Standard_False;
212 }
213
214 //=======================================================================
215 // function : Overlaps
216 // purpose  : Checks if line segment overlaps selecting volume
217 //=======================================================================
218 Standard_Boolean SelectMgr_BaseFrustum::Overlaps (const gp_Pnt& /*thePnt1*/,
219                                                   const gp_Pnt& /*thePnt2*/,
220                                                   SelectBasics_PickResult& )
221 {
222   return Standard_False;
223 }
224
225 //=======================================================================
226 // function : DistToGeometryCenter
227 // purpose  : Measures distance between 3d projection of user-picked
228 //            screen point and given point theCOG
229 //=======================================================================
230 Standard_Real SelectMgr_BaseFrustum::DistToGeometryCenter (const gp_Pnt& /*theCOG*/)
231 {
232   return DBL_MAX;
233 }
234
235 //=======================================================================
236 // function : DetectedPoint
237 // purpose  :
238 //=======================================================================
239 gp_Pnt SelectMgr_BaseFrustum::DetectedPoint (const Standard_Real /*theDepth*/) const
240 {
241   return gp_Pnt (RealLast(), RealLast(), RealLast());
242 }
243
244 //=======================================================================
245 // function : IsClipped
246 // purpose  : Checks if the point of sensitive in which selection was
247 //            detected belongs to the region defined by clipping planes
248 //=======================================================================
249 Standard_Boolean SelectMgr_BaseFrustum::IsClipped (const Graphic3d_SequenceOfHClipPlane& /*thePlanes*/,
250                                                    const Standard_Real /*theDepth*/)
251 {
252   return Standard_True;
253 }