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