| """GLX (x-windows)-specific platform features""" |
| import ctypes, ctypes.util |
| from functools import wraps |
| from OpenGL.platform import baseplatform, ctypesloader |
|
|
| class GLXPlatform( baseplatform.BasePlatform ): |
| """Posix (Linux, FreeBSD, etceteras) implementation for PyOpenGL""" |
| |
| |
| |
| @baseplatform.lazy_property |
| def GL(self): |
| try: |
| return ctypesloader.loadLibrary( |
| ctypes.cdll, |
| 'GL', |
| mode=ctypes.RTLD_GLOBAL |
| ) |
| except OSError as err: |
| raise ImportError("Unable to load OpenGL library", *err.args) |
| @baseplatform.lazy_property |
| def GLU(self): |
| try: |
| return ctypesloader.loadLibrary( |
| ctypes.cdll, |
| 'GLU', |
| mode=ctypes.RTLD_GLOBAL |
| ) |
| except OSError as err: |
| return None |
| @baseplatform.lazy_property |
| def GLUT( self ): |
| try: |
| return ctypesloader.loadLibrary( |
| ctypes.cdll, |
| 'glut', |
| mode=ctypes.RTLD_GLOBAL |
| ) |
| except OSError as err: |
| return None |
| |
| @baseplatform.lazy_property |
| def GLX(self): return self.GL |
|
|
| @baseplatform.lazy_property |
| def GLES1(self): |
| try: |
| return ctypesloader.loadLibrary( |
| ctypes.cdll, |
| 'GLESv1_CM', |
| mode=ctypes.RTLD_GLOBAL |
| ) |
| except OSError as err: |
| return None |
| @baseplatform.lazy_property |
| def GLES2(self): |
| try: |
| return ctypesloader.loadLibrary( |
| ctypes.cdll, |
| 'GLESv2', |
| mode=ctypes.RTLD_GLOBAL |
| ) |
| except OSError as err: |
| return None |
| @baseplatform.lazy_property |
| def GLES3(self): |
| |
| return self.GLES2 |
| |
| @baseplatform.lazy_property |
| def glXGetProcAddressARB(self): |
| base = self.GLX.glXGetProcAddressARB |
| base.restype = ctypes.c_void_p |
| return base |
| @baseplatform.lazy_property |
| def getExtensionProcedure(self): |
| return self.glXGetProcAddressARB |
| |
| @baseplatform.lazy_property |
| def GLE( self ): |
| try: |
| return ctypesloader.loadLibrary( |
| ctypes.cdll, |
| 'gle', |
| mode=ctypes.RTLD_GLOBAL |
| ) |
| except OSError as err: |
| return None |
|
|
| DEFAULT_FUNCTION_TYPE = staticmethod( ctypes.CFUNCTYPE ) |
|
|
| |
| |
| @baseplatform.lazy_property |
| def GetCurrentContext( self ): |
| return self.GL.glXGetCurrentContext |
|
|
| def getGLUTFontPointer( self, constant ): |
| """Platform specific function to retrieve a GLUT font pointer |
| |
| GLUTAPI void *glutBitmap9By15; |
| #define GLUT_BITMAP_9_BY_15 (&glutBitmap9By15) |
| |
| Key here is that we want the addressof the pointer in the DLL, |
| not the pointer in the DLL. That is, our pointer is to the |
| pointer defined in the DLL, we don't want the *value* stored in |
| that pointer. |
| """ |
| name = [ x.title() for x in constant.split( '_' )[1:] ] |
| internal = 'glut' + "".join( [x.title() for x in name] ) |
| pointer = ctypes.c_void_p.in_dll( self.GLUT, internal ) |
| return ctypes.c_void_p(ctypes.addressof(pointer)) |
| |
| @baseplatform.lazy_property |
| def glGetError( self ): |
| return self.GL.glGetError |
| |
|
|