0024428: Implementation of LGPL license
[occt.git] / src / OpenGl / OpenGl_Structure.hxx
1 // Created on: 2011-08-01
2 // Created by: Sergey ZERCHANINOV
3 // Copyright (c) 2011-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
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 #ifndef OpenGl_Structure_Header
17 #define OpenGl_Structure_Header
18
19 #include <NCollection_List.hxx>
20 #include <InterfaceGraphic_Graphic3d.hxx>
21
22 #include <OpenGl_AspectLine.hxx>
23 #include <OpenGl_AspectFace.hxx>
24 #include <OpenGl_AspectMarker.hxx>
25 #include <OpenGl_AspectText.hxx>
26
27 #include <OpenGl_Group.hxx>
28 #include <OpenGl_Matrix.hxx>
29 #include <OpenGl_NamedStatus.hxx>
30
31 #include <Graphic3d_SequenceOfHClipPlane.hxx>
32
33 class OpenGl_Structure;
34
35 typedef NCollection_List<const OpenGl_Structure* > OpenGl_ListOfStructure;
36
37 class OpenGl_Structure : public OpenGl_Element
38 {
39   friend class OpenGl_Group;
40
41 public:
42
43   OpenGl_Structure();
44
45   void SetTransformation (const float *AMatrix);
46
47   void SetTransformPersistence (const CALL_DEF_TRANSFORM_PERSISTENCE &ATransPers);
48
49   void SetAspectLine   (const CALL_DEF_CONTEXTLINE &theAspect);
50   void SetAspectFace   (const CALL_DEF_CONTEXTFILLAREA& theAspect);
51   void SetAspectMarker (const CALL_DEF_CONTEXTMARKER& theAspect);
52   void SetAspectText   (const CALL_DEF_CONTEXTTEXT &theAspect);
53
54   void SetHighlightBox (const Handle(OpenGl_Context)& theGlCtx,
55                         const CALL_DEF_BOUNDBOX& theBoundBox);
56
57   void ClearHighlightBox (const Handle(OpenGl_Context)& theGlCtx);
58
59   void SetHighlightColor (const Handle(OpenGl_Context)& theGlCtx,
60                           const Standard_ShortReal R,
61                           const Standard_ShortReal G,
62                           const Standard_ShortReal B);
63
64   void ClearHighlightColor (const Handle(OpenGl_Context)& theGlCtx);
65
66   void SetNamedStatus (const Standard_Integer aStatus);
67
68   Standard_Boolean IsVisible() const { return !(myNamedStatus & OPENGL_NS_HIDE); }
69
70   void SetClipPlanes (const Graphic3d_SequenceOfHClipPlane& thePlanes) { myClipPlanes = thePlanes; }
71
72   void Connect (const OpenGl_Structure *astructure);
73   void Disconnect (const OpenGl_Structure *astructure);
74
75   OpenGl_Group* AddGroup();
76   void RemoveGroup (const Handle(OpenGl_Context)& theGlCtx,
77                     const OpenGl_Group*           theGroup);
78   void Clear (const Handle(OpenGl_Context)& theGlCtx);
79
80   //! Set z layer ID to display the structure in specified layer
81   void SetZLayer (const Standard_Integer theLayerIndex);
82
83   //! Get z layer ID
84   Standard_Integer GetZLayer () const;
85
86   virtual void Render  (const Handle(OpenGl_Workspace)& theWorkspace) const;
87   virtual void Release (const Handle(OpenGl_Context)&   theGlCtx);
88
89   //! This method releases GL resources without actual elements destruction.
90   //! As result structure could be correctly destroyed layer without GL context
91   //! (after last window was closed for example).
92   //!
93   //! Notice however that reusage of this structure after calling this method is incorrect
94   //! and will lead to broken visualization due to loosed data.
95   void ReleaseGlResources (const Handle(OpenGl_Context)& theGlCtx);
96
97   //! Returns list of OpenGL groups.
98   const OpenGl_ListOfGroup& Groups() const { return myGroups; }
99
100   //! Returns list of connected OpenGL structures.
101   const OpenGl_ListOfStructure& ConnectedStructures() const { return myConnected; }
102
103   //! Returns OpenGL face aspect.
104   const OpenGl_AspectFace* AspectFace() const { return myAspectFace; }
105
106   //! Returns OpenGL transformation matrix.
107   const OpenGl_Matrix* Transformation() const { return myTransformation; }
108   
109   //! Returns OpenGL persistent translation.
110   const TEL_TRANSFORM_PERSISTENCE* PersistentTranslation() const { return myTransPers; }
111
112 #ifdef HAVE_OPENCL
113
114   //! Returns structure modification state (for ray-tracing).
115   Standard_Size ModificationState() const { return myModificationState; }
116
117   //! Resets structure modification state (for ray-tracing)
118   void ResetModificationState() const { myModificationState = 0; }
119
120   //! Is the structure ray-tracable (contains ray-tracable elements)?
121   Standard_Boolean IsRaytracable() const { return myIsRaytracable; }
122
123 #endif
124
125 protected:
126
127   virtual ~OpenGl_Structure();
128
129 #ifdef HAVE_OPENCL
130
131   //! Registers ancestor connected structure (for updating ray-tracing state).
132   void RegisterAncestorStructure (const OpenGl_Structure* theStructure) const;
133
134   //! Unregisters ancestor connected structure (for updating ray-tracing state).
135   void UnregisterAncestorStructure (const OpenGl_Structure* theStructure) const;
136
137   //! Unregisters structure from ancestor structure (for updating ray-tracing state).
138   void UnregisterFromAncestorStructure() const;
139
140   //! Updates modification state for structure and its parents.
141   void UpdateStateWithAncestorStructures() const;
142
143   //! Updates ray-tracable status for structure and its parents.
144   void UpdateRaytracableWithAncestorStructures() const;
145
146   //! Sets ray-tracable status for structure and its parents.
147   void SetRaytracableWithAncestorStructures() const;
148
149 #endif
150
151 protected:
152
153   //Structure_LABBegin
154   OpenGl_Matrix*             myTransformation;
155   TEL_TRANSFORM_PERSISTENCE* myTransPers;
156   OpenGl_AspectLine*         myAspectLine;
157   OpenGl_AspectFace*         myAspectFace;
158   OpenGl_AspectMarker*       myAspectMarker;
159   OpenGl_AspectText*         myAspectText;
160   //Structure_LABHighlight
161   OpenGl_Group*              myHighlightBox;
162   TEL_COLOUR*                myHighlightColor;
163   //Structure_LABVisibility
164   //Structure_LABPick
165   int                        myNamedStatus; //Structure_LABNameSet
166   int                        myZLayer;
167
168   OpenGl_ListOfStructure           myConnected;
169   OpenGl_ListOfGroup               myGroups;
170   Graphic3d_SequenceOfHClipPlane   myClipPlanes;
171
172 #ifdef HAVE_OPENCL
173   mutable OpenGl_ListOfStructure   myAncestorStructures;
174   mutable Standard_Boolean         myIsRaytracable;
175   mutable Standard_Size            myModificationState;
176 #endif
177
178 public:
179
180   DEFINE_STANDARD_ALLOC
181
182 };
183
184 #endif //OpenGl_Structure_Header