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.
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 +4 -17
  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 +27 -5
  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 +147 -177
  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.12.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.12.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.12.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.12.dist-info/licenses → pyglet-3.0.dev1.dist-info}/LICENSE +0 -0
@@ -0,0 +1,55 @@
1
+ from __future__ import annotations
2
+ import pyglet
3
+ from typing import TYPE_CHECKING
4
+
5
+ if TYPE_CHECKING:
6
+ from pyglet.graphics.api.gl.shader import ShaderProgram
7
+
8
+ vertex_source = """#version 150 core
9
+ in vec2 position;
10
+ in vec3 translation;
11
+ in vec4 colors;
12
+ in float rotation;
13
+
14
+ out vec4 vertex_colors;
15
+
16
+ uniform WindowBlock
17
+ {
18
+ mat4 projection;
19
+ mat4 view;
20
+ } window;
21
+
22
+ mat4 m_rotation = mat4(1.0);
23
+ mat4 m_translate = mat4(1.0);
24
+
25
+ void main()
26
+ {
27
+ m_translate[3][0] = translation.x;
28
+ m_translate[3][1] = translation.y;
29
+ m_rotation[0][0] = cos(-radians(rotation));
30
+ m_rotation[0][1] = sin(-radians(rotation));
31
+ m_rotation[1][0] = -sin(-radians(rotation));
32
+ m_rotation[1][1] = cos(-radians(rotation));
33
+
34
+ gl_Position = window.projection * window.view * m_translate * m_rotation * vec4(position, translation.z, 1.0);
35
+ vertex_colors = colors;
36
+ }
37
+ """
38
+
39
+ fragment_source = """#version 150 core
40
+ in vec4 vertex_colors;
41
+ out vec4 final_color;
42
+
43
+ void main()
44
+ {
45
+ final_color = vertex_colors;
46
+ }
47
+ """
48
+
49
+
50
+ def get_default_shader() -> ShaderProgram:
51
+ return pyglet.graphics.api.core.get_cached_shader(
52
+ "default_shapes",
53
+ (vertex_source, 'vertex'),
54
+ (fragment_source, 'fragment'),
55
+ )
@@ -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 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,219 @@
1
+ from __future__ import annotations
2
+ from dataclasses import dataclass
3
+ from typing import Any, Callable, Generator, TYPE_CHECKING
4
+
5
+ import pyglet
6
+ from pyglet.enums import BlendFactor, BlendOp, CompareOp
7
+ from pyglet.graphics.api.gl import GL_TEXTURE0, GL_BLEND, GL_SCISSOR_TEST, GL_DEPTH_TEST, OpenGLSurfaceContext, \
8
+ glScissor
9
+ from pyglet.graphics.api.gl.enums import blend_factor_map, compare_op_map
10
+ from pyglet.graphics.state import State
11
+
12
+ if TYPE_CHECKING:
13
+ from pyglet.graphics.texture import TextureBase
14
+ from pyglet.graphics.api.gl.shader import ShaderProgram
15
+ from pyglet.customtypes import ScissorProtocol
16
+
17
+
18
+ @dataclass(frozen=True)
19
+ class ActiveTextureState(State):
20
+ binding: int
21
+ sets_state: bool = True
22
+
23
+ def set_state(self, ctx: OpenGLSurfaceContext) -> None:
24
+ ctx = pyglet.graphics.api.core.current_context
25
+ ctx.glActiveTexture(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
+ binding: int = 0
36
+ set_id: int = 0
37
+
38
+ parents: bool = True
39
+ sets_state: bool = True
40
+
41
+ @classmethod
42
+ def from_texture(cls, texture: TextureBase, binding: int, set_id: int) -> TextureState:
43
+ return cls((texture.target, texture.id), binding, set_id)
44
+
45
+ def set_state(self, ctx: OpenGLSurfaceContext) -> None:
46
+ ctx.glBindTexture(*self.texture)
47
+
48
+ def generate_parent_states(self) -> Generator[State, None, None]:
49
+ yield ActiveTextureState(self.binding)
50
+
51
+
52
+
53
+ @dataclass(frozen=True)
54
+ class ShaderProgramState(State):
55
+ program: ShaderProgram
56
+
57
+ sets_state: bool = True
58
+ #unsets_state: bool = True
59
+
60
+ def set_state(self, ctx: OpenGLSurfaceContext) -> None:
61
+ self.program.use()
62
+
63
+ #def unset_state(self, ctx: OpenGLSurfaceContext) -> None:
64
+ # self.program.stop()
65
+
66
+ @dataclass(frozen=True)
67
+ class RenderPassState(State):
68
+ renderpass: Any # Renderpass for Vulkan.
69
+
70
+
71
+ @dataclass(frozen=True)
72
+ class RenderAreaState(State):
73
+ width: int
74
+ height: int
75
+
76
+
77
+ @dataclass(frozen=True)
78
+ class ScissorStateEnable(State):
79
+ sets_state: bool = True
80
+ unsets_state: bool = True
81
+
82
+ def set_state(self, ctx: OpenGLSurfaceContext) -> None:
83
+ ctx.glEnable(GL_SCISSOR_TEST)
84
+
85
+ def unset_state(self, ctx: OpenGLSurfaceContext) -> None:
86
+ ctx.glDisable(GL_SCISSOR_TEST)
87
+
88
+ @dataclass(frozen=True)
89
+ class ScissorState(State):
90
+ spo: ScissorProtocol
91
+
92
+ sets_state: bool = True
93
+ parents: bool = True
94
+
95
+ def generate_parent_states(self) -> Generator[State, None, None]:
96
+ yield ScissorStateEnable()
97
+
98
+ def set_state(self, ctx: OpenGLSurfaceContext) -> None:
99
+ glScissor(int(self.spo.x), int(self.spo.y), int(self.spo.width), int(self.spo.height))
100
+
101
+
102
+ @dataclass(frozen=True)
103
+ class BlendStateEnable(State):
104
+ sets_state: bool = True
105
+ unsets_state: bool = True
106
+
107
+ def set_state(self, ctx: OpenGLSurfaceContext) -> None:
108
+ ctx.glEnable(GL_BLEND)
109
+
110
+ def unset_state(self, ctx: OpenGLSurfaceContext) -> None:
111
+ ctx.glDisable(GL_BLEND)
112
+
113
+
114
+ @dataclass(frozen=True)
115
+ class BlendState(State):
116
+ src: BlendFactor
117
+ dst: BlendFactor
118
+ op: BlendOp = BlendOp.ADD
119
+
120
+ sets_state: bool = True
121
+ parents: bool = True
122
+
123
+ def __post_init__(self) -> None:
124
+ if not isinstance(self.src, BlendFactor):
125
+ raise Exception("src must be BlendFactor")
126
+
127
+ def generate_parent_states(self) -> Generator[State, None, None]:
128
+ yield BlendStateEnable()
129
+ # Do later.
130
+ #if self.op != BlendOp.ADD:
131
+ # yield GLBlendState(blend_factor_map[self.src], self.op)
132
+
133
+ def set_state(self, ctx: OpenGLSurfaceContext) -> None:
134
+ ctx.glBlendFunc(blend_factor_map[self.src], blend_factor_map[self.dst])
135
+
136
+
137
+ @dataclass(frozen=True)
138
+ class DepthTestStateEnable(State):
139
+ sets_state: bool = True
140
+ unsets_state: bool = True
141
+
142
+ def set_state(self, ctx: OpenGLSurfaceContext) -> None:
143
+ ctx.glEnable(GL_DEPTH_TEST)
144
+
145
+ def unset_state(self, ctx: OpenGLSurfaceContext) -> None:
146
+ ctx.glDisable(GL_DEPTH_TEST)
147
+
148
+
149
+ @dataclass(frozen=True)
150
+ class DepthBufferComparison(State):
151
+ func: CompareOp
152
+
153
+ sets_state: bool = True
154
+ parents: bool = True
155
+
156
+ def generate_parent_states(self) -> Generator[State, None, None]:
157
+ yield DepthTestStateEnable()
158
+
159
+ def set_state(self, ctx: OpenGLSurfaceContext) -> None:
160
+ ctx.glDepthFunc(compare_op_map[self.func])
161
+
162
+
163
+ @dataclass(frozen=True)
164
+ class DepthWriteState(State):
165
+ flag: int
166
+
167
+ @dataclass(frozen=True)
168
+ class StencilFuncState(State):
169
+ func: Callable
170
+ ref: int
171
+ mask: int
172
+
173
+ @dataclass(frozen=True)
174
+ class StencilOpState(State):
175
+ fail: int
176
+ zfail: int
177
+ zpass: int
178
+
179
+ @dataclass(frozen=True)
180
+ class PolygonModeState(State):
181
+ face: int
182
+ mode: int
183
+
184
+
185
+ @dataclass(frozen=True)
186
+ class ViewportState(State):
187
+ x: int
188
+ y: int
189
+ width: int
190
+ height: float
191
+
192
+ sets_state: bool = True
193
+
194
+ def set_state(self, ctx: OpenGLSurfaceContext) -> None:
195
+ ctx.glViewport(self.x, self.y, self.width, self.height)
196
+
197
+
198
+ @dataclass(frozen=True)
199
+ class UniformBufferState(State):
200
+ name: str
201
+ binding: int
202
+
203
+
204
+ @dataclass(frozen=True)
205
+ class ShaderUniformState(State):
206
+ program: ShaderProgram
207
+ data: dict[str, Any]
208
+
209
+ sets_state: bool = True
210
+
211
+ def set_state(self, ctx: OpenGLSurfaceContext) -> None:
212
+ for name, value in self.data.items():
213
+ self.program[name] = value
214
+
215
+ def __hash__(self) -> int:
216
+ return id(self)
217
+
218
+ def __eq__(self, other: State) -> bool:
219
+ return False
@@ -0,0 +1,190 @@
1
+ from __future__ import annotations
2
+
3
+ import pyglet
4
+ from typing import TYPE_CHECKING
5
+
6
+ if TYPE_CHECKING:
7
+ from pyglet.graphics.api.gl.shader import ShaderProgram
8
+
9
+ layout_vertex_source = """#version 330 core
10
+ in vec3 position;
11
+ in vec4 colors;
12
+ in vec3 tex_coords;
13
+ in vec3 translation;
14
+ in vec3 view_translation;
15
+ in vec2 anchor;
16
+ in float rotation;
17
+ in float visible;
18
+
19
+ out vec4 text_colors;
20
+ out vec2 texture_coords;
21
+ out vec4 vert_position;
22
+
23
+ uniform WindowBlock
24
+ {
25
+ mat4 projection;
26
+ mat4 view;
27
+ } window;
28
+
29
+ void main()
30
+ {
31
+ mat4 m_rotation = mat4(1.0);
32
+ vec3 v_anchor = vec3(anchor.x, anchor.y, 0);
33
+ mat4 m_anchor = mat4(1.0);
34
+ mat4 m_translate = mat4(1.0);
35
+
36
+ m_translate[3][0] = translation.x;
37
+ m_translate[3][1] = translation.y;
38
+ m_translate[3][2] = translation.z;
39
+
40
+ m_rotation[0][0] = cos(-radians(rotation));
41
+ m_rotation[0][1] = sin(-radians(rotation));
42
+ m_rotation[1][0] = -sin(-radians(rotation));
43
+ m_rotation[1][1] = cos(-radians(rotation));
44
+
45
+ gl_Position = window.projection * window.view * m_translate * m_anchor * m_rotation * vec4(position +
46
+ view_translation + v_anchor, 1.0) * visible;
47
+
48
+ vert_position = vec4(position + translation + view_translation + v_anchor, 1.0);
49
+ text_colors = colors;
50
+ texture_coords = tex_coords.xy;
51
+ }
52
+ """
53
+
54
+ layout_fragment_source = """#version 330 core
55
+ in vec4 text_colors;
56
+ in vec2 texture_coords;
57
+ in vec4 vert_position;
58
+
59
+ out vec4 final_colors;
60
+
61
+ uniform sampler2D text;
62
+ uniform bool scissor;
63
+ uniform vec4 scissor_area;
64
+
65
+ void main()
66
+ {
67
+ final_colors = texture(text, texture_coords) * text_colors;
68
+ if (scissor == true) {
69
+ if (vert_position.x < scissor_area[0]) discard; // left
70
+ if (vert_position.y < scissor_area[1]) discard; // bottom
71
+ if (vert_position.x > scissor_area[0] + scissor_area[2]) discard; // right
72
+ if (vert_position.y > scissor_area[1] + scissor_area[3]) discard; // top
73
+ }
74
+ }
75
+ """
76
+ layout_fragment_image_source = """#version 330 core
77
+ in vec4 text_colors;
78
+ in vec2 texture_coords;
79
+ in vec4 vert_position;
80
+
81
+ uniform sampler2D image_texture;
82
+
83
+ out vec4 final_colors;
84
+
85
+ uniform bool scissor;
86
+ uniform vec4 scissor_area;
87
+
88
+ void main()
89
+ {
90
+ final_colors = texture(image_texture, texture_coords.xy);
91
+ if (scissor == true) {
92
+ if (vert_position.x < scissor_area[0]) discard; // left
93
+ if (vert_position.y < scissor_area[1]) discard; // bottom
94
+ if (vert_position.x > scissor_area[0] + scissor_area[2]) discard; // right
95
+ if (vert_position.y > scissor_area[1] + scissor_area[3]) discard; // top
96
+ }
97
+ }
98
+ """
99
+ decoration_vertex_source = """#version 330 core
100
+ in vec3 position;
101
+ in vec4 colors;
102
+ in vec3 translation;
103
+ in vec3 view_translation;
104
+ in vec2 anchor;
105
+ in float rotation;
106
+ in float visible;
107
+
108
+ out vec4 vert_colors;
109
+ out vec4 vert_position;
110
+
111
+ uniform WindowBlock
112
+ {
113
+ mat4 projection;
114
+ mat4 view;
115
+ } window;
116
+
117
+ void main()
118
+ {
119
+ mat4 m_rotation = mat4(1.0);
120
+ vec3 v_anchor = vec3(anchor.x, anchor.y, 0);
121
+ mat4 m_anchor = mat4(1.0);
122
+ mat4 m_translate = mat4(1.0);
123
+
124
+ m_translate[3][0] = translation.x;
125
+ m_translate[3][1] = translation.y;
126
+ m_translate[3][2] = translation.z;
127
+
128
+ m_rotation[0][0] = cos(-radians(rotation));
129
+ m_rotation[0][1] = sin(-radians(rotation));
130
+ m_rotation[1][0] = -sin(-radians(rotation));
131
+ m_rotation[1][1] = cos(-radians(rotation));
132
+
133
+ gl_Position = window.projection * window.view * m_translate * m_anchor * m_rotation * vec4(position +
134
+ view_translation + v_anchor, 1.0) * visible;
135
+
136
+ vert_position = vec4(position + translation + view_translation + v_anchor, 1.0);
137
+ vert_colors = colors;
138
+ }
139
+ """
140
+ decoration_fragment_source = """#version 330 core
141
+ in vec4 vert_colors;
142
+ in vec4 vert_position;
143
+
144
+ out vec4 final_colors;
145
+
146
+ uniform bool scissor;
147
+ uniform vec4 scissor_area;
148
+
149
+ void main()
150
+ {
151
+ final_colors = vert_colors;
152
+ if (scissor == true) {
153
+ if (vert_position.x < scissor_area[0]) discard; // left
154
+ if (vert_position.y < scissor_area[1]) discard; // bottom
155
+ if (vert_position.x > scissor_area[0] + scissor_area[2]) discard; // right
156
+ if (vert_position.y > scissor_area[1] + scissor_area[3]) discard; // top
157
+ }
158
+ }
159
+ """
160
+
161
+
162
+ def get_default_layout_shader() -> ShaderProgram:
163
+ """The default shader used for all glyphs in the layout."""
164
+ return pyglet.graphics.api.core.get_cached_shader(
165
+ "default_text_layout",
166
+ (layout_vertex_source, "vertex"),
167
+ (layout_fragment_source, "fragment"),
168
+ )
169
+
170
+
171
+ def get_default_image_layout_shader() -> ShaderProgram:
172
+ """The default shader used for an InlineElement image. Used for HTML Labels that insert images via <img> tag."""
173
+ return pyglet.graphics.api.core.get_cached_shader(
174
+ "default_text_image",
175
+ (layout_vertex_source, "vertex"),
176
+ (layout_fragment_image_source, "fragment"),
177
+ )
178
+
179
+
180
+ def get_default_decoration_shader() -> ShaderProgram:
181
+ """The default shader for underline and background decoration effects in the layout."""
182
+ return pyglet.graphics.api.core.get_cached_shader(
183
+ "default_text_decoration",
184
+ (decoration_vertex_source, "vertex"),
185
+ (decoration_fragment_source, "fragment"),
186
+ )
187
+
188
+ # ====== SCROLLING TEXT
189
+
190
+