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,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
+ )