0024428: Implementation of LGPL license
[occt.git] / src / OpenGl / OpenGl_Display.cxx
1 // Created on: 2011-09-20
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
8 // under the terms of the GNU Lesser General Public 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 <OpenGl_GlCore11.hxx>
17
18 #include <OpenGl_Display.hxx>
19 #include <OpenGl_Context.hxx>
20 #include <OpenGl_Light.hxx>
21
22 #include <OSD_Environment.hxx>
23 #include <TCollection_AsciiString.hxx>
24 #include <Aspect_GraphicDeviceDefinitionError.hxx>
25
26 #if (!defined(_WIN32) && !defined(__WIN32__) && (!defined(__APPLE__) || defined(MACOSX_USE_GLX)))
27   #include <X11/Xlib.h> // XOpenDisplay()
28 #endif
29
30 IMPLEMENT_STANDARD_HANDLE(OpenGl_Display,MMgt_TShared)
31 IMPLEMENT_STANDARD_RTTIEXT(OpenGl_Display,MMgt_TShared)
32
33 namespace
34 {
35   #if (defined(_WIN32) || defined(__WIN32__)) || (defined(__APPLE__) && !defined(MACOSX_USE_GLX))
36     static char* TheDummyDisplay = "DISPLAY";
37   #endif
38
39   static const OpenGl_Facilities myDefaultFacilities = { 1, 1, 1, 1, OpenGLMaxLights, 10000 };
40 };
41
42 /*----------------------------------------------------------------------*/
43 #if (defined(_WIN32) || defined(__WIN32__)) || (defined(__APPLE__) && !defined(MACOSX_USE_GLX))
44 OpenGl_Display::OpenGl_Display (const Handle(Aspect_DisplayConnection)& )
45 #else
46 OpenGl_Display::OpenGl_Display (const Handle(Aspect_DisplayConnection)& theDisplayConnection)
47 #endif
48 : myDisplay(NULL),
49   myFacilities(myDefaultFacilities),
50   myDBuffer(Standard_True),
51   myDither(Standard_True),
52   myBackDither(Standard_False),
53   myWalkthrough(Standard_False),
54   mySymPerspective(Standard_False),
55   myOffsetFactor(1.F),
56   myOffsetUnits(0.F),
57   myAntiAliasingMode(3),
58   myLinestyleBase(0),
59   myPatternBase(0)
60 {
61 #if (defined(_WIN32) || defined(__WIN32__)) || (defined(__APPLE__) && !defined(MACOSX_USE_GLX))
62   myDisplay = TheDummyDisplay;
63 #else
64   myDisplay = theDisplayConnection->GetDisplay();
65 #endif
66
67   Init();
68 }
69
70 /*----------------------------------------------------------------------*/
71
72 OpenGl_Display::~OpenGl_Display ()
73 {
74   ReleaseAttributes (NULL);
75   myDisplay = NULL;
76 }
77
78 void OpenGl_Display::ReleaseAttributes (const OpenGl_Context* theGlCtx)
79 {
80   // Delete line styles
81   if (myLinestyleBase != 0)
82   {
83     if (theGlCtx->IsValid())
84     {
85       glDeleteLists ((GLuint )myLinestyleBase, 5);
86     }
87     myLinestyleBase = 0;
88   }
89   // Delete surface patterns
90   if (myPatternBase != 0)
91   {
92     if (theGlCtx->IsValid())
93     {
94       glDeleteLists ((GLuint )myPatternBase, TEL_HS_USER_DEF_START);
95     }
96     myPatternBase = 0;
97   }
98 }
99
100 /*----------------------------------------------------------------------*/
101
102 void OpenGl_Display::Init()
103 {
104   if (myDisplay != NULL)
105   {
106   #if (!defined(_WIN32) && !defined(__WIN32__) && (!defined(__APPLE__) || defined(MACOSX_USE_GLX)))
107     XSynchronize ((Display* )myDisplay, (getenv("CALL_SYNCHRO_X") != NULL) ? 1 : 0);
108
109     if (getenv("CSF_GraphicSync") != NULL)
110       XSynchronize ((Display* )myDisplay, 1);
111
112     // does the server know about OpenGL & GLX?
113     int aDummy;
114     if (!XQueryExtension ((Display* )myDisplay, "GLX", &aDummy, &aDummy, &aDummy))
115     {
116     #ifdef DEBUG
117       std::cerr << "This system doesn't appear to support OpenGL\n";
118     #endif
119     }
120   #endif
121   }
122   else
123   {
124     TCollection_AsciiString msg("OpenGl_Display::Init");
125   #if (!defined(_WIN32) && !defined(__WIN32__) && (!defined(__APPLE__) || defined(MACOSX_USE_GLX)))
126     msg += " : Cannot connect to X server ";
127     msg += XDisplayName ((char*) NULL);
128   #endif
129     Aspect_GraphicDeviceDefinitionError::Raise(msg.ToCString());
130   }
131
132   if (getenv("CALL_OPENGL_NO_DBF") != NULL)
133     myDBuffer = Standard_False;
134
135   if (getenv("CALL_OPENGL_NO_DITHER") != NULL)
136     myDither = Standard_False;
137
138   if (getenv("CALL_OPENGL_NO_BACKDITHER") != NULL)
139     myBackDither = Standard_False;
140
141   if (getenv("CSF_WALKTHROUGH") != NULL)
142     myWalkthrough = Standard_True;
143
144   /* OCC18942: Test if symmetric perspective projection should be turned on */
145   if (getenv("CSF_SYM_PERSPECTIVE") != NULL)
146     mySymPerspective = Standard_True;
147
148   const char* pvalue = getenv("CALL_OPENGL_POLYGON_OFFSET");
149   if (pvalue)
150   {
151     float v1, v2;
152     const int n = sscanf(pvalue, "%f %f", &v1, &v2);
153     if (n > 0) myOffsetFactor = v1;
154     if (n > 1) myOffsetUnits  = v2;
155   }
156
157   pvalue = getenv("CALL_OPENGL_ANTIALIASING_MODE");
158   if (pvalue)
159   {
160     int v;
161     if ( sscanf(pvalue,"%d",&v) > 0 ) myAntiAliasingMode = v;
162   }
163 }