Commit | Line | Data |
---|---|---|
b311480e | 1 | // Created on: 2011-09-20 |
2 | // Created by: Sergey ZERCHANINOV | |
1981cb22 | 3 | // Copyright (c) 2011-2013 OPEN CASCADE SAS |
b311480e | 4 | // |
973c2be1 | 5 | // This file is part of Open CASCADE Technology software library. |
b311480e | 6 | // |
d5f74e42 | 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 | |
973c2be1 | 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. | |
b311480e | 12 | // |
973c2be1 | 13 | // Alternatively, this file may be used under the terms of Open CASCADE |
14 | // commercial license or contractual agreement. | |
b311480e | 15 | |
2166f0fa SK |
16 | #ifndef _OpenGl_Workspace_Header |
17 | #define _OpenGl_Workspace_Header | |
18 | ||
bf75be98 | 19 | #include <Graphic3d_BufferType.hxx> |
2166f0fa | 20 | |
bf75be98 | 21 | #include <OpenGl_AspectFace.hxx> |
c357e426 | 22 | #include <OpenGl_CappingAlgo.hxx> |
fc73a202 | 23 | #include <OpenGl_FrameBuffer.hxx> |
2166f0fa SK |
24 | #include <OpenGl_Matrix.hxx> |
25 | #include <OpenGl_NamedStatus.hxx> | |
4269bd1b | 26 | #include <OpenGl_RenderFilter.hxx> |
fc73a202 | 27 | #include <OpenGl_ShaderObject.hxx> |
28 | #include <OpenGl_ShaderProgram.hxx> | |
c357e426 | 29 | #include <OpenGl_TextParam.hxx> |
fc73a202 | 30 | #include <OpenGl_TextureBufferArb.hxx> |
c357e426 | 31 | #include <OpenGl_Vec.hxx> |
32 | #include <OpenGl_Window.hxx> | |
fc73a202 | 33 | |
5b111128 | 34 | class OpenGl_View; |
692613e5 | 35 | class Image_PixMap; |
2166f0fa | 36 | |
0adbd30f | 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 | ||
f9ba5c4d | 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 | ||
0adbd30f | 61 | //! Initialize material |
b6472664 | 62 | void Init (const Graphic3d_MaterialAspect& theProp, |
63 | const Quantity_Color& theInteriorColor); | |
0adbd30f | 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 | ||
c04c30b3 | 71 | class OpenGl_RaytraceFilter; |
a89742cf | 72 | DEFINE_STANDARD_HANDLE (OpenGl_RaytraceFilter, OpenGl_RenderFilter) |
73 | ||
25ef750e | 74 | //! Graphical ray-tracing filter. |
a89742cf | 75 | //! Filters out all raytracable structures. |
76 | class OpenGl_RaytraceFilter : public OpenGl_RenderFilter | |
77 | { | |
78 | public: | |
79 | ||
80 | //! Default constructor. | |
81 | OpenGl_RaytraceFilter() {} | |
82 | ||
91c60b57 | 83 | //! Returns the previously set filter. |
84 | const Handle(OpenGl_RenderFilter)& PrevRenderFilter() | |
85 | { | |
86 | return myPrevRenderFilter; | |
87 | } | |
88 | ||
a89742cf | 89 | //! Remembers the previously set filter. |
91c60b57 | 90 | void SetPrevRenderFilter (const Handle(OpenGl_RenderFilter)& theFilter) |
a89742cf | 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. | |
79104795 | 98 | virtual Standard_Boolean CanRender (const OpenGl_Element* theElement) Standard_OVERRIDE; |
a89742cf | 99 | |
100 | private: | |
101 | ||
102 | Handle(OpenGl_RenderFilter) myPrevRenderFilter; | |
103 | ||
104 | public: | |
105 | ||
92efcf78 | 106 | DEFINE_STANDARD_RTTIEXT(OpenGl_RaytraceFilter,OpenGl_RenderFilter) |
a89742cf | 107 | }; |
108 | ||
c04c30b3 | 109 | class OpenGl_Workspace; |
c357e426 | 110 | DEFINE_STANDARD_HANDLE(OpenGl_Workspace,Standard_Transient) |
c04c30b3 | 111 | |
c357e426 | 112 | //! Rendering workspace. |
e276548b | 113 | //! Provides methods to render primitives and maintain GL state. |
c357e426 | 114 | class OpenGl_Workspace : public Standard_Transient |
2166f0fa SK |
115 | { |
116 | public: | |
117 | ||
c357e426 | 118 | //! Constructor of rendering workspace. |
119 | Standard_EXPORT OpenGl_Workspace (OpenGl_View* theView, const Handle(OpenGl_Window)& theWindow); | |
2166f0fa SK |
120 | |
121 | //! Destructor | |
6d0e6be5 | 122 | virtual ~OpenGl_Workspace() {} |
2166f0fa | 123 | |
c357e426 | 124 | //! Activate rendering context. |
125 | Standard_EXPORT Standard_Boolean Activate(); | |
a272ed94 | 126 | |
c357e426 | 127 | OpenGl_View* View() const { return myView; } |
2166f0fa | 128 | |
c357e426 | 129 | const Handle(OpenGl_Context)& GetGlContext() { return myGlContext; } |
2166f0fa | 130 | |
b128c892 | 131 | Standard_EXPORT Handle(OpenGl_FrameBuffer) FBOCreate (const Standard_Integer theWidth, const Standard_Integer theHeight); |
679ecdee | 132 | |
b128c892 | 133 | Standard_EXPORT void FBORelease (Handle(OpenGl_FrameBuffer)& theFbo); |
a174a3c5 | 134 | |
b128c892 | 135 | Standard_Boolean BufferDump (const Handle(OpenGl_FrameBuffer)& theFbo, |
136 | Image_PixMap& theImage, | |
137 | const Graphic3d_BufferType& theBufferType); | |
2166f0fa | 138 | |
c357e426 | 139 | Standard_EXPORT Standard_Integer Width() const; |
140 | ||
141 | Standard_EXPORT Standard_Integer Height() const; | |
142 | ||
eae454e3 | 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 | ||
c357e426 | 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. | |
eae454e3 | 156 | Standard_Boolean& UseDepthWrite() { return myUseDepthWrite; } |
2166f0fa | 157 | |
c357e426 | 158 | //! @return true if usage of GL light is enabled. |
159 | Standard_EXPORT Standard_Boolean UseGLLight() const; | |
73192b37 | 160 | |
c357e426 | 161 | //! @return true if clipping algorithm enabled |
162 | Standard_EXPORT Standard_Boolean IsCullingEnabled() const; | |
163 | ||
164 | Standard_Integer NamedStatus; | |
165 | ||
166 | //// RELATED TO STATUS //// | |
2166f0fa | 167 | |
b6472664 | 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; } | |
2166f0fa | 177 | |
f9ba5c4d | 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. | |
b6472664 | 185 | const OpenGl_Vec4& LineColor() const |
f9ba5c4d | 186 | { |
187 | return myToHighlight | |
188 | ? *HighlightColor | |
b6472664 | 189 | : myAspectLineSet->Aspect()->ColorRGBA(); |
f9ba5c4d | 190 | } |
191 | ||
192 | //! Return edge color taking into account highlight flag. | |
b6472664 | 193 | const OpenGl_Vec4& EdgeColor() const |
f9ba5c4d | 194 | { |
195 | return myToHighlight | |
196 | ? *HighlightColor | |
b6472664 | 197 | : myAspectFaceSet->AspectEdge()->Aspect()->ColorRGBA(); |
f9ba5c4d | 198 | } |
199 | ||
200 | //! Return marker color taking into account highlight flag. | |
b6472664 | 201 | const OpenGl_Vec4& MarkerColor() const |
f9ba5c4d | 202 | { |
203 | return myToHighlight | |
204 | ? *HighlightColor | |
b6472664 | 205 | : myAspectMarkerSet->Aspect()->ColorRGBA(); |
f9ba5c4d | 206 | } |
207 | ||
208 | //! Return Interior color taking into account highlight flag. | |
b6472664 | 209 | const OpenGl_Vec4& InteriorColor() const |
f9ba5c4d | 210 | { |
211 | return myToHighlight | |
212 | ? *HighlightColor | |
b6472664 | 213 | : myAspectFaceSet->Aspect()->InteriorColorRGBA(); |
f9ba5c4d | 214 | } |
215 | ||
216 | //! Return text color taking into account highlight flag. | |
b6472664 | 217 | const OpenGl_Vec4& TextColor() const |
f9ba5c4d | 218 | { |
219 | return myToHighlight | |
220 | ? *HighlightColor | |
b6472664 | 221 | : myAspectTextSet->Aspect()->ColorRGBA(); |
f9ba5c4d | 222 | } |
223 | ||
224 | //! Return text Subtitle color taking into account highlight flag. | |
b6472664 | 225 | const OpenGl_Vec4& TextSubtitleColor() const |
f9ba5c4d | 226 | { |
227 | return myToHighlight | |
228 | ? *HighlightColor | |
b6472664 | 229 | : myAspectTextSet->Aspect()->ColorSubTitleRGBA(); |
f9ba5c4d | 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()). | |
71c6e1e5 | 245 | Standard_EXPORT const OpenGl_AspectLine* SetAspectLine (const OpenGl_AspectLine* theAspect); |
f9ba5c4d | 246 | |
247 | //! Assign new face aspect (will be applied within ApplyAspectFace()). | |
71c6e1e5 | 248 | Standard_EXPORT const OpenGl_AspectFace* SetAspectFace (const OpenGl_AspectFace* theAspect); |
f9ba5c4d | 249 | |
250 | //! Assign new marker aspect (will be applied within ApplyAspectMarker()). | |
71c6e1e5 | 251 | Standard_EXPORT const OpenGl_AspectMarker* SetAspectMarker (const OpenGl_AspectMarker* theAspect); |
f9ba5c4d | 252 | |
253 | //! Assign new text aspect (will be applied within ApplyAspectText()). | |
71c6e1e5 | 254 | Standard_EXPORT const OpenGl_AspectText* SetAspectText (const OpenGl_AspectText* theAspect); |
2166f0fa | 255 | |
f9ba5c4d | 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; } | |
2166f0fa | 271 | |
f9ba5c4d | 272 | //! Clear the applied aspect state to default values. |
34a44cbd | 273 | void ResetAppliedAspect(); |
274 | ||
bf75be98 | 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); | |
8625ef7e | 278 | const Handle(OpenGl_Texture)& ActiveTexture() const { return myTextureBound; } |
bf75be98 | 279 | |
4269bd1b | 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 | { | |
5322131b | 286 | myRenderFilter = theFilter; |
4269bd1b | 287 | } |
288 | ||
289 | //! Get rendering filter. | |
290 | //! @return filter instance. | |
5322131b | 291 | inline const Handle(OpenGl_RenderFilter)& GetRenderFilter() const |
292 | { | |
293 | return myRenderFilter; | |
4269bd1b | 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 | ||
550f3b8b | 302 | //! Sets and applies current polygon offset. |
b6472664 | 303 | void SetPolygonOffset (const Graphic3d_PolygonOffset& theParams); |
550f3b8b | 304 | |
6d0e6be5 | 305 | //! Returns currently applied polygon offset parameters. |
b6472664 | 306 | const Graphic3d_PolygonOffset& AppliedPolygonOffset() { return myPolygonOffsetApplied; } |
550f3b8b | 307 | |
f8ae3605 | 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 | ||
83da37b1 | 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 | ||
2166f0fa SK |
338 | protected: |
339 | ||
b6472664 | 340 | enum |
341 | { | |
342 | TEL_FRONT_MATERIAL = 1, | |
343 | TEL_BACK_MATERIAL = 2 | |
344 | }; | |
345 | ||
0adbd30f | 346 | void updateMaterial (const int theFlag); |
2166f0fa | 347 | |
bf75be98 | 348 | void setTextureParams (Handle(OpenGl_Texture)& theTexture, |
349 | const Handle(Graphic3d_TextureParams)& theParams); | |
2166f0fa | 350 | |
91c60b57 | 351 | protected: //! @name protected fields |
265d4508 | 352 | |
c357e426 | 353 | OpenGl_View* myView; |
354 | Handle(OpenGl_Window) myWindow; | |
355 | Handle(OpenGl_Context) myGlContext; | |
c357e426 | 356 | Standard_Boolean myUseZBuffer; |
357 | Standard_Boolean myUseDepthWrite; | |
358 | Standard_Boolean myUseGLLight; | |
f8ae3605 | 359 | Handle(OpenGl_CappingAlgoFilter) myDefaultCappingAlgoFilter; |
360 | OpenGl_AspectFace myNoneCulling; | |
361 | OpenGl_AspectFace myFrontCulling; | |
362 | ||
bf75be98 | 363 | protected: //! @name fields related to status |
364 | ||
4269bd1b | 365 | Handle(OpenGl_RenderFilter) myRenderFilter; |
bf75be98 | 366 | Handle(OpenGl_Texture) myTextureBound; //!< currently bound texture (managed by OpenGl_AspectFace and OpenGl_View environment texture) |
f9ba5c4d | 367 | const OpenGl_AspectLine* myAspectLineSet; |
368 | const OpenGl_AspectFace* myAspectFaceSet; | |
b6472664 | 369 | Handle(Graphic3d_AspectFillArea3d) myAspectFaceApplied; |
f9ba5c4d | 370 | const OpenGl_AspectMarker* myAspectMarkerSet; |
b6472664 | 371 | Handle(Graphic3d_AspectMarker3d) myAspectMarkerApplied; |
f9ba5c4d | 372 | const OpenGl_AspectText* myAspectTextSet; |
373 | bool myAspectFaceAppliedWithHL; | |
2166f0fa | 374 | |
2166f0fa SK |
375 | const OpenGl_Matrix* ViewMatrix_applied; |
376 | const OpenGl_Matrix* StructureMatrix_applied; | |
377 | ||
3b1817a9 | 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 | |
b6472664 | 381 | bool myToAllowFaceCulling; //!< allow back face culling |
f9ba5c4d | 382 | bool myToHighlight; //!< flag indicating highlighting mode |
0adbd30f | 383 | |
550f3b8b | 384 | OpenGl_Matrix myModelViewMatrix; //!< Model matrix with applied structure transformations |
0f8c0fb8 | 385 | |
b6472664 | 386 | Graphic3d_PolygonOffset myPolygonOffsetApplied; //!< currently applied polygon offset |
2166f0fa | 387 | |
550f3b8b | 388 | OpenGl_AspectFace myAspectFaceHl; //!< Hiddenline aspect |
bf75be98 | 389 | |
83da37b1 | 390 | Handle(OpenGl_Texture) myEnvironmentTexture; |
391 | ||
bf75be98 | 392 | public: //! @name type definition |
2166f0fa | 393 | |
92efcf78 | 394 | DEFINE_STANDARD_RTTIEXT(OpenGl_Workspace,Standard_Transient) |
1c35b92f | 395 | DEFINE_STANDARD_ALLOC |
2166f0fa SK |
396 | |
397 | }; | |
398 | ||
bf75be98 | 399 | #endif // _OpenGl_Workspace_Header |