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