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
@@ -8,118 +8,31 @@ changes to GPU memory, which can improve performance is some cases.
8
8
  """
9
9
  from __future__ import annotations
10
10
 
11
- import abc
12
11
  import ctypes
13
12
  import sys
14
13
  from functools import lru_cache
15
- from typing import TYPE_CHECKING, Sequence, Type
14
+ from typing import TYPE_CHECKING, Sequence
16
15
 
17
- from _ctypes import Array, _Pointer, _SimpleCData
18
16
 
19
- import pyglet
20
- from pyglet.gl.gl import (
17
+ from pyglet.graphics.api.gl import (
21
18
  GL_ARRAY_BUFFER,
22
19
  GL_DYNAMIC_DRAW,
23
20
  GL_ELEMENT_ARRAY_BUFFER,
24
- GL_MAP_READ_BIT,
25
- GL_MAP_WRITE_BIT,
26
21
  GL_MAP_COHERENT_BIT,
27
22
  GL_MAP_PERSISTENT_BIT,
23
+ GL_MAP_READ_BIT,
24
+ GL_MAP_WRITE_BIT,
28
25
  GL_WRITE_ONLY,
29
26
  GLubyte,
30
27
  GLuint,
31
- glBindBuffer,
32
- glBufferData,
33
- glBufferStorage,
34
- glBufferSubData,
35
- glDeleteBuffers,
36
- glGenBuffers,
37
- glMapBuffer,
38
- glMapBufferRange,
39
- glUnmapBuffer,
28
+ OpenGLSurfaceContext,
40
29
  )
30
+ from pyglet.graphics.buffer import AbstractBuffer
41
31
 
42
32
  if TYPE_CHECKING:
43
- from pyglet.gl import Context
44
- from pyglet.graphics.shader import Attribute
45
-
46
- CTypesDataType = Type[_SimpleCData]
47
- CTypesPointer = _Pointer
48
-
49
-
50
- class AbstractBuffer:
51
- """Abstract buffer of byte data.
52
-
53
- Attributes:
54
- size:
55
- Size of buffer, in bytes
56
- ptr:
57
- Memory offset of the buffer, as used by the ``glVertexPointer`` family of functions
58
- """
59
-
60
- ptr: int = 0
61
- size: int = 0
62
-
63
- @abc.abstractmethod
64
- def bind(self, target: int = GL_ARRAY_BUFFER) -> None:
65
- """Bind this buffer to an OpenGL target."""
66
-
67
- @abc.abstractmethod
68
- def unbind(self) -> None:
69
- """Reset the buffer's OpenGL target."""
70
-
71
- @abc.abstractmethod
72
- def set_data(self, data: Sequence[int] | CTypesPointer) -> None:
73
- """Set the entire contents of the buffer.
74
-
75
- Args:
76
- data:
77
- The byte array to set.
78
-
79
- """
80
-
81
- @abc.abstractmethod
82
- def set_data_region(self, data: Sequence[int] | CTypesPointer, start: int, length: int) -> None:
83
- """Set part of the buffer contents.
84
-
85
- Args:
86
- data:
87
- The byte array of data to set
88
- start:
89
- Offset to start replacing data
90
- length:
91
- Length of region to replace
92
-
93
- """
94
-
95
- @abc.abstractmethod
96
- def map(self) -> CTypesPointer[ctypes.c_ubyte]:
97
- """Map the entire buffer into system memory.
98
-
99
- The mapped region must be subsequently unmapped with `unmap` before
100
- performing any other operations on the buffer.
101
-
102
- Returns:
103
- Pointer to the mapped block in memory
104
- """
105
-
106
- @abc.abstractmethod
107
- def unmap(self) -> None:
108
- """Unmap a previously mapped memory block."""
109
-
110
- def resize(self, size: int) -> None:
111
- """Resize the buffer to a new size.
112
-
113
- Args:
114
- size:
115
- New size of the buffer, in bytes
116
-
117
- """
118
-
119
- @abc.abstractmethod
120
- def delete(self) -> None:
121
- """Delete this buffer, reducing system resource usage."""
122
-
33
+ from pyglet.customtypes import CType, CTypesPointer
34
+ from pyglet.graphics.shader import Attribute, GraphicsAttribute
35
+ from ctypes import Array, _SimpleCData
123
36
 
124
37
  class BufferObject(AbstractBuffer):
125
38
  """Lightweight representation of an OpenGL Buffer Object.
@@ -133,62 +46,88 @@ class BufferObject(AbstractBuffer):
133
46
  """
134
47
 
135
48
  id: int
136
- size: int
137
49
  usage: int
138
- _context: Context | None
50
+ target: int
51
+ _context: OpenGLSurfaceContext | None
139
52
 
140
- def __init__(self, size: int, usage: int = GL_DYNAMIC_DRAW) -> None:
53
+ def __init__(self, context: OpenGLSurfaceContext, size: int, target = GL_ARRAY_BUFFER, usage: int = GL_DYNAMIC_DRAW) -> None:
141
54
  """Initialize the BufferObject with the given size and draw usage.
142
55
 
143
56
  Buffer data is cleared on creation.
144
57
  """
145
- self.size = size
58
+ super().__init__('b', size)
146
59
  self.usage = usage
147
- self._context = pyglet.gl.current_context
60
+ self.target = target
61
+ self._context = context
148
62
 
149
63
  buffer_id = GLuint()
150
- glGenBuffers(1, buffer_id)
64
+ self._context.glGenBuffers(1, buffer_id)
151
65
  self.id = buffer_id.value
152
66
 
153
- glBindBuffer(GL_ARRAY_BUFFER, self.id)
67
+ self._context.glBindBuffer(self.target, self.id)
154
68
  data = (GLubyte * self.size)()
155
- glBufferData(GL_ARRAY_BUFFER, self.size, data, self.usage)
69
+ self._context.glBufferData(self.target, self.size, data, self.usage)
70
+
71
+ def get_bytes(self) -> bytes:
72
+ self._context.glBindBuffer(self.target, self.id)
73
+ ptr = self._context.glMapBufferRange(self.target, 0, self.size, GL_MAP_READ_BIT)
74
+ data = ctypes.string_at(ptr, size=self.size)
75
+ self._context.glUnmapBuffer(self.target)
76
+ return data
77
+
78
+ def get_bytes_region(self, offset: int, length: int) -> bytes:
79
+ ...
80
+
81
+ def get_data(self) -> ctypes.Array[CType]:
82
+ self._context.glBindBuffer(self.target, self.id)
83
+ ptr = self._context.glMapBufferRange(self.target, 0, self.size, GL_MAP_READ_BIT)
84
+ data = ctypes.string_at(ptr, size=self.size)
85
+ self._context.glUnmapBuffer(self.target)
86
+ return data
87
+
88
+ def get_data_region(self, start: int, length: int) -> ctypes.Array[CType]:
89
+ ...
90
+
91
+ def set_bytes(self, data: bytes) -> None:
92
+ ...
93
+
94
+ def set_bytes_region(self, start: int, length: int) -> None:
95
+ ...
96
+
97
+ def set_data_ptr(self, offset: int, length: int, ptr: CTypesPointer) -> None:
98
+ ...
156
99
 
157
100
  def invalidate(self) -> None:
158
- glBufferData(GL_ARRAY_BUFFER, self.size, None, self.usage)
101
+ self._context.glBufferData(self.target, self.size, None, self.usage)
159
102
 
160
- def bind(self, target: int = GL_ARRAY_BUFFER) -> None:
161
- glBindBuffer(target, self.id)
103
+ def bind(self) -> None:
104
+ self._context.glBindBuffer(self.target, self.id)
162
105
 
163
106
  def unbind(self) -> None:
164
- glBindBuffer(GL_ARRAY_BUFFER, 0)
165
-
166
- def bind_to_index_buffer(self) -> None:
167
- """Binds this buffer as an index buffer on the active vertex array."""
168
- glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, self.id)
107
+ self._context.glBindBuffer(self.target, 0)
169
108
 
170
109
  def set_data(self, data: Sequence[int] | CTypesPointer) -> None:
171
- glBindBuffer(GL_ARRAY_BUFFER, self.id)
172
- glBufferData(GL_ARRAY_BUFFER, self.size, data, self.usage)
110
+ self._context.glBindBuffer(self.target, self.id)
111
+ self._context.glBufferData(self.target, self.size, data, self.usage)
173
112
 
174
113
  def set_data_region(self, data: Sequence[int] | CTypesPointer, start: int, length: int) -> None:
175
- glBindBuffer(GL_ARRAY_BUFFER, self.id)
176
- glBufferSubData(GL_ARRAY_BUFFER, start, length, data)
114
+ self._context.glBindBuffer(self.target, self.id)
115
+ self._context.glBufferSubData(self.target, start, length, data)
177
116
 
178
- def map(self) -> CTypesPointer[ctypes.c_byte]:
179
- glBindBuffer(GL_ARRAY_BUFFER, self.id)
180
- return ctypes.cast(glMapBuffer(GL_ARRAY_BUFFER, GL_WRITE_ONLY),
117
+ def map(self, bits=GL_WRITE_ONLY) -> CTypesPointer[ctypes.c_byte]:
118
+ self._context.glBindBuffer(self.target, self.id)
119
+ return ctypes.cast(self._context.glMapBuffer(self.target, bits),
181
120
  ctypes.POINTER(ctypes.c_byte * self.size)).contents
182
121
 
183
- def map_range(self, start: int, size: int, ptr_type: type[CTypesPointer]) -> CTypesPointer:
184
- glBindBuffer(GL_ARRAY_BUFFER, self.id)
185
- return ctypes.cast(glMapBufferRange(GL_ARRAY_BUFFER, start, size, GL_MAP_WRITE_BIT), ptr_type).contents
122
+ def map_range(self, start: int, size: int, ptr_type: type[CTypesPointer], bits=GL_MAP_WRITE_BIT) -> CTypesPointer:
123
+ self._context.glBindBuffer(self.target, self.id)
124
+ return ctypes.cast(self._context.glMapBufferRange(self.target, start, size, bits), ptr_type).contents
186
125
 
187
126
  def unmap(self) -> None:
188
- glUnmapBuffer(GL_ARRAY_BUFFER)
127
+ self._context.glUnmapBuffer(self.target)
189
128
 
190
129
  def delete(self) -> None:
191
- glDeleteBuffers(1, GLuint(self.id))
130
+ self._context.glDeleteBuffers(1, GLuint(self.id))
192
131
  self.id = None
193
132
 
194
133
  def __del__(self) -> None:
@@ -203,16 +142,16 @@ class BufferObject(AbstractBuffer):
203
142
  # Map, create a copy, then reinitialize.
204
143
  temp = (ctypes.c_byte * size)()
205
144
 
206
- glBindBuffer(GL_ARRAY_BUFFER, self.id)
207
- data = glMapBufferRange(GL_ARRAY_BUFFER, 0, self.size, GL_MAP_READ_BIT)
145
+ self._context.glBindBuffer(self.target, self.id)
146
+ data = self._context.glMapBufferRange(self.target, 0, self.size, GL_MAP_READ_BIT)
208
147
  ctypes.memmove(temp, data, min(size, self.size))
209
- glUnmapBuffer(GL_ARRAY_BUFFER)
148
+ self._context.glUnmapBuffer(self.target)
210
149
 
211
150
  self.size = size
212
- glBufferData(GL_ARRAY_BUFFER, self.size, temp, self.usage)
151
+ self._context.glBufferData(self.target, self.size, temp, self.usage)
213
152
 
214
153
  def __repr__(self) -> str:
215
- return f"{self.__class__.__name__}(id={self.id}, size={self.size})"
154
+ return f"{self.__class__.__name__}(id={self.id}, data_type={self.data_type}, size={self.size})"
216
155
 
217
156
 
218
157
  class BackedBufferObject(BufferObject):
@@ -223,18 +162,18 @@ class BackedBufferObject(BufferObject):
223
162
  OpenGL calls are needed, which can increase performance at the expense of
224
163
  system memory.
225
164
  """
226
- data: CTypesDataType
165
+ data: Array[CType] | Array[_SimpleCData]
227
166
  data_ptr: int
228
167
  _dirty_min: int
229
168
  _dirty_max: int
230
169
  _dirty: bool
231
170
  stride: int
232
- count: int
233
- ctype: CTypesDataType
171
+ element_count: int
172
+ ctype: CType
234
173
 
235
- def __init__(self, size: int, c_type: CTypesDataType, stride: int, count: int, # noqa: D107
174
+ def __init__(self, context: OpenGLSurfaceContext, size: int, c_type: CType, stride: int, element_count: int,
236
175
  usage: int = GL_DYNAMIC_DRAW) -> None:
237
- super().__init__(size, usage)
176
+ super().__init__(context, size, GL_ARRAY_BUFFER, usage)
238
177
 
239
178
  self.c_type = c_type
240
179
  self._ctypes_size = ctypes.sizeof(c_type)
@@ -247,7 +186,7 @@ class BackedBufferObject(BufferObject):
247
186
  self._dirty = False
248
187
 
249
188
  self.stride = stride
250
- self.count = count
189
+ self.element_count = element_count
251
190
 
252
191
  def commit(self) -> None:
253
192
  """Commits all saved changes to the underlying buffer before drawing.
@@ -257,28 +196,28 @@ class BackedBufferObject(BufferObject):
257
196
  if not self._dirty:
258
197
  return
259
198
 
260
- glBindBuffer(GL_ARRAY_BUFFER, self.id)
199
+ self._context.glBindBuffer(self.target, self.id)
261
200
  size = self._dirty_max - self._dirty_min
262
201
  if size > 0:
263
202
  if size == self.size:
264
- glBufferData(GL_ARRAY_BUFFER, self.size, self.data, self.usage)
203
+ self._context.glBufferData(self.target, self.size, self.data, self.usage)
265
204
  else:
266
- glBufferSubData(GL_ARRAY_BUFFER, self._dirty_min, size, self.data_ptr + self._dirty_min)
205
+ self._context.glBufferSubData(self.target, self._dirty_min, size, self.data_ptr + self._dirty_min)
267
206
 
268
207
  self._dirty_min = sys.maxsize
269
208
  self._dirty_max = 0
270
209
  self._dirty = False
271
210
 
272
211
  @lru_cache(maxsize=None) # noqa: B019
273
- def get_region(self, start: int, count: int) -> Array[CTypesDataType]:
212
+ def get_region(self, start: int, count: int) -> Array[CType]:
274
213
  byte_start = self.stride * start # byte offset
275
- array_count = self.count * count # number of values
214
+ array_count = self.element_count * count # number of values
276
215
  ptr_type = ctypes.POINTER(self.c_type * array_count)
277
216
  return ctypes.cast(self.data_ptr + byte_start, ptr_type).contents
278
217
 
279
218
  def set_region(self, start: int, count: int, data: Sequence[float]) -> None:
280
- array_start = self.count * start
281
- array_end = self.count * count + array_start
219
+ array_start = self.element_count * start
220
+ array_end = self.element_count * count + array_start
282
221
 
283
222
  self.data[array_start:array_end] = data
284
223
 
@@ -326,17 +265,23 @@ class BackedBufferObject(BufferObject):
326
265
  class AttributeBufferObject(BackedBufferObject):
327
266
  """A backed buffer used for Shader Program attributes."""
328
267
 
329
- def __init__(self, size: int, attribute: Attribute) -> None: # noqa: D107
268
+ def __init__(self, context: OpenGLSurfaceContext, size: int, graphics_attr: GraphicsAttribute) -> None:
330
269
  # size is the allocator size * attribute.stride (buffer size)
331
- super().__init__(size, attribute.c_type, attribute.stride, attribute.count)
270
+ super().__init__(context, size, graphics_attr.attribute.c_type,
271
+ graphics_attr.view.stride,
272
+ graphics_attr.attribute.fmt.components)
332
273
 
333
274
 
334
275
  class IndexedBufferObject(BackedBufferObject):
335
276
  """A backed buffer used for indices."""
336
277
 
337
- def __init__(self, size: int, c_type: CTypesDataType, stride: int, count: int, # noqa: D107
278
+ def __init__(self, context: OpenGLSurfaceContext, size: int, c_type: CType, stride: int, count: int,
338
279
  usage: int = GL_DYNAMIC_DRAW) -> None:
339
- super().__init__(size, c_type, stride, count, usage)
280
+ super().__init__(context, size, c_type, stride, count, usage)
281
+
282
+ def bind_to_index_buffer(self) -> None:
283
+ """Binds this buffer as an index buffer on the active vertex array."""
284
+ self._context.glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, self.id)
340
285
 
341
286
 
342
287
  class PersistentBufferObject(AbstractBuffer):
@@ -347,7 +292,7 @@ class PersistentBufferObject(AbstractBuffer):
347
292
  without the need to map or unmap.
348
293
  """
349
294
 
350
- def __init__(self, size, attribute, vao):
295
+ def __init__(self, context, size, attribute, vao):
351
296
  # TODO: Persistent buffers cannot be resized. A new buffer is created, and the
352
297
  # data is copied over. Therefore, unlike other buffers, they currently
353
298
  # require s reference to an attribute so the attribute pointer can be reset
@@ -356,25 +301,25 @@ class PersistentBufferObject(AbstractBuffer):
356
301
  self.size = size
357
302
  self.attribute = attribute
358
303
  self.attribute_stride = attribute.stride
359
- self.attribute_count = attribute.count
304
+ self.attribute_count = attribute.element_count
360
305
  self.attribute_ctype = attribute.c_type
361
306
  self.vao = vao
362
307
 
363
- self._context = pyglet.gl.current_context
308
+ self._context = context
364
309
 
365
310
  buffer_id = GLuint()
366
- glGenBuffers(1, buffer_id)
311
+ self._context.glGenBuffers(1, buffer_id)
367
312
  self.id = buffer_id.value
368
- glBindBuffer(GL_ARRAY_BUFFER, self.id)
313
+ self._context.glBindBuffer(GL_ARRAY_BUFFER, self.id)
369
314
 
370
315
  self.flags = GL_MAP_WRITE_BIT | GL_MAP_PERSISTENT_BIT | GL_MAP_COHERENT_BIT
371
316
  data = (GLubyte * size)()
372
- glBufferStorage(GL_ARRAY_BUFFER, size, data, self.flags)
317
+ self._context.glBufferStorage(GL_ARRAY_BUFFER, size, data, self.flags)
373
318
 
374
319
  # size is the allocator size * attribute.stride
375
320
  number = size // attribute.element_size
376
321
  ptr = ctypes.POINTER(attribute.c_type * number)
377
- self.data = ctypes.cast(glMapBufferRange(GL_ARRAY_BUFFER, 0, size, self.flags), ptr).contents
322
+ self.data = ctypes.cast(self._context.glMapBufferRange(GL_ARRAY_BUFFER, 0, size, self.flags), ptr).contents
378
323
 
379
324
  def set_data(self, data: Sequence[int] | CTypesPointer) -> None:
380
325
  raise NotImplementedError("Not yet implemented")
@@ -383,10 +328,10 @@ class PersistentBufferObject(AbstractBuffer):
383
328
  raise NotImplementedError("Not yet implemented")
384
329
 
385
330
  def bind(self, target=GL_ARRAY_BUFFER):
386
- glBindBuffer(target, self.id)
331
+ self._context.glBindBuffer(target, self.id)
387
332
 
388
333
  def unbind(self):
389
- glBindBuffer(GL_ARRAY_BUFFER, 0)
334
+ self._context.glBindBuffer(GL_ARRAY_BUFFER, 0)
390
335
 
391
336
  def map(self) -> CTypesPointer[ctypes.c_ubyte]:
392
337
  raise NotImplementedError("PersistentBufferObjects are always mapped.")
@@ -398,7 +343,7 @@ class PersistentBufferObject(AbstractBuffer):
398
343
  raise NotImplementedError("PersistentBufferObjects cannot be unmapped.")
399
344
 
400
345
  def delete(self) -> None:
401
- glDeleteBuffers(1, GLuint(self.id))
346
+ self._context.glDeleteBuffers(1, GLuint(self.id))
402
347
  self.id = None
403
348
 
404
349
  @lru_cache(maxsize=None)
@@ -418,11 +363,11 @@ class PersistentBufferObject(AbstractBuffer):
418
363
  # Create temporary copy of current data
419
364
  temp = (GLubyte * size)()
420
365
  ctypes.memmove(temp, self.data, min(size, self.size))
421
- glDeleteBuffers(1, GLuint(self.id))
366
+ self._context.glDeleteBuffers(1, GLuint(self.id))
422
367
 
423
368
  # Generate new buffer
424
369
  buffer_id = GLuint()
425
- glGenBuffers(1, buffer_id)
370
+ self._context.glGenBuffers(1, buffer_id)
426
371
  self.id = buffer_id.value
427
372
 
428
373
  # Link attributes to new buffer:
@@ -432,7 +377,7 @@ class PersistentBufferObject(AbstractBuffer):
432
377
  self.attribute.set_pointer(self.ptr)
433
378
 
434
379
  # Initialize the new buffer with the old data, and map it:
435
- glBufferStorage(GL_ARRAY_BUFFER, size, temp, self.flags)
380
+ self._context.glBufferStorage(GL_ARRAY_BUFFER, size, temp, self.flags)
436
381
 
437
382
  ptr_type = self.attribute.c_type * (size // self.attribute.element_size)
438
383
  self.data = self.map_range(0, size, ctypes.POINTER(ptr_type), self.flags)
@@ -0,0 +1,76 @@
1
+ from __future__ import annotations
2
+
3
+ from ctypes import byref, c_int
4
+ from typing import TYPE_CHECKING
5
+
6
+ from pyglet.config.gl.macos import os_x_release, _os_x_version, CocoaGLSurfaceConfig
7
+ from pyglet.graphics.api.gl.base import ContextException
8
+ from pyglet.graphics.api.gl import OpenGLSurfaceContext
9
+ from pyglet.libs.darwin import cocoapy
10
+
11
+ if TYPE_CHECKING:
12
+ from pyglet.graphics.api.gl.global_opengl import OpenGLBackend
13
+ from pyglet.window.cocoa import CocoaWindow
14
+
15
+ NSOpenGLPixelFormat = cocoapy.ObjCClass('NSOpenGLPixelFormat')
16
+ NSOpenGLContext = cocoapy.ObjCClass('NSOpenGLContext')
17
+
18
+
19
+ class CocoaContext(OpenGLSurfaceContext):
20
+
21
+ def __init__(self,
22
+ opengl_backend: OpenGLBackend,
23
+ window: CocoaWindow,
24
+ config: CocoaGLSurfaceConfig,
25
+ nscontext: NSOpenGLContext,
26
+ share: CocoaContext | None) -> None:
27
+ super().__init__(opengl_backend, window, config, platform_info=None, context_share=share)
28
+ self.config = config
29
+ self._nscontext = nscontext
30
+
31
+ def attach(self, window: CocoaWindow) -> None:
32
+ # See if we want OpenGL 3 in a non-Lion OS
33
+ if _os_x_version < os_x_release['lion']:
34
+ msg = 'OpenGL 3 not supported'
35
+ raise ContextException(msg)
36
+
37
+ super().attach(window)
38
+ # The NSView instance should be attached to a nondeferred window before calling
39
+ # setView, otherwise you get an "invalid drawable" message.
40
+ self._nscontext.setView_(window._nsview) # noqa: SLF001
41
+
42
+ self.set_current()
43
+
44
+ def detach(self) -> None:
45
+ super().detach()
46
+ self._nscontext.clearDrawable()
47
+
48
+ def set_current(self) -> None:
49
+ self._nscontext.makeCurrentContext()
50
+ super().set_current()
51
+
52
+ def update_geometry(self) -> None:
53
+ # Need to call this method whenever the context drawable (an NSView)
54
+ # changes size or location.
55
+ self._nscontext.update()
56
+
57
+ def set_full_screen(self) -> None:
58
+ self._nscontext.makeCurrentContext()
59
+ self._nscontext.setFullScreen()
60
+
61
+ def destroy(self) -> None:
62
+ super().destroy()
63
+ self._nscontext.release()
64
+ self._nscontext = None
65
+
66
+ def set_vsync(self, vsync: bool = True) -> None:
67
+ vals = c_int(vsync)
68
+ self._nscontext.setValues_forParameter_(byref(vals), cocoapy.NSOpenGLCPSwapInterval)
69
+
70
+ def get_vsync(self) -> bool:
71
+ vals = c_int()
72
+ self._nscontext.getValues_forParameter_(byref(vals), cocoapy.NSOpenGLCPSwapInterval)
73
+ return bool(vals.value)
74
+
75
+ def flip(self) -> None:
76
+ self._nscontext.flushBuffer()