0029570: Visualization, Graphic3d_Aspect - merge Graphic3d_Group aspects
[occt.git] / src / OpenGl / OpenGl_Workspace.hxx
1 // Created on: 2011-09-20
2 // Created by: Sergey ZERCHANINOV
3 // Copyright (c) 2011-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 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 _OpenGl_Workspace_Header
17 #define _OpenGl_Workspace_Header
18
19 #include <Graphic3d_BufferType.hxx>
20
21 #include <OpenGl_Aspects.hxx>
22 #include <OpenGl_CappingAlgo.hxx>
23 #include <OpenGl_FrameBuffer.hxx>
24 #include <OpenGl_Material.hxx>
25 #include <OpenGl_Matrix.hxx>
26 #include <OpenGl_ShaderObject.hxx>
27 #include <OpenGl_ShaderProgram.hxx>
28 #include <OpenGl_TextParam.hxx>
29 #include <OpenGl_TextureBufferArb.hxx>
30 #include <OpenGl_RenderFilter.hxx>
31 #include <OpenGl_Vec.hxx>
32 #include <OpenGl_Window.hxx>
33
34 class OpenGl_View;
35 class Image_PixMap;
36
37 class OpenGl_Workspace;
38 DEFINE_STANDARD_HANDLE(OpenGl_Workspace,Standard_Transient)
39
40 //! Rendering workspace.
41 //! Provides methods to render primitives and maintain GL state.
42 class OpenGl_Workspace : public Standard_Transient
43 {
44 public:
45
46   //! Constructor of rendering workspace.
47   Standard_EXPORT OpenGl_Workspace (OpenGl_View* theView, const Handle(OpenGl_Window)& theWindow);
48
49   //! Destructor
50   virtual ~OpenGl_Workspace() {}
51
52   //! Activate rendering context.
53   Standard_EXPORT Standard_Boolean Activate();
54
55   OpenGl_View* View() const { return myView; }
56
57   const Handle(OpenGl_Context)& GetGlContext() { return myGlContext; }
58
59   Standard_EXPORT Handle(OpenGl_FrameBuffer) FBOCreate (const Standard_Integer theWidth, const Standard_Integer theHeight);
60
61   Standard_EXPORT void FBORelease (Handle(OpenGl_FrameBuffer)& theFbo);
62
63   Standard_Boolean BufferDump (const Handle(OpenGl_FrameBuffer)& theFbo,
64                                Image_PixMap&                     theImage,
65                                const Graphic3d_BufferType&       theBufferType);
66
67   Standard_EXPORT Standard_Integer Width()  const;
68
69   Standard_EXPORT Standard_Integer Height() const;
70
71   //! Setup Z-buffer usage flag (without affecting GL state!).
72   //! Returns previously set flag.
73   Standard_Boolean SetUseZBuffer (const Standard_Boolean theToUse)
74   {
75     const Standard_Boolean wasUsed = myUseZBuffer;
76     myUseZBuffer = theToUse;
77     return wasUsed;
78   }
79
80   //! @return true if usage of Z buffer is enabled.
81   Standard_Boolean& UseZBuffer() { return myUseZBuffer; }
82
83   //! @return true if depth writing is enabled.
84   Standard_Boolean& UseDepthWrite() { return myUseDepthWrite; }
85
86   //! Configure default polygon offset parameters.
87   //! Return previous settings.
88   Standard_EXPORT Graphic3d_PolygonOffset SetDefaultPolygonOffset (const Graphic3d_PolygonOffset& theOffset);
89
90   //// RELATED TO STATUS ////
91
92   //! Return true if active group might activate face culling (e.g. primitives are closed).
93   bool ToAllowFaceCulling() const { return myToAllowFaceCulling; }
94
95   //! Allow or disallow face culling.
96   //! This call does NOT affect current state of back face culling;
97   //! ApplyAspectFace() should be called to update state.
98   bool SetAllowFaceCulling (bool theToAllow)
99   {
100     const bool wasAllowed = myToAllowFaceCulling;
101     myToAllowFaceCulling = theToAllow;
102     return wasAllowed;
103   }
104
105   //! Return true if following structures should apply highlight color.
106   bool ToHighlight() const { return !myHighlightStyle.IsNull(); }
107
108   //! Return highlight style.
109   const Handle(Graphic3d_PresentationAttributes)& HighlightStyle() const { return myHighlightStyle; }
110
111   //! Set highlight style.
112   void SetHighlightStyle (const Handle(Graphic3d_PresentationAttributes)& theStyle) {  myHighlightStyle = theStyle; }
113
114   //! Return edge color taking into account highlight flag.
115   const OpenGl_Vec4& EdgeColor() const
116   {
117     return !myHighlightStyle.IsNull()
118          ?  myHighlightStyle->ColorRGBA()
119          :  myAspectsSet->Aspect()->EdgeColorRGBA();
120   }
121
122   //! Return Interior color taking into account highlight flag.
123   const OpenGl_Vec4& InteriorColor() const
124   {
125     return !myHighlightStyle.IsNull()
126          ?  myHighlightStyle->ColorRGBA()
127          :  myAspectsSet->Aspect()->InteriorColorRGBA();
128   }
129
130   //! Return text color taking into account highlight flag.
131   const OpenGl_Vec4& TextColor() const
132   {
133     return !myHighlightStyle.IsNull()
134          ?  myHighlightStyle->ColorRGBA()
135          :  myAspectsSet->Aspect()->ColorRGBA();
136   }
137
138   //! Return text Subtitle color taking into account highlight flag.
139   const OpenGl_Vec4& TextSubtitleColor() const
140   {
141     return !myHighlightStyle.IsNull()
142          ?  myHighlightStyle->ColorRGBA()
143          :  myAspectsSet->Aspect()->ColorSubTitleRGBA();
144   }
145
146   //! Currently set aspects (can differ from applied).
147   const OpenGl_Aspects* Aspects() const { return myAspectsSet; }
148
149   //! Assign new aspects (will be applied within ApplyAspects()).
150   Standard_EXPORT const OpenGl_Aspects* SetAspects (const OpenGl_Aspects* theAspect);
151
152   //! Apply aspects.
153   //! @return aspect set by SetAspects()
154   Standard_EXPORT const OpenGl_Aspects* ApplyAspects();
155
156   //! Clear the applied aspect state to default values.
157   void ResetAppliedAspect();
158
159   //! Get rendering filter.
160   //! @sa ShouldRender()
161   Standard_Integer RenderFilter() const { return myRenderFilter; }
162
163   //! Set filter for restricting rendering of particular elements.
164   //! @sa ShouldRender()
165   void SetRenderFilter (Standard_Integer theFilter) { myRenderFilter = theFilter; }
166
167   //! Checks whether the element can be rendered or not.
168   //! @param theElement [in] the element to check
169   //! @return True if element can be rendered
170   bool ShouldRender (const OpenGl_Element* theElement);
171
172   //! Return the number of skipped transparent elements within active OpenGl_RenderFilter_OpaqueOnly filter.
173   //! @sa OpenGl_LayerList::Render()
174   Standard_Integer NbSkippedTransparentElements() { return myNbSkippedTranspElems; }
175
176   //! Reset skipped transparent elements counter.
177   //! @sa OpenGl_LayerList::Render()
178   void ResetSkippedCounter() { myNbSkippedTranspElems = 0; }
179
180   //! @return applied view matrix.
181   inline const OpenGl_Matrix* ViewMatrix() const { return ViewMatrix_applied; }
182
183   //! @return applied model structure matrix.
184   inline const OpenGl_Matrix* ModelMatrix() const { return StructureMatrix_applied; }
185
186   //! Returns face aspect for none culling mode.
187   const OpenGl_Aspects& NoneCulling() const { return myNoneCulling; }
188
189   //! Returns face aspect for front face culling mode.
190   const OpenGl_Aspects& FrontCulling() const { return myFrontCulling; }
191
192   //! Sets a new environment texture.
193   void SetEnvironmentTexture (const Handle(OpenGl_TextureSet)& theTexture) { myEnvironmentTexture = theTexture; }
194
195   //! Returns environment texture.
196   const Handle(OpenGl_TextureSet)& EnvironmentTexture() const { return myEnvironmentTexture; }
197
198 protected: //! @name protected fields
199
200   OpenGl_View*           myView;
201   Handle(OpenGl_Window)  myWindow;
202   Handle(OpenGl_Context) myGlContext;
203   Standard_Boolean       myUseZBuffer;
204   Standard_Boolean       myUseDepthWrite;
205   OpenGl_Aspects         myNoneCulling;
206   OpenGl_Aspects         myFrontCulling;
207
208 protected: //! @name fields related to status
209
210   Standard_Integer myNbSkippedTranspElems; //!< counter of skipped transparent elements for OpenGl_LayerList two rendering passes method
211   Standard_Integer myRenderFilter;         //!< active filter for skipping rendering of elements by some criteria (multiple render passes)
212
213   OpenGl_Aspects   myDefaultAspects;
214   const OpenGl_Aspects*      myAspectsSet;
215   Handle(Graphic3d_Aspects)  myAspectsApplied;
216
217   Handle(Graphic3d_PresentationAttributes) myAspectFaceAppliedWithHL;
218
219   const OpenGl_Matrix* ViewMatrix_applied;
220   const OpenGl_Matrix* StructureMatrix_applied;
221
222   bool            myToAllowFaceCulling; //!< allow back face culling
223   Handle(Graphic3d_PresentationAttributes) myHighlightStyle; //!< active highlight style
224
225   OpenGl_Matrix myModelViewMatrix; //!< Model matrix with applied structure transformations
226
227   OpenGl_Aspects myAspectFaceHl; //!< Hiddenline aspect
228
229   Handle(OpenGl_TextureSet) myEnvironmentTexture;
230
231 public: //! @name type definition
232
233   DEFINE_STANDARD_RTTIEXT(OpenGl_Workspace,Standard_Transient)
234   DEFINE_STANDARD_ALLOC
235
236 };
237
238 #endif // _OpenGl_Workspace_Header