0030655: Modeling Data - Provide interfaces for selection of the elements from BVH...
[occt.git] / src / BVH / BVH_IndexedBoxSet.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_IndexedBoxSet_Header
17 #define _BVH_IndexedBoxSet_Header
18
19 #include <BVH_BoxSet.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 //! It uses the indirect indexing for accessing the elements and their boxes
26 //! which allows using heavy data types as elements with better efficiency
27 //! during BVH construction and just a bit slower selection time.
28 //! Due to better BVH tree construction time the class will be more efficient
29 //! than BVH_BoxSet on the operations where just a few selections from
30 //! the tree required.
31 //!
32 //! \tparam NumType Numeric data type
33 //! \tparam Dimension Vector dimension
34 //! \tparam DataType Type of elements on which the boxes are built
35 template <class NumType, int Dimension, class DataType = Standard_Integer>
36 class BVH_IndexedBoxSet : public BVH_BoxSet <NumType, Dimension, DataType>
37 {
38 public: //! @name Constructors
39
40   //! Empty constructor for use the default BVH_Builder
41   BVH_IndexedBoxSet()
42     : BVH_BoxSet <NumType, Dimension, DataType>()
43   {
44   }
45   
46   //! Constructor for usage the custom BVH builder
47   BVH_IndexedBoxSet (const opencascade::handle <BVH_Builder <NumType, Dimension> >& theBuilder)
48     : BVH_BoxSet <NumType, Dimension, DataType> (theBuilder)
49   {
50   }
51
52 public: //! @name Setting expected size of the BVH
53
54   //! Sets the expected size of BVH tree
55   virtual void SetSize (const Standard_Size theSize) Standard_OVERRIDE
56   {
57     myIndices.reserve (theSize);
58     BVH_BoxSet <NumType, Dimension, DataType>::SetSize (theSize);
59   }
60
61 public: //! @name Adding elements in BVH
62
63   //! Adds the element into BVH
64   virtual void Add (const DataType& theElement, const BVH_Box<NumType, Dimension>& theBox) Standard_OVERRIDE
65   {
66     myIndices.push_back (static_cast<Standard_Integer> (myIndices.size()));
67     BVH_BoxSet <NumType, Dimension, DataType>::Add (theElement, theBox);
68   }
69
70 public: //! @name Clearing the elements and boxes
71
72   //! Clears the vectors of elements and boxes
73   virtual void Clear() Standard_OVERRIDE
74   {
75     myIndices.clear();
76     BVH_BoxSet <NumType, Dimension, DataType>::Clear();
77   }
78
79 public: //! @name Necessary overrides for BVH construction
80
81   //! Make inherited method Box() visible to avoid CLang warning
82   using BVH_BoxSet <NumType, Dimension, DataType>::Box;
83
84   //! Returns the bounding box with the given index.
85   virtual BVH_Box <NumType, Dimension> Box (const Standard_Integer theIndex) const Standard_OVERRIDE
86   {
87     return myBoxes[myIndices[theIndex]];
88   }
89
90   //! Swaps indices of two specified boxes.
91   virtual void Swap (const Standard_Integer theIndex1,
92                      const Standard_Integer theIndex2) Standard_OVERRIDE
93   {
94     std::swap (myIndices[theIndex1], myIndices[theIndex2]);
95   }
96
97   //! Returns the Element with the index theIndex.
98   virtual DataType Element (const Standard_Integer theIndex) const
99   {
100     return myElements[myIndices[theIndex]];
101   }
102
103 protected: //! @name Fields
104
105   std::vector <Standard_Integer> myIndices;
106
107 };
108
109 #endif // _BVH_IndexedBoxSet_Header