0025201: Visualization - Implementing soft shadows and ambient occlusion in OCCT...
[occt.git] / src / OpenGl / OpenGl_AspectFace.hxx
1 // Created on: 2011-07-13
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 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_AspectFace_Header
17 #define _OpenGl_AspectFace_Header
18
19 #include <InterfaceGraphic_telem.hxx>
20 #include <Aspect_InteriorStyle.hxx>
21 #include <Aspect_PolygonOffsetMode.hxx>
22 #include <TCollection_AsciiString.hxx>
23
24 #include <Handle_Graphic3d_TextureParams.hxx>
25 #include <Handle_OpenGl_ShaderProgram.hxx>
26 #include <Handle_OpenGl_Texture.hxx>
27 #include <OpenGl_AspectLine.hxx>
28 #include <OpenGl_Element.hxx>
29
30 #include <Graphic3d_AspectFillArea3d.hxx>
31 #include <Graphic3d_CAspectFillArea.hxx>
32 #include <Graphic3d_ShaderProgram.hxx>
33 #include <Graphic3d_TextureMap.hxx>
34 #include <Graphic3d_BSDF.hxx>
35
36 #define OPENGL_AMBIENT_MASK  (1<<0)
37 #define OPENGL_DIFFUSE_MASK  (1<<1)
38 #define OPENGL_SPECULAR_MASK (1<<2)
39 #define OPENGL_EMISSIVE_MASK (1<<3)
40
41 static const TEL_POFFSET_PARAM THE_DEFAULT_POFFSET = { Aspect_POM_Fill, 1.0F, 0.0F };
42
43 struct OPENGL_SURF_PROP
44 {
45   Standard_ShortReal amb;
46   Standard_ShortReal diff;
47   Standard_ShortReal spec;
48   Standard_ShortReal emsv;
49
50   Standard_ShortReal trans;
51   Standard_ShortReal shine;
52   Standard_ShortReal index;
53
54   Standard_ShortReal env_reflexion;
55   Standard_Integer   isphysic;
56
57   unsigned int color_mask;
58
59   TEL_COLOUR speccol;
60   TEL_COLOUR difcol;
61   TEL_COLOUR ambcol;
62   TEL_COLOUR emscol;
63   TEL_COLOUR matcol;
64
65   Graphic3d_BSDF BSDF;
66
67   DEFINE_STANDARD_ALLOC
68 };
69
70 class OpenGl_AspectFace : public OpenGl_Element
71 {
72
73 public:
74
75   Standard_EXPORT OpenGl_AspectFace();
76
77   //! Copy parameters
78   Standard_EXPORT void SetAspect (const CALL_DEF_CONTEXTFILLAREA& theAspect);
79   Standard_EXPORT void SetAspect (const Handle(Graphic3d_AspectFillArea3d)& theAspect);
80
81   //! Set edge aspect.
82   void SetAspectEdge (const OpenGl_AspectLine* theAspectEdge)
83   {
84     myAspectEdge = *theAspectEdge;
85   }
86
87   //! @return edge aspect.
88   const OpenGl_AspectLine* AspectEdge() const 
89   {
90     return &myAspectEdge;
91   }
92
93   //! @return interior style
94   const Aspect_InteriorStyle InteriorStyle() const
95   {
96     return myInteriorStyle;
97   }
98
99   Aspect_InteriorStyle& ChangeInteriorStyle()
100   {
101     return myInteriorStyle;
102   }
103
104   //! @return edge on flag.
105   int Edge() const
106   {
107     return myEdge;
108   }
109
110   //! @return edge on flag.
111   int& ChangeEdge()
112   {
113     return myEdge;
114   }
115
116   //! @return hatch type.
117   int Hatch() const
118   {
119     return myHatch;
120   }
121
122   //! @return hatch type variable.
123   int& ChangeHatch()
124   {
125     return myHatch;
126   }
127
128   //! @return distinguishing mode.
129   int DistinguishingMode() const
130   {
131     return myDistinguishingMode;
132   }
133
134   //! @return distinguishing mode.
135   int& ChangeDistinguishingMode()
136   {
137     return myDistinguishingMode;
138   }
139
140   //! @return culling mode.
141   int CullingMode() const
142   {
143     return myCullingMode;
144   }
145
146   //! @return culling mode.
147   int& ChangeCullingMode()
148   {
149     return myCullingMode;
150   }
151
152   //! @return front material properties.
153   const OPENGL_SURF_PROP& IntFront() const
154   {
155     return myIntFront;
156   }
157
158   //! @return front material properties.
159   OPENGL_SURF_PROP& ChangeIntFront()
160   {
161     return myIntFront;
162   }
163
164   //! @return back material properties.
165   const OPENGL_SURF_PROP& IntBack() const
166   {
167     return myIntBack;
168   }
169
170   //! @return back material properties.
171   OPENGL_SURF_PROP& ChangeIntBack()
172   {
173     return myIntBack;
174   }
175
176   //! @return polygon offset parameters.
177   const TEL_POFFSET_PARAM& PolygonOffset() const
178   {
179     return myPolygonOffset;
180   }
181
182   //! @return polygon offset parameters.
183   TEL_POFFSET_PARAM& ChangePolygonOffset()
184   {
185     return myPolygonOffset;
186   }
187
188   //! @return texture mapping flag.
189   bool DoTextureMap() const
190   {
191     return myDoTextureMap;
192   }
193
194   //! @return texture mapping flag.
195   bool& ChangeDoTextureMap()
196   {
197     return myDoTextureMap;
198   }
199
200   //! @return texture mapping parameters.
201   const Handle(Graphic3d_TextureParams)& TextureParams() const
202   {
203     return myTexture->GetParams();
204   }
205
206   //! @return texture map.
207   const Handle(OpenGl_Texture)& TextureRes (const Handle(OpenGl_Context)& theCtx) const
208   {
209     if (!myResources.IsTextureReady())
210     {
211       myResources.BuildTexture (theCtx, myTexture);
212       myResources.SetTextureReady();
213     }
214
215     return myResources.Texture;
216   }
217
218   //! Init and return OpenGl shader program resource.
219   //! @return shader program resource.
220   const Handle(OpenGl_ShaderProgram)& ShaderProgramRes (const Handle(OpenGl_Context)& theCtx) const
221   {
222     if (!myResources.IsShaderReady())
223     {
224       myResources.BuildShader (theCtx, myShaderProgram);
225       myResources.SetShaderReady();
226     }
227
228     return myResources.ShaderProgram;
229   }
230
231   Standard_EXPORT virtual void Render  (const Handle(OpenGl_Workspace)& theWorkspace) const;
232   Standard_EXPORT virtual void Release (OpenGl_Context* theContext);
233
234 protected:
235
236   Standard_EXPORT void convertMaterial (const CALL_DEF_MATERIAL& theMat,
237                                         OPENGL_SURF_PROP&        theSurf);
238
239 protected: //! @name ordinary aspect properties
240
241   Aspect_InteriorStyle            myInteriorStyle;
242   int                             myEdge;
243   int                             myHatch;
244   int                             myDistinguishingMode;
245   int                             myCullingMode;
246   OPENGL_SURF_PROP                myIntFront;
247   OPENGL_SURF_PROP                myIntBack;
248   TEL_POFFSET_PARAM               myPolygonOffset;
249   bool                            myDoTextureMap;
250   Handle(Graphic3d_TextureMap)    myTexture;
251   Handle(Graphic3d_ShaderProgram) myShaderProgram;
252
253 protected:
254
255   //! OpenGl resources
256   mutable struct Resources
257   {
258   public:
259     Resources()
260       : myIsTextureReady (Standard_False),
261         myIsShaderReady  (Standard_False) {}
262
263     Standard_Boolean IsTextureReady() const { return myIsTextureReady; }
264     Standard_Boolean IsShaderReady () const { return myIsShaderReady;  }
265     void SetTextureReady() { myIsTextureReady = Standard_True; }
266     void SetShaderReady () { myIsShaderReady  = Standard_True; }
267     void ResetTextureReadiness() { myIsTextureReady = Standard_False; }
268     void ResetShaderReadiness () { myIsShaderReady  = Standard_False; }
269
270     Standard_EXPORT void BuildTexture (const Handle(OpenGl_Context)&          theCtx,
271                                        const Handle(Graphic3d_TextureMap)&    theTexture);
272     Standard_EXPORT void BuildShader  (const Handle(OpenGl_Context)&          theCtx,
273                                        const Handle(Graphic3d_ShaderProgram)& theShader);
274
275     Handle(OpenGl_Texture)       Texture;
276     TCollection_AsciiString      TextureId;
277     Handle(OpenGl_ShaderProgram) ShaderProgram;
278     TCollection_AsciiString      ShaderProgramId;
279
280   private:
281
282     Standard_Boolean myIsTextureReady;
283     Standard_Boolean myIsShaderReady;
284
285   } myResources;
286
287 protected:
288
289   OpenGl_AspectLine               myAspectEdge;
290
291 public:
292
293   DEFINE_STANDARD_ALLOC
294
295 };
296
297 #endif //_OpenGl_AspectFace_Header