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,245 @@
1
+ """Byte abstractions of OpenGL Buffer Objects.
2
+
3
+ Use `create_buffer` to create a Buffer Object.
4
+
5
+ Buffers can optionally be created "mappable" (incorporating the
6
+ `AbstractMappable` mix-in). In this case the buffer provides a ``get_region``
7
+ method which provides the most efficient path for updating partial data within
8
+ the buffer.
9
+ """
10
+
11
+ from __future__ import annotations
12
+
13
+ import abc
14
+ import ctypes
15
+ from abc import abstractmethod
16
+ from functools import lru_cache
17
+ from typing import Sequence, TYPE_CHECKING
18
+ from pyglet.graphics.shader import _data_type_to_ctype, GraphicsAttribute
19
+
20
+ if TYPE_CHECKING:
21
+ from pyglet.customtypes import DataTypes, CType, CTypesPointer
22
+ from pyglet.graphics.shader import Attribute
23
+
24
+
25
+ class AbstractBuffer(abc.ABC):
26
+ c_type_size: int
27
+ data_type: DataTypes
28
+ c_type: CType
29
+ size: int
30
+
31
+ def __init__(self, data_type: DataTypes, size: int) -> None:
32
+ """Create a buffer with the intended data type.
33
+
34
+ Args:
35
+ data_type:
36
+ Data types.
37
+ size:
38
+ Array size of the buffer, based on the data_type.
39
+ """
40
+ self.data_type = data_type
41
+ self.size = size
42
+
43
+ self.c_type = _data_type_to_ctype[data_type]
44
+ self.c_type_size = ctypes.sizeof(self.c_type)
45
+
46
+ @classmethod
47
+ def from_byte_size(cls, data_type: DataTypes, size: int) -> AbstractBuffer:
48
+ c_type = _data_type_to_ctype[data_type]
49
+ return cls(data_type, size // ctypes.sizeof(c_type))
50
+
51
+ @abstractmethod
52
+ def set_data_ptr(self, offset: int, length: int, ptr: CTypesPointer) -> None:
53
+ """Copy data from ptr into the data_ptr at offset."""
54
+
55
+ @abstractmethod
56
+ def get_data(self) -> ctypes.Array[CType]:
57
+ """Get the entire buffer contents."""
58
+
59
+ @abstractmethod
60
+ def get_data_region(self, start: int, length: int) -> ctypes.Array[CType]:
61
+ """Get a range in the current buffer."""
62
+
63
+ @abstractmethod
64
+ def set_data(self, data: Sequence) -> None:
65
+ """Set the entire buffer contents."""
66
+
67
+ @abstractmethod
68
+ def set_data_region(self, start: int, data: Sequence[float | int]) -> None:
69
+ """Set part of the buffer contents."""
70
+
71
+ @abstractmethod
72
+ def get_bytes(self) -> bytes:
73
+ """Return the entire buffer contents in bytes."""
74
+
75
+ @abstractmethod
76
+ def get_bytes_region(self, offset: int, length: int) -> bytes:
77
+ """Return a region of the buffer contents based on bytes."""
78
+
79
+ @abstractmethod
80
+ def set_bytes(self, data: bytes) -> None:
81
+ """Set the entire buffer data using bytes."""
82
+
83
+ @abstractmethod
84
+ def set_bytes_region(self, offset: int, data: bytes) -> None:
85
+ """Set bytes at an offset in the buffer."""
86
+
87
+ @abstractmethod
88
+ def resize(self, size: int) -> None:
89
+ """Resize the buffer to a new size."""
90
+
91
+ @abstractmethod
92
+ def delete(self) -> None:
93
+ """Free memory or resources with the underlying buffer.
94
+
95
+ The buffer should be unusable after this.
96
+ """
97
+
98
+
99
+ class MappedBufferObjectBase(AbstractBuffer):
100
+ """A buffer that requires being mapped before writing or reading data."""
101
+
102
+ def get_region(self, start: int, count: int) -> ctypes.Array[CType]:
103
+ ...
104
+
105
+ @abc.abstractmethod
106
+ def map(self) -> CTypesPointer[ctypes.c_ubyte]:
107
+ """Map the entire buffer into system memory.
108
+
109
+ The mapped region must be subsequently unmapped with `unmap` before
110
+ performing any other operations on the buffer.
111
+
112
+ Returns:
113
+ Pointer to the mapped block in memory
114
+ """
115
+
116
+ @abc.abstractmethod
117
+ def unmap(self) -> None:
118
+ """Unmap a previously mapped memory block."""
119
+
120
+ # @abc.abstractmethod
121
+ # def map_region(self, start: int, size: int) -> CTypesPointer[ctypes.c_byte]:
122
+ # """Map the entire buffer into system memory.
123
+ #
124
+ # The mapped region must be subsequently unmapped with `unmap` before
125
+ # performing any other operations on the buffer.
126
+ #
127
+ # Returns:
128
+ # Pointer to the mapped block in memory
129
+ # """
130
+ #
131
+ # @abc.abstractmethod
132
+ # def map_byte_region(self, offset: int, size: int) -> CTypesPointer[ctypes.c_byte]:
133
+ # """Map the entire buffer into system memory.
134
+ #
135
+ # The mapped region must be subsequently unmapped with `unmap` before
136
+ # performing any other operations on the buffer.
137
+ #
138
+ # Returns:
139
+ # Pointer to the mapped block in memory
140
+ # """
141
+
142
+ class BackedBufferObjectBase(AbstractBuffer):
143
+ """A buffer with system-memory backed store.
144
+
145
+ Updates to the data via `set_data` and `set_data_region` will be held
146
+ in local memory until `buffer_data` is called. The advantage is that
147
+ fewer OpenGL calls are needed, which can increasing performance at the
148
+ expense of system memory.
149
+ """
150
+ # A ctypes array of the specified data_type
151
+ data: ctypes.Array[CType]
152
+
153
+ # Memory address pointing to the CTypes data.
154
+ data_ptr: int
155
+
156
+ def __init__(self, data_type: DataTypes, size: int) -> None:
157
+ super().__init__(data_type, size)
158
+ self.data = (self.c_type * size)()
159
+ self.data_ptr = ctypes.addressof(self.data)
160
+
161
+ @abstractmethod
162
+ def commit(self) -> None:
163
+ """Commits all saved changes to the underlying buffer before drawing.
164
+
165
+ Allows submitting multiple changes at once, rather than having to call glBufferSubData for every change.
166
+ """
167
+
168
+ def invalidate(self) -> None:
169
+ ...
170
+
171
+ def invalidate_region(self, start: int, count: int) -> None:
172
+ ...
173
+
174
+
175
+ class AttributeBufferObject(BackedBufferObjectBase):
176
+ """A backed buffer used for Shader Program attributes."""
177
+
178
+ def __init__(self, size: int, shader_attr: GraphicsAttribute) -> None: # noqa: D107
179
+ # size is the allocator size * attribute.stride (buffer size)
180
+ super().__init__(size, shader_attr.attribute.c_type, shader_attr.view.stride, shader_attr.attribute.fmt.components)
181
+
182
+
183
+ class IndexedBufferObject(BackedBufferObjectBase):
184
+ """A backed buffer used for indices."""
185
+
186
+ def __init__(self, size: int, c_type: CType, stride: int, count: int) -> None:
187
+ super().__init__(size, c_type, stride, count)
188
+
189
+
190
+ class PersistentBufferObject(BackedBufferObjectBase):
191
+ """A persistently mapped buffer.
192
+
193
+ Available in OpenGL 4.3+ contexts. Persistently mapped buffers
194
+ are mapped one time on creation, and can be updated at any time
195
+ without the need to map or unmap.
196
+ """
197
+
198
+ def __init__(self, size, attribute, vao):
199
+ ...
200
+
201
+ def set_data(self, data: Sequence[int] | CTypesPointer) -> None:
202
+ raise NotImplementedError("Not yet implemented")
203
+
204
+ def set_data_region(self, data: Sequence[int] | CTypesPointer, start: int, length: int) -> None:
205
+ raise NotImplementedError("Not yet implemented")
206
+
207
+ def bind(self, target=None):
208
+ ...
209
+
210
+ def unbind(self):
211
+ ...
212
+
213
+ def map(self) -> CTypesPointer[ctypes.c_ubyte]:
214
+ raise NotImplementedError("PersistentBufferObjects are always mapped.")
215
+
216
+ def map_range(self, start, size, ptr_type, flags):
217
+ raise NotImplementedError("PersistentBufferObjects are always mapped.")
218
+
219
+ def unmap(self) -> None:
220
+ raise NotImplementedError("PersistentBufferObjects cannot be unmapped.")
221
+
222
+ def delete(self) -> None:
223
+ ...
224
+
225
+ @lru_cache(maxsize=None)
226
+ def get_region(self, start, count):
227
+ ...
228
+
229
+ def set_region(self, start, count, data):
230
+ ...
231
+
232
+ def resize(self, size):
233
+ ...
234
+
235
+ def sub_data(self):
236
+ # Not necessary with persistent mapping
237
+ pass
238
+
239
+ def invalidate(self):
240
+ # Not necessary with persistent mapping
241
+ pass
242
+
243
+ def invalidate_region(self, start, count):
244
+ # Not necessary with persistent mapping
245
+ pass