pyglet 2.1.12__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.
- pyglet/__init__.py +67 -61
- pyglet/__init__.pyi +15 -8
- pyglet/app/__init__.py +22 -13
- pyglet/app/async_app.py +212 -0
- pyglet/app/base.py +2 -1
- pyglet/app/{xlib.py → linux.py} +3 -3
- pyglet/config/__init__.py +101 -0
- pyglet/config/gl/__init__.py +30 -0
- pyglet/config/gl/egl.py +120 -0
- pyglet/config/gl/macos.py +262 -0
- pyglet/config/gl/windows.py +267 -0
- pyglet/config/gl/x11.py +142 -0
- pyglet/customtypes.py +43 -2
- pyglet/display/__init__.py +8 -6
- pyglet/display/base.py +3 -63
- pyglet/display/cocoa.py +12 -17
- pyglet/display/emscripten.py +39 -0
- pyglet/display/headless.py +23 -30
- pyglet/display/wayland.py +157 -0
- pyglet/display/win32.py +4 -17
- pyglet/display/xlib.py +19 -27
- pyglet/display/xlib_vidmoderestore.py +2 -2
- pyglet/enums.py +183 -0
- pyglet/event.py +0 -1
- pyglet/experimental/geoshader_sprite.py +15 -13
- pyglet/experimental/hidraw.py +6 -15
- pyglet/experimental/multitexture_sprite.py +31 -19
- pyglet/experimental/particles.py +13 -35
- pyglet/font/__init__.py +251 -85
- pyglet/font/base.py +116 -61
- pyglet/font/dwrite/__init__.py +349 -204
- pyglet/font/dwrite/dwrite_lib.py +27 -5
- pyglet/font/fontconfig.py +14 -6
- pyglet/font/freetype.py +138 -87
- pyglet/font/freetype_lib.py +19 -0
- pyglet/font/group.py +179 -0
- pyglet/font/harfbuzz/__init__.py +3 -3
- pyglet/font/pyodide_js.py +310 -0
- pyglet/font/quartz.py +319 -126
- pyglet/font/ttf.py +45 -3
- pyglet/font/user.py +14 -19
- pyglet/font/win32.py +45 -21
- pyglet/graphics/__init__.py +8 -787
- pyglet/graphics/allocation.py +115 -1
- pyglet/graphics/api/__init__.py +77 -0
- pyglet/graphics/api/base.py +299 -0
- pyglet/graphics/api/gl/__init__.py +58 -0
- pyglet/graphics/api/gl/base.py +24 -0
- pyglet/graphics/{vertexbuffer.py → api/gl/buffer.py} +104 -159
- pyglet/graphics/api/gl/cocoa/context.py +76 -0
- pyglet/graphics/api/gl/context.py +391 -0
- pyglet/graphics/api/gl/default_shaders.py +0 -0
- pyglet/graphics/api/gl/draw.py +627 -0
- pyglet/graphics/api/gl/egl/__init__.py +0 -0
- pyglet/graphics/api/gl/egl/context.py +92 -0
- pyglet/graphics/api/gl/enums.py +76 -0
- pyglet/graphics/api/gl/framebuffer.py +315 -0
- pyglet/graphics/api/gl/gl.py +5463 -0
- pyglet/graphics/api/gl/gl_info.py +188 -0
- pyglet/graphics/api/gl/global_opengl.py +226 -0
- pyglet/{gl → graphics/api/gl}/lib.py +34 -18
- pyglet/graphics/api/gl/shader.py +1476 -0
- pyglet/graphics/api/gl/shapes.py +55 -0
- pyglet/graphics/api/gl/sprite.py +102 -0
- pyglet/graphics/api/gl/state.py +219 -0
- pyglet/graphics/api/gl/text.py +190 -0
- pyglet/graphics/api/gl/texture.py +1526 -0
- pyglet/graphics/{vertexarray.py → api/gl/vertexarray.py} +11 -13
- pyglet/graphics/api/gl/vertexdomain.py +751 -0
- pyglet/graphics/api/gl/win32/__init__.py +0 -0
- pyglet/graphics/api/gl/win32/context.py +108 -0
- pyglet/graphics/api/gl/win32/wgl_info.py +24 -0
- pyglet/graphics/api/gl/xlib/__init__.py +0 -0
- pyglet/graphics/api/gl/xlib/context.py +174 -0
- pyglet/{gl → graphics/api/gl/xlib}/glx_info.py +26 -31
- pyglet/graphics/api/gl1/__init__.py +0 -0
- pyglet/{gl → graphics/api/gl1}/gl_compat.py +3 -2
- pyglet/graphics/api/gl2/__init__.py +0 -0
- pyglet/graphics/api/gl2/buffer.py +320 -0
- pyglet/graphics/api/gl2/draw.py +600 -0
- pyglet/graphics/api/gl2/global_opengl.py +122 -0
- pyglet/graphics/api/gl2/shader.py +200 -0
- pyglet/graphics/api/gl2/shapes.py +51 -0
- pyglet/graphics/api/gl2/sprite.py +79 -0
- pyglet/graphics/api/gl2/text.py +175 -0
- pyglet/graphics/api/gl2/vertexdomain.py +364 -0
- pyglet/graphics/api/webgl/__init__.py +233 -0
- pyglet/graphics/api/webgl/buffer.py +302 -0
- pyglet/graphics/api/webgl/context.py +234 -0
- pyglet/graphics/api/webgl/draw.py +590 -0
- pyglet/graphics/api/webgl/enums.py +76 -0
- pyglet/graphics/api/webgl/framebuffer.py +360 -0
- pyglet/graphics/api/webgl/gl.py +1537 -0
- pyglet/graphics/api/webgl/gl_info.py +130 -0
- pyglet/graphics/api/webgl/shader.py +1346 -0
- pyglet/graphics/api/webgl/shapes.py +92 -0
- pyglet/graphics/api/webgl/sprite.py +102 -0
- pyglet/graphics/api/webgl/state.py +227 -0
- pyglet/graphics/api/webgl/text.py +187 -0
- pyglet/graphics/api/webgl/texture.py +1227 -0
- pyglet/graphics/api/webgl/vertexarray.py +54 -0
- pyglet/graphics/api/webgl/vertexdomain.py +616 -0
- pyglet/graphics/api/webgl/webgl_js.pyi +307 -0
- pyglet/{image → graphics}/atlas.py +33 -32
- pyglet/graphics/base.py +10 -0
- pyglet/graphics/buffer.py +245 -0
- pyglet/graphics/draw.py +578 -0
- pyglet/graphics/framebuffer.py +26 -0
- pyglet/graphics/instance.py +178 -69
- pyglet/graphics/shader.py +267 -1553
- pyglet/graphics/state.py +83 -0
- pyglet/graphics/texture.py +703 -0
- pyglet/graphics/vertexdomain.py +695 -538
- pyglet/gui/ninepatch.py +10 -10
- pyglet/gui/widgets.py +120 -10
- pyglet/image/__init__.py +20 -1973
- pyglet/image/animation.py +12 -12
- pyglet/image/base.py +730 -0
- pyglet/image/codecs/__init__.py +9 -0
- pyglet/image/codecs/bmp.py +53 -30
- pyglet/image/codecs/dds.py +53 -31
- pyglet/image/codecs/gdiplus.py +38 -14
- pyglet/image/codecs/gdkpixbuf2.py +0 -2
- pyglet/image/codecs/js_image.py +99 -0
- pyglet/image/codecs/ktx2.py +161 -0
- pyglet/image/codecs/pil.py +1 -1
- pyglet/image/codecs/png.py +1 -1
- pyglet/image/codecs/wic.py +11 -2
- pyglet/info.py +26 -24
- pyglet/input/__init__.py +8 -0
- pyglet/input/base.py +163 -105
- pyglet/input/controller.py +13 -19
- pyglet/input/controller_db.py +39 -24
- pyglet/input/emscripten/__init__.py +18 -0
- pyglet/input/emscripten/gamepad_js.py +397 -0
- pyglet/input/linux/__init__.py +11 -5
- pyglet/input/linux/evdev.py +10 -11
- pyglet/input/linux/x11_xinput.py +2 -2
- pyglet/input/linux/x11_xinput_tablet.py +1 -1
- pyglet/input/macos/__init__.py +7 -2
- pyglet/input/macos/darwin_gc.py +559 -0
- pyglet/input/win32/__init__.py +1 -1
- pyglet/input/win32/directinput.py +34 -29
- pyglet/input/win32/xinput.py +11 -61
- pyglet/lib.py +3 -3
- pyglet/libs/__init__.py +1 -1
- pyglet/{gl → libs/darwin}/agl.py +1 -1
- pyglet/libs/darwin/cocoapy/__init__.py +2 -2
- pyglet/libs/darwin/cocoapy/cocoahelpers.py +181 -0
- pyglet/libs/darwin/cocoapy/cocoalibs.py +31 -0
- pyglet/libs/darwin/cocoapy/cocoatypes.py +27 -0
- pyglet/libs/darwin/cocoapy/runtime.py +81 -45
- pyglet/libs/darwin/coreaudio.py +4 -4
- pyglet/{gl → libs/darwin}/lib_agl.py +9 -8
- pyglet/libs/darwin/quartzkey.py +1 -3
- pyglet/libs/egl/__init__.py +2 -0
- pyglet/libs/egl/egl_lib.py +576 -0
- pyglet/libs/egl/eglext.py +51 -5
- pyglet/libs/linux/__init__.py +0 -0
- pyglet/libs/linux/egl/__init__.py +0 -0
- pyglet/libs/linux/egl/eglext.py +22 -0
- pyglet/libs/linux/glx/__init__.py +0 -0
- pyglet/{gl → libs/linux/glx}/glx.py +13 -14
- pyglet/{gl → libs/linux/glx}/glxext_arb.py +408 -192
- pyglet/{gl → libs/linux/glx}/glxext_mesa.py +1 -1
- pyglet/{gl → libs/linux/glx}/glxext_nv.py +345 -164
- pyglet/{gl → libs/linux/glx}/lib_glx.py +3 -2
- pyglet/libs/linux/wayland/__init__.py +0 -0
- pyglet/libs/linux/wayland/client.py +1068 -0
- pyglet/libs/linux/wayland/lib_wayland.py +207 -0
- pyglet/libs/linux/wayland/wayland_egl.py +38 -0
- pyglet/libs/{wayland → linux/wayland}/xkbcommon.py +26 -0
- pyglet/libs/{x11 → linux/x11}/xf86vmode.py +4 -4
- pyglet/libs/{x11 → linux/x11}/xinerama.py +2 -2
- pyglet/libs/{x11 → linux/x11}/xinput.py +10 -10
- pyglet/libs/linux/x11/xrandr.py +0 -0
- pyglet/libs/{x11 → linux/x11}/xrender.py +1 -1
- pyglet/libs/shared/__init__.py +0 -0
- pyglet/libs/shared/spirv/__init__.py +0 -0
- pyglet/libs/shared/spirv/lib_shaderc.py +85 -0
- pyglet/libs/shared/spirv/lib_spirv_cross.py +126 -0
- pyglet/libs/win32/__init__.py +27 -5
- pyglet/libs/win32/constants.py +59 -48
- pyglet/libs/win32/context_managers.py +20 -3
- pyglet/libs/win32/dinput.py +105 -88
- pyglet/{gl → libs/win32}/lib_wgl.py +52 -26
- pyglet/libs/win32/types.py +58 -23
- pyglet/{gl → libs/win32}/wgl.py +32 -25
- pyglet/{gl → libs/win32}/wglext_arb.py +364 -2
- pyglet/media/__init__.py +9 -10
- pyglet/media/codecs/__init__.py +12 -1
- pyglet/media/codecs/base.py +99 -96
- pyglet/media/codecs/ffmpeg.py +2 -2
- pyglet/media/codecs/ffmpeg_lib/libavformat.py +3 -8
- pyglet/media/codecs/webaudio_pyodide.py +111 -0
- pyglet/media/drivers/__init__.py +9 -4
- pyglet/media/drivers/base.py +4 -4
- pyglet/media/drivers/openal/__init__.py +1 -1
- pyglet/media/drivers/openal/adaptation.py +3 -3
- pyglet/media/drivers/pulse/__init__.py +1 -1
- pyglet/media/drivers/pulse/adaptation.py +3 -3
- pyglet/media/drivers/pyodide_js/__init__.py +8 -0
- pyglet/media/drivers/pyodide_js/adaptation.py +288 -0
- pyglet/media/drivers/xaudio2/adaptation.py +3 -3
- pyglet/media/player.py +276 -193
- pyglet/media/player_worker_thread.py +1 -1
- pyglet/model/__init__.py +39 -29
- pyglet/model/codecs/base.py +4 -4
- pyglet/model/codecs/gltf.py +3 -3
- pyglet/model/codecs/obj.py +71 -43
- pyglet/resource.py +129 -78
- pyglet/shapes.py +147 -177
- pyglet/sprite.py +47 -164
- pyglet/text/__init__.py +44 -54
- pyglet/text/caret.py +12 -7
- pyglet/text/document.py +19 -17
- pyglet/text/formats/html.py +2 -2
- pyglet/text/formats/structured.py +10 -40
- pyglet/text/layout/__init__.py +20 -13
- pyglet/text/layout/base.py +176 -287
- pyglet/text/layout/incremental.py +9 -10
- pyglet/text/layout/scrolling.py +7 -95
- pyglet/window/__init__.py +183 -172
- pyglet/window/cocoa/__init__.py +62 -51
- pyglet/window/cocoa/pyglet_delegate.py +2 -25
- pyglet/window/cocoa/pyglet_view.py +9 -8
- pyglet/window/dialog/__init__.py +184 -0
- pyglet/window/dialog/base.py +99 -0
- pyglet/window/dialog/darwin.py +121 -0
- pyglet/window/dialog/linux.py +72 -0
- pyglet/window/dialog/windows.py +194 -0
- pyglet/window/emscripten/__init__.py +779 -0
- pyglet/window/headless/__init__.py +44 -28
- pyglet/window/key.py +2 -0
- pyglet/window/mouse.py +2 -2
- pyglet/window/wayland/__init__.py +377 -0
- pyglet/window/win32/__init__.py +101 -46
- pyglet/window/xlib/__init__.py +104 -66
- {pyglet-2.1.12.dist-info → pyglet-3.0.dev1.dist-info}/METADATA +2 -3
- pyglet-3.0.dev1.dist-info/RECORD +322 -0
- {pyglet-2.1.12.dist-info → pyglet-3.0.dev1.dist-info}/WHEEL +1 -1
- pyglet/gl/__init__.py +0 -208
- pyglet/gl/base.py +0 -499
- pyglet/gl/cocoa.py +0 -309
- pyglet/gl/gl.py +0 -4625
- pyglet/gl/gl.pyi +0 -2320
- pyglet/gl/gl_compat.pyi +0 -3097
- pyglet/gl/gl_info.py +0 -190
- pyglet/gl/headless.py +0 -166
- pyglet/gl/wgl_info.py +0 -36
- pyglet/gl/wglext_nv.py +0 -1096
- pyglet/gl/win32.py +0 -268
- pyglet/gl/xlib.py +0 -295
- pyglet/image/buffer.py +0 -274
- pyglet/image/codecs/s3tc.py +0 -354
- pyglet/libs/x11/xrandr.py +0 -166
- pyglet-2.1.12.dist-info/RECORD +0 -234
- /pyglet/{libs/wayland → graphics/api/gl/cocoa}/__init__.py +0 -0
- /pyglet/libs/{egl → linux/egl}/egl.py +0 -0
- /pyglet/libs/{egl → linux/egl}/lib.py +0 -0
- /pyglet/libs/{ioctl.py → linux/ioctl.py} +0 -0
- /pyglet/libs/{wayland → linux/wayland}/gbm.py +0 -0
- /pyglet/libs/{x11 → linux/x11}/__init__.py +0 -0
- /pyglet/libs/{x11 → linux/x11}/cursorfont.py +0 -0
- /pyglet/libs/{x11 → linux/x11}/xlib.py +0 -0
- /pyglet/libs/{x11 → linux/x11}/xsync.py +0 -0
- {pyglet-2.1.12.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
|
|
14
|
+
from typing import TYPE_CHECKING, Sequence
|
|
16
15
|
|
|
17
|
-
from _ctypes import Array, _Pointer, _SimpleCData
|
|
18
16
|
|
|
19
|
-
import
|
|
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
|
-
|
|
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.
|
|
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
|
-
|
|
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
|
-
|
|
58
|
+
super().__init__('b', size)
|
|
146
59
|
self.usage = usage
|
|
147
|
-
self.
|
|
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(
|
|
67
|
+
self._context.glBindBuffer(self.target, self.id)
|
|
154
68
|
data = (GLubyte * self.size)()
|
|
155
|
-
glBufferData(
|
|
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(
|
|
101
|
+
self._context.glBufferData(self.target, self.size, None, self.usage)
|
|
159
102
|
|
|
160
|
-
def bind(self
|
|
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(
|
|
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(
|
|
172
|
-
glBufferData(
|
|
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(
|
|
176
|
-
glBufferSubData(
|
|
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(
|
|
180
|
-
return ctypes.cast(glMapBuffer(
|
|
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(
|
|
185
|
-
return ctypes.cast(glMapBufferRange(
|
|
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(
|
|
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(
|
|
207
|
-
data = glMapBufferRange(
|
|
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(
|
|
148
|
+
self._context.glUnmapBuffer(self.target)
|
|
210
149
|
|
|
211
150
|
self.size = size
|
|
212
|
-
glBufferData(
|
|
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:
|
|
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
|
-
|
|
233
|
-
ctype:
|
|
171
|
+
element_count: int
|
|
172
|
+
ctype: CType
|
|
234
173
|
|
|
235
|
-
def __init__(self, size: int, c_type:
|
|
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.
|
|
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(
|
|
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(
|
|
203
|
+
self._context.glBufferData(self.target, self.size, self.data, self.usage)
|
|
265
204
|
else:
|
|
266
|
-
glBufferSubData(
|
|
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[
|
|
212
|
+
def get_region(self, start: int, count: int) -> Array[CType]:
|
|
274
213
|
byte_start = self.stride * start # byte offset
|
|
275
|
-
array_count = self.
|
|
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.
|
|
281
|
-
array_end = self.
|
|
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,
|
|
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,
|
|
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:
|
|
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.
|
|
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 =
|
|
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()
|