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
|
@@ -0,0 +1,92 @@
|
|
|
1
|
+
from __future__ import annotations
|
|
2
|
+
|
|
3
|
+
from typing import TYPE_CHECKING
|
|
4
|
+
|
|
5
|
+
import pyglet
|
|
6
|
+
from pyglet.enums import BlendFactor
|
|
7
|
+
from pyglet.graphics.draw import Group
|
|
8
|
+
|
|
9
|
+
if TYPE_CHECKING:
|
|
10
|
+
from pyglet.graphics.api.webgl.shader import ShaderProgram
|
|
11
|
+
|
|
12
|
+
vertex_source = """#version 300 es
|
|
13
|
+
in vec2 position;
|
|
14
|
+
in vec3 translation;
|
|
15
|
+
in vec4 colors;
|
|
16
|
+
in float rotation;
|
|
17
|
+
|
|
18
|
+
out vec4 vertex_colors;
|
|
19
|
+
|
|
20
|
+
uniform WindowBlock
|
|
21
|
+
{
|
|
22
|
+
mat4 projection;
|
|
23
|
+
mat4 view;
|
|
24
|
+
} window;
|
|
25
|
+
|
|
26
|
+
mat4 m_rotation = mat4(1.0);
|
|
27
|
+
mat4 m_translate = mat4(1.0);
|
|
28
|
+
|
|
29
|
+
void main()
|
|
30
|
+
{
|
|
31
|
+
m_translate[3][0] = translation.x;
|
|
32
|
+
m_translate[3][1] = translation.y;
|
|
33
|
+
m_rotation[0][0] = cos(-radians(rotation));
|
|
34
|
+
m_rotation[0][1] = sin(-radians(rotation));
|
|
35
|
+
m_rotation[1][0] = -sin(-radians(rotation));
|
|
36
|
+
m_rotation[1][1] = cos(-radians(rotation));
|
|
37
|
+
|
|
38
|
+
gl_Position = window.projection * window.view * m_translate * m_rotation * vec4(position, translation.z, 1.0);
|
|
39
|
+
vertex_colors = colors;
|
|
40
|
+
}
|
|
41
|
+
"""
|
|
42
|
+
|
|
43
|
+
fragment_source = """#version 300 es
|
|
44
|
+
in vec4 vertex_colors;
|
|
45
|
+
out vec4 final_color;
|
|
46
|
+
|
|
47
|
+
void main()
|
|
48
|
+
{
|
|
49
|
+
final_color = vertex_colors;
|
|
50
|
+
}
|
|
51
|
+
"""
|
|
52
|
+
|
|
53
|
+
|
|
54
|
+
def get_default_shader() -> ShaderProgram:
|
|
55
|
+
return pyglet.graphics.api.core.get_cached_shader(
|
|
56
|
+
"default_shapes",
|
|
57
|
+
(vertex_source, 'vertex'),
|
|
58
|
+
(fragment_source, 'fragment'),
|
|
59
|
+
)
|
|
60
|
+
|
|
61
|
+
|
|
62
|
+
class _ShapeGroup(Group):
|
|
63
|
+
"""Shared Shape rendering Group.
|
|
64
|
+
|
|
65
|
+
The group is automatically coalesced with other shape groups
|
|
66
|
+
sharing the same parent group and blend parameters.
|
|
67
|
+
"""
|
|
68
|
+
|
|
69
|
+
blend_src: int
|
|
70
|
+
blend_dest: int
|
|
71
|
+
|
|
72
|
+
def __init__(
|
|
73
|
+
self, blend_src: BlendFactor, blend_dest: BlendFactor, program: ShaderProgram, parent: Group | None = None
|
|
74
|
+
) -> None:
|
|
75
|
+
"""Create a Shape group.
|
|
76
|
+
|
|
77
|
+
The group is created internally. Usually you do not
|
|
78
|
+
need to explicitly create it.
|
|
79
|
+
|
|
80
|
+
Args:
|
|
81
|
+
blend_src:
|
|
82
|
+
OpenGL blend source mode; for example, ``GL_SRC_ALPHA``.
|
|
83
|
+
blend_dest:
|
|
84
|
+
OpenGL blend destination mode; for example, ``GL_ONE_MINUS_SRC_ALPHA``.
|
|
85
|
+
program:
|
|
86
|
+
The ShaderProgram to use.
|
|
87
|
+
parent:
|
|
88
|
+
Optional parent group.
|
|
89
|
+
"""
|
|
90
|
+
super().__init__(parent=parent)
|
|
91
|
+
self.set_shader_program(program)
|
|
92
|
+
self.set_blend(blend_src, blend_dest)
|
|
@@ -0,0 +1,102 @@
|
|
|
1
|
+
from __future__ import annotations
|
|
2
|
+
|
|
3
|
+
import sys
|
|
4
|
+
from typing import TYPE_CHECKING
|
|
5
|
+
|
|
6
|
+
import pyglet
|
|
7
|
+
|
|
8
|
+
_is_pyglet_doc_run = hasattr(sys, 'is_pyglet_doc_run') and sys.is_pyglet_doc_run
|
|
9
|
+
|
|
10
|
+
if TYPE_CHECKING:
|
|
11
|
+
from pyglet.graphics.shader import ShaderProgram
|
|
12
|
+
|
|
13
|
+
|
|
14
|
+
vertex_source: str = """#version 150 core
|
|
15
|
+
in vec3 translate;
|
|
16
|
+
in vec4 colors;
|
|
17
|
+
in vec3 tex_coords;
|
|
18
|
+
in vec2 scale;
|
|
19
|
+
in vec3 position;
|
|
20
|
+
in float rotation;
|
|
21
|
+
|
|
22
|
+
out vec4 vertex_colors;
|
|
23
|
+
out vec3 texture_coords;
|
|
24
|
+
|
|
25
|
+
uniform WindowBlock
|
|
26
|
+
{
|
|
27
|
+
mat4 projection;
|
|
28
|
+
mat4 view;
|
|
29
|
+
} window;
|
|
30
|
+
|
|
31
|
+
mat4 m_scale = mat4(1.0);
|
|
32
|
+
mat4 m_rotation = mat4(1.0);
|
|
33
|
+
mat4 m_translate = mat4(1.0);
|
|
34
|
+
|
|
35
|
+
void main()
|
|
36
|
+
{
|
|
37
|
+
m_scale[0][0] = scale.x;
|
|
38
|
+
m_scale[1][1] = scale.y;
|
|
39
|
+
m_translate[3][0] = translate.x;
|
|
40
|
+
m_translate[3][1] = translate.y;
|
|
41
|
+
m_translate[3][2] = translate.z;
|
|
42
|
+
m_rotation[0][0] = cos(-radians(rotation));
|
|
43
|
+
m_rotation[0][1] = sin(-radians(rotation));
|
|
44
|
+
m_rotation[1][0] = -sin(-radians(rotation));
|
|
45
|
+
m_rotation[1][1] = cos(-radians(rotation));
|
|
46
|
+
|
|
47
|
+
gl_Position = window.projection * window.view * m_translate * m_rotation * m_scale * vec4(position, 1.0);
|
|
48
|
+
|
|
49
|
+
vertex_colors = colors;
|
|
50
|
+
texture_coords = tex_coords;
|
|
51
|
+
}
|
|
52
|
+
"""
|
|
53
|
+
|
|
54
|
+
fragment_source: str = """#version 150 core
|
|
55
|
+
in vec4 vertex_colors;
|
|
56
|
+
in vec3 texture_coords;
|
|
57
|
+
out vec4 final_colors;
|
|
58
|
+
|
|
59
|
+
uniform sampler2D sprite_texture;
|
|
60
|
+
|
|
61
|
+
void main()
|
|
62
|
+
{
|
|
63
|
+
final_colors = texture(sprite_texture, texture_coords.xy) * vertex_colors;
|
|
64
|
+
}
|
|
65
|
+
"""
|
|
66
|
+
|
|
67
|
+
fragment_array_source: str = """#version 150 core
|
|
68
|
+
in vec4 vertex_colors;
|
|
69
|
+
in vec3 texture_coords;
|
|
70
|
+
out vec4 final_colors;
|
|
71
|
+
|
|
72
|
+
uniform sampler2DArray sprite_texture;
|
|
73
|
+
|
|
74
|
+
void main()
|
|
75
|
+
{
|
|
76
|
+
final_colors = texture(sprite_texture, texture_coords) * vertex_colors;
|
|
77
|
+
}
|
|
78
|
+
"""
|
|
79
|
+
|
|
80
|
+
|
|
81
|
+
def get_default_shader() -> ShaderProgram:
|
|
82
|
+
"""Create and return the default sprite shader.
|
|
83
|
+
|
|
84
|
+
This method allows the module to be imported without an OpenGL Context.
|
|
85
|
+
"""
|
|
86
|
+
return pyglet.graphics.api.core.get_cached_shader(
|
|
87
|
+
"default_sprite",
|
|
88
|
+
(vertex_source, 'vertex'),
|
|
89
|
+
(fragment_source, 'fragment'),
|
|
90
|
+
)
|
|
91
|
+
|
|
92
|
+
|
|
93
|
+
def get_default_array_shader() -> ShaderProgram:
|
|
94
|
+
"""Create and return the default array sprite shader.
|
|
95
|
+
|
|
96
|
+
This method allows the module to be imported without an OpenGL Context.
|
|
97
|
+
"""
|
|
98
|
+
return pyglet.graphics.api.core.get_cached_shader(
|
|
99
|
+
"default_sprite_array",
|
|
100
|
+
(vertex_source, 'vertex'),
|
|
101
|
+
(fragment_array_source, 'fragment'),
|
|
102
|
+
)
|
|
@@ -0,0 +1,227 @@
|
|
|
1
|
+
from __future__ import annotations
|
|
2
|
+
|
|
3
|
+
from dataclasses import dataclass, field
|
|
4
|
+
from typing import TYPE_CHECKING, Any, Callable, Generator
|
|
5
|
+
|
|
6
|
+
from pyglet.enums import BlendFactor, BlendOp, CompareOp
|
|
7
|
+
from pyglet.graphics.api.webgl.enums import blend_factor_map, compare_op_map
|
|
8
|
+
from pyglet.graphics.api.webgl.gl import GL_BLEND, GL_DEPTH_TEST, GL_SCISSOR_TEST, GL_TEXTURE0
|
|
9
|
+
from pyglet.graphics.state import State
|
|
10
|
+
|
|
11
|
+
if TYPE_CHECKING:
|
|
12
|
+
from pyglet.graphics.api.webgl.webgl_js import WebGLTexture
|
|
13
|
+
from pyglet.graphics.api.webgl import OpenGLSurfaceContext
|
|
14
|
+
from pyglet.graphics import Group
|
|
15
|
+
from pyglet.graphics.api.webgl.shader import ShaderProgram
|
|
16
|
+
from pyglet.graphics.texture import TextureBase
|
|
17
|
+
|
|
18
|
+
|
|
19
|
+
@dataclass(frozen=True)
|
|
20
|
+
class ActiveTextureState(State):
|
|
21
|
+
binding: int
|
|
22
|
+
sets_state: bool = True
|
|
23
|
+
|
|
24
|
+
def set_state(self, ctx: OpenGLSurfaceContext) -> None:
|
|
25
|
+
ctx.gl.activeTexture(GL_TEXTURE0 + self.binding)
|
|
26
|
+
|
|
27
|
+
# Technically not needed since this is a dependent state and will always be called with its parents.
|
|
28
|
+
# def unset_state(self, ctx: OpenGLSurfaceContext):
|
|
29
|
+
# glActiveTexture(GL_TEXTURE0)
|
|
30
|
+
|
|
31
|
+
|
|
32
|
+
@dataclass(frozen=True)
|
|
33
|
+
class TextureState(State): # noqa: D101
|
|
34
|
+
texture: tuple[int, int]
|
|
35
|
+
# WebGL doesn't expose the actual texture ID, so we use the python memory ID instead to consolidate the types
|
|
36
|
+
# as Python doesn't allow the JS Proxy to be hashable.
|
|
37
|
+
# However, the actual WebGL object needs to be passed for the function.
|
|
38
|
+
webgl_texture: WebGLTexture = field(hash=False, compare=False)
|
|
39
|
+
binding: int = 0
|
|
40
|
+
set_id: int = 0
|
|
41
|
+
|
|
42
|
+
parents: bool = True
|
|
43
|
+
sets_state: bool = True
|
|
44
|
+
|
|
45
|
+
@classmethod
|
|
46
|
+
def from_texture(cls, texture: TextureBase, binding: int, set_id: int) -> TextureState:
|
|
47
|
+
return cls((texture.target, id(texture.id)),
|
|
48
|
+
webgl_texture=texture.id,
|
|
49
|
+
binding=binding,
|
|
50
|
+
set_id=set_id)
|
|
51
|
+
|
|
52
|
+
def set_state(self, ctx: OpenGLSurfaceContext) -> None:
|
|
53
|
+
ctx.gl.bindTexture(self.texture[0], self.webgl_texture)
|
|
54
|
+
|
|
55
|
+
def generate_parent_states(self) -> Generator[State, None, None]:
|
|
56
|
+
yield ActiveTextureState(self.binding)
|
|
57
|
+
|
|
58
|
+
|
|
59
|
+
@dataclass(frozen=True)
|
|
60
|
+
class ShaderProgramState(State):
|
|
61
|
+
program: ShaderProgram
|
|
62
|
+
|
|
63
|
+
sets_state: bool = True
|
|
64
|
+
#unsets_state: bool = True
|
|
65
|
+
|
|
66
|
+
def set_state(self, ctx: OpenGLSurfaceContext) -> None:
|
|
67
|
+
self.program.use()
|
|
68
|
+
|
|
69
|
+
#def unset_state(self, ctx: OpenGLSurfaceContext) -> None:
|
|
70
|
+
# self.program.stop()l
|
|
71
|
+
|
|
72
|
+
|
|
73
|
+
@dataclass(frozen=True)
|
|
74
|
+
class RenderPassState(State):
|
|
75
|
+
renderpass: Any # Renderpass for Vulkan.
|
|
76
|
+
|
|
77
|
+
|
|
78
|
+
@dataclass(frozen=True)
|
|
79
|
+
class RenderAreaState(State):
|
|
80
|
+
width: int
|
|
81
|
+
height: int
|
|
82
|
+
|
|
83
|
+
|
|
84
|
+
@dataclass(frozen=True)
|
|
85
|
+
class ScissorStateEnable(State):
|
|
86
|
+
sets_state: bool = True
|
|
87
|
+
unsets_state: bool = True
|
|
88
|
+
|
|
89
|
+
def set_state(self, ctx: OpenGLSurfaceContext) -> None:
|
|
90
|
+
ctx.gl.enable(GL_SCISSOR_TEST)
|
|
91
|
+
|
|
92
|
+
def unset_state(self, ctx: OpenGLSurfaceContext) -> None:
|
|
93
|
+
ctx.gl.disable(GL_SCISSOR_TEST)
|
|
94
|
+
|
|
95
|
+
|
|
96
|
+
@dataclass(frozen=True)
|
|
97
|
+
class ScissorState(State):
|
|
98
|
+
group: Group
|
|
99
|
+
|
|
100
|
+
sets_state: bool = True
|
|
101
|
+
parents: bool = True
|
|
102
|
+
|
|
103
|
+
def generate_parent_states(self) -> Generator[State, None, None]:
|
|
104
|
+
yield ScissorStateEnable()
|
|
105
|
+
|
|
106
|
+
def set_state(self, ctx: OpenGLSurfaceContext) -> None:
|
|
107
|
+
ctx.gl.scissor(*self.group.data["scissor"])
|
|
108
|
+
|
|
109
|
+
|
|
110
|
+
@dataclass(frozen=True)
|
|
111
|
+
class BlendStateEnable(State):
|
|
112
|
+
sets_state: bool = True
|
|
113
|
+
unsets_state: bool = True
|
|
114
|
+
|
|
115
|
+
def set_state(self, ctx: OpenGLSurfaceContext) -> None:
|
|
116
|
+
ctx.gl.enable(GL_BLEND)
|
|
117
|
+
|
|
118
|
+
def unset_state(self, ctx: OpenGLSurfaceContext) -> None:
|
|
119
|
+
ctx.gl.disable(GL_BLEND)
|
|
120
|
+
|
|
121
|
+
|
|
122
|
+
@dataclass(frozen=True)
|
|
123
|
+
class BlendState(State):
|
|
124
|
+
src: BlendFactor
|
|
125
|
+
dst: BlendFactor
|
|
126
|
+
op: BlendOp = BlendOp.ADD
|
|
127
|
+
|
|
128
|
+
sets_state: bool = True
|
|
129
|
+
parents: bool = True
|
|
130
|
+
|
|
131
|
+
def generate_parent_states(self) -> Generator[State, None, None]:
|
|
132
|
+
yield BlendStateEnable()
|
|
133
|
+
# Do later.
|
|
134
|
+
# if self.op != BlendOp.ADD:
|
|
135
|
+
# yield GLBlendState(blend_factor_map[self.src], self.op)
|
|
136
|
+
|
|
137
|
+
def set_state(self, ctx: OpenGLSurfaceContext) -> None:
|
|
138
|
+
ctx.gl.blendFunc(blend_factor_map[self.src], blend_factor_map[self.dst])
|
|
139
|
+
|
|
140
|
+
|
|
141
|
+
@dataclass(frozen=True)
|
|
142
|
+
class DepthTestStateEnable(State):
|
|
143
|
+
sets_state: bool = True
|
|
144
|
+
unsets_state: bool = True
|
|
145
|
+
|
|
146
|
+
def set_state(self, ctx: OpenGLSurfaceContext) -> None:
|
|
147
|
+
ctx.gl.enable(GL_DEPTH_TEST)
|
|
148
|
+
|
|
149
|
+
def unset_state(self, ctx: OpenGLSurfaceContext) -> None:
|
|
150
|
+
ctx.gl.disable(GL_DEPTH_TEST)
|
|
151
|
+
|
|
152
|
+
|
|
153
|
+
@dataclass(frozen=True)
|
|
154
|
+
class DepthBufferComparison(State):
|
|
155
|
+
func: CompareOp
|
|
156
|
+
|
|
157
|
+
sets_state: bool = True
|
|
158
|
+
parents: bool = True
|
|
159
|
+
|
|
160
|
+
def generate_parent_states(self) -> Generator[State, None, None]:
|
|
161
|
+
yield DepthTestStateEnable()
|
|
162
|
+
|
|
163
|
+
def set_state(self, ctx: OpenGLSurfaceContext) -> None:
|
|
164
|
+
ctx.gl.depthFunc(compare_op_map[self.func])
|
|
165
|
+
|
|
166
|
+
|
|
167
|
+
@dataclass(frozen=True)
|
|
168
|
+
class DepthWriteState(State):
|
|
169
|
+
flag: int
|
|
170
|
+
|
|
171
|
+
|
|
172
|
+
@dataclass(frozen=True)
|
|
173
|
+
class StencilFuncState(State):
|
|
174
|
+
func: Callable
|
|
175
|
+
ref: int
|
|
176
|
+
mask: int
|
|
177
|
+
|
|
178
|
+
|
|
179
|
+
@dataclass(frozen=True)
|
|
180
|
+
class StencilOpState(State):
|
|
181
|
+
fail: int
|
|
182
|
+
zfail: int
|
|
183
|
+
zpass: int
|
|
184
|
+
|
|
185
|
+
|
|
186
|
+
@dataclass(frozen=True)
|
|
187
|
+
class PolygonModeState(State):
|
|
188
|
+
face: int
|
|
189
|
+
mode: int
|
|
190
|
+
|
|
191
|
+
|
|
192
|
+
@dataclass(frozen=True)
|
|
193
|
+
class ViewportState(State):
|
|
194
|
+
x: int
|
|
195
|
+
y: int
|
|
196
|
+
width: int
|
|
197
|
+
height: float
|
|
198
|
+
|
|
199
|
+
sets_state: bool = True
|
|
200
|
+
|
|
201
|
+
def set_state(self, ctx: OpenGLSurfaceContext) -> None:
|
|
202
|
+
ctx.gl.viewport(self.x, self.y, self.width, self.height)
|
|
203
|
+
|
|
204
|
+
|
|
205
|
+
@dataclass(frozen=True)
|
|
206
|
+
class UniformBufferState(State):
|
|
207
|
+
name: str
|
|
208
|
+
binding: int
|
|
209
|
+
|
|
210
|
+
|
|
211
|
+
@dataclass(frozen=True)
|
|
212
|
+
class ShaderUniformState(State):
|
|
213
|
+
program: ShaderProgram
|
|
214
|
+
data: dict[str, Any]
|
|
215
|
+
|
|
216
|
+
sets_state: bool = True
|
|
217
|
+
|
|
218
|
+
def set_state(self, ctx: OpenGLSurfaceContext) -> None:
|
|
219
|
+
for name, value in self.data.items():
|
|
220
|
+
self.program[name] = value
|
|
221
|
+
|
|
222
|
+
def __hash__(self) -> int:
|
|
223
|
+
return id(self)
|
|
224
|
+
|
|
225
|
+
def __eq__(self, other: State) -> bool:
|
|
226
|
+
return False
|
|
227
|
+
|
|
@@ -0,0 +1,187 @@
|
|
|
1
|
+
from __future__ import annotations
|
|
2
|
+
|
|
3
|
+
from typing import TYPE_CHECKING
|
|
4
|
+
|
|
5
|
+
import pyglet
|
|
6
|
+
|
|
7
|
+
if TYPE_CHECKING:
|
|
8
|
+
from pyglet.graphics.api.webgl import ShaderProgram
|
|
9
|
+
|
|
10
|
+
layout_vertex_source = """#version 330 core
|
|
11
|
+
in vec3 position;
|
|
12
|
+
in vec4 colors;
|
|
13
|
+
in vec3 tex_coords;
|
|
14
|
+
in vec3 translation;
|
|
15
|
+
in vec3 view_translation;
|
|
16
|
+
in vec2 anchor;
|
|
17
|
+
in float rotation;
|
|
18
|
+
in float visible;
|
|
19
|
+
|
|
20
|
+
out vec4 text_colors;
|
|
21
|
+
out vec2 texture_coords;
|
|
22
|
+
out vec4 vert_position;
|
|
23
|
+
|
|
24
|
+
uniform WindowBlock
|
|
25
|
+
{
|
|
26
|
+
mat4 projection;
|
|
27
|
+
mat4 view;
|
|
28
|
+
} window;
|
|
29
|
+
|
|
30
|
+
void main()
|
|
31
|
+
{
|
|
32
|
+
mat4 m_rotation = mat4(1.0);
|
|
33
|
+
vec3 v_anchor = vec3(anchor.x, anchor.y, 0);
|
|
34
|
+
mat4 m_anchor = mat4(1.0);
|
|
35
|
+
mat4 m_translate = mat4(1.0);
|
|
36
|
+
|
|
37
|
+
m_translate[3][0] = translation.x;
|
|
38
|
+
m_translate[3][1] = translation.y;
|
|
39
|
+
m_translate[3][2] = translation.z;
|
|
40
|
+
|
|
41
|
+
m_rotation[0][0] = cos(-radians(rotation));
|
|
42
|
+
m_rotation[0][1] = sin(-radians(rotation));
|
|
43
|
+
m_rotation[1][0] = -sin(-radians(rotation));
|
|
44
|
+
m_rotation[1][1] = cos(-radians(rotation));
|
|
45
|
+
|
|
46
|
+
gl_Position = window.projection * window.view * m_translate * m_anchor * m_rotation * vec4(position +
|
|
47
|
+
view_translation + v_anchor, 1.0) * visible;
|
|
48
|
+
|
|
49
|
+
vert_position = vec4(position + translation + view_translation + v_anchor, 1.0);
|
|
50
|
+
text_colors = colors;
|
|
51
|
+
texture_coords = tex_coords.xy;
|
|
52
|
+
}
|
|
53
|
+
"""
|
|
54
|
+
|
|
55
|
+
layout_fragment_source = """#version 330 core
|
|
56
|
+
in vec4 text_colors;
|
|
57
|
+
in vec2 texture_coords;
|
|
58
|
+
in vec4 vert_position;
|
|
59
|
+
|
|
60
|
+
out vec4 final_colors;
|
|
61
|
+
|
|
62
|
+
uniform sampler2D text;
|
|
63
|
+
uniform bool scissor;
|
|
64
|
+
uniform vec4 scissor_area;
|
|
65
|
+
|
|
66
|
+
void main()
|
|
67
|
+
{
|
|
68
|
+
final_colors = texture(text, texture_coords) * text_colors;
|
|
69
|
+
if (scissor == true) {
|
|
70
|
+
if (vert_position.x < scissor_area[0]) discard; // left
|
|
71
|
+
if (vert_position.y < scissor_area[1]) discard; // bottom
|
|
72
|
+
if (vert_position.x > scissor_area[0] + scissor_area[2]) discard; // right
|
|
73
|
+
if (vert_position.y > scissor_area[1] + scissor_area[3]) discard; // top
|
|
74
|
+
}
|
|
75
|
+
}
|
|
76
|
+
"""
|
|
77
|
+
layout_fragment_image_source = """#version 330 core
|
|
78
|
+
in vec4 text_colors;
|
|
79
|
+
in vec2 texture_coords;
|
|
80
|
+
in vec4 vert_position;
|
|
81
|
+
|
|
82
|
+
uniform sampler2D image_texture;
|
|
83
|
+
|
|
84
|
+
out vec4 final_colors;
|
|
85
|
+
|
|
86
|
+
uniform bool scissor;
|
|
87
|
+
uniform vec4 scissor_area;
|
|
88
|
+
|
|
89
|
+
void main()
|
|
90
|
+
{
|
|
91
|
+
final_colors = texture(image_texture, texture_coords.xy);
|
|
92
|
+
if (scissor == true) {
|
|
93
|
+
if (vert_position.x < scissor_area[0]) discard; // left
|
|
94
|
+
if (vert_position.y < scissor_area[1]) discard; // bottom
|
|
95
|
+
if (vert_position.x > scissor_area[0] + scissor_area[2]) discard; // right
|
|
96
|
+
if (vert_position.y > scissor_area[1] + scissor_area[3]) discard; // top
|
|
97
|
+
}
|
|
98
|
+
}
|
|
99
|
+
"""
|
|
100
|
+
decoration_vertex_source = """#version 330 core
|
|
101
|
+
in vec3 position;
|
|
102
|
+
in vec4 colors;
|
|
103
|
+
in vec3 translation;
|
|
104
|
+
in vec3 view_translation;
|
|
105
|
+
in vec2 anchor;
|
|
106
|
+
in float rotation;
|
|
107
|
+
in float visible;
|
|
108
|
+
|
|
109
|
+
out vec4 vert_colors;
|
|
110
|
+
out vec4 vert_position;
|
|
111
|
+
|
|
112
|
+
uniform WindowBlock
|
|
113
|
+
{
|
|
114
|
+
mat4 projection;
|
|
115
|
+
mat4 view;
|
|
116
|
+
} window;
|
|
117
|
+
|
|
118
|
+
void main()
|
|
119
|
+
{
|
|
120
|
+
mat4 m_rotation = mat4(1.0);
|
|
121
|
+
vec3 v_anchor = vec3(anchor.x, anchor.y, 0);
|
|
122
|
+
mat4 m_anchor = mat4(1.0);
|
|
123
|
+
mat4 m_translate = mat4(1.0);
|
|
124
|
+
|
|
125
|
+
m_translate[3][0] = translation.x;
|
|
126
|
+
m_translate[3][1] = translation.y;
|
|
127
|
+
m_translate[3][2] = translation.z;
|
|
128
|
+
|
|
129
|
+
m_rotation[0][0] = cos(-radians(rotation));
|
|
130
|
+
m_rotation[0][1] = sin(-radians(rotation));
|
|
131
|
+
m_rotation[1][0] = -sin(-radians(rotation));
|
|
132
|
+
m_rotation[1][1] = cos(-radians(rotation));
|
|
133
|
+
|
|
134
|
+
gl_Position = window.projection * window.view * m_translate * m_anchor * m_rotation * vec4(position +
|
|
135
|
+
view_translation + v_anchor, 1.0) * visible;
|
|
136
|
+
|
|
137
|
+
vert_position = vec4(position + translation + view_translation + v_anchor, 1.0);
|
|
138
|
+
vert_colors = colors;
|
|
139
|
+
}
|
|
140
|
+
"""
|
|
141
|
+
decoration_fragment_source = """#version 330 core
|
|
142
|
+
in vec4 vert_colors;
|
|
143
|
+
in vec4 vert_position;
|
|
144
|
+
|
|
145
|
+
out vec4 final_colors;
|
|
146
|
+
|
|
147
|
+
uniform bool scissor;
|
|
148
|
+
uniform vec4 scissor_area;
|
|
149
|
+
|
|
150
|
+
void main()
|
|
151
|
+
{
|
|
152
|
+
final_colors = vert_colors;
|
|
153
|
+
if (scissor == true) {
|
|
154
|
+
if (vert_position.x < scissor_area[0]) discard; // left
|
|
155
|
+
if (vert_position.y < scissor_area[1]) discard; // bottom
|
|
156
|
+
if (vert_position.x > scissor_area[0] + scissor_area[2]) discard; // right
|
|
157
|
+
if (vert_position.y > scissor_area[1] + scissor_area[3]) discard; // top
|
|
158
|
+
}
|
|
159
|
+
}
|
|
160
|
+
"""
|
|
161
|
+
|
|
162
|
+
|
|
163
|
+
def get_default_layout_shader() -> ShaderProgram:
|
|
164
|
+
"""The default shader used for all glyphs in the layout."""
|
|
165
|
+
return pyglet.graphics.api.core.get_cached_shader(
|
|
166
|
+
"default_text_layout",
|
|
167
|
+
(layout_vertex_source, "vertex"),
|
|
168
|
+
(layout_fragment_source, "fragment"),
|
|
169
|
+
)
|
|
170
|
+
|
|
171
|
+
|
|
172
|
+
def get_default_image_layout_shader() -> ShaderProgram:
|
|
173
|
+
"""The default shader used for an InlineElement image. Used for HTML Labels that insert images via <img> tag."""
|
|
174
|
+
return pyglet.graphics.api.core.get_cached_shader(
|
|
175
|
+
"default_text_image",
|
|
176
|
+
(layout_vertex_source, "vertex"),
|
|
177
|
+
(layout_fragment_image_source, "fragment"),
|
|
178
|
+
)
|
|
179
|
+
|
|
180
|
+
|
|
181
|
+
def get_default_decoration_shader() -> ShaderProgram:
|
|
182
|
+
"""The default shader for underline and background decoration effects in the layout."""
|
|
183
|
+
return pyglet.graphics.api.core.get_cached_shader(
|
|
184
|
+
"default_text_decoration",
|
|
185
|
+
(decoration_vertex_source, "vertex"),
|
|
186
|
+
(decoration_fragment_source, "fragment"),
|
|
187
|
+
)
|