0030675: Visualization - remove redundant proxy classes in hierarchy of PrsMgr_Presen...
[occt.git] / src / Graphic3d / Graphic3d_BvhCStructureSet.cxx
1 // Created on: 2013-12-25
2 // Created by: Varvara POSKONINA
3 // Copyright (c) 1999-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 #include <Graphic3d_BvhCStructureSet.hxx>
17
18 #include <BVH_BinnedBuilder.hxx>
19 #include <Graphic3d_CStructure.hxx>
20
21 IMPLEMENT_STANDARD_RTTIEXT(Graphic3d_BvhCStructureSet, BVH_PrimitiveSet3d)
22
23 // =======================================================================
24 // function : Graphic3d_BvhCStructureSet
25 // purpose  :
26 // =======================================================================
27 Graphic3d_BvhCStructureSet::Graphic3d_BvhCStructureSet()
28 {
29   myBuilder = new BVH_BinnedBuilder<Standard_Real, 3> (BVH_Constants_LeafNodeSizeSingle, BVH_Constants_MaxTreeDepth);
30 }
31
32 // =======================================================================
33 // function : Size
34 // purpose  :
35 // =======================================================================
36 Standard_Integer Graphic3d_BvhCStructureSet::Size() const
37 {
38   return myStructs.Size();
39 }
40
41 // =======================================================================
42 // function : Box
43 // purpose  :
44 // =======================================================================
45 Graphic3d_BndBox3d Graphic3d_BvhCStructureSet::Box (const Standard_Integer theIdx) const
46 {
47   return myStructs.FindKey (theIdx + 1)->BoundingBox();
48 }
49
50 // =======================================================================
51 // function : Center
52 // purpose  :
53 // =======================================================================
54 Standard_Real Graphic3d_BvhCStructureSet::Center (const Standard_Integer theIdx,
55                                                   const Standard_Integer theAxis) const
56 {
57   Graphic3d_BndBox3d aBndBox = myStructs.FindKey (theIdx + 1)->BoundingBox();
58
59   const Standard_Real aMin = aBndBox.CornerMin()[theAxis];
60   const Standard_Real aMax = aBndBox.CornerMax()[theAxis];
61   const Standard_Real aCenter = (aMin + aMax) * 0.5;
62   return aCenter;
63 }
64
65 // =======================================================================
66 // function : Swap
67 // purpose  :
68 // =======================================================================
69 void Graphic3d_BvhCStructureSet::Swap (const Standard_Integer theIdx1,
70                                        const Standard_Integer theIdx2)
71 {
72   myStructs.Swap (theIdx1 + 1, theIdx2 + 1);
73 }
74
75 // =======================================================================
76 // function : Add
77 // purpose  :
78 // =======================================================================
79 Standard_Boolean Graphic3d_BvhCStructureSet::Add (const Graphic3d_CStructure* theStruct)
80 {
81   const Standard_Integer aSize = myStructs.Size();
82
83   if (myStructs.Add (theStruct) > aSize) // new structure?
84   {
85     MarkDirty();
86
87     return Standard_True;
88   }
89
90   return Standard_False;
91 }
92
93 // =======================================================================
94 // function : Remove
95 // purpose  :
96 // =======================================================================
97 Standard_Boolean Graphic3d_BvhCStructureSet::Remove (const Graphic3d_CStructure* theStruct)
98 {
99   const Standard_Integer anIndex = myStructs.FindIndex (theStruct);
100
101   if (anIndex != 0)
102   {
103     myStructs.Swap (Size(), anIndex);
104     myStructs.RemoveLast();
105     MarkDirty();
106
107     return Standard_True;
108   }
109
110   return Standard_False;
111 }
112
113 // =======================================================================
114 // function : Clear
115 // purpose  :
116 // =======================================================================
117 void Graphic3d_BvhCStructureSet::Clear()
118 {
119   myStructs.Clear();
120   MarkDirty();
121 }
122
123 // =======================================================================
124 // function : GetStructureById
125 // purpose  :
126 // =======================================================================
127 const Graphic3d_CStructure* Graphic3d_BvhCStructureSet::GetStructureById (Standard_Integer theId)
128 {
129   return myStructs.FindKey (theId + 1);
130 }