0032337: Visualization - rename Overlaps() method in selection to more self-describab...
[occt.git] / src / SelectMgr / SelectMgr_RectangularFrustum.hxx
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 #ifndef _SelectMgr_RectangularFrustum_HeaderFile
17 #define _SelectMgr_RectangularFrustum_HeaderFile
18
19 #include <SelectMgr_Frustum.hxx>
20
21 //! This class contains representation of rectangular selecting frustum, created in case
22 //! of point and box selection, and algorithms for overlap detection between selecting
23 //! frustum and sensitive entities. The principle of frustum calculation:
24 //! - for point selection: on a near view frustum plane rectangular neighborhood of
25 //!                        user-picked point is created according to the pixel tolerance
26 //!                        given and then this rectangle is projected onto far view frustum
27 //!                        plane. This rectangles define the parallel bases of selecting frustum;
28 //! - for box selection: box points are projected onto near and far view frustum planes.
29 //!                      These 2 projected rectangles define parallel bases of selecting frustum.
30 //! Overlap detection tests are implemented according to the terms of separating axis
31 //! theorem (SAT).
32 class SelectMgr_RectangularFrustum : public SelectMgr_Frustum<4>
33 {
34 public:
35
36   //! Auxiliary structure to define selection primitive (point or box)
37   //! In case of point selection min and max points are identical.
38   struct SelectionRectangle
39   {
40     SelectionRectangle()
41     : myMinPnt(gp_Pnt2d(RealLast(), RealLast())),
42       myMaxPnt(gp_Pnt2d(RealLast(), RealLast())) {}
43
44     const gp_Pnt2d& MousePos() const { return myMinPnt; }
45     void SetMousePos (const gp_Pnt2d& thePos) { myMinPnt = thePos; myMaxPnt = thePos; }
46
47     const gp_Pnt2d& MinPnt() const { return myMinPnt; }
48     void SetMinPnt (const gp_Pnt2d& theMinPnt) { myMinPnt = theMinPnt; }
49
50     const gp_Pnt2d& MaxPnt() const { return myMaxPnt; }
51     void SetMaxPnt (const gp_Pnt2d& theMaxPnt) { myMaxPnt = theMaxPnt; }
52
53   private:
54
55     gp_Pnt2d myMinPnt;
56     gp_Pnt2d myMaxPnt;
57   };
58
59   //! Creates rectangular selecting frustum.
60   Standard_EXPORT SelectMgr_RectangularFrustum();
61
62   //! Initializes volume according to the point and given pixel tolerance
63   Standard_EXPORT void Init (const gp_Pnt2d& thePoint);
64
65   //! Initializes volume according to the selected rectangle
66   Standard_EXPORT void Init (const gp_Pnt2d& theMinPnt,
67                              const gp_Pnt2d& theMaxPnt);
68
69   //! Builds volume according to internal parameters.
70   //! NOTE: it should be called after Init() method
71   Standard_EXPORT virtual void Build() Standard_OVERRIDE;
72
73   //! Checks if it is possible to scale this frustum.
74   //! It is true for frustum built on a single point.
75   Standard_EXPORT virtual Standard_Boolean IsScalable() const Standard_OVERRIDE;
76
77   //! IMPORTANT: Scaling makes sense only for frustum built on a single point!
78   //!            Note that this method does not perform any checks on type of the frustum.
79   //! Returns a copy of the frustum resized according to the scale factor given
80   //! and transforms it using the matrix given.
81   //! There are no default parameters, but in case if:
82   //!    - transformation only is needed: @theScaleFactor must be initialized as any negative value;
83   //!    - scale only is needed: @theTrsf must be set to gp_Identity.
84   //! Builder is an optional argument that represents corresponding settings for re-constructing transformed
85   //! frustum from scratch. Can be null if reconstruction is not expected furthermore.
86   Standard_EXPORT virtual Handle(SelectMgr_BaseIntersector) ScaleAndTransform (const Standard_Integer theScaleFactor,
87                                                                                const gp_GTrsf& theTrsf,
88                                                                                const Handle(SelectMgr_FrustumBuilder)& theBuilder) const Standard_OVERRIDE;
89
90   // SAT Tests for different objects
91
92   //! SAT intersection test between defined volume and given axis-aligned box
93   Standard_EXPORT virtual Standard_Boolean OverlapsBox (const SelectMgr_Vec3& theBoxMin,
94                                                         const SelectMgr_Vec3& theBoxMax,
95                                                         const SelectMgr_ViewClipRange& theClipRange,
96                                                         SelectBasics_PickResult& thePickResult) const Standard_OVERRIDE;
97
98   //! Returns true if selecting volume is overlapped by axis-aligned bounding box
99   //! with minimum corner at point theMinPt and maximum at point theMaxPt
100   Standard_EXPORT virtual Standard_Boolean OverlapsBox (const SelectMgr_Vec3& theBoxMin,
101                                                         const SelectMgr_Vec3& theBoxMax,
102                                                         Standard_Boolean*     theInside) const Standard_OVERRIDE;
103
104   //! Intersection test between defined volume and given point
105   Standard_EXPORT virtual Standard_Boolean OverlapsPoint (const gp_Pnt& thePnt,
106                                                      const SelectMgr_ViewClipRange& theClipRange,
107                                                      SelectBasics_PickResult& thePickResult) const Standard_OVERRIDE;
108
109   //! Intersection test between defined volume and given point
110   Standard_EXPORT virtual Standard_Boolean OverlapsPoint (const gp_Pnt& thePnt) const Standard_OVERRIDE;
111
112   //! SAT intersection test between defined volume and given ordered set of points,
113   //! representing line segments. The test may be considered of interior part or
114   //! boundary line defined by segments depending on given sensitivity type
115   Standard_EXPORT virtual Standard_Boolean OverlapsPolygon (const TColgp_Array1OfPnt& theArrayOfPnts,
116                                                             Select3D_TypeOfSensitivity theSensType,
117                                                             const SelectMgr_ViewClipRange& theClipRange,
118                                                             SelectBasics_PickResult& thePickResult) const Standard_OVERRIDE;
119
120   //! Checks if line segment overlaps selecting frustum
121   Standard_EXPORT virtual Standard_Boolean OverlapsSegment (const gp_Pnt& thePnt1,
122                                                             const gp_Pnt& thePnt2,
123                                                             const SelectMgr_ViewClipRange& theClipRange,
124                                                             SelectBasics_PickResult& thePickResult) const Standard_OVERRIDE;
125
126   //! SAT intersection test between defined volume and given triangle. The test may
127   //! be considered of interior part or boundary line defined by triangle vertices
128   //! depending on given sensitivity type
129   Standard_EXPORT virtual Standard_Boolean OverlapsTriangle (const gp_Pnt& thePnt1,
130                                                              const gp_Pnt& thePnt2,
131                                                              const gp_Pnt& thePnt3,
132                                                              Select3D_TypeOfSensitivity theSensType,
133                                                              const SelectMgr_ViewClipRange& theClipRange,
134                                                              SelectBasics_PickResult& thePickResult) const Standard_OVERRIDE;
135
136   //! Measures distance between 3d projection of user-picked
137   //! screen point and given point theCOG.
138   //! It makes sense only for frustums built on a single point.
139   Standard_EXPORT virtual Standard_Real DistToGeometryCenter (const gp_Pnt& theCOG) const Standard_OVERRIDE;
140
141   //! Calculates the point on a view ray that was detected during the run of selection algo by given depth
142   Standard_EXPORT virtual gp_Pnt DetectedPoint (const Standard_Real theDepth) const Standard_OVERRIDE;
143
144   //! A set of helper functions that return rectangular selecting frustum data
145   const gp_Pnt* GetVertices() const { return myVertices; }
146
147   //! Returns projection of 2d mouse picked point or projection
148   //! of center of 2d rectangle (for point and rectangular selection
149   //! correspondingly) onto near view frustum plane
150   virtual const gp_Pnt& GetNearPnt() const Standard_OVERRIDE { return myNearPickedPnt; }
151
152   //! Returns projection of 2d mouse picked point or projection
153   //! of center of 2d rectangle (for point and rectangular selection
154   //! correspondingly) onto far view frustum plane
155   virtual const gp_Pnt& GetFarPnt() const Standard_OVERRIDE { return myFarPickedPnt; }
156
157   //! Returns view ray direction.
158   virtual const gp_Dir& GetViewRayDirection() const Standard_OVERRIDE { return myViewRayDir; }
159
160   //! Returns current mouse coordinates.
161   Standard_EXPORT virtual const gp_Pnt2d& GetMousePosition() const Standard_OVERRIDE;
162
163   //! Stores plane equation coefficients (in the following form:
164   //! Ax + By + Cz + D = 0) to the given vector
165   Standard_EXPORT virtual void GetPlanes (NCollection_Vector<SelectMgr_Vec4>& thePlaneEquations) const Standard_OVERRIDE;
166
167   //! Dumps the content of me into the stream
168   Standard_EXPORT virtual void DumpJson (Standard_OStream& theOStream, Standard_Integer theDepth = -1) const Standard_OVERRIDE;
169
170 protected:
171
172   Standard_EXPORT void segmentSegmentDistance (const gp_Pnt& theSegPnt1,
173                                                const gp_Pnt& theSegPnt2,
174                                                SelectBasics_PickResult& thePickResult) const;
175
176   Standard_EXPORT bool segmentPlaneIntersection (const gp_Vec& thePlane,
177                                                  const gp_Pnt& thePntOnPlane,
178                                                  SelectBasics_PickResult& thePickResult) const;
179
180 private:
181
182   void cacheVertexProjections (SelectMgr_RectangularFrustum* theFrustum) const;
183
184 private:
185   enum { LeftTopNear, LeftTopFar,
186          LeftBottomNear, LeftBottomFar,
187          RightTopNear, RightTopFar,
188          RightBottomNear, RightBottomFar };
189
190 private:
191
192   SelectionRectangle      mySelRectangle;              //!< parameters for selection by point or box (it is used to build frustum)
193   gp_Pnt                  myNearPickedPnt;             //!< 3d projection of user-picked selection point onto near view plane
194   gp_Pnt                  myFarPickedPnt;              //!< 3d projection of user-picked selection point onto far view plane
195   gp_Dir                  myViewRayDir;                //!< view ray direction
196   Standard_Real           myScale;                     //!< Scale factor of applied transformation, if there was any
197
198 };
199
200 #endif // _SelectMgr_RectangularFrustum_HeaderFile