1 // Created on: 2011-10-20
2 // Created by: Sergey ZERCHANINOV
3 // Copyright (c) 2011-2014 OPEN CASCADE SAS
5 // This file is part of Open CASCADE Technology software library.
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.
13 // Alternatively, this file may be used under the terms of Open CASCADE
14 // commercial license or contractual agreement.
16 #include <OpenGl_GlCore11.hxx>
18 #include <OpenGl_GraphicDriver.hxx>
20 #include <Font_FontAspect.hxx>
22 #include <OpenGl_AspectText.hxx>
23 #include <OpenGl_Text.hxx>
24 #include <OpenGl_TextParam.hxx>
25 #include <OpenGl_LineAttributes.hxx>
27 /*----------------------------------------------------------------------*/
29 struct OpenGl_LAYER_PROP
37 OpenGl_AspectText AspectText;
38 OpenGl_TextParam TextParam;
41 /*----------------------------------------------------------------------*/
43 static const TEL_COLOUR myDefaultColor = {{ 1.F, 1.F, 1.F, 1.F }};
44 static const CALL_DEF_CONTEXTTEXT myDefaultContextText =
51 { 1.F, 1.F, 1.F }, //Color
52 (int)Aspect_TOST_NORMAL, //Style
53 (int)Aspect_TODT_NORMAL, //DisplayType
54 { 1.F, 1.F, 1.F }, //ColorSubTitle
57 (int)Font_FA_Regular //TextFontAspect
60 static Standard_Boolean TheLayerIsOpen = Standard_False;
61 static OpenGl_LAYER_PROP TheLayerProp;
63 /*----------------------------------------------------------------------*/
65 void InitLayerProp (const int theListId)
67 TheLayerProp.ListId = theListId;
71 TheLayerProp.Color = myDefaultColor;
72 TheLayerProp.NbPoints = 0;
73 TheLayerProp.LineType = -1;
74 TheLayerProp.LineWidth = -1.F;
76 TheLayerProp.AspectText.SetAspect (myDefaultContextText);
78 TheLayerProp.TextParam.HAlign = Graphic3d_HTA_LEFT;
79 TheLayerProp.TextParam.VAlign = Graphic3d_VTA_BOTTOM;
83 /*----------------------------------------------------------------------*/
85 void OpenGl_GraphicDriver::Layer (Aspect_CLayer2d& ACLayer)
87 ACLayer.ptrLayer = new CALL_DEF_PTRLAYER();
88 #if !defined(GL_ES_VERSION_2_0)
89 ACLayer.ptrLayer->listIndex = glGenLists(1);
93 /*----------------------------------------------------------------------*/
95 void OpenGl_GraphicDriver::RemoveLayer (const Aspect_CLayer2d& ACLayer)
97 if (!ACLayer.ptrLayer) return;
98 if (!ACLayer.ptrLayer->listIndex) return;
99 if (TheLayerProp.ListId == ACLayer.ptrLayer->listIndex)
102 #if !defined(GL_ES_VERSION_2_0)
103 glDeleteLists (ACLayer.ptrLayer->listIndex, 1);
105 ACLayer.ptrLayer->listIndex = 0;
106 //szvgl: memory leak here?
107 //free ( ACLayer.ptrLayer );
108 //ACLayer.ptrLayer = NULL;
111 /*----------------------------------------------------------------------*/
113 void OpenGl_GraphicDriver::BeginLayer (const Aspect_CLayer2d& ACLayer)
115 call_def_ptrLayer ptrLayer = (call_def_ptrLayer) ACLayer.ptrLayer;
116 if (!ptrLayer) return;
118 InitLayerProp (ptrLayer->listIndex);
119 if (!TheLayerProp.ListId) return;
121 #if !defined(GL_ES_VERSION_2_0)
122 glNewList (TheLayerProp.ListId, GL_COMPILE);
124 TheLayerIsOpen = Standard_True;
127 void OpenGl_GraphicDriver::BeginPolygon2d ()
129 if (!TheLayerProp.ListId) return;
130 TheLayerProp.NbPoints = 0;
131 #if !defined(GL_ES_VERSION_2_0)
132 glBegin (GL_POLYGON);
136 void OpenGl_GraphicDriver::BeginPolyline2d ()
138 if (!TheLayerProp.ListId) return;
139 TheLayerProp.NbPoints = 0;
140 #if !defined(GL_ES_VERSION_2_0)
141 glBegin (GL_LINE_STRIP);
145 void OpenGl_GraphicDriver::ClearLayer (const Aspect_CLayer2d& ACLayer)
147 if (!ACLayer.ptrLayer) return;
149 InitLayerProp (ACLayer.ptrLayer->listIndex);
150 if (!TheLayerProp.ListId) return;
152 #if !defined(GL_ES_VERSION_2_0)
153 glNewList (TheLayerProp.ListId, GL_COMPILE);
158 void OpenGl_GraphicDriver::Draw (const Standard_ShortReal X, const Standard_ShortReal Y)
160 if (!TheLayerProp.ListId) return;
161 TheLayerProp.NbPoints++;
162 #if !defined(GL_ES_VERSION_2_0)
163 glVertex3f (X, Y, 0.F);
167 void OpenGl_GraphicDriver::Edge (const Standard_ShortReal X, const Standard_ShortReal Y)
169 if (!TheLayerProp.ListId) return;
170 TheLayerProp.NbPoints++;
171 #if !defined(GL_ES_VERSION_2_0)
172 glVertex3f (X, Y, 0.F);
176 void OpenGl_GraphicDriver::EndLayer ()
178 if (!TheLayerProp.ListId) return;
181 #if !defined(GL_ES_VERSION_2_0)
184 TheLayerIsOpen = Standard_False;
186 TheLayerProp.ListId = 0;
189 void OpenGl_GraphicDriver::EndPolygon2d ()
191 if (!TheLayerProp.ListId) return;
192 #if !defined(GL_ES_VERSION_2_0)
197 void OpenGl_GraphicDriver::EndPolyline2d ()
199 if (!TheLayerProp.ListId) return;
200 #if !defined(GL_ES_VERSION_2_0)
205 void OpenGl_GraphicDriver::Move (const Standard_ShortReal X, const Standard_ShortReal Y)
207 if (!TheLayerProp.ListId) return;
208 if (TheLayerProp.NbPoints)
210 #if !defined(GL_ES_VERSION_2_0)
212 glBegin (GL_LINE_STRIP);
214 TheLayerProp.NbPoints = 0;
216 TheLayerProp.NbPoints++;
217 #if !defined(GL_ES_VERSION_2_0)
218 glVertex3f (X, Y, 0.F);
222 void OpenGl_GraphicDriver::Rectangle (const Standard_ShortReal X, const Standard_ShortReal Y, const Standard_ShortReal Width, const Standard_ShortReal Height)
224 if (!TheLayerProp.ListId) return;
225 #if !defined(GL_ES_VERSION_2_0)
226 glRectf (X, Y, X + Width, Y + Height);
230 void OpenGl_GraphicDriver::SetColor (const Standard_ShortReal R, const Standard_ShortReal G, const Standard_ShortReal B)
232 if (!TheLayerProp.ListId) return;
233 TheLayerProp.Color.rgb[0] = R;
234 TheLayerProp.Color.rgb[1] = G;
235 TheLayerProp.Color.rgb[2] = B;
236 #if !defined(GL_ES_VERSION_2_0)
237 glColor3fv (TheLayerProp.Color.rgb);
241 void OpenGl_GraphicDriver::SetTransparency (const Standard_ShortReal ATransparency)
243 if (!TheLayerProp.ListId) return;
244 TheLayerProp.Color.rgb[3] = ATransparency;
245 #if !defined(GL_ES_VERSION_2_0)
247 glBlendFunc (GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
248 glColor4fv (TheLayerProp.Color.rgb);
252 void OpenGl_GraphicDriver::UnsetTransparency ()
254 if (!TheLayerProp.ListId) return;
255 TheLayerProp.Color.rgb[3] = 1.F;
256 #if !defined(GL_ES_VERSION_2_0)
257 glDisable (GL_BLEND);
261 void OpenGl_GraphicDriver::SetLineAttributes (const Standard_Integer theType,
262 const Standard_ShortReal theWidth)
264 const Handle(OpenGl_Context)& aCtx = GetSharedContext();
265 if (!TheLayerProp.ListId
271 if (TheLayerProp.LineType != theType)
273 TheLayerProp.LineType = theType;
274 aCtx->SetTypeOfLine ((Aspect_TypeOfLine) theType);
276 if (TheLayerProp.LineWidth != theWidth)
278 TheLayerProp.LineWidth = theWidth;
279 aCtx->SetLineWidth (theWidth);
283 void OpenGl_GraphicDriver::SetTextAttributes (const Standard_CString theFont,
284 const Standard_Integer theType,
285 const Standard_ShortReal theR,
286 const Standard_ShortReal theG,
287 const Standard_ShortReal theB)
289 if (!TheLayerProp.ListId)
294 TheLayerProp.AspectText.ChangeFontName() = theFont;
295 TheLayerProp.AspectText.SetDisplayType ((Aspect_TypeOfDisplayText )theType);
296 TEL_COLOUR& aSubColor = TheLayerProp.AspectText.ChangeSubtitleColor();
297 aSubColor.rgb[0] = (float )theR;
298 aSubColor.rgb[1] = (float )theG;
299 aSubColor.rgb[2] = (float )theB;
302 void OpenGl_GraphicDriver::Text (const Standard_CString theText,
303 const Standard_ShortReal theX,
304 const Standard_ShortReal theY,
305 const Standard_ShortReal theHeight)
307 const Handle(OpenGl_Context)& aCtx = GetSharedContext();
308 if (!TheLayerProp.ListId || aCtx.IsNull())
313 const Standard_ShortReal aHeight = (theHeight < 2.0f) ? DefaultTextHeight() : theHeight;
314 TheLayerProp.TextParam.Height = (int )aHeight;
315 TheLayerProp.AspectText.ChangeColor() = TheLayerProp.Color;
317 myTempText->Init (aCtx, TCollection_ExtendedString (theText), OpenGl_Vec2 (theX, theY), TheLayerProp.TextParam);
318 myTempText->Render (myPrintContext, aCtx, TheLayerProp.AspectText);
319 //myTempText->Release (aCtx);
322 void OpenGl_GraphicDriver::TextSize (const Standard_CString theText,
323 const Standard_ShortReal theHeight,
324 Standard_ShortReal& theWidth,
325 Standard_ShortReal& theAscent,
326 Standard_ShortReal& theDescent) const
328 const Handle(OpenGl_Context)& aCtx = GetSharedContext();
329 if (!TheLayerProp.ListId || aCtx.IsNull())
334 const Standard_ShortReal aHeight = (theHeight < 2.0f) ? DefaultTextHeight() : theHeight;
335 TheLayerProp.TextParam.Height = (int )aHeight;
337 TCollection_ExtendedString anExtText = theText;
338 NCollection_String aText = (Standard_Utf16Char* )anExtText.ToExtString();
339 OpenGl_Text::StringSize (aCtx, aText, TheLayerProp.AspectText, TheLayerProp.TextParam, theWidth, theAscent, theDescent);