0027961: Visualization - remove unused and no more working OpenGl_AVIWriter
[occt.git] / src / OpenGl / OpenGl_AspectFace.cxx
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 #include <Aspect_PolygonOffsetMode.hxx>
17 #include <NCollection_Vec3.hxx>
18
19 #include <OpenGl_AspectFace.hxx>
20 #include <OpenGl_Context.hxx>
21 #include <OpenGl_ShaderManager.hxx>
22 #include <OpenGl_ShaderProgram.hxx>
23 #include <OpenGl_Texture.hxx>
24 #include <OpenGl_Workspace.hxx>
25
26 #include <Graphic3d_ShaderProgram.hxx>
27 #include <Graphic3d_TextureMap.hxx>
28 #include <Graphic3d_TextureParams.hxx>
29 #include <Graphic3d_TypeOfReflection.hxx>
30 #include <Graphic3d_MaterialAspect.hxx>
31
32 #include <Image_PixMap.hxx>
33
34 namespace
35 {
36   //! Initialize default material in this way for backward compatibility.
37   inline Graphic3d_MaterialAspect initDefaultMaterial()
38   {
39     Graphic3d_MaterialAspect aMat;
40     aMat.SetMaterialType (Graphic3d_MATERIAL_ASPECT);
41     aMat.SetAmbient  (0.2);
42     aMat.SetDiffuse  (0.8);
43     aMat.SetSpecular (0.1);
44     aMat.SetEmissive (0.0);
45     aMat.SetAmbientColor (Quantity_NOC_WHITE);
46     aMat.SetDiffuseColor (Quantity_NOC_WHITE);
47     aMat.SetEmissiveColor(Quantity_NOC_WHITE);
48     aMat.SetSpecularColor(Quantity_NOC_WHITE);
49     aMat.SetShininess (10.0 / 128.0);
50     aMat.SetRefractionIndex (1.0);
51     return aMat;
52   }
53
54   static const TCollection_AsciiString  THE_EMPTY_KEY;
55   static const Graphic3d_MaterialAspect THE_DEFAULT_MATERIAL = initDefaultMaterial();
56 }
57
58 // =======================================================================
59 // function : OpenGl_AspectFace
60 // purpose  :
61 // =======================================================================
62 OpenGl_AspectFace::OpenGl_AspectFace()
63 : myAspect (new Graphic3d_AspectFillArea3d (Aspect_IS_SOLID, Quantity_NOC_WHITE,
64                                             Quantity_NOC_WHITE, Aspect_TOL_SOLID, 1.0,
65                                             THE_DEFAULT_MATERIAL, THE_DEFAULT_MATERIAL)),
66   myIsNoLighting (false)
67 {
68   myAspect->SetHatchStyle (Aspect_HS_SOLID);
69 }
70
71 // =======================================================================
72 // function : OpenGl_AspectFace
73 // purpose  :
74 // =======================================================================
75 OpenGl_AspectFace::OpenGl_AspectFace (const Handle(Graphic3d_AspectFillArea3d)& theAspect)
76 : myIsNoLighting (false)
77 {
78   SetAspect (theAspect);
79 }
80
81 // =======================================================================
82 // function : SetAspect
83 // purpose  :
84 // =======================================================================
85 void OpenGl_AspectFace::SetAspect (const Handle(Graphic3d_AspectFillArea3d)& theAspect)
86 {
87   myAspect = theAspect;
88
89   const Graphic3d_MaterialAspect& aMat = theAspect->FrontMaterial();
90   myIsNoLighting = !aMat.ReflectionMode (Graphic3d_TOR_AMBIENT)
91                 && !aMat.ReflectionMode (Graphic3d_TOR_DIFFUSE)
92                 && !aMat.ReflectionMode (Graphic3d_TOR_SPECULAR)
93                 && !aMat.ReflectionMode (Graphic3d_TOR_EMISSION);
94
95   myAspectEdge.Aspect()->SetColor (theAspect->EdgeColor());
96   myAspectEdge.Aspect()->SetType  (theAspect->EdgeLineType());
97   myAspectEdge.Aspect()->SetWidth (theAspect->EdgeWidth());
98
99   // update texture binding
100   const TCollection_AsciiString& aTextureKey = myAspect->TextureMap().IsNull() ? THE_EMPTY_KEY : myAspect->TextureMap()->GetId();
101   if (aTextureKey.IsEmpty() || myResources.TextureId != aTextureKey)
102   {
103     myResources.ResetTextureReadiness();
104   }
105   else if (!myResources.Texture.IsNull()
106         && !myAspect->TextureMap().IsNull()
107         &&  myResources.Texture->Revision() != myAspect->TextureMap()->Revision())
108   {
109     myResources.ResetTextureReadiness();
110   }
111
112   // update shader program binding
113   const TCollection_AsciiString& aShaderKey = myAspect->ShaderProgram().IsNull() ? THE_EMPTY_KEY : myAspect->ShaderProgram()->GetId();
114   if (aShaderKey.IsEmpty() || myResources.ShaderProgramId != aShaderKey)
115   {
116     myResources.ResetShaderReadiness();
117   }
118 }
119
120 // =======================================================================
121 // function : Render
122 // purpose  :
123 // =======================================================================
124 void OpenGl_AspectFace::Render (const Handle(OpenGl_Workspace)& theWorkspace) const
125 {
126   theWorkspace->SetAspectFace (this);
127 }
128
129 // =======================================================================
130 // function : Release
131 // purpose  :
132 // =======================================================================
133 void OpenGl_AspectFace::Release (OpenGl_Context* theContext)
134 {
135   if (!myResources.Texture.IsNull())
136   {
137     if (theContext)
138     {
139       if (myResources.TextureId.IsEmpty())
140       {
141         theContext->DelayedRelease (myResources.Texture);
142       }
143       else
144       {
145         myResources.Texture.Nullify(); // we need nullify all handles before ReleaseResource() call
146         theContext->ReleaseResource (myResources.TextureId, Standard_True);
147       }
148     }
149     myResources.Texture.Nullify();
150   }
151   myResources.TextureId.Clear();
152   myResources.ResetTextureReadiness();
153
154   if (!myResources.ShaderProgram.IsNull()
155    && theContext)
156   {
157     theContext->ShaderManager()->Unregister (myResources.ShaderProgramId,
158                                              myResources.ShaderProgram);
159   }
160   myResources.ShaderProgramId.Clear();
161   myResources.ResetShaderReadiness();
162 }
163
164 // =======================================================================
165 // function : BuildTexture
166 // purpose  :
167 // =======================================================================
168 void OpenGl_AspectFace::Resources::BuildTexture (const Handle(OpenGl_Context)&       theCtx,
169                                                  const Handle(Graphic3d_TextureMap)& theTexture)
170 {
171   // release old texture resource
172   if (!Texture.IsNull())
173   {
174     if (!theTexture.IsNull()
175      &&  theTexture->GetId()    == TextureId
176      &&  theTexture->Revision() != Texture->Revision())
177     {
178       Handle(Image_PixMap) anImage = theTexture->GetImage();
179       if (!anImage.IsNull())
180       {
181         Texture->Init (theCtx, *anImage.operator->(), theTexture->Type());
182         Texture->SetRevision (Texture->Revision());
183         return;
184       }
185     }
186
187     if (TextureId.IsEmpty())
188     {
189       theCtx->DelayedRelease (Texture);
190       Texture.Nullify();
191     }
192     else
193     {
194       Texture.Nullify(); // we need nullify all handles before ReleaseResource() call
195       theCtx->ReleaseResource (TextureId, Standard_True);
196     }
197   }
198
199   TextureId = theTexture.IsNull() ? THE_EMPTY_KEY : theTexture->GetId();
200
201   if (!theTexture.IsNull())
202   {
203     if (TextureId.IsEmpty() || !theCtx->GetResource<Handle(OpenGl_Texture)> (TextureId, Texture))
204     {
205       Texture = new OpenGl_Texture (theTexture->GetParams());
206       Handle(Image_PixMap) anImage = theTexture->GetImage();
207       if (!anImage.IsNull())
208       {
209         Texture->Init (theCtx, *anImage.operator->(), theTexture->Type());
210         Texture->SetRevision (Texture->Revision());
211       }
212       if (!TextureId.IsEmpty())
213       {
214         theCtx->ShareResource (TextureId, Texture);
215       }
216     }
217   }
218 }
219
220 // =======================================================================
221 // function : BuildShader
222 // purpose  :
223 // =======================================================================
224 void OpenGl_AspectFace::Resources::BuildShader (const Handle(OpenGl_Context)&          theCtx,
225                                                 const Handle(Graphic3d_ShaderProgram)& theShader)
226 {
227   if (theCtx->core20fwd == NULL)
228   {
229     return;
230   }
231
232   // release old shader program resources
233   if (!ShaderProgram.IsNull())
234   {
235     theCtx->ShaderManager()->Unregister (ShaderProgramId, ShaderProgram);
236     ShaderProgramId.Clear();
237     ShaderProgram.Nullify();
238   }
239   if (theShader.IsNull())
240   {
241     return;
242   }
243
244   theCtx->ShaderManager()->Create (theShader, ShaderProgramId, ShaderProgram);
245 }