0024473: TKMath, BVH - introduce template-based package for Bounding volume hierarchy...
[occt.git] / src / BVH / BVH_Geometry.lxx
1 // Created on: 2013-12-20
2 // Created by: Denis BOGOLEPOV
3 // Copyright (c) 2013 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
8 // under the terms of the GNU Lesser General Public 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 <BVH_BinnedBuilder.hxx>
17
18 // =======================================================================
19 // function : BVH_Geometry
20 // purpose  :
21 // =======================================================================
22 template<class T, int N>
23 BVH_Geometry<T, N>::BVH_Geometry()
24 : myIsDirty (Standard_False),
25   myBVH (new BVH_Tree<T, N>())
26 {
27   // Set default builder - binned SAH split
28   myBuilder = new BVH_BinnedBuilder<T, N, 32> (1 /* primitive per leaf */);
29 }
30
31 // =======================================================================
32 // function : ~BVH_Geometry
33 // purpose  :
34 // =======================================================================
35 template<class T, int N>
36 BVH_Geometry<T, N>::~BVH_Geometry()
37 {
38   myBVH.Nullify();
39   myBuilder.Nullify();
40 }
41
42 // =======================================================================
43 // function : MarkDirty
44 // purpose  :
45 // =======================================================================
46 template<class T, int N>
47 void BVH_Geometry<T, N>::MarkDirty()
48 {
49   myIsDirty = Standard_True;
50 }
51
52 // =======================================================================
53 // function : Box
54 // purpose  :
55 // =======================================================================
56 template<class T, int N>
57 BVH_Box<T, N> BVH_Geometry<T, N>::Box() const
58 {
59   if (!myIsDirty)
60   {
61     return myBox;
62   }
63
64   myBox = BVH_Set<T, N>::Box();
65   return myBox;
66 }
67
68 // =======================================================================
69 // function : BVH
70 // purpose  :
71 // =======================================================================
72 template<class T, int N>
73 const NCollection_Handle<BVH_Tree<T, N> >& BVH_Geometry<T, N>::BVH()
74 {
75   if (myIsDirty)
76   {
77     Update();
78   }
79
80   return myBVH;
81 }
82
83 // =======================================================================
84 // function : Update
85 // purpose  :
86 // =======================================================================
87 template<class T, int N>
88 void BVH_Geometry<T, N>::Update()
89 {
90   if (!myIsDirty)
91   {
92     return;
93   }
94
95   BVH_Box<T, N> aBox;
96   for (Standard_Integer anIndex = 0; anIndex < BVH_ObjectSet<T, N>::myObjects.Size(); ++anIndex)
97   {
98     aBox.Combine (BVH_ObjectSet<T, N>::myObjects.Value (anIndex)->Box());
99   }
100
101   myBuilder->Build (this, myBVH.operator->(), aBox);
102   myIsDirty = Standard_False;
103 }
104
105 // =======================================================================
106 // function : Builder
107 // purpose  :
108 // =======================================================================
109 template<class T, int N>
110 const NCollection_Handle<BVH_Builder<T, N> >& BVH_Geometry<T, N>::Builder() const
111 {
112   return myBuilder;
113 }
114
115 // =======================================================================
116 // function : SetBuilder
117 // purpose  :
118 // =======================================================================
119 template<class T, int N>
120 void BVH_Geometry<T, N>::SetBuilder (NCollection_Handle<BVH_Builder<T, N> >& theBuilder)
121 {
122   myBuilder = theBuilder;
123 }