gl.py (3460B)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 | from glad.lang.common.loader import BaseLoader from glad.lang.nim.loader import LOAD_OPENGL_DLL _OPENGL_LOADER = \ LOAD_OPENGL_DLL % {'pre':'private', 'init':'open_gl', 'proc':'get_proc', 'terminate':'close_gl'} + ''' bool gladLoadGL() bool status = false if(open_gl()) status = gladLoadGL(x => get_proc(x)) close_gl() return status ''' _OPENGL_HAS_EXT_LT3 = '''proc hasExt(extname: string): bool = if extname == nil: return false var extensions = $cast[cstring](glGetString(GL_EXTENSIONS)) if extensions == nil: return false var loc, terminatorLoc: int terminator: char while true: loc = extensions.find(extname) if loc < 0: return false terminatorLoc = loc + extname.len terminator = extensions[terminatorLoc] if (loc == 0 or extensions[loc - 1] == ' ') and (terminator == ' ' or terminator == '\\0'): return true extensions = extensions[terminatorLoc..^1] ''' _OPENGL_HAS_EXT_GTE3 = '''proc hasExt(extname: string): bool = if extname == nil: return false if glVersionMajor < 3: var extensions = $cast[cstring](glGetString(GL_EXTENSIONS)) if extensions == nil: return false var loc, terminatorLoc: int terminator: char while true: loc = extensions.find(extname) if loc < 0: return false terminatorLoc = loc + extname.len terminator = extensions[terminatorLoc] if (loc == 0 or extensions[loc - 1] == ' ') and (terminator == ' ' or terminator == '\\0'): return true extensions = extensions[terminatorLoc..^1] else: var num: GLint s: cstring glGetIntegerv(GL_NUM_EXTENSIONS, num.addr) for i in 0..num-1: s = cast[cstring](glGetStringi(GL_EXTENSIONS, GLuint(i))) if s == extname: return true ''' _FIND_VERSION = ''' # Thank you @elmindreda # https://github.com/elmindreda/greg/blob/master/templates/greg.c.in#L176 # https://github.com/glfw/glfw/blob/master/src/context.c#L36 var prefixes = ["OpenGL ES-CM ", "OpenGL ES-CL ", "OpenGL ES "] var version = glVersion for p in prefixes: if version.startsWith(p): version = version.replace(p) break var major = ord(glVersion[0]) - ord('0') var minor = ord(glVersion[2]) - ord('0') glVersionMajor = major glVersionMinor = minor ''' _BEGIN_LOAD = ''' glGetString = cast[proc (name: GLenum): ptr GLubyte {.cdecl.}](load("glGetString")) if glGetString == nil: return false var glVersion = cast[cstring](glGetString(GL_VERSION)) if glVersion == nil: return false ''' class OpenGLNimLoader(BaseLoader): def write_header_end(self, fobj): pass def write_header(self, fobj): pass def write(self, fobj): pass # TODO # if not self.disabled and 'gl' in self.apis: # fobj.write(_OPENGL_LOADER) def write_begin_load(self, fobj): fobj.write(_BEGIN_LOAD) def write_end_load(self, fobj): fobj.write('\n return glVersionMajor != 0 or glVersionMinor != 0\n') def write_find_core(self, fobj): fobj.write(_FIND_VERSION) def write_has_ext(self, fobj, apiversion): if apiversion.major == 1 and apiversion.minor == 0: return if apiversion.major < 3: fobj.write(_OPENGL_HAS_EXT_LT3) else: fobj.write(_OPENGL_HAS_EXT_GTE3) |