0024228: TKOpenGL - destroy GL context at view close
[occt.git] / src / OpenGl / OpenGl_AspectFace.hxx
1 // Created on: 2011-07-13
2 // Created by: Sergey ZERCHANINOV
3 // Copyright (c) 2011-2012 OPEN CASCADE SAS
4 //
5 // The content of this file is subject to the Open CASCADE Technology Public
6 // License Version 6.5 (the "License"). You may not use the content of this file
7 // except in compliance with the License. Please obtain a copy of the License
8 // at http://www.opencascade.org and read it completely before using this file.
9 //
10 // The Initial Developer of the Original Code is Open CASCADE S.A.S., having its
11 // main offices at: 1, place des Freres Montgolfier, 78280 Guyancourt, France.
12 //
13 // The Original Code and all software distributed under the License is
14 // distributed on an "AS IS" basis, without warranty of any kind, and the
15 // Initial Developer hereby disclaims all such warranties, including without
16 // limitation, any warranties of merchantability, fitness for a particular
17 // purpose or non-infringement. Please see the License for the specific terms
18 // and conditions governing the rights and limitations under the License.
19
20 #ifndef _OpenGl_AspectFace_Header
21 #define _OpenGl_AspectFace_Header
22
23 #include <InterfaceGraphic_telem.hxx>
24 #include <Aspect_InteriorStyle.hxx>
25 #include <TCollection_AsciiString.hxx>
26
27 #include <OpenGl_AspectLine.hxx>
28 #include <OpenGl_Element.hxx>
29 #include <Handle_OpenGl_Texture.hxx>
30
31 #include <Graphic3d_TextureMap.hxx>
32 #include <Graphic3d_AspectFillArea3d.hxx>
33 #include <Handle_Graphic3d_TextureParams.hxx>
34
35 #define OPENGL_AMBIENT_MASK  (1<<0)
36 #define OPENGL_DIFFUSE_MASK  (1<<1)
37 #define OPENGL_SPECULAR_MASK (1<<2)
38 #define OPENGL_EMISSIVE_MASK (1<<3)
39
40 class CALL_DEF_CONTEXTFILLAREA;
41
42 struct OPENGL_SURF_PROP
43 {
44   float        amb, diff, spec, emsv;
45   float        trans, shine;
46   float        env_reflexion;
47   int          isphysic;
48   unsigned int color_mask;
49   TEL_COLOUR speccol, difcol, ambcol, emscol, matcol;
50   DEFINE_STANDARD_ALLOC
51 };
52
53 class OpenGl_AspectFace : public OpenGl_Element
54 {
55
56 public:
57
58   OpenGl_AspectFace();
59
60   //! Copy parameters
61   void SetAspect (const CALL_DEF_CONTEXTFILLAREA& theAspect);
62   void SetAspect (const Handle(Graphic3d_AspectFillArea3d)& theAspect);
63
64   //! Set edge aspect.
65   void SetAspectEdge (const OpenGl_AspectLine* theAspectEdge)
66   {
67     myAspectEdge = *theAspectEdge;
68   }
69
70   //! @return edge aspect.
71   const OpenGl_AspectLine* AspectEdge() const 
72   {
73     return &myAspectEdge;
74   }
75
76   //! @return interior style
77   const Aspect_InteriorStyle InteriorStyle() const
78   {
79     return myInteriorStyle;
80   }
81
82   Aspect_InteriorStyle& ChangeInteriorStyle()
83   {
84     return myInteriorStyle;
85   }
86
87   //! @return edge on flag.
88   int Edge() const
89   {
90     return myEdge;
91   }
92
93   //! @return edge on flag.
94   int& ChangeEdge()
95   {
96     return myEdge;
97   }
98
99   //! @return hatch type.
100   int Hatch() const
101   {
102     return myHatch;
103   }
104
105   //! @return hatch type variable.
106   int& ChangeHatch()
107   {
108     return myHatch;
109   }
110
111   //! @return distinguishing mode.
112   int DistinguishingMode() const
113   {
114     return myDistinguishingMode;
115   }
116
117   //! @return distinguishing mode.
118   int& ChangeDistinguishingMode()
119   {
120     return myDistinguishingMode;
121   }
122
123   //! @return culling mode.
124   int CullingMode() const
125   {
126     return myCullingMode;
127   }
128
129   //! @return culling mode.
130   int& ChangeCullingMode()
131   {
132     return myCullingMode;
133   }
134
135   //! @return front material properties.
136   const OPENGL_SURF_PROP& IntFront() const
137   {
138     return myIntFront;
139   }
140
141   //! @return front material properties.
142   OPENGL_SURF_PROP& ChangeIntFront()
143   {
144     return myIntFront;
145   }
146
147   //! @return back material properties.
148   const OPENGL_SURF_PROP& IntBack() const
149   {
150     return myIntBack;
151   }
152
153   //! @return back material properties.
154   OPENGL_SURF_PROP& ChangeIntBack()
155   {
156     return myIntBack;
157   }
158
159   //! @return polygon offset parameters.
160   const TEL_POFFSET_PARAM& PolygonOffset() const
161   {
162     return myPolygonOffset;
163   }
164
165   //! @return polygon offset parameters.
166   TEL_POFFSET_PARAM& ChangePolygonOffset()
167   {
168     return myPolygonOffset;
169   }
170
171   //! @return texture mapping flag.
172   bool DoTextureMap() const
173   {
174     return myDoTextureMap;
175   }
176
177   //! @return texture mapping flag.
178   bool& ChangeDoTextureMap()
179   {
180     return myDoTextureMap;
181   }
182
183   //! @return texture map.
184   const Handle(OpenGl_Texture)& TextureRes (const Handle(OpenGl_Workspace)& theWorkspace) const
185   {
186     if (!myIsTextureInit)
187     {
188       buildTexture (theWorkspace);
189       myIsTextureInit = Standard_True;
190     }
191
192     return myTextureRes;
193   }
194
195   //! @return texture mapping parameters.
196   const Handle(Graphic3d_TextureParams)& TextureParams() const
197   {
198     return myTextureMap->GetParams();
199   }
200
201   virtual void Render  (const Handle(OpenGl_Workspace)& theWorkspace) const;
202   virtual void Release (const Handle(OpenGl_Context)&   theContext);
203
204 protected:
205
206   void buildTexture (const Handle(OpenGl_Workspace)& theWorkspace) const;
207   void convertMaterial (const CALL_DEF_MATERIAL& theMat,
208                         OPENGL_SURF_PROP&        theSurf);
209
210 protected: //! @name ordinary aspect properties
211
212   Aspect_InteriorStyle            myInteriorStyle;
213   int                             myEdge;
214   int                             myHatch;
215   int                             myDistinguishingMode;
216   int                             myCullingMode;
217   OPENGL_SURF_PROP                myIntFront;
218   OPENGL_SURF_PROP                myIntBack;
219   TEL_POFFSET_PARAM               myPolygonOffset;
220   bool                            myDoTextureMap;
221   Handle(Graphic3d_TextureMap)    myTextureMap;
222
223 protected: //! @name OpenGl resources
224
225   mutable Standard_Boolean        myIsTextureInit;
226   mutable Handle(OpenGl_Texture)  myTextureRes;
227   mutable TCollection_AsciiString myTextureId;
228
229 protected:
230
231   OpenGl_AspectLine               myAspectEdge;
232
233 public:
234
235   DEFINE_STANDARD_ALLOC
236
237 };
238
239 #endif //_OpenGl_AspectFace_Header