0023076: Empty result done by intersection algorithm for a curve and a surface
[occt.git] / src / OpenGl / OpenGl_Context.hxx
CommitLineData
b311480e 1// Created on: 2012-01-26
2// Created by: Kirill GAVRILOV
3// Copyright (c) 2012-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
SK
20
21#ifndef _OpenGl_Context_H__
22#define _OpenGl_Context_H__
23
2bd4c032 24#include <Aspect_Handle.hxx>
25#include <Aspect_Drawable.hxx>
26#include <Aspect_Display.hxx>
27#include <Aspect_RenderingContext.hxx>
2166f0fa
SK
28#include <Standard_Transient.hxx>
29#include <Handle_OpenGl_Context.hxx>
30
5f8b738e 31//! Forward declarations
32struct OpenGl_GlCore12;
33struct OpenGl_GlCore13;
34struct OpenGl_GlCore14;
35struct OpenGl_GlCore15;
36struct OpenGl_GlCore20;
37struct OpenGl_ArbVBO;
38struct OpenGl_ExtFBO;
2166f0fa 39
5f8b738e 40//! This class generalize access to the GL context and available extensions.
41//!
42//! Functions are grouped into structures and accessed as fields.
43//! You should check the group for NULL before usage (if group is not NULL
44//! then all functions are available):
45//! @code
46//! if (myContext->core20 != NULL)
47//! {
48//! myGlProgram = myContext->core20->glCreateProgram();
49//! .. do more stuff ..
50//! }
51//! else
52//! {
53//! .. compatibility with outdated configurations ..
54//! }
55//! @endcode
56//!
57//! Current implementation provide access to OpenGL core functionality up to 2.0 version
58//! (core12, core13, core14, core15, fields core20).
59//! within several extensions (arbVBO, extFBO, etc.).
60//!
61//! Simplified extensions classification:
62//! - prefixed with NV, AMD, ATI are vendor-specific (however may be provided by other vendors in some cases);
63//! - prefixed with EXT are accepted by 2+ vendors;
64//! - prefixed with ARB are accepted by Architecture Review Board and are candidates
65//! for inclusion into GL core functionality.
66//! Some functionality can be represented in several extensions simultaneously.
67//! In this case developer should be careful because different specification may differ
68//! in aspects (like enumeration values and error-handling).
69//!
70//! Notice that some systems provide mechanisms to simultaneously incorporate with GL contexts
71//! with different capabilities. Thats why OpenGl_Context should be initialized and used
72//! for each GL context individually.
2166f0fa
SK
73class OpenGl_Context : public Standard_Transient
74{
75public:
76
5f8b738e 77 //! Empty constructor. You should call Init() to perform initialization with bound GL context.
78 Standard_EXPORT OpenGl_Context();
79
80 //! Destructor.
81 Standard_EXPORT virtual ~OpenGl_Context();
2166f0fa
SK
82
83 //! Initialize available extensions.
84 //! GL context should be active!
5f8b738e 85 Standard_EXPORT void Init();
2166f0fa 86
2bd4c032 87#if (defined(_WIN32) || defined(__WIN32__))
88 Standard_EXPORT void Init (const Aspect_Handle theWindow,
89 const Aspect_Handle theWindowDC,
90 const Aspect_RenderingContext theGContext);
91#else
92 Standard_EXPORT void Init (const Aspect_Drawable theWindow,
93 const Aspect_Display theDisplay,
94 const Aspect_RenderingContext theGContext);
95#endif
96
5f8b738e 97 //! Check if theExtName extension is supported by active GL context.
2bd4c032 98 Standard_EXPORT Standard_Boolean CheckExtension (const char* theExtName) const;
2166f0fa
SK
99
100 //! Auxiliary template to retrieve GL function pointer.
5f8b738e 101 //! Pointer to function retrieved from library is statically casted
102 //! to requested type - there no way to check real signature of exported function.
2166f0fa
SK
103 //! The context should be bound before call.
104 template <typename FuncType_t>
5f8b738e 105 Standard_Boolean FindProc (const char* theFuncName,
106 FuncType_t& theFuncPtr)
2166f0fa 107 {
5f8b738e 108 theFuncPtr = (FuncType_t )findProc (theFuncName);
2166f0fa
SK
109 return (theFuncPtr != NULL);
110 }
111
2bd4c032 112 //! @return true if detected GL version is greater or equal to requested one.
113 inline Standard_Boolean IsGlGreaterEqual (const Standard_Integer theVerMajor,
114 const Standard_Integer theVerMinor)
5f8b738e 115 {
116 return (myGlVerMajor > theVerMajor)
117 || (myGlVerMajor == theVerMajor && myGlVerMinor >= theVerMinor);
118 }
119
120 //! Clean up errors stack for this GL context (glGetError() in loop).
121 Standard_EXPORT void ResetErrors();
122
2bd4c032 123 //! Activates current context.
124 //! Class should be initialized with appropriate info.
125 Standard_EXPORT Standard_Boolean MakeCurrent();
126
664cae74 127 //! Return true if active mode is GL_FEEDBACK (cached state)
128 Standard_EXPORT Standard_Boolean IsFeedback() const;
129
130 //! Setup feedback mode cached state
131 Standard_EXPORT void SetFeedback (const Standard_Boolean theFeedbackOn);
132
5f8b738e 133private:
134
135 //! Wrapper to system function to retrieve GL function pointer by name.
136 Standard_EXPORT void* findProc (const char* theFuncName);
137
138 //! Read OpenGL version information from active context.
139 Standard_EXPORT void readGlVersion();
140
141 //! Private initialization function that should be called only once.
142 Standard_EXPORT void init();
143
144public: // core profiles
145
146 OpenGl_GlCore12* core12;
147 OpenGl_GlCore13* core13;
148 OpenGl_GlCore14* core14;
149 OpenGl_GlCore15* core15;
150 OpenGl_GlCore20* core20;
151
152public: // extensions
153
154 OpenGl_ArbVBO* arbVBO;
155 OpenGl_ExtFBO* extFBO;
156
157private:
2166f0fa 158
2bd4c032 159#if (defined(_WIN32) || defined(__WIN32__))
160 Aspect_Handle myWindow; //!< window handle (owner of GL context) : HWND
161 Aspect_Handle myWindowDC; //!< Device Descriptor handle : HDC
162 Aspect_RenderingContext myGContext; //!< Rendering Context handle : HGLRC
163#else
164 Aspect_Drawable myWindow; //!< window handle (owner of GL context) : GLXDrawable
165 Aspect_Display myDisplay; //!< connection to the X-server : Display*
166 Aspect_RenderingContext myGContext; //!< X-GLX rendering context : GLXContext
167#endif
168
5f8b738e 169 void* myGlLibHandle; //!< optional handle to GL library
170 OpenGl_GlCore20* myGlCore20; //!< common structure for GL core functions upto 2.0
171 Standard_Integer myGlVerMajor; //!< cached GL version major number
172 Standard_Integer myGlVerMinor; //!< cached GL version minor number
664cae74 173 Standard_Boolean myIsFeedback; //!< flag indicates GL_FEEDBACK mode
5f8b738e 174 Standard_Boolean myIsInitialized; //!< flag to indicate initialization state
2166f0fa
SK
175
176public:
177
5f8b738e 178 DEFINE_STANDARD_RTTI(OpenGl_Context) // Type definition
2166f0fa
SK
179
180};
181
182#endif // _OpenGl_Context_H__