0027816: Visualization - provide an API for overriding clipping planes list
[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_AspectFace.hxx>
22 #include <OpenGl_CappingAlgo.hxx>
23 #include <OpenGl_FrameBuffer.hxx>
24 #include <OpenGl_Matrix.hxx>
25 #include <OpenGl_NamedStatus.hxx>
26 #include <OpenGl_RenderFilter.hxx>
27 #include <OpenGl_ShaderObject.hxx>
28 #include <OpenGl_ShaderProgram.hxx>
29 #include <OpenGl_TextParam.hxx>
30 #include <OpenGl_TextureBufferArb.hxx>
31 #include <OpenGl_Vec.hxx>
32 #include <OpenGl_Window.hxx>
33
34 class OpenGl_View;
35 class Image_PixMap;
36
37 //! OpenGL material definition
38 struct OpenGl_Material
39 {
40
41   OpenGl_Vec4 Ambient;  //!< ambient reflection coefficient
42   OpenGl_Vec4 Diffuse;  //!< diffuse reflection coefficient
43   OpenGl_Vec4 Specular; //!< glossy  reflection coefficient
44   OpenGl_Vec4 Emission; //!< material emission
45   OpenGl_Vec4 Params;   //!< extra packed parameters
46
47   Standard_ShortReal  Shine()              const { return Params.x(); }
48   Standard_ShortReal& ChangeShine()              { return Params.x(); }
49
50   Standard_ShortReal  Transparency()       const { return Params.y(); }
51   Standard_ShortReal& ChangeTransparency()       { return Params.y(); }
52
53   //! Set material color.
54   void SetColor (const OpenGl_Vec4& theColor)
55   {
56     // apply the same formula as in Graphic3d_MaterialAspect::SetColor()
57     Ambient.xyz() = theColor.rgb() * 0.25f;
58     Diffuse.xyz() = theColor.rgb();
59   }
60
61   //! Initialize material
62   void Init (const Graphic3d_MaterialAspect& theProp,
63              const Quantity_Color&           theInteriorColor);
64
65   //! Returns packed (serialized) representation of material properties
66   const OpenGl_Vec4* Packed() const { return reinterpret_cast<const OpenGl_Vec4*> (this); }
67   static Standard_Integer NbOfVec4() { return 5; }
68
69 };
70
71 class OpenGl_RaytraceFilter;
72 DEFINE_STANDARD_HANDLE (OpenGl_RaytraceFilter, OpenGl_RenderFilter)
73
74 //! Graphical ray-tracing filter.
75 //! Filters out all raytracable structures.
76 class OpenGl_RaytraceFilter : public OpenGl_RenderFilter
77 {
78 public:
79
80   //! Default constructor.
81   OpenGl_RaytraceFilter() {}
82
83   //! Returns the previously set filter.
84   const Handle(OpenGl_RenderFilter)& PrevRenderFilter()
85   {
86     return myPrevRenderFilter;
87   }
88
89   //! Remembers the previously set filter.
90   void SetPrevRenderFilter (const Handle(OpenGl_RenderFilter)& theFilter)
91   {
92     myPrevRenderFilter = theFilter;
93   }
94
95   //! Checks whether the element can be rendered or not.
96   //! @param theElement [in] the element to check.
97   //! @return True if element can be rendered.
98   virtual Standard_Boolean CanRender (const OpenGl_Element* theElement) Standard_OVERRIDE;
99
100 private:
101
102   Handle(OpenGl_RenderFilter) myPrevRenderFilter;
103
104 public:
105
106   DEFINE_STANDARD_RTTIEXT(OpenGl_RaytraceFilter,OpenGl_RenderFilter)
107 };
108
109 class OpenGl_Workspace;
110 DEFINE_STANDARD_HANDLE(OpenGl_Workspace,Standard_Transient)
111
112 //! Rendering workspace.
113 //! Provides methods to render primitives and maintain GL state.
114 class OpenGl_Workspace : public Standard_Transient
115 {
116 public:
117
118   //! Constructor of rendering workspace.
119   Standard_EXPORT OpenGl_Workspace (OpenGl_View* theView, const Handle(OpenGl_Window)& theWindow);
120
121   //! Destructor
122   virtual ~OpenGl_Workspace() {}
123
124   //! Activate rendering context.
125   Standard_EXPORT Standard_Boolean Activate();
126
127   OpenGl_View* View() const { return myView; }
128
129   const Handle(OpenGl_Context)& GetGlContext() { return myGlContext; }
130
131   Standard_EXPORT Handle(OpenGl_FrameBuffer) FBOCreate (const Standard_Integer theWidth, const Standard_Integer theHeight);
132
133   Standard_EXPORT void FBORelease (Handle(OpenGl_FrameBuffer)& theFbo);
134
135   Standard_Boolean BufferDump (const Handle(OpenGl_FrameBuffer)& theFbo,
136                                Image_PixMap&                     theImage,
137                                const Graphic3d_BufferType&       theBufferType);
138
139   Standard_EXPORT Standard_Integer Width()  const;
140
141   Standard_EXPORT Standard_Integer Height() const;
142
143   //! Setup Z-buffer usage flag (without affecting GL state!).
144   //! Returns previously set flag.
145   Standard_Boolean SetUseZBuffer (const Standard_Boolean theToUse)
146   {
147     const Standard_Boolean wasUsed = myUseZBuffer;
148     myUseZBuffer = theToUse;
149     return wasUsed;
150   }
151
152   //! @return true if usage of Z buffer is enabled.
153   Standard_Boolean& UseZBuffer() { return myUseZBuffer; }
154
155   //! @return true if depth writing is enabled.
156   Standard_Boolean& UseDepthWrite() { return myUseDepthWrite; }
157
158   //! @return true if usage of GL light is enabled.
159   Standard_EXPORT Standard_Boolean  UseGLLight() const;
160
161   //! @return true if clipping algorithm enabled
162   Standard_EXPORT Standard_Boolean IsCullingEnabled() const;
163
164   Standard_Integer NamedStatus;
165
166   //// RELATED TO STATUS ////
167
168   const OpenGl_Vec4* HighlightColor;
169
170   //! Return true if active group might activate face culling (e.g. primitives are closed).
171   bool ToAllowFaceCulling() const { return myToAllowFaceCulling; }
172
173   //! Allow or disallow face culling.
174   //! This call does NOT affect current state of back face culling;
175   //! ApplyAspectFace() should be called to update state.
176   void SetAllowFaceCulling (bool theToAllow) { myToAllowFaceCulling = theToAllow; }
177
178   //! Return true if following structures should apply highlight color.
179   bool ToHighlight() const { return myToHighlight; }
180
181   //! Set highlight.
182   void SetHighlight (bool theToHighlight) { myToHighlight = theToHighlight; }
183
184   //! Return line color taking into account highlight flag.
185   const OpenGl_Vec4& LineColor() const
186   {
187     return myToHighlight
188          ? *HighlightColor
189          : myAspectLineSet->Aspect()->ColorRGBA();
190   }
191
192   //! Return edge color taking into account highlight flag.
193   const OpenGl_Vec4& EdgeColor() const
194   {
195     return myToHighlight
196          ? *HighlightColor
197          : myAspectFaceSet->AspectEdge()->Aspect()->ColorRGBA();
198   }
199
200   //! Return marker color taking into account highlight flag.
201   const OpenGl_Vec4& MarkerColor() const
202   {
203     return myToHighlight
204          ? *HighlightColor
205          : myAspectMarkerSet->Aspect()->ColorRGBA();
206   }
207
208   //! Return Interior color taking into account highlight flag.
209   const OpenGl_Vec4& InteriorColor() const
210   {
211     return myToHighlight
212          ? *HighlightColor
213          : myAspectFaceSet->Aspect()->InteriorColorRGBA();
214   }
215
216   //! Return text color taking into account highlight flag.
217   const OpenGl_Vec4& TextColor() const
218   {
219     return myToHighlight
220          ? *HighlightColor
221          : myAspectTextSet->Aspect()->ColorRGBA();
222   }
223
224   //! Return text Subtitle color taking into account highlight flag.
225   const OpenGl_Vec4& TextSubtitleColor() const
226   {
227     return myToHighlight
228          ? *HighlightColor
229          : myAspectTextSet->Aspect()->ColorSubTitleRGBA();
230   }
231
232   //! Currently set line aspect (can differ from applied).
233   const OpenGl_AspectLine*   AspectLine()   const { return myAspectLineSet; }
234
235   //! Currently set face aspect (can differ from applied).
236   const OpenGl_AspectFace*   AspectFace()   const { return myAspectFaceSet; }
237
238   //! Currently set marker aspect (can differ from applied).
239   const OpenGl_AspectMarker* AspectMarker() const { return myAspectMarkerSet; }
240
241   //! Currently set text aspect (can differ from applied).
242   const OpenGl_AspectText*   AspectText()   const { return myAspectTextSet; }
243
244   //! Assign new line aspect (will be applied within ApplyAspectLine()).
245   Standard_EXPORT const OpenGl_AspectLine*   SetAspectLine   (const OpenGl_AspectLine*   theAspect);
246
247   //! Assign new face aspect (will be applied within ApplyAspectFace()).
248   Standard_EXPORT const OpenGl_AspectFace*   SetAspectFace   (const OpenGl_AspectFace*   theAspect);
249
250   //! Assign new marker aspect (will be applied within ApplyAspectMarker()).
251   Standard_EXPORT const OpenGl_AspectMarker* SetAspectMarker (const OpenGl_AspectMarker* theAspect);
252
253   //! Assign new text aspect (will be applied within ApplyAspectText()).
254   Standard_EXPORT const OpenGl_AspectText*   SetAspectText   (const OpenGl_AspectText*   theAspect);
255
256   //! Apply line aspect.
257   //! @return aspect set by SetAspectLine()
258   const OpenGl_AspectLine* ApplyAspectLine() { return myAspectLineSet; }
259
260   //! Apply face aspect.
261   //! @return aspect set by SetAspectFace()
262   Standard_EXPORT const OpenGl_AspectFace*   ApplyAspectFace();
263
264   //! Apply marker aspect.
265   //! @return aspect set by SetAspectMarker()
266   Standard_EXPORT const OpenGl_AspectMarker* ApplyAspectMarker();
267
268   //! Apply text aspect.
269   //! @return aspect set by SetAspectText()
270   const OpenGl_AspectText* ApplyAspectText() { return myAspectTextSet; }
271
272   //! Clear the applied aspect state to default values.
273   void ResetAppliedAspect();
274
275   Standard_EXPORT Handle(OpenGl_Texture) DisableTexture();
276   Standard_EXPORT Handle(OpenGl_Texture) EnableTexture (const Handle(OpenGl_Texture)&          theTexture,
277                                                         const Handle(Graphic3d_TextureParams)& theParams = NULL);
278   const Handle(OpenGl_Texture)& ActiveTexture() const { return myTextureBound; }
279
280   //! Set filter for restricting rendering of particular elements.
281   //! Filter can be applied for rendering passes used by recursive
282   //! rendering algorithms for rendering elements of groups.
283   //! @param theFilter [in] the filter instance.
284   inline void SetRenderFilter (const Handle(OpenGl_RenderFilter)& theFilter)
285   {
286     myRenderFilter = theFilter;
287   }
288
289   //! Get rendering filter.
290   //! @return filter instance.
291   inline const Handle(OpenGl_RenderFilter)& GetRenderFilter() const
292   {
293     return myRenderFilter;
294   }
295
296   //! @return applied view matrix.
297   inline const OpenGl_Matrix* ViewMatrix() const { return ViewMatrix_applied; }
298
299   //! @return applied model structure matrix.
300   inline const OpenGl_Matrix* ModelMatrix() const { return StructureMatrix_applied; }
301
302   //! Sets and applies current polygon offset.
303   void SetPolygonOffset (const Graphic3d_PolygonOffset& theParams);
304
305   //! Returns currently applied polygon offset parameters.
306   const Graphic3d_PolygonOffset& AppliedPolygonOffset() { return myPolygonOffsetApplied; }
307
308   //! Returns capping algorithm rendering filter.
309   const Handle(OpenGl_CappingAlgoFilter)& DefaultCappingAlgoFilter() const
310   {
311     return myDefaultCappingAlgoFilter;
312   }
313
314   //! Returns face aspect for none culling mode.
315   const OpenGl_AspectFace& NoneCulling() const
316   {
317     return myNoneCulling;
318   }
319
320   //! Returns face aspect for front face culling mode.
321   const OpenGl_AspectFace& FrontCulling() const
322   {
323     return myFrontCulling;
324   }
325
326   //! Sets a new environment texture.
327   void SetEnvironmentTexture (const Handle(OpenGl_Texture)& theTexture)
328   {
329     myEnvironmentTexture = theTexture;
330   }
331
332   //! Returns environment texture.
333   const Handle(OpenGl_Texture)& EnvironmentTexture() const
334   {
335     return myEnvironmentTexture;
336   }
337
338 protected:
339
340   enum
341   {
342     TEL_FRONT_MATERIAL = 1,
343     TEL_BACK_MATERIAL  = 2
344   };
345
346   void updateMaterial (const int theFlag);
347
348   void setTextureParams (Handle(OpenGl_Texture)&                theTexture,
349                          const Handle(Graphic3d_TextureParams)& theParams);
350
351 protected: //! @name protected fields
352
353   OpenGl_View*                     myView;
354   Handle(OpenGl_Window)            myWindow;
355   Handle(OpenGl_Context)           myGlContext;
356   Standard_Boolean                 myUseZBuffer;
357   Standard_Boolean                 myUseDepthWrite;
358   Standard_Boolean                 myUseGLLight;
359   Handle(OpenGl_CappingAlgoFilter) myDefaultCappingAlgoFilter;
360   OpenGl_AspectFace                myNoneCulling;
361   OpenGl_AspectFace                myFrontCulling;
362
363 protected: //! @name fields related to status
364
365   Handle(OpenGl_RenderFilter) myRenderFilter;
366   Handle(OpenGl_Texture) myTextureBound;    //!< currently bound texture (managed by OpenGl_AspectFace and OpenGl_View environment texture)
367   const OpenGl_AspectLine*   myAspectLineSet;
368   const OpenGl_AspectFace*   myAspectFaceSet;
369   Handle(Graphic3d_AspectFillArea3d) myAspectFaceApplied;
370   const OpenGl_AspectMarker* myAspectMarkerSet;
371   Handle(Graphic3d_AspectMarker3d) myAspectMarkerApplied;
372   const OpenGl_AspectText*   myAspectTextSet;
373   bool                       myAspectFaceAppliedWithHL;
374
375   const OpenGl_Matrix* ViewMatrix_applied;
376   const OpenGl_Matrix* StructureMatrix_applied;
377
378   OpenGl_Material myMatFront;    //!< current front material state (cached to reduce GL context updates)
379   OpenGl_Material myMatBack;     //!< current back  material state
380   OpenGl_Material myMatTmp;      //!< temporary variable
381   bool            myToAllowFaceCulling; //!< allow back face culling
382   bool            myToHighlight; //!< flag indicating highlighting mode
383
384   OpenGl_Matrix myModelViewMatrix; //!< Model matrix with applied structure transformations
385
386   Graphic3d_PolygonOffset myPolygonOffsetApplied; //!< currently applied polygon offset
387
388   OpenGl_AspectFace myAspectFaceHl; //!< Hiddenline aspect
389
390   Handle(OpenGl_Texture) myEnvironmentTexture;
391
392 public: //! @name type definition
393
394   DEFINE_STANDARD_RTTIEXT(OpenGl_Workspace,Standard_Transient)
395   DEFINE_STANDARD_ALLOC
396
397 };
398
399 #endif // _OpenGl_Workspace_Header