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