pyglet 2.1.13__py3-none-any.whl → 3.0.dev1__py3-none-any.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (267) hide show
  1. pyglet/__init__.py +67 -61
  2. pyglet/__init__.pyi +15 -8
  3. pyglet/app/__init__.py +22 -13
  4. pyglet/app/async_app.py +212 -0
  5. pyglet/app/base.py +2 -1
  6. pyglet/app/{xlib.py → linux.py} +3 -3
  7. pyglet/config/__init__.py +101 -0
  8. pyglet/config/gl/__init__.py +30 -0
  9. pyglet/config/gl/egl.py +120 -0
  10. pyglet/config/gl/macos.py +262 -0
  11. pyglet/config/gl/windows.py +267 -0
  12. pyglet/config/gl/x11.py +142 -0
  13. pyglet/customtypes.py +43 -2
  14. pyglet/display/__init__.py +8 -6
  15. pyglet/display/base.py +3 -63
  16. pyglet/display/cocoa.py +12 -17
  17. pyglet/display/emscripten.py +39 -0
  18. pyglet/display/headless.py +23 -30
  19. pyglet/display/wayland.py +157 -0
  20. pyglet/display/win32.py +5 -21
  21. pyglet/display/xlib.py +19 -27
  22. pyglet/display/xlib_vidmoderestore.py +2 -2
  23. pyglet/enums.py +183 -0
  24. pyglet/event.py +0 -1
  25. pyglet/experimental/geoshader_sprite.py +15 -13
  26. pyglet/experimental/hidraw.py +6 -15
  27. pyglet/experimental/multitexture_sprite.py +31 -19
  28. pyglet/experimental/particles.py +13 -35
  29. pyglet/font/__init__.py +251 -85
  30. pyglet/font/base.py +116 -61
  31. pyglet/font/dwrite/__init__.py +349 -204
  32. pyglet/font/dwrite/dwrite_lib.py +27 -5
  33. pyglet/font/fontconfig.py +14 -6
  34. pyglet/font/freetype.py +138 -87
  35. pyglet/font/freetype_lib.py +19 -0
  36. pyglet/font/group.py +179 -0
  37. pyglet/font/harfbuzz/__init__.py +3 -3
  38. pyglet/font/pyodide_js.py +310 -0
  39. pyglet/font/quartz.py +319 -126
  40. pyglet/font/ttf.py +45 -3
  41. pyglet/font/user.py +14 -19
  42. pyglet/font/win32.py +45 -21
  43. pyglet/graphics/__init__.py +8 -787
  44. pyglet/graphics/allocation.py +115 -1
  45. pyglet/graphics/api/__init__.py +77 -0
  46. pyglet/graphics/api/base.py +299 -0
  47. pyglet/graphics/api/gl/__init__.py +58 -0
  48. pyglet/graphics/api/gl/base.py +24 -0
  49. pyglet/graphics/{vertexbuffer.py → api/gl/buffer.py} +104 -159
  50. pyglet/graphics/api/gl/cocoa/context.py +76 -0
  51. pyglet/graphics/api/gl/context.py +391 -0
  52. pyglet/graphics/api/gl/default_shaders.py +0 -0
  53. pyglet/graphics/api/gl/draw.py +627 -0
  54. pyglet/graphics/api/gl/egl/__init__.py +0 -0
  55. pyglet/graphics/api/gl/egl/context.py +92 -0
  56. pyglet/graphics/api/gl/enums.py +76 -0
  57. pyglet/graphics/api/gl/framebuffer.py +315 -0
  58. pyglet/graphics/api/gl/gl.py +5463 -0
  59. pyglet/graphics/api/gl/gl_info.py +188 -0
  60. pyglet/graphics/api/gl/global_opengl.py +226 -0
  61. pyglet/{gl → graphics/api/gl}/lib.py +34 -18
  62. pyglet/graphics/api/gl/shader.py +1476 -0
  63. pyglet/graphics/api/gl/shapes.py +55 -0
  64. pyglet/graphics/api/gl/sprite.py +102 -0
  65. pyglet/graphics/api/gl/state.py +219 -0
  66. pyglet/graphics/api/gl/text.py +190 -0
  67. pyglet/graphics/api/gl/texture.py +1526 -0
  68. pyglet/graphics/{vertexarray.py → api/gl/vertexarray.py} +11 -13
  69. pyglet/graphics/api/gl/vertexdomain.py +751 -0
  70. pyglet/graphics/api/gl/win32/__init__.py +0 -0
  71. pyglet/graphics/api/gl/win32/context.py +108 -0
  72. pyglet/graphics/api/gl/win32/wgl_info.py +24 -0
  73. pyglet/graphics/api/gl/xlib/__init__.py +0 -0
  74. pyglet/graphics/api/gl/xlib/context.py +174 -0
  75. pyglet/{gl → graphics/api/gl/xlib}/glx_info.py +26 -31
  76. pyglet/graphics/api/gl1/__init__.py +0 -0
  77. pyglet/{gl → graphics/api/gl1}/gl_compat.py +3 -2
  78. pyglet/graphics/api/gl2/__init__.py +0 -0
  79. pyglet/graphics/api/gl2/buffer.py +320 -0
  80. pyglet/graphics/api/gl2/draw.py +600 -0
  81. pyglet/graphics/api/gl2/global_opengl.py +122 -0
  82. pyglet/graphics/api/gl2/shader.py +200 -0
  83. pyglet/graphics/api/gl2/shapes.py +51 -0
  84. pyglet/graphics/api/gl2/sprite.py +79 -0
  85. pyglet/graphics/api/gl2/text.py +175 -0
  86. pyglet/graphics/api/gl2/vertexdomain.py +364 -0
  87. pyglet/graphics/api/webgl/__init__.py +233 -0
  88. pyglet/graphics/api/webgl/buffer.py +302 -0
  89. pyglet/graphics/api/webgl/context.py +234 -0
  90. pyglet/graphics/api/webgl/draw.py +590 -0
  91. pyglet/graphics/api/webgl/enums.py +76 -0
  92. pyglet/graphics/api/webgl/framebuffer.py +360 -0
  93. pyglet/graphics/api/webgl/gl.py +1537 -0
  94. pyglet/graphics/api/webgl/gl_info.py +130 -0
  95. pyglet/graphics/api/webgl/shader.py +1346 -0
  96. pyglet/graphics/api/webgl/shapes.py +92 -0
  97. pyglet/graphics/api/webgl/sprite.py +102 -0
  98. pyglet/graphics/api/webgl/state.py +227 -0
  99. pyglet/graphics/api/webgl/text.py +187 -0
  100. pyglet/graphics/api/webgl/texture.py +1227 -0
  101. pyglet/graphics/api/webgl/vertexarray.py +54 -0
  102. pyglet/graphics/api/webgl/vertexdomain.py +616 -0
  103. pyglet/graphics/api/webgl/webgl_js.pyi +307 -0
  104. pyglet/{image → graphics}/atlas.py +33 -32
  105. pyglet/graphics/base.py +10 -0
  106. pyglet/graphics/buffer.py +245 -0
  107. pyglet/graphics/draw.py +578 -0
  108. pyglet/graphics/framebuffer.py +26 -0
  109. pyglet/graphics/instance.py +178 -69
  110. pyglet/graphics/shader.py +267 -1553
  111. pyglet/graphics/state.py +83 -0
  112. pyglet/graphics/texture.py +703 -0
  113. pyglet/graphics/vertexdomain.py +695 -538
  114. pyglet/gui/ninepatch.py +10 -10
  115. pyglet/gui/widgets.py +120 -10
  116. pyglet/image/__init__.py +20 -1973
  117. pyglet/image/animation.py +12 -12
  118. pyglet/image/base.py +730 -0
  119. pyglet/image/codecs/__init__.py +9 -0
  120. pyglet/image/codecs/bmp.py +53 -30
  121. pyglet/image/codecs/dds.py +53 -31
  122. pyglet/image/codecs/gdiplus.py +38 -14
  123. pyglet/image/codecs/gdkpixbuf2.py +0 -2
  124. pyglet/image/codecs/js_image.py +99 -0
  125. pyglet/image/codecs/ktx2.py +161 -0
  126. pyglet/image/codecs/pil.py +1 -1
  127. pyglet/image/codecs/png.py +1 -1
  128. pyglet/image/codecs/wic.py +11 -2
  129. pyglet/info.py +26 -24
  130. pyglet/input/__init__.py +8 -0
  131. pyglet/input/base.py +163 -105
  132. pyglet/input/controller.py +13 -19
  133. pyglet/input/controller_db.py +39 -24
  134. pyglet/input/emscripten/__init__.py +18 -0
  135. pyglet/input/emscripten/gamepad_js.py +397 -0
  136. pyglet/input/linux/__init__.py +11 -5
  137. pyglet/input/linux/evdev.py +10 -11
  138. pyglet/input/linux/x11_xinput.py +2 -2
  139. pyglet/input/linux/x11_xinput_tablet.py +1 -1
  140. pyglet/input/macos/__init__.py +7 -2
  141. pyglet/input/macos/darwin_gc.py +559 -0
  142. pyglet/input/win32/__init__.py +1 -1
  143. pyglet/input/win32/directinput.py +34 -29
  144. pyglet/input/win32/xinput.py +11 -61
  145. pyglet/lib.py +3 -3
  146. pyglet/libs/__init__.py +1 -1
  147. pyglet/{gl → libs/darwin}/agl.py +1 -1
  148. pyglet/libs/darwin/cocoapy/__init__.py +2 -2
  149. pyglet/libs/darwin/cocoapy/cocoahelpers.py +181 -0
  150. pyglet/libs/darwin/cocoapy/cocoalibs.py +31 -0
  151. pyglet/libs/darwin/cocoapy/cocoatypes.py +27 -0
  152. pyglet/libs/darwin/cocoapy/runtime.py +81 -45
  153. pyglet/libs/darwin/coreaudio.py +4 -4
  154. pyglet/{gl → libs/darwin}/lib_agl.py +9 -8
  155. pyglet/libs/darwin/quartzkey.py +1 -3
  156. pyglet/libs/egl/__init__.py +2 -0
  157. pyglet/libs/egl/egl_lib.py +576 -0
  158. pyglet/libs/egl/eglext.py +51 -5
  159. pyglet/libs/linux/__init__.py +0 -0
  160. pyglet/libs/linux/egl/__init__.py +0 -0
  161. pyglet/libs/linux/egl/eglext.py +22 -0
  162. pyglet/libs/linux/glx/__init__.py +0 -0
  163. pyglet/{gl → libs/linux/glx}/glx.py +13 -14
  164. pyglet/{gl → libs/linux/glx}/glxext_arb.py +408 -192
  165. pyglet/{gl → libs/linux/glx}/glxext_mesa.py +1 -1
  166. pyglet/{gl → libs/linux/glx}/glxext_nv.py +345 -164
  167. pyglet/{gl → libs/linux/glx}/lib_glx.py +3 -2
  168. pyglet/libs/linux/wayland/__init__.py +0 -0
  169. pyglet/libs/linux/wayland/client.py +1068 -0
  170. pyglet/libs/linux/wayland/lib_wayland.py +207 -0
  171. pyglet/libs/linux/wayland/wayland_egl.py +38 -0
  172. pyglet/libs/{wayland → linux/wayland}/xkbcommon.py +26 -0
  173. pyglet/libs/{x11 → linux/x11}/xf86vmode.py +4 -4
  174. pyglet/libs/{x11 → linux/x11}/xinerama.py +2 -2
  175. pyglet/libs/{x11 → linux/x11}/xinput.py +10 -10
  176. pyglet/libs/linux/x11/xrandr.py +0 -0
  177. pyglet/libs/{x11 → linux/x11}/xrender.py +1 -1
  178. pyglet/libs/shared/__init__.py +0 -0
  179. pyglet/libs/shared/spirv/__init__.py +0 -0
  180. pyglet/libs/shared/spirv/lib_shaderc.py +85 -0
  181. pyglet/libs/shared/spirv/lib_spirv_cross.py +126 -0
  182. pyglet/libs/win32/__init__.py +28 -8
  183. pyglet/libs/win32/constants.py +59 -48
  184. pyglet/libs/win32/context_managers.py +20 -3
  185. pyglet/libs/win32/dinput.py +105 -88
  186. pyglet/{gl → libs/win32}/lib_wgl.py +52 -26
  187. pyglet/libs/win32/types.py +58 -23
  188. pyglet/{gl → libs/win32}/wgl.py +32 -25
  189. pyglet/{gl → libs/win32}/wglext_arb.py +364 -2
  190. pyglet/media/__init__.py +9 -10
  191. pyglet/media/codecs/__init__.py +12 -1
  192. pyglet/media/codecs/base.py +99 -96
  193. pyglet/media/codecs/ffmpeg.py +2 -2
  194. pyglet/media/codecs/ffmpeg_lib/libavformat.py +3 -8
  195. pyglet/media/codecs/webaudio_pyodide.py +111 -0
  196. pyglet/media/drivers/__init__.py +9 -4
  197. pyglet/media/drivers/base.py +4 -4
  198. pyglet/media/drivers/openal/__init__.py +1 -1
  199. pyglet/media/drivers/openal/adaptation.py +3 -3
  200. pyglet/media/drivers/pulse/__init__.py +1 -1
  201. pyglet/media/drivers/pulse/adaptation.py +3 -3
  202. pyglet/media/drivers/pyodide_js/__init__.py +8 -0
  203. pyglet/media/drivers/pyodide_js/adaptation.py +288 -0
  204. pyglet/media/drivers/xaudio2/adaptation.py +3 -3
  205. pyglet/media/player.py +276 -193
  206. pyglet/media/player_worker_thread.py +1 -1
  207. pyglet/model/__init__.py +39 -29
  208. pyglet/model/codecs/base.py +4 -4
  209. pyglet/model/codecs/gltf.py +3 -3
  210. pyglet/model/codecs/obj.py +71 -43
  211. pyglet/resource.py +129 -78
  212. pyglet/shapes.py +154 -194
  213. pyglet/sprite.py +47 -164
  214. pyglet/text/__init__.py +44 -54
  215. pyglet/text/caret.py +12 -7
  216. pyglet/text/document.py +19 -17
  217. pyglet/text/formats/html.py +2 -2
  218. pyglet/text/formats/structured.py +10 -40
  219. pyglet/text/layout/__init__.py +20 -13
  220. pyglet/text/layout/base.py +176 -287
  221. pyglet/text/layout/incremental.py +9 -10
  222. pyglet/text/layout/scrolling.py +7 -95
  223. pyglet/window/__init__.py +183 -172
  224. pyglet/window/cocoa/__init__.py +62 -51
  225. pyglet/window/cocoa/pyglet_delegate.py +2 -25
  226. pyglet/window/cocoa/pyglet_view.py +9 -8
  227. pyglet/window/dialog/__init__.py +184 -0
  228. pyglet/window/dialog/base.py +99 -0
  229. pyglet/window/dialog/darwin.py +121 -0
  230. pyglet/window/dialog/linux.py +72 -0
  231. pyglet/window/dialog/windows.py +194 -0
  232. pyglet/window/emscripten/__init__.py +779 -0
  233. pyglet/window/headless/__init__.py +44 -28
  234. pyglet/window/key.py +2 -0
  235. pyglet/window/mouse.py +2 -2
  236. pyglet/window/wayland/__init__.py +377 -0
  237. pyglet/window/win32/__init__.py +101 -46
  238. pyglet/window/xlib/__init__.py +104 -66
  239. {pyglet-2.1.13.dist-info → pyglet-3.0.dev1.dist-info}/METADATA +2 -3
  240. pyglet-3.0.dev1.dist-info/RECORD +322 -0
  241. {pyglet-2.1.13.dist-info → pyglet-3.0.dev1.dist-info}/WHEEL +1 -1
  242. pyglet/gl/__init__.py +0 -208
  243. pyglet/gl/base.py +0 -499
  244. pyglet/gl/cocoa.py +0 -309
  245. pyglet/gl/gl.py +0 -4625
  246. pyglet/gl/gl.pyi +0 -2320
  247. pyglet/gl/gl_compat.pyi +0 -3097
  248. pyglet/gl/gl_info.py +0 -190
  249. pyglet/gl/headless.py +0 -166
  250. pyglet/gl/wgl_info.py +0 -36
  251. pyglet/gl/wglext_nv.py +0 -1096
  252. pyglet/gl/win32.py +0 -268
  253. pyglet/gl/xlib.py +0 -295
  254. pyglet/image/buffer.py +0 -274
  255. pyglet/image/codecs/s3tc.py +0 -354
  256. pyglet/libs/x11/xrandr.py +0 -166
  257. pyglet-2.1.13.dist-info/RECORD +0 -234
  258. /pyglet/{libs/wayland → graphics/api/gl/cocoa}/__init__.py +0 -0
  259. /pyglet/libs/{egl → linux/egl}/egl.py +0 -0
  260. /pyglet/libs/{egl → linux/egl}/lib.py +0 -0
  261. /pyglet/libs/{ioctl.py → linux/ioctl.py} +0 -0
  262. /pyglet/libs/{wayland → linux/wayland}/gbm.py +0 -0
  263. /pyglet/libs/{x11 → linux/x11}/__init__.py +0 -0
  264. /pyglet/libs/{x11 → linux/x11}/cursorfont.py +0 -0
  265. /pyglet/libs/{x11 → linux/x11}/xlib.py +0 -0
  266. /pyglet/libs/{x11 → linux/x11}/xsync.py +0 -0
  267. {pyglet-2.1.13.dist-info/licenses → pyglet-3.0.dev1.dist-info}/LICENSE +0 -0
@@ -0,0 +1,391 @@
1
+ from __future__ import annotations
2
+
3
+ import threading
4
+ import weakref
5
+ from typing import Callable, TYPE_CHECKING
6
+
7
+ from pyglet.graphics.api.gl import gl, gl_info, ObjectSpace
8
+ from pyglet.graphics.api.base import SurfaceContext
9
+ from pyglet.graphics.api.gl.gl import GLFunctions, GLuint, GL_COLOR_BUFFER_BIT, GL_DEPTH_BUFFER_BIT
10
+
11
+
12
+ if TYPE_CHECKING:
13
+ from pyglet.config import SurfaceConfig
14
+ from pyglet.graphics.api.gl.shader import GLDataType, GLFunc
15
+ from ctypes import Array
16
+ from pyglet.window import Window
17
+ from pyglet.graphics.api.gl.xlib.glx_info import GLXInfo
18
+ from pyglet.graphics.api.gl.win32.wgl_info import WGLInfo
19
+ from pyglet.graphics.api.gl.global_opengl import OpenGLBackend
20
+ from pyglet.graphics.api.gl.framebuffer import Framebuffer
21
+
22
+
23
+ class OpenGLSurfaceContext(SurfaceContext, GLFunctions):
24
+ """A base OpenGL context for drawing.
25
+
26
+ Use ``DisplayConfig.create_context`` to create a context.
27
+ """
28
+ gles_pixel_fbo: Framebuffer | None
29
+ #: gl_info.GLInfo instance, filled in on first set_current
30
+ _info: gl_info.GLInfo | None = None
31
+
32
+ #: A container which is shared between all contexts that share GL objects.
33
+ object_space: ObjectSpace
34
+ config: SurfaceConfig
35
+ context_share: OpenGLSurfaceContext | None
36
+
37
+ def __init__(self, core: OpenGLBackend,
38
+ window: Window,
39
+ config: SurfaceConfig,
40
+ platform_info: GLXInfo | WGLInfo | None = None,
41
+ context_share: OpenGLSurfaceContext | None = None,
42
+ platform_func_class: type | None = None) -> None:
43
+ """Initialize a context.
44
+
45
+ Args:
46
+ config:
47
+ An operating system specific config.
48
+ context_share:
49
+ A context to share objects with. Use ``None`` to disable sharing.
50
+ """
51
+ self._context = None
52
+ self.core = core
53
+ self.window = window
54
+ self.config = config
55
+ #super().__init__(core, window, config)
56
+ self.context_share = context_share
57
+ self.is_current = False
58
+ self._info = gl_info.GLInfo(platform_info)
59
+ self.platform_func_class = platform_func_class
60
+ self.platform_func = None
61
+
62
+ self.doomed_vaos = []
63
+ self.doomed_framebuffers = []
64
+
65
+ if context_share:
66
+ self.object_space = context_share.object_space
67
+ else:
68
+ self.object_space = ObjectSpace()
69
+
70
+ self.cached_programs = weakref.WeakValueDictionary()
71
+
72
+ # GLES needs an FBO to read pixel data.
73
+ self.gles_pixel_fbo = None
74
+
75
+ def resized(self, width, height):
76
+ ...
77
+
78
+ def detach(self):
79
+ self.context = None
80
+
81
+ def __repr__(self) -> str:
82
+ return f"{self.__class__.__name__}(id={id(self)}, share={self.context_share})"
83
+
84
+ def __enter__(self) -> None:
85
+ self.set_current()
86
+
87
+ def __exit__(self, *_args) -> None: # noqa: ANN002
88
+ return
89
+
90
+ def set_clear_color(self, r: float, g: float, b: float, a: float) -> None:
91
+ self.glClearColor(r, g, b, a)
92
+
93
+ def clear(self) -> None:
94
+ self.glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT)
95
+
96
+ def attach(self, window: Window) -> None:
97
+ """Attaches a Window and context to the current window.
98
+
99
+ The OS specific child classes create contexts or GL related OS resources.
100
+
101
+ This mostly exists because of Xlib, as GLXWindow requires XWindow creation before the GLXWindow is created.
102
+ However, the GLX Context needs to be created before the XWindow, due to matching
103
+ assign_config (glx_context is created) -> XWindow creation -> Create GLXWindow
104
+ """
105
+ # if not self.config.compatible(canvas):
106
+ # msg = f'Cannot attach {canvas} to {self}'
107
+ # raise RuntimeError(msg)
108
+ self.window = window
109
+
110
+ def before_draw(self) -> None:
111
+ self.set_current()
112
+
113
+ def set_current(self) -> None:
114
+ """Make this the active Context.
115
+
116
+ Setting the Context current will also delete any OpenGL
117
+ objects that have been queued for deletion. IE: any objects
118
+ that were created in this Context, but have been called for
119
+ deletion while another Context was active.
120
+ """
121
+ # Not per-thread
122
+ self.core.current_context = self
123
+
124
+ if not self._info.was_queried:
125
+ GLFunctions.__init__(self)
126
+ # Move this later to a better platform implementation.
127
+ if not self.platform_func and self.platform_func_class:
128
+ self.platform_func = self.platform_func_class()
129
+ self.uniform_getters, self.uniform_setters = self._get_uniform_func_tables()
130
+ self._info.query(self)
131
+ if self.get_info().get_opengl_api() == "gles":
132
+ from pyglet.graphics.api.gl.framebuffer import Framebuffer
133
+ self.gles_pixel_fbo = Framebuffer(context=self)
134
+
135
+ if self.object_space.doomed_textures:
136
+ self._delete_objects(self.object_space.doomed_textures, self.glDeleteTextures)
137
+ if self.object_space.doomed_buffers:
138
+ self._delete_objects(self.object_space.doomed_buffers, self.glDeleteBuffers)
139
+ if self.object_space.doomed_shader_programs:
140
+ self._delete_objects_one_by_one(self.object_space.doomed_shader_programs,
141
+ self.glDeleteProgram)
142
+ if self.object_space.doomed_shaders:
143
+ self._delete_objects_one_by_one(self.object_space.doomed_shaders, self.glDeleteShader)
144
+ if self.object_space.doomed_renderbuffers:
145
+ self._delete_objects(self.object_space.doomed_renderbuffers, self.glDeleteRenderbuffers)
146
+
147
+ if self.doomed_vaos:
148
+ self._delete_objects(self.doomed_vaos, self.glDeleteVertexArrays)
149
+ if self.doomed_framebuffers:
150
+ self._delete_objects(self.doomed_framebuffers, self.glDeleteFramebuffers)
151
+
152
+ # For the static functions below:
153
+ # The garbage collector introduces a race condition.
154
+ # The provided list might be appended to (and only appended to) while this
155
+ # method runs, as it's a `doomed_*` list either on the context or its bject
156
+ # space. If `count` wasn't stored in a local, this method might leak objects.
157
+ @staticmethod
158
+ def _delete_objects(list_: list, deletion_func: Callable[[int, Array[GLuint]], None]) -> None:
159
+ """Release all OpenGL objects in the given list.
160
+
161
+ Uses the supplied deletion function with the signature ``(GLuint count, GLuint *names)``.
162
+ """
163
+ count = len(list_)
164
+ to_delete = list_[:count]
165
+ del list_[:count]
166
+
167
+ deletion_func(count, (GLuint * count)(*to_delete))
168
+
169
+ @staticmethod
170
+ def _delete_objects_one_by_one(list_: list, deletion_func: Callable[[GLuint], None]) -> None:
171
+ """Release all OpenGL objects in the given list.
172
+
173
+ Similar to ``_delete_objects``, but assumes the deletion function's signature to be ``(GLuint name)``.
174
+
175
+ The function is called for each object.
176
+ """
177
+ count = len(list_)
178
+ to_delete = list_[:count]
179
+ del list_[:count]
180
+
181
+ for name in to_delete:
182
+ deletion_func(GLuint(name))
183
+
184
+ def destroy(self) -> None:
185
+ """Release the Context.
186
+
187
+ The context will not be useable after being destroyed. Each platform
188
+ has its own convention for releasing the context and the buffer(s)
189
+ that depend on it in the correct order; this should never be called
190
+ by an application.
191
+ """
192
+ self.detach()
193
+
194
+ if self.core.current_context is self:
195
+ self.core.current_context = None
196
+ #gl_info.remove_active_context()
197
+
198
+ def _safe_to_operate_on_object_space(self) -> bool:
199
+ """Check if it's safe to interact with this context's object space.
200
+
201
+ This is considered to be the case if the currently active context's
202
+ object space is the same as this context's object space and this
203
+ method is called from the main thread.
204
+ """
205
+ return (self.object_space is self.core.current_context.object_space and
206
+ threading.current_thread() is threading.main_thread())
207
+
208
+ def _safe_to_operate_on(self) -> bool:
209
+ """Check whether it is safe to interact with this context.
210
+
211
+ This is considered to be the case if it's the current context and this
212
+ method is called from the main thread.
213
+ """
214
+ return self.core.current_context is self and threading.current_thread() is threading.main_thread()
215
+
216
+ def delete_texture(self, texture_id: int) -> None:
217
+ """Safely delete a Texture belonging to this context's object space.
218
+
219
+ This method will delete the texture immediately via
220
+ ``glDeleteTextures`` if the current context's object space is the same
221
+ as this context's object space, and it is called from the main thread.
222
+
223
+ Otherwise, the texture will only be marked for deletion, postponing
224
+ it until any context with the same object space becomes active again.
225
+
226
+ This makes it safe to call from anywhere, including other threads.
227
+ """
228
+ if self._safe_to_operate_on_object_space():
229
+ self.glDeleteTextures(1, GLuint(texture_id))
230
+ else:
231
+ self.object_space.doomed_textures.append(texture_id)
232
+
233
+ def delete_buffer(self, buffer_id: int) -> None:
234
+ """Safely delete a Buffer belonging to this context's object space.
235
+
236
+ This method behaves similarly to ``delete_texture``, though for
237
+ ``glDeleteBuffers`` instead of ``glDeleteTextures``.
238
+ """
239
+ if self._safe_to_operate_on_object_space():
240
+ self.glDeleteBuffers(1, GLuint(buffer_id))
241
+ else:
242
+ self.object_space.doomed_buffers.append(buffer_id)
243
+
244
+ def delete_shader_program(self, program_id: int) -> None:
245
+ """Safely delete a ShaderProgram belonging to this context's object space.
246
+
247
+ This method behaves similarly to ``delete_texture``, though for
248
+ ``glDeleteProgram`` instead of ``glDeleteTextures``.
249
+ """
250
+ if self._safe_to_operate_on_object_space():
251
+ self.glDeleteProgram(GLuint(program_id))
252
+ else:
253
+ self.object_space.doomed_shader_programs.append(program_id)
254
+
255
+ def delete_shader(self, shader_id: int) -> None:
256
+ """Safely delete a Shader belonging to this context's object space.
257
+
258
+ This method behaves similarly to ``delete_texture``, though for
259
+ ``glDeleteShader`` instead of ``glDeleteTextures``.
260
+ """
261
+ if self._safe_to_operate_on_object_space():
262
+ self.glDeleteShader(GLuint(shader_id))
263
+ else:
264
+ self.object_space.doomed_shaders.append(shader_id)
265
+
266
+ def delete_renderbuffer(self, rbo_id: int) -> None:
267
+ """Safely delete a Renderbuffer belonging to this context's object space.
268
+
269
+ This method behaves similarly to ``delete_texture``, though for
270
+ ``glDeleteRenderbuffers`` instead of ``glDeleteTextures``.
271
+ """
272
+ if self._safe_to_operate_on_object_space():
273
+ self.glDeleteRenderbuffers(1, GLuint(rbo_id))
274
+ else:
275
+ self.object_space.doomed_renderbuffers.append(rbo_id)
276
+
277
+ def delete_vao(self, vao_id: int) -> None:
278
+ """Safely delete a Vertex Array Object belonging to this context.
279
+
280
+ If this context is not the current context or this method is not
281
+ called from the main thread, its deletion will be postponed until
282
+ this context is next made active again.
283
+
284
+ Otherwise, this method will immediately delete the VAO via
285
+ ``glDeleteVertexArrays``.
286
+ """
287
+ if self._safe_to_operate_on():
288
+ self.glDeleteVertexArrays(1, GLuint(vao_id))
289
+ else:
290
+ self.doomed_vaos.append(vao_id)
291
+
292
+ def delete_framebuffer(self, fbo_id: int) -> None:
293
+ """Safely delete a Framebuffer Object belonging to this context.
294
+
295
+ This method behaves similarly to ``delete_vao``, though for
296
+ ``glDeleteFramebuffers`` instead of ``glDeleteVertexArrays``.
297
+ """
298
+ if self._safe_to_operate_on():
299
+ self.glDeleteFramebuffers(1, GLuint(fbo_id))
300
+ else:
301
+ self.doomed_framebuffers.append(fbo_id)
302
+
303
+ def get_info(self) -> gl_info.GLInfo:
304
+ """Get the :py:class:`~GLInfo` instance for this context."""
305
+ return self._info
306
+
307
+ def _get_uniform_func_tables(self):
308
+ _uniform_getters: dict[GLDataType, Callable] = {
309
+ gl.GLint: self.glGetUniformiv,
310
+ gl.GLfloat: self.glGetUniformfv,
311
+ gl.GLboolean: self.glGetUniformiv,
312
+ }
313
+
314
+ _uniform_setters: dict[int, tuple[GLDataType, GLFunc, GLFunc, int]] = {
315
+ # uniform: gl_type, legacy_setter, setter, length
316
+ gl.GL_BOOL: (gl.GLint, self.glUniform1iv, self.glProgramUniform1iv, 1),
317
+ gl.GL_BOOL_VEC2: (gl.GLint, self.glUniform1iv, self.glProgramUniform1iv, 2),
318
+ gl.GL_BOOL_VEC3: (gl.GLint, self.glUniform1iv, self.glProgramUniform1iv, 3),
319
+ gl.GL_BOOL_VEC4: (gl.GLint, self.glUniform1iv, self.glProgramUniform1iv, 4),
320
+
321
+ gl.GL_INT: (gl.GLint, self.glUniform1iv, self.glProgramUniform1iv, 1),
322
+ gl.GL_INT_VEC2: (gl.GLint, self.glUniform2iv, self.glProgramUniform2iv, 2),
323
+ gl.GL_INT_VEC3: (gl.GLint, self.glUniform3iv, self.glProgramUniform3iv, 3),
324
+ gl.GL_INT_VEC4: (gl.GLint, self.glUniform4iv, self.glProgramUniform4iv, 4),
325
+
326
+ gl.GL_FLOAT: (gl.GLfloat, self.glUniform1fv, self.glProgramUniform1fv, 1),
327
+ gl.GL_FLOAT_VEC2: (gl.GLfloat, self.glUniform2fv, self.glProgramUniform2fv, 2),
328
+ gl.GL_FLOAT_VEC3: (gl.GLfloat, self.glUniform3fv, self.glProgramUniform3fv, 3),
329
+ gl.GL_FLOAT_VEC4: (gl.GLfloat, self.glUniform4fv, self.glProgramUniform4fv, 4),
330
+
331
+ # 1D Samplers
332
+ gl.GL_SAMPLER_1D: (gl.GLint, self.glUniform1iv, self.glProgramUniform1iv, 1),
333
+ gl.GL_SAMPLER_1D_ARRAY: (gl.GLint, self.glUniform1iv, self.glProgramUniform1iv, 1),
334
+ gl.GL_INT_SAMPLER_1D: (gl.GLint, self.glUniform1iv, self.glProgramUniform1iv, 1),
335
+ gl.GL_INT_SAMPLER_1D_ARRAY: (gl.GLint, self.glUniform1iv, self.glProgramUniform1iv, 1),
336
+ gl.GL_UNSIGNED_INT_SAMPLER_1D: (gl.GLint, self.glUniform1iv, self.glProgramUniform1iv, 1),
337
+ gl.GL_UNSIGNED_INT_SAMPLER_1D_ARRAY: (gl.GLint, self.glUniform1iv, self.glProgramUniform1iv, 1),
338
+
339
+ # 2D Samplers
340
+ gl.GL_SAMPLER_2D: (gl.GLint, self.glUniform1iv, self.glProgramUniform1iv, 1),
341
+ gl.GL_SAMPLER_2D_ARRAY: (gl.GLint, self.glUniform1iv, self.glProgramUniform1iv, 1),
342
+ gl.GL_INT_SAMPLER_2D: (gl.GLint, self.glUniform1iv, self.glProgramUniform1iv, 1),
343
+ gl.GL_INT_SAMPLER_2D_ARRAY: (gl.GLint, self.glUniform1iv, self.glProgramUniform1iv, 1),
344
+ gl.GL_UNSIGNED_INT_SAMPLER_2D: (gl.GLint, self.glUniform1iv, self.glProgramUniform1iv, 1),
345
+ gl.GL_UNSIGNED_INT_SAMPLER_2D_ARRAY: (gl.GLint, self.glUniform1iv, self.glProgramUniform1iv, 1),
346
+ # Multisample
347
+ gl.GL_SAMPLER_2D_MULTISAMPLE: (gl.GLint, self.glUniform1iv, self.glProgramUniform1iv, 1),
348
+ gl.GL_INT_SAMPLER_2D_MULTISAMPLE: (gl.GLint, self.glUniform1iv, self.glProgramUniform1iv, 1),
349
+ gl.GL_UNSIGNED_INT_SAMPLER_2D_MULTISAMPLE: (gl.GLint, self.glUniform1iv, self.glProgramUniform1iv, 1),
350
+
351
+ # Cube Samplers
352
+ gl.GL_SAMPLER_CUBE: (gl.GLint, self.glUniform1iv, self.glProgramUniform1iv, 1),
353
+ gl.GL_INT_SAMPLER_CUBE: (gl.GLint, self.glUniform1iv, self.glProgramUniform1iv, 1),
354
+ gl.GL_UNSIGNED_INT_SAMPLER_CUBE: (gl.GLint, self.glUniform1iv, self.glProgramUniform1iv, 1),
355
+ gl.GL_SAMPLER_CUBE_MAP_ARRAY: (gl.GLint, self.glUniform1iv, self.glProgramUniform1iv, 1),
356
+ gl.GL_INT_SAMPLER_CUBE_MAP_ARRAY: (gl.GLint, self.glUniform1iv, self.glProgramUniform1iv, 1),
357
+ gl.GL_UNSIGNED_INT_SAMPLER_CUBE_MAP_ARRAY: (gl.GLint, self.glUniform1iv, self.glProgramUniform1iv, 1),
358
+
359
+ # 3D Samplers
360
+ gl.GL_SAMPLER_3D: (gl.GLint, self.glUniform1iv, self.glProgramUniform1iv, 1),
361
+ gl.GL_INT_SAMPLER_3D: (gl.GLint, self.glUniform1iv, self.glProgramUniform1iv, 1),
362
+ gl.GL_UNSIGNED_INT_SAMPLER_3D: (gl.GLint, self.glUniform1iv, self.glProgramUniform1iv, 1),
363
+
364
+ gl.GL_FLOAT_MAT2: (gl.GLfloat, self.glUniformMatrix2fv, self.glProgramUniformMatrix2fv, 4),
365
+ gl.GL_FLOAT_MAT3: (gl.GLfloat, self.glUniformMatrix3fv, self.glProgramUniformMatrix3fv, 6),
366
+ gl.GL_FLOAT_MAT4: (gl.GLfloat, self.glUniformMatrix4fv, self.glProgramUniformMatrix4fv, 16),
367
+
368
+ # TODO: test/implement these:
369
+ # GL_FLOAT_MAT2x3: glUniformMatrix2x3fv, glProgramUniformMatrix2x3fv,
370
+ # GL_FLOAT_MAT2x4: glUniformMatrix2x4fv, glProgramUniformMatrix2x4fv,
371
+ # GL_FLOAT_MAT3x2: glUniformMatrix3x2fv, glProgramUniformMatrix3x2fv,
372
+ # GL_FLOAT_MAT3x4: glUniformMatrix3x4fv, glProgramUniformMatrix3x4fv,
373
+ # GL_FLOAT_MAT4x2: glUniformMatrix4x2fv, glProgramUniformMatrix4x2fv,
374
+ # GL_FLOAT_MAT4x3: glUniformMatrix4x3fv, glProgramUniformMatrix4x3fv,
375
+
376
+ gl.GL_IMAGE_1D: (gl.GLint, self.glUniform1iv, self.glProgramUniform1iv, 1),
377
+ gl.GL_IMAGE_2D: (gl.GLint, self.glUniform1iv, self.glProgramUniform1iv, 2),
378
+ gl.GL_IMAGE_2D_RECT: (gl.GLint, self.glUniform1iv, self.glProgramUniform1iv, 3),
379
+ gl.GL_IMAGE_3D: (gl.GLint, self.glUniform1iv, self.glProgramUniform1iv, 3),
380
+
381
+ gl.GL_IMAGE_1D_ARRAY: (gl.GLint, self.glUniform1iv, self.glProgramUniform1iv, 2),
382
+ gl.GL_IMAGE_2D_ARRAY: (gl.GLint, self.glUniform1iv, self.glProgramUniform1iv, 3),
383
+
384
+ gl.GL_IMAGE_2D_MULTISAMPLE: (gl.GLint, self.glUniform1iv, self.glProgramUniform1iv, 2),
385
+ gl.GL_IMAGE_2D_MULTISAMPLE_ARRAY: (gl.GLint, self.glUniform1iv, self.glProgramUniform1iv, 3),
386
+
387
+ gl.GL_IMAGE_BUFFER: (gl.GLint, self.glUniform1iv, self.glProgramUniform1iv, 3),
388
+ gl.GL_IMAGE_CUBE: (gl.GLint, self.glUniform1iv, self.glProgramUniform1iv, 1),
389
+ gl.GL_IMAGE_CUBE_MAP_ARRAY: (gl.GLint, self.glUniform1iv, self.glProgramUniform1iv, 3),
390
+ }
391
+ return _uniform_getters, _uniform_setters
File without changes