0027969: Visualization - add interfaces to access selecting volumes from SelectMgr_Se...
[occt.git] / src / SelectMgr / SelectMgr_Frustum.hxx
CommitLineData
f751596e 1// Created on: 2015-03-16
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_Frustum_HeaderFile
17#define _SelectMgr_Frustum_HeaderFile
18
19#include <BVH_Box.hxx>
20#include <gp_Pnt.hxx>
3bf9a45f 21#include <gp_Vec.hxx>
22#include <gp_XYZ.hxx>
f751596e 23#include <SelectMgr_BaseFrustum.hxx>
f751596e 24#include <TColgp_HArray1OfPnt.hxx>
25#include <TColgp_Array1OfPnt2d.hxx>
26
27//! This is an internal class containing representation of rectangular selecting frustum, created in case
28//! of point and box selection, and algorithms for overlap detection between selecting
29//! frustum and sensitive entities. The principle of frustum calculation:
30//! - for point selection: on a near view frustum plane rectangular neighborhood of
31//! user-picked point is created according to the pixel tolerance
32//! given and then this rectangle is projected onto far view frustum
33//! plane. This rectangles define the parallel bases of selecting frustum;
34//! - for box selection: box points are projected onto near and far view frustum planes.
35//! These 2 projected rectangles define parallel bases of selecting frustum.
36//! Overlap detection tests are implemented according to the terms of separating axis
37//! theorem (SAT).
38//! Vertex order:
39//! - for triangular frustum: V0_Near, V1_Near, V2_Near,
40//! V0_Far, V1_Far, V2_Far;
41//! - for rectangular frustum: LeftTopNear, LeftTopFar,
42//! LeftBottomNear,LeftBottomFar,
43//! RightTopNear, RightTopFar,
44//! RightBottomNear, RightBottomFar.
45//! Plane order in array:
46//! - for triangular frustum: V0V1, V1V2, V0V2, Near, Far;
47//! - for rectangular frustum: Top, Bottom, Left, Right, Near, Far.
48//! Uncollinear edge directions order:
49//! - for rectangular frustum: Horizontal, Vertical,
50//! LeftLower, RightLower,
51//! LeftUpper, RightUpper;
52//! - for triangular frustum: V0_Near - V0_Far, V1_Near - V1_Far, V2_Near - V2_Far,
53//! V1_Near - V0_Near, V2_Near - V1_Near, V2_Near - V0_Near.
54template <int N>
55class SelectMgr_Frustum : public SelectMgr_BaseFrustum
56{
57public:
58
59 SelectMgr_Frustum() : SelectMgr_BaseFrustum() {};
60
61protected:
62
63 // SAT Tests for different objects
64
65 //! Returns true if selecting volume is overlapped by axis-aligned bounding box
66 //! with minimum corner at point theMinPt and maximum at point theMaxPt
1f3913c6 67 Standard_EXPORT Standard_Boolean hasOverlap (const SelectMgr_Vec3& theBoxMin,
68 const SelectMgr_Vec3& theBoxMax,
69 Standard_Boolean* theInside = NULL);
f751596e 70
71 //! SAT intersection test between defined volume and given point
1f3913c6 72 Standard_EXPORT Standard_Boolean hasOverlap (const gp_Pnt& thePnt);
f751596e 73
74 //! SAT intersection test between defined volume and given segment
1f3913c6 75 Standard_EXPORT Standard_Boolean hasOverlap (const gp_Pnt& thePnt1,
76 const gp_Pnt& thePnt2);
f751596e 77
78 //! SAT intersection test between frustum given and planar convex polygon represented as ordered point set
114b7bf1 79 Standard_EXPORT Standard_Boolean hasOverlap (const TColgp_Array1OfPnt& theArrayOfPnts,
3bf9a45f 80 gp_Vec& theNormal);
f751596e 81
82 //! SAT intersection test between defined volume and given triangle
1f3913c6 83 Standard_EXPORT Standard_Boolean hasOverlap (const gp_Pnt& thePnt1,
84 const gp_Pnt& thePnt2,
85 const gp_Pnt& thePnt3,
3bf9a45f 86 gp_Vec& theNormal);
f751596e 87
88private:
89
90 //! Checks if AABB and frustum are separated along the given axis
91 Standard_Boolean isSeparated (const SelectMgr_Vec3& theBoxMin,
92 const SelectMgr_Vec3& theBoxMax,
3bf9a45f 93 const gp_XYZ& theDirect,
2157d6ac 94 Standard_Boolean* theInside) const;
f751596e 95
96 //! Checks if triangle and frustum are separated along the given axis
97 Standard_Boolean isSeparated (const gp_Pnt& thePnt1,
98 const gp_Pnt& thePnt2,
99 const gp_Pnt& thePnt3,
3bf9a45f 100 const gp_XYZ& theAxis) const;
f751596e 101
102protected:
103
3bf9a45f 104 gp_Vec myPlanes[N + 2]; //!< Plane equations
105 gp_Pnt myVertices[N * 2]; //!< Vertices coordinates
f751596e 106
107 Standard_Real myMaxVertsProjections[N + 2]; //!< Cached projections of vertices onto frustum plane directions
108 Standard_Real myMinVertsProjections[N + 2]; //!< Cached projections of vertices onto frustum plane directions
109 Standard_Real myMaxOrthoVertsProjections[3]; //!< Cached projections of vertices onto directions of ortho unit vectors
110 Standard_Real myMinOrthoVertsProjections[3]; //!< Cached projections of vertices onto directions of ortho unit vectors
111
3bf9a45f 112 gp_Vec myEdgeDirs[6]; //!< Cached edge directions
f751596e 113};
114
115#include <SelectMgr_Frustum.lxx>
116
117#endif // _SelectMgr_Frustum_HeaderFile