medfall

Unnamed repository; edit this file 'description' to name the repository.
Log | Files | Refs

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)