0030655: Modeling Data - Provide interfaces for selection of the elements from BVH...
[occt.git] / src / BVH / BVH_BoxSet.hxx
1 // Created by: Eugeny MALTCHIKOV
2 // Created on: 2019-04-17
3 // Copyright (c) 2019 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 _BVH_BoxSet_Header
17 #define _BVH_BoxSet_Header
18
19 #include <BVH_PrimitiveSet.hxx>
20
21 //! Implements easy to use interfaces for adding the elements into
22 //! BVH tree and its following construction.
23 //! To make it more effective it is better to set the number of elements
24 //! that are going to be added into BVH tree.
25 //! For better efficiency on heavy data types it is recommended to use
26 //! either BHV_IndexedBoxSet which uses indirect indexing for accessing
27 //! the elements and their boxes or set the element to be an index
28 //! of the real element in the application's internal data structures.
29 //!
30 //! \tparam NumType Numeric data type
31 //! \tparam Dimension Vector dimension
32 //! \tparam DataType Type of elements on which the boxes are built
33 template <class NumType, int Dimension, class DataType = Standard_Integer>
34 class BVH_BoxSet : public BVH_PrimitiveSet <NumType, Dimension>
35 {
36 public: //! @name Constructors
37
38   //! Empty constructor for use the default BVH_Builder
39   BVH_BoxSet()
40     : BVH_PrimitiveSet <NumType, Dimension>()
41   {
42   }
43   
44   //! Constructor for usage the custom BVH builder
45   BVH_BoxSet (const opencascade::handle <BVH_Builder <NumType, Dimension> >& theBuilder)
46     : BVH_PrimitiveSet <NumType, Dimension> (theBuilder)
47   {
48   }
49
50 public: //! @name Setting expected size of the BVH
51
52   //! Sets the expected size of BVH tree
53   virtual void SetSize (const Standard_Size theSize)
54   {
55     myElements.reserve (theSize);
56     myBoxes.reserve (theSize);
57   }
58
59 public: //! @name Adding elements in BVH
60
61   //! Adds the element into BVH
62   virtual void Add (const DataType& theElement, const BVH_Box<NumType, Dimension>& theBox)
63   {
64     myElements.push_back (theElement);
65     myBoxes.push_back (theBox);
66     BVH_Object<NumType, Dimension>::myIsDirty = Standard_True;
67   }
68
69 public: //! @name BVH construction
70
71   //! BVH construction
72   void Build()
73   {
74     BVH_PrimitiveSet <NumType, Dimension>::Update();
75   }
76
77 public: //! @name Clearing the elements and boxes
78
79   //! Clears the vectors of elements and boxes
80   virtual void Clear()
81   {
82     myElements.clear();
83     myBoxes.clear();
84     BVH_Object<NumType, Dimension>::myIsDirty = Standard_True;
85   }
86
87 public: //! @name Necessary overrides for BVH construction
88
89   //! Make inherited method Box() visible to avoid CLang warning
90   using BVH_PrimitiveSet <NumType, Dimension>::Box;
91
92   //! Returns the bounding box with the given index.
93   virtual BVH_Box <NumType, Dimension> Box (const Standard_Integer theIndex) const Standard_OVERRIDE
94   {
95     return myBoxes[theIndex];
96   }
97
98   //! Returns centroid position along specified axis.
99   virtual Standard_Real Center (const Standard_Integer theIndex,
100                                 const Standard_Integer theAxis) const Standard_OVERRIDE
101   {
102     return Box (theIndex).Center (theAxis);
103   }
104
105   //! Returns the number of boxes.
106   virtual Standard_Integer Size() const Standard_OVERRIDE
107   {
108     return static_cast<Standard_Integer> (myBoxes.size());
109   }
110
111   //! Swaps indices of two specified boxes.
112   virtual void Swap (const Standard_Integer theIndex1,
113                      const Standard_Integer theIndex2) Standard_OVERRIDE
114   {
115     std::swap (myElements[theIndex1], myElements[theIndex2]);
116     std::swap (myBoxes   [theIndex1], myBoxes   [theIndex2]);
117   }
118
119   //! Returns the Element with the index theIndex.
120   virtual DataType Element (const Standard_Integer theIndex) const
121   {
122     return myElements[theIndex];
123   }
124
125 protected: //! @name Fields
126
127   std::vector <DataType> myElements;                   //!< Elements
128   std::vector <BVH_Box <NumType, Dimension> > myBoxes; //!< Boxes for the elements
129
130 };
131
132 #endif // _BVH_BoxSet_Header