pyglet 2.0.8__zip → 2.0.10__zip

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 (876) hide show
  1. {pyglet-2.0.8 → pyglet-2.0.10}/.github/workflows/unittests.yml +1 -5
  2. {pyglet-2.0.8 → pyglet-2.0.10}/.gitignore +3 -0
  3. {pyglet-2.0.8 → pyglet-2.0.10}/.readthedocs.yml +5 -1
  4. {pyglet-2.0.8 → pyglet-2.0.10}/PKG-INFO +3 -2
  5. {pyglet-2.0.8 → pyglet-2.0.10}/README.md +2 -1
  6. {pyglet-2.0.8 → pyglet-2.0.10}/RELEASE_NOTES +55 -0
  7. {pyglet-2.0.8 → pyglet-2.0.10}/contrib/qt_sprite_preview.py +774 -586
  8. {pyglet-2.0.8 → pyglet-2.0.10}/doc/conf.py +6 -0
  9. {pyglet-2.0.8 → pyglet-2.0.10}/doc/modules/shapes.rst +8 -8
  10. {pyglet-2.0.8 → pyglet-2.0.10}/doc/modules/window_key.rst +9 -1
  11. {pyglet-2.0.8 → pyglet-2.0.10}/doc/programming_guide/eventloop.rst +57 -53
  12. {pyglet-2.0.8 → pyglet-2.0.10}/doc/programming_guide/keyboard.rst +194 -67
  13. {pyglet-2.0.8 → pyglet-2.0.10}/doc/programming_guide/media.rst +297 -67
  14. {pyglet-2.0.8 → pyglet-2.0.10}/doc/programming_guide/quickstart.rst +1 -0
  15. pyglet-2.0.10/examples/clipboard.py +18 -0
  16. {pyglet-2.0.8 → pyglet-2.0.10}/examples/input/controller.py +4 -0
  17. {pyglet-2.0.8 → pyglet-2.0.10}/examples/media/media_info.py +1 -9
  18. pyglet-2.0.10/examples/media/soundspace/README +38 -0
  19. pyglet-2.0.10/examples/media/soundspace/reader.py +117 -0
  20. pyglet-2.0.10/examples/media/soundspace/res/bass.wav +0 -0
  21. pyglet-2.0.10/examples/media/soundspace/res/drums.wav +0 -0
  22. pyglet-2.0.10/examples/media/soundspace/res/guitar.wav +0 -0
  23. pyglet-2.0.10/examples/media/soundspace/res/piano.wav +0 -0
  24. pyglet-2.0.10/examples/media/soundspace/res/space.txt +24 -0
  25. pyglet-2.0.10/examples/media/soundspace/soundspace.py +660 -0
  26. {pyglet-2.0.8 → pyglet-2.0.10}/examples/model/fpscamera.py +50 -38
  27. pyglet-2.0.10/examples/net/client.py +18 -0
  28. pyglet-2.0.10/examples/net/server.py +25 -0
  29. pyglet-2.0.10/examples/opengl/compute_shader.py +39 -0
  30. {pyglet-2.0.8/examples/graphics → pyglet-2.0.10/examples}/shapes.py +3 -0
  31. {pyglet-2.0.8 → pyglet-2.0.10}/examples/window/fixed_resolution.py +37 -34
  32. {pyglet-2.0.8 → pyglet-2.0.10}/pyglet/__init__.py +21 -10
  33. {pyglet-2.0.8 → pyglet-2.0.10}/pyglet/app/base.py +13 -1
  34. {pyglet-2.0.8 → pyglet-2.0.10}/pyglet/canvas/cocoa.py +6 -0
  35. {pyglet-2.0.8 → pyglet-2.0.10}/pyglet/clock.py +47 -116
  36. pyglet-2.0.10/pyglet/customtypes.py +12 -0
  37. {pyglet-2.0.8 → pyglet-2.0.10}/pyglet/event.py +16 -16
  38. pyglet-2.0.10/pyglet/experimental/README.md +6 -0
  39. pyglet-2.0.10/pyglet/experimental/geoshader_sprite.py +792 -0
  40. pyglet-2.0.10/pyglet/experimental/net.py +247 -0
  41. {pyglet-2.0.8 → pyglet-2.0.10}/pyglet/font/directwrite.py +33 -59
  42. {pyglet-2.0.8 → pyglet-2.0.10}/pyglet/font/win32.py +85 -25
  43. {pyglet-2.0.8 → pyglet-2.0.10}/pyglet/gl/base.py +195 -46
  44. {pyglet-2.0.8 → pyglet-2.0.10}/pyglet/gl/gl_info.py +4 -2
  45. {pyglet-2.0.8 → pyglet-2.0.10}/pyglet/gl/lib.py +1 -2
  46. {pyglet-2.0.8 → pyglet-2.0.10}/pyglet/gl/win32.py +30 -30
  47. {pyglet-2.0.8 → pyglet-2.0.10}/pyglet/graphics/__init__.py +9 -21
  48. {pyglet-2.0.8 → pyglet-2.0.10}/pyglet/graphics/shader.py +53 -50
  49. {pyglet-2.0.8 → pyglet-2.0.10}/pyglet/graphics/vertexarray.py +8 -9
  50. {pyglet-2.0.8 → pyglet-2.0.10}/pyglet/graphics/vertexbuffer.py +50 -74
  51. {pyglet-2.0.8 → pyglet-2.0.10}/pyglet/graphics/vertexdomain.py +54 -97
  52. {pyglet-2.0.8 → pyglet-2.0.10}/pyglet/gui/frame.py +2 -2
  53. {pyglet-2.0.8 → pyglet-2.0.10}/pyglet/gui/widgets.py +31 -3
  54. {pyglet-2.0.8 → pyglet-2.0.10}/pyglet/image/__init__.py +35 -14
  55. {pyglet-2.0.8 → pyglet-2.0.10}/pyglet/image/atlas.py +9 -9
  56. {pyglet-2.0.8 → pyglet-2.0.10}/pyglet/image/buffer.py +19 -16
  57. {pyglet-2.0.8 → pyglet-2.0.10}/pyglet/image/codecs/wic.py +8 -10
  58. {pyglet-2.0.8 → pyglet-2.0.10}/pyglet/input/controller_db.py +19 -23
  59. {pyglet-2.0.8 → pyglet-2.0.10}/pyglet/input/linux/evdev.py +3 -2
  60. {pyglet-2.0.8 → pyglet-2.0.10}/pyglet/input/win32/xinput.py +2 -2
  61. {pyglet-2.0.8 → pyglet-2.0.10}/pyglet/libs/darwin/cocoapy/cocoalibs.py +1 -0
  62. {pyglet-2.0.8 → pyglet-2.0.10}/pyglet/libs/win32/__init__.py +12 -1
  63. pyglet-2.0.10/pyglet/libs/win32/com.py +397 -0
  64. {pyglet-2.0.8 → pyglet-2.0.10}/pyglet/libs/win32/types.py +9 -1
  65. {pyglet-2.0.8 → pyglet-2.0.10}/pyglet/math.py +18 -43
  66. {pyglet-2.0.8 → pyglet-2.0.10}/pyglet/media/codecs/wmf.py +16 -22
  67. {pyglet-2.0.8 → pyglet-2.0.10}/pyglet/media/devices/base.py +28 -24
  68. {pyglet-2.0.8 → pyglet-2.0.10}/pyglet/media/devices/win32.py +93 -47
  69. {pyglet-2.0.8 → pyglet-2.0.10}/pyglet/media/drivers/base.py +6 -4
  70. {pyglet-2.0.8 → pyglet-2.0.10}/pyglet/media/drivers/directsound/adaptation.py +13 -8
  71. {pyglet-2.0.8 → pyglet-2.0.10}/pyglet/media/drivers/directsound/lib_dsound.py +0 -1
  72. {pyglet-2.0.8 → pyglet-2.0.10}/pyglet/media/drivers/listener.py +1 -3
  73. {pyglet-2.0.8 → pyglet-2.0.10}/pyglet/media/drivers/openal/adaptation.py +17 -7
  74. {pyglet-2.0.8 → pyglet-2.0.10}/pyglet/media/drivers/xaudio2/adaptation.py +2 -1
  75. {pyglet-2.0.8 → pyglet-2.0.10}/pyglet/media/drivers/xaudio2/interface.py +12 -9
  76. {pyglet-2.0.8 → pyglet-2.0.10}/pyglet/media/drivers/xaudio2/lib_xaudio2.py +16 -34
  77. pyglet-2.0.10/pyglet/media/mediathreads.py +129 -0
  78. {pyglet-2.0.8 → pyglet-2.0.10}/pyglet/media/player.py +8 -3
  79. {pyglet-2.0.8 → pyglet-2.0.10}/pyglet/model/__init__.py +4 -17
  80. {pyglet-2.0.8 → pyglet-2.0.10}/pyglet/model/codecs/obj.py +1 -0
  81. {pyglet-2.0.8 → pyglet-2.0.10}/pyglet/shapes.py +194 -143
  82. {pyglet-2.0.8 → pyglet-2.0.10}/pyglet/sprite.py +4 -17
  83. {pyglet-2.0.8 → pyglet-2.0.10}/pyglet/text/__init__.py +2 -0
  84. {pyglet-2.0.8 → pyglet-2.0.10}/pyglet/text/caret.py +2 -1
  85. {pyglet-2.0.8 → pyglet-2.0.10}/pyglet/text/layout.py +171 -189
  86. {pyglet-2.0.8 → pyglet-2.0.10}/pyglet/util.py +6 -35
  87. {pyglet-2.0.8 → pyglet-2.0.10}/pyglet/window/__init__.py +75 -35
  88. {pyglet-2.0.8 → pyglet-2.0.10}/pyglet/window/cocoa/__init__.py +28 -0
  89. {pyglet-2.0.8 → pyglet-2.0.10}/pyglet/window/cocoa/pyglet_textview.py +11 -4
  90. {pyglet-2.0.8 → pyglet-2.0.10}/pyglet/window/key.py +10 -1
  91. {pyglet-2.0.8 → pyglet-2.0.10}/pyglet/window/win32/__init__.py +37 -0
  92. {pyglet-2.0.8 → pyglet-2.0.10}/pyglet/window/xlib/__init__.py +142 -5
  93. {pyglet-2.0.8 → pyglet-2.0.10}/pyglet.egg-info/PKG-INFO +3 -2
  94. {pyglet-2.0.8 → pyglet-2.0.10}/pyglet.egg-info/SOURCES.txt +68 -2
  95. {pyglet-2.0.8 → pyglet-2.0.10}/tests/integration/app/test_eventloop.py +1 -2
  96. {pyglet-2.0.8 → pyglet-2.0.10}/tests/integration/image/test_imagegrid.py +3 -0
  97. {pyglet-2.0.8 → pyglet-2.0.10}/tests/integration/image/test_texture3d.py +3 -0
  98. {pyglet-2.0.8 → pyglet-2.0.10}/tests/integration/media/test_driver.py +15 -12
  99. pyglet-2.0.10/tests/interactive/screenshots/committed/tests.interactive.image.test_image.test_bmp_loading[rgb_16bpp.bmp].001.png +0 -0
  100. pyglet-2.0.10/tests/interactive/screenshots/committed/tests.interactive.image.test_image.test_bmp_loading[rgb_1bpp.bmp].001.png +0 -0
  101. pyglet-2.0.10/tests/interactive/screenshots/committed/tests.interactive.image.test_image.test_bmp_loading[rgb_24bpp.bmp].001.png +0 -0
  102. pyglet-2.0.10/tests/interactive/screenshots/committed/tests.interactive.image.test_image.test_bmp_loading[rgb_32bpp.bmp].001.png +0 -0
  103. pyglet-2.0.10/tests/interactive/screenshots/committed/tests.interactive.image.test_image.test_bmp_loading[rgb_4bpp.bmp].001.png +0 -0
  104. pyglet-2.0.10/tests/interactive/screenshots/committed/tests.interactive.image.test_image.test_bmp_loading[rgb_8bpp.bmp].001.png +0 -0
  105. pyglet-2.0.10/tests/interactive/screenshots/committed/tests.interactive.image.test_image.test_bmp_loading[rgba_32bpp.bmp].001.png +0 -0
  106. pyglet-2.0.10/tests/interactive/screenshots/committed/tests.interactive.image.test_image.test_buffer_copy.001.png +0 -0
  107. pyglet-2.0.10/tests/interactive/screenshots/committed/tests.interactive.image.test_image.test_buffer_saving.001.png +0 -0
  108. pyglet-2.0.10/tests/interactive/screenshots/committed/tests.interactive.image.test_image.test_checkerboard.001.png +0 -0
  109. pyglet-2.0.10/tests/interactive/screenshots/committed/tests.interactive.image.test_image.test_dds_loading[rgb_dxt1.dds].001.png +0 -0
  110. pyglet-2.0.10/tests/interactive/screenshots/committed/tests.interactive.image.test_image.test_dds_loading[rgba_dxt1.dds].001.png +0 -0
  111. pyglet-2.0.10/tests/interactive/screenshots/committed/tests.interactive.image.test_image.test_dds_loading[rgba_dxt3.dds].001.png +0 -0
  112. pyglet-2.0.10/tests/interactive/screenshots/committed/tests.interactive.image.test_image.test_dds_loading[rgba_dxt5.dds].001.png +0 -0
  113. pyglet-2.0.10/tests/interactive/screenshots/committed/tests.interactive.image.test_image.test_depth_buffer_saving.001.png +0 -0
  114. pyglet-2.0.10/tests/interactive/screenshots/committed/tests.interactive.image.test_image.test_gdkpixbuf2_loading[8bpp.gif].001.png +0 -0
  115. pyglet-2.0.10/tests/interactive/screenshots/committed/tests.interactive.image.test_image.test_gdkpixbuf2_loading[l.png].001.png +0 -0
  116. pyglet-2.0.10/tests/interactive/screenshots/committed/tests.interactive.image.test_image.test_gdkpixbuf2_loading[la.png].001.png +0 -0
  117. pyglet-2.0.10/tests/interactive/screenshots/committed/tests.interactive.image.test_image.test_gdkpixbuf2_loading[rgb.png].001.png +0 -0
  118. pyglet-2.0.10/tests/interactive/screenshots/committed/tests.interactive.image.test_image.test_gdkpixbuf2_loading[rgba.png].001.png +0 -0
  119. pyglet-2.0.10/tests/interactive/screenshots/committed/tests.interactive.image.test_image.test_pil_loading[la.png].001.png +0 -0
  120. pyglet-2.0.10/tests/interactive/screenshots/committed/tests.interactive.image.test_image.test_pil_loading[rgb.png].001.png +0 -0
  121. pyglet-2.0.10/tests/interactive/screenshots/committed/tests.interactive.image.test_image.test_pil_loading[rgba.png].001.png +0 -0
  122. pyglet-2.0.10/tests/interactive/screenshots/committed/tests.interactive.image.test_image.test_pil_saving[l.png].001.png +0 -0
  123. pyglet-2.0.10/tests/interactive/screenshots/committed/tests.interactive.image.test_image.test_pil_saving[la.png].001.png +0 -0
  124. pyglet-2.0.10/tests/interactive/screenshots/committed/tests.interactive.image.test_image.test_pypng_loading[la.png].001.png +0 -0
  125. pyglet-2.0.10/tests/interactive/screenshots/committed/tests.interactive.image.test_image.test_pypng_loading[rgb.png].001.png +0 -0
  126. pyglet-2.0.10/tests/interactive/screenshots/committed/tests.interactive.image.test_image.test_pypng_loading[rgb_8bpp.png].001.png +0 -0
  127. pyglet-2.0.10/tests/interactive/screenshots/committed/tests.interactive.image.test_image.test_pypng_loading[rgb_8bpp_trans.png].001.png +0 -0
  128. pyglet-2.0.10/tests/interactive/screenshots/committed/tests.interactive.image.test_image.test_pypng_loading[rgba.png].001.png +0 -0
  129. pyglet-2.0.10/tests/interactive/screenshots/committed/tests.interactive.image.test_image.test_pypng_saving[l.png].001.png +0 -0
  130. pyglet-2.0.10/tests/interactive/screenshots/committed/tests.interactive.image.test_image.test_pypng_saving[la.png].001.png +0 -0
  131. pyglet-2.0.10/tests/interactive/screenshots/committed/tests.interactive.image.test_image.test_pypng_saving[rgb.png].001.png +0 -0
  132. pyglet-2.0.10/tests/interactive/screenshots/committed/tests.interactive.image.test_image.test_pypng_saving[rgba.png].001.png +0 -0
  133. pyglet-2.0.10/tests/interactive/screenshots/session/tests.interactive.image.test_image.test_bmp_loading[rgb_16bpp.bmp].001.png +0 -0
  134. pyglet-2.0.10/tests/interactive/screenshots/session/tests.interactive.image.test_image.test_bmp_loading[rgb_1bpp.bmp].001.png +0 -0
  135. pyglet-2.0.10/tests/interactive/screenshots/session/tests.interactive.image.test_image.test_bmp_loading[rgb_24bpp.bmp].001.png +0 -0
  136. pyglet-2.0.10/tests/interactive/screenshots/session/tests.interactive.image.test_image.test_bmp_loading[rgb_32bpp.bmp].001.png +0 -0
  137. pyglet-2.0.10/tests/interactive/screenshots/session/tests.interactive.image.test_image.test_bmp_loading[rgb_4bpp.bmp].001.png +0 -0
  138. pyglet-2.0.10/tests/interactive/screenshots/session/tests.interactive.image.test_image.test_bmp_loading[rgb_8bpp.bmp].001.png +0 -0
  139. pyglet-2.0.10/tests/interactive/screenshots/session/tests.interactive.image.test_image.test_bmp_loading[rgba_32bpp.bmp].001.png +0 -0
  140. pyglet-2.0.10/tests/interactive/screenshots/session/tests.interactive.image.test_image.test_buffer_copy.001.png +0 -0
  141. pyglet-2.0.10/tests/interactive/screenshots/session/tests.interactive.image.test_image.test_buffer_saving.001.png +0 -0
  142. pyglet-2.0.10/tests/interactive/screenshots/session/tests.interactive.image.test_image.test_checkerboard.001.png +0 -0
  143. pyglet-2.0.10/tests/interactive/screenshots/session/tests.interactive.image.test_image.test_dds_loading[rgb_dxt1.dds].001.png +0 -0
  144. pyglet-2.0.10/tests/interactive/screenshots/session/tests.interactive.image.test_image.test_dds_loading[rgba_dxt1.dds].001.png +0 -0
  145. pyglet-2.0.10/tests/interactive/screenshots/session/tests.interactive.image.test_image.test_dds_loading[rgba_dxt3.dds].001.png +0 -0
  146. pyglet-2.0.10/tests/interactive/screenshots/session/tests.interactive.image.test_image.test_dds_loading[rgba_dxt5.dds].001.png +0 -0
  147. pyglet-2.0.10/tests/interactive/screenshots/session/tests.interactive.image.test_image.test_depth_buffer_saving.001.png +0 -0
  148. pyglet-2.0.10/tests/interactive/screenshots/session/tests.interactive.image.test_image.test_gdkpixbuf2_loading[8bpp.gif].001.png +0 -0
  149. pyglet-2.0.10/tests/interactive/screenshots/session/tests.interactive.image.test_image.test_gdkpixbuf2_loading[l.png].001.png +0 -0
  150. pyglet-2.0.10/tests/interactive/screenshots/session/tests.interactive.image.test_image.test_gdkpixbuf2_loading[la.png].001.png +0 -0
  151. pyglet-2.0.10/tests/interactive/screenshots/session/tests.interactive.image.test_image.test_gdkpixbuf2_loading[rgb.png].001.png +0 -0
  152. pyglet-2.0.10/tests/interactive/screenshots/session/tests.interactive.image.test_image.test_gdkpixbuf2_loading[rgba.png].001.png +0 -0
  153. pyglet-2.0.10/tests/interactive/screenshots/session/tests.interactive.image.test_image.test_pil_loading[la.png].001.png +0 -0
  154. pyglet-2.0.10/tests/interactive/screenshots/session/tests.interactive.image.test_image.test_pil_loading[rgb.png].001.png +0 -0
  155. pyglet-2.0.10/tests/interactive/screenshots/session/tests.interactive.image.test_image.test_pil_loading[rgba.png].001.png +0 -0
  156. pyglet-2.0.10/tests/interactive/screenshots/session/tests.interactive.image.test_image.test_pil_saving[l.png].001.png +0 -0
  157. pyglet-2.0.10/tests/interactive/screenshots/session/tests.interactive.image.test_image.test_pil_saving[la.png].001.png +0 -0
  158. pyglet-2.0.10/tests/interactive/screenshots/session/tests.interactive.image.test_image.test_pil_saving[rgb.png].001.png +0 -0
  159. pyglet-2.0.10/tests/interactive/screenshots/session/tests.interactive.image.test_image.test_pil_saving[rgba.png].001.png +0 -0
  160. pyglet-2.0.10/tests/interactive/screenshots/session/tests.interactive.image.test_image.test_pypng_loading[la.png].001.png +0 -0
  161. pyglet-2.0.10/tests/interactive/screenshots/session/tests.interactive.image.test_image.test_pypng_loading[rgb.png].001.png +0 -0
  162. pyglet-2.0.10/tests/interactive/screenshots/session/tests.interactive.image.test_image.test_pypng_loading[rgb_8bpp.png].001.png +0 -0
  163. pyglet-2.0.10/tests/interactive/screenshots/session/tests.interactive.image.test_image.test_pypng_loading[rgb_8bpp_trans.png].001.png +0 -0
  164. pyglet-2.0.10/tests/interactive/screenshots/session/tests.interactive.image.test_image.test_pypng_loading[rgba.png].001.png +0 -0
  165. pyglet-2.0.10/tests/interactive/screenshots/session/tests.interactive.image.test_image.test_pypng_saving[l.png].001.png +0 -0
  166. pyglet-2.0.10/tests/interactive/screenshots/session/tests.interactive.image.test_image.test_pypng_saving[la.png].001.png +0 -0
  167. pyglet-2.0.10/tests/interactive/screenshots/session/tests.interactive.image.test_image.test_pypng_saving[rgb.png].001.png +0 -0
  168. pyglet-2.0.10/tests/interactive/screenshots/session/tests.interactive.image.test_image.test_pypng_saving[rgba.png].001.png +0 -0
  169. pyglet-2.0.10/tests/interactive/shapes/test_shapes.py +179 -0
  170. {pyglet-2.0.8 → pyglet-2.0.10}/tests/interactive/text/test_inline_elements.py +20 -17
  171. {pyglet-2.0.8 → pyglet-2.0.10}/tests/interactive/text/test_inline_elements_style_change.py +15 -14
  172. {pyglet-2.0.8 → pyglet-2.0.10}/tests/interactive/text/test_multiline_wrap.py +18 -18
  173. {pyglet-2.0.8 → pyglet-2.0.10}/tests/interactive/text/test_plain.py +5 -5
  174. {pyglet-2.0.8 → pyglet-2.0.10}/tests/interactive/text/test_style.py +5 -5
  175. {pyglet-2.0.8 → pyglet-2.0.10}/tests/unit/conftest.py +5 -0
  176. {pyglet-2.0.8 → pyglet-2.0.10}/tests/unit/shapes/test_shapes.py +24 -2
  177. {pyglet-2.0.8 → pyglet-2.0.10}/tests/unit/test_events.py +31 -21
  178. {pyglet-2.0.8 → pyglet-2.0.10}/tools/gencontrollerdb.py +3 -3
  179. pyglet-2.0.8/experimental/geoshader_sprite.py +0 -367
  180. pyglet-2.0.8/pyglet/libs/win32/com.py +0 -340
  181. pyglet-2.0.8/pyglet/media/mediathreads.py +0 -152
  182. pyglet-2.0.8/tests/interactive/screenshots/session/tests.interactive.image.test_image.test_bmp_loading[rgb_24bpp.bmp].001.png +0 -0
  183. pyglet-2.0.8/tests/interactive/screenshots/session/tests.interactive.image.test_image.test_bmp_loading[rgb_32bpp.bmp].001.png +0 -0
  184. pyglet-2.0.8/tests/interactive/screenshots/session/tests.interactive.image.test_image.test_bmp_loading[rgb_4bpp.bmp].001.png +0 -0
  185. pyglet-2.0.8/tests/interactive/screenshots/session/tests.interactive.image.test_image.test_bmp_loading[rgb_8bpp.bmp].001.png +0 -0
  186. pyglet-2.0.8/tests/interactive/screenshots/session/tests.interactive.image.test_image.test_bmp_loading[rgba_32bpp.bmp].001.png +0 -0
  187. pyglet-2.0.8/tests/interactive/screenshots/session/tests.interactive.image.test_image.test_checkerboard.001.png +0 -0
  188. pyglet-2.0.8/tests/interactive/screenshots/session/tests.interactive.image.test_image.test_dds_loading[rgb_dxt1.dds].001.png +0 -0
  189. pyglet-2.0.8/tests/interactive/screenshots/session/tests.interactive.image.test_image.test_dds_loading[rgba_dxt1.dds].001.png +0 -0
  190. pyglet-2.0.8/tests/interactive/screenshots/session/tests.interactive.image.test_image.test_dds_loading[rgba_dxt3.dds].001.png +0 -0
  191. pyglet-2.0.8/tests/interactive/screenshots/session/tests.interactive.image.test_image.test_dds_loading[rgba_dxt5.dds].001.png +0 -0
  192. pyglet-2.0.8/tests/interactive/screenshots/session/tests.interactive.image.test_image.test_gdkpixbuf2_loading[8bpp.gif].001.png +0 -0
  193. pyglet-2.0.8/tests/interactive/screenshots/session/tests.interactive.image.test_image.test_gdkpixbuf2_loading[l.png].001.png +0 -0
  194. pyglet-2.0.8/tests/interactive/screenshots/session/tests.interactive.image.test_image.test_gdkpixbuf2_loading[la.png].001.png +0 -0
  195. pyglet-2.0.8/tests/interactive/screenshots/session/tests.interactive.image.test_image.test_gdkpixbuf2_loading[rgb.png].001.png +0 -0
  196. pyglet-2.0.8/tests/interactive/screenshots/session/tests.interactive.image.test_image.test_gdkpixbuf2_loading[rgba.png].001.png +0 -0
  197. pyglet-2.0.8/tests/interactive/screenshots/session/tests.interactive.image.test_image.test_pil_loading[la.png].001.png +0 -0
  198. pyglet-2.0.8/tests/interactive/screenshots/session/tests.interactive.image.test_image.test_pil_loading[rgb.png].001.png +0 -0
  199. pyglet-2.0.8/tests/interactive/screenshots/session/tests.interactive.image.test_image.test_pil_loading[rgba.png].001.png +0 -0
  200. pyglet-2.0.8/tests/interactive/screenshots/session/tests.interactive.image.test_image.test_pypng_loading[la.png].001.png +0 -0
  201. pyglet-2.0.8/tests/interactive/screenshots/session/tests.interactive.image.test_image.test_pypng_loading[rgba.png].001.png +0 -0
  202. {pyglet-2.0.8 → pyglet-2.0.10}/.coveragerc +0 -0
  203. {pyglet-2.0.8 → pyglet-2.0.10}/.github/ISSUE_TEMPLATE/bug_report.md +0 -0
  204. {pyglet-2.0.8 → pyglet-2.0.10}/.github/ISSUE_TEMPLATE/feature_request.md +0 -0
  205. {pyglet-2.0.8 → pyglet-2.0.10}/.github/ISSUE_TEMPLATE/questions--or-other.md +0 -0
  206. {pyglet-2.0.8 → pyglet-2.0.10}/.github/workflows/codeql.yml +0 -0
  207. {pyglet-2.0.8 → pyglet-2.0.10}/LICENSE +0 -0
  208. {pyglet-2.0.8 → pyglet-2.0.10}/MANIFEST.in +0 -0
  209. {pyglet-2.0.8 → pyglet-2.0.10}/contrib/aseprite_codec/README +0 -0
  210. {pyglet-2.0.8 → pyglet-2.0.10}/contrib/aseprite_codec/asedemo.py +0 -0
  211. {pyglet-2.0.8 → pyglet-2.0.10}/contrib/aseprite_codec/aseprite.py +0 -0
  212. {pyglet-2.0.8 → pyglet-2.0.10}/contrib/aseprite_codec/running.ase +0 -0
  213. {pyglet-2.0.8 → pyglet-2.0.10}/contrib/logo3d/logo3d.jpg +0 -0
  214. {pyglet-2.0.8 → pyglet-2.0.10}/contrib/logo3d/logo3d.obj.zip +0 -0
  215. {pyglet-2.0.8 → pyglet-2.0.10}/contrib/logo3d/logo3d.wings +0 -0
  216. {pyglet-2.0.8 → pyglet-2.0.10}/contrib/scenemanager.py +0 -0
  217. {pyglet-2.0.8 → pyglet-2.0.10}/contrib/toys/follow_mouse.py +0 -0
  218. {pyglet-2.0.8 → pyglet-2.0.10}/doc/Makefile +0 -0
  219. {pyglet-2.0.8 → pyglet-2.0.10}/doc/README.md +0 -0
  220. {pyglet-2.0.8 → pyglet-2.0.10}/doc/_static/favicon.ico +0 -0
  221. {pyglet-2.0.8 → pyglet-2.0.10}/doc/_static/logo.png +0 -0
  222. {pyglet-2.0.8 → pyglet-2.0.10}/doc/_static/logo5.svg +0 -0
  223. {pyglet-2.0.8 → pyglet-2.0.10}/doc/_static/relatedlogo.png +0 -0
  224. {pyglet-2.0.8 → pyglet-2.0.10}/doc/external_resources.rst +0 -0
  225. {pyglet-2.0.8 → pyglet-2.0.10}/doc/index.rst +0 -0
  226. {pyglet-2.0.8 → pyglet-2.0.10}/doc/internal/contributing.rst +0 -0
  227. {pyglet-2.0.8 → pyglet-2.0.10}/doc/internal/dist.rst +0 -0
  228. {pyglet-2.0.8 → pyglet-2.0.10}/doc/internal/doc.rst +0 -0
  229. {pyglet-2.0.8 → pyglet-2.0.10}/doc/internal/generated.rst +0 -0
  230. {pyglet-2.0.8 → pyglet-2.0.10}/doc/internal/gl.rst +0 -0
  231. {pyglet-2.0.8 → pyglet-2.0.10}/doc/internal/media_logging_manual.rst +0 -0
  232. {pyglet-2.0.8 → pyglet-2.0.10}/doc/internal/media_manual.rst +0 -0
  233. {pyglet-2.0.8 → pyglet-2.0.10}/doc/internal/testing.rst +0 -0
  234. {pyglet-2.0.8 → pyglet-2.0.10}/doc/internal/virtualenv.rst +0 -0
  235. {pyglet-2.0.8 → pyglet-2.0.10}/doc/internal/wraptypes-class.svg +0 -0
  236. {pyglet-2.0.8 → pyglet-2.0.10}/doc/internal/wraptypes.rst +0 -0
  237. {pyglet-2.0.8 → pyglet-2.0.10}/doc/make.bat +0 -0
  238. {pyglet-2.0.8 → pyglet-2.0.10}/doc/modules/app.rst +0 -0
  239. {pyglet-2.0.8 → pyglet-2.0.10}/doc/modules/canvas.rst +0 -0
  240. {pyglet-2.0.8 → pyglet-2.0.10}/doc/modules/clock.rst +0 -0
  241. {pyglet-2.0.8 → pyglet-2.0.10}/doc/modules/event.rst +0 -0
  242. {pyglet-2.0.8 → pyglet-2.0.10}/doc/modules/font.rst +0 -0
  243. {pyglet-2.0.8 → pyglet-2.0.10}/doc/modules/gl.rst +0 -0
  244. {pyglet-2.0.8 → pyglet-2.0.10}/doc/modules/graphics/allocation.rst +0 -0
  245. {pyglet-2.0.8 → pyglet-2.0.10}/doc/modules/graphics/index.rst +0 -0
  246. {pyglet-2.0.8 → pyglet-2.0.10}/doc/modules/graphics/shader.rst +0 -0
  247. {pyglet-2.0.8 → pyglet-2.0.10}/doc/modules/graphics/vertexbuffer.rst +0 -0
  248. {pyglet-2.0.8 → pyglet-2.0.10}/doc/modules/graphics/vertexdomain.rst +0 -0
  249. {pyglet-2.0.8 → pyglet-2.0.10}/doc/modules/gui.rst +0 -0
  250. {pyglet-2.0.8 → pyglet-2.0.10}/doc/modules/image/animation.rst +0 -0
  251. {pyglet-2.0.8 → pyglet-2.0.10}/doc/modules/image/atlas.rst +0 -0
  252. {pyglet-2.0.8 → pyglet-2.0.10}/doc/modules/image/index.rst +0 -0
  253. {pyglet-2.0.8 → pyglet-2.0.10}/doc/modules/info.rst +0 -0
  254. {pyglet-2.0.8 → pyglet-2.0.10}/doc/modules/input.rst +0 -0
  255. {pyglet-2.0.8 → pyglet-2.0.10}/doc/modules/math.rst +0 -0
  256. {pyglet-2.0.8 → pyglet-2.0.10}/doc/modules/media.rst +0 -0
  257. {pyglet-2.0.8 → pyglet-2.0.10}/doc/modules/media_synthesis.rst +0 -0
  258. {pyglet-2.0.8 → pyglet-2.0.10}/doc/modules/pyglet.rst +0 -0
  259. {pyglet-2.0.8 → pyglet-2.0.10}/doc/modules/resource.rst +0 -0
  260. {pyglet-2.0.8 → pyglet-2.0.10}/doc/modules/sprite.rst +0 -0
  261. {pyglet-2.0.8 → pyglet-2.0.10}/doc/modules/text/caret.rst +0 -0
  262. {pyglet-2.0.8 → pyglet-2.0.10}/doc/modules/text/document.rst +0 -0
  263. {pyglet-2.0.8 → pyglet-2.0.10}/doc/modules/text/index.rst +0 -0
  264. {pyglet-2.0.8 → pyglet-2.0.10}/doc/modules/text/layout.rst +0 -0
  265. {pyglet-2.0.8 → pyglet-2.0.10}/doc/modules/window.rst +0 -0
  266. {pyglet-2.0.8 → pyglet-2.0.10}/doc/modules/window_mouse.rst +0 -0
  267. {pyglet-2.0.8 → pyglet-2.0.10}/doc/programming_guide/context.rst +0 -0
  268. {pyglet-2.0.8 → pyglet-2.0.10}/doc/programming_guide/debug.rst +0 -0
  269. {pyglet-2.0.8 → pyglet-2.0.10}/doc/programming_guide/events.rst +0 -0
  270. {pyglet-2.0.8 → pyglet-2.0.10}/doc/programming_guide/examplegame.rst +0 -0
  271. {pyglet-2.0.8 → pyglet-2.0.10}/doc/programming_guide/gl.rst +0 -0
  272. {pyglet-2.0.8 → pyglet-2.0.10}/doc/programming_guide/graphics.rst +0 -0
  273. {pyglet-2.0.8 → pyglet-2.0.10}/doc/programming_guide/image.rst +0 -0
  274. {pyglet-2.0.8 → pyglet-2.0.10}/doc/programming_guide/img/abstract_image.png +0 -0
  275. {pyglet-2.0.8 → pyglet-2.0.10}/doc/programming_guide/img/abstract_image.svg +0 -0
  276. {pyglet-2.0.8 → pyglet-2.0.10}/doc/programming_guide/img/buffer_image.png +0 -0
  277. {pyglet-2.0.8 → pyglet-2.0.10}/doc/programming_guide/img/buffer_image.svg +0 -0
  278. {pyglet-2.0.8 → pyglet-2.0.10}/doc/programming_guide/img/context_flow.png +0 -0
  279. {pyglet-2.0.8 → pyglet-2.0.10}/doc/programming_guide/img/context_flow.svg +0 -0
  280. {pyglet-2.0.8 → pyglet-2.0.10}/doc/programming_guide/img/cursor_mac_crosshair.png +0 -0
  281. {pyglet-2.0.8 → pyglet-2.0.10}/doc/programming_guide/img/cursor_mac_default.png +0 -0
  282. {pyglet-2.0.8 → pyglet-2.0.10}/doc/programming_guide/img/cursor_mac_hand.png +0 -0
  283. {pyglet-2.0.8 → pyglet-2.0.10}/doc/programming_guide/img/cursor_mac_no.png +0 -0
  284. {pyglet-2.0.8 → pyglet-2.0.10}/doc/programming_guide/img/cursor_mac_size_down.png +0 -0
  285. {pyglet-2.0.8 → pyglet-2.0.10}/doc/programming_guide/img/cursor_mac_size_left.png +0 -0
  286. {pyglet-2.0.8 → pyglet-2.0.10}/doc/programming_guide/img/cursor_mac_size_left_right.png +0 -0
  287. {pyglet-2.0.8 → pyglet-2.0.10}/doc/programming_guide/img/cursor_mac_size_right.png +0 -0
  288. {pyglet-2.0.8 → pyglet-2.0.10}/doc/programming_guide/img/cursor_mac_size_up.png +0 -0
  289. {pyglet-2.0.8 → pyglet-2.0.10}/doc/programming_guide/img/cursor_mac_size_up_down.png +0 -0
  290. {pyglet-2.0.8 → pyglet-2.0.10}/doc/programming_guide/img/cursor_mac_text.png +0 -0
  291. {pyglet-2.0.8 → pyglet-2.0.10}/doc/programming_guide/img/cursor_mac_wait.png +0 -0
  292. {pyglet-2.0.8 → pyglet-2.0.10}/doc/programming_guide/img/cursor_win_crosshair.png +0 -0
  293. {pyglet-2.0.8 → pyglet-2.0.10}/doc/programming_guide/img/cursor_win_default.png +0 -0
  294. {pyglet-2.0.8 → pyglet-2.0.10}/doc/programming_guide/img/cursor_win_hand.png +0 -0
  295. {pyglet-2.0.8 → pyglet-2.0.10}/doc/programming_guide/img/cursor_win_help.png +0 -0
  296. {pyglet-2.0.8 → pyglet-2.0.10}/doc/programming_guide/img/cursor_win_no.png +0 -0
  297. {pyglet-2.0.8 → pyglet-2.0.10}/doc/programming_guide/img/cursor_win_size.png +0 -0
  298. {pyglet-2.0.8 → pyglet-2.0.10}/doc/programming_guide/img/cursor_win_size_left_right.png +0 -0
  299. {pyglet-2.0.8 → pyglet-2.0.10}/doc/programming_guide/img/cursor_win_size_nesw.png +0 -0
  300. {pyglet-2.0.8 → pyglet-2.0.10}/doc/programming_guide/img/cursor_win_size_nwse.png +0 -0
  301. {pyglet-2.0.8 → pyglet-2.0.10}/doc/programming_guide/img/cursor_win_size_up_down.png +0 -0
  302. {pyglet-2.0.8 → pyglet-2.0.10}/doc/programming_guide/img/cursor_win_text.png +0 -0
  303. {pyglet-2.0.8 → pyglet-2.0.10}/doc/programming_guide/img/cursor_win_wait.png +0 -0
  304. {pyglet-2.0.8 → pyglet-2.0.10}/doc/programming_guide/img/cursor_win_wait_arrow.png +0 -0
  305. {pyglet-2.0.8 → pyglet-2.0.10}/doc/programming_guide/img/explosion.png +0 -0
  306. {pyglet-2.0.8 → pyglet-2.0.10}/doc/programming_guide/img/font_metrics.png +0 -0
  307. {pyglet-2.0.8 → pyglet-2.0.10}/doc/programming_guide/img/font_metrics.svg +0 -0
  308. {pyglet-2.0.8 → pyglet-2.0.10}/doc/programming_guide/img/image_classes.png +0 -0
  309. {pyglet-2.0.8 → pyglet-2.0.10}/doc/programming_guide/img/image_classes.svg +0 -0
  310. {pyglet-2.0.8 → pyglet-2.0.10}/doc/programming_guide/img/image_grid.png +0 -0
  311. {pyglet-2.0.8 → pyglet-2.0.10}/doc/programming_guide/img/image_grid.svg +0 -0
  312. {pyglet-2.0.8 → pyglet-2.0.10}/doc/programming_guide/img/image_sequence.png +0 -0
  313. {pyglet-2.0.8 → pyglet-2.0.10}/doc/programming_guide/img/image_sequence.svg +0 -0
  314. {pyglet-2.0.8 → pyglet-2.0.10}/doc/programming_guide/img/mouse_coordinates.png +0 -0
  315. {pyglet-2.0.8 → pyglet-2.0.10}/doc/programming_guide/img/mouse_coordinates.svg +0 -0
  316. {pyglet-2.0.8 → pyglet-2.0.10}/doc/programming_guide/img/screens.png +0 -0
  317. {pyglet-2.0.8 → pyglet-2.0.10}/doc/programming_guide/img/screens.svg +0 -0
  318. {pyglet-2.0.8 → pyglet-2.0.10}/doc/programming_guide/img/text_classes.png +0 -0
  319. {pyglet-2.0.8 → pyglet-2.0.10}/doc/programming_guide/img/text_classes.svg +0 -0
  320. {pyglet-2.0.8 → pyglet-2.0.10}/doc/programming_guide/img/window_location.png +0 -0
  321. {pyglet-2.0.8 → pyglet-2.0.10}/doc/programming_guide/img/window_location.svg +0 -0
  322. {pyglet-2.0.8 → pyglet-2.0.10}/doc/programming_guide/img/window_osx_borderless.png +0 -0
  323. {pyglet-2.0.8 → pyglet-2.0.10}/doc/programming_guide/img/window_osx_default.png +0 -0
  324. {pyglet-2.0.8 → pyglet-2.0.10}/doc/programming_guide/img/window_osx_dialog.png +0 -0
  325. {pyglet-2.0.8 → pyglet-2.0.10}/doc/programming_guide/img/window_osx_tool.png +0 -0
  326. {pyglet-2.0.8 → pyglet-2.0.10}/doc/programming_guide/img/window_xp_default.png +0 -0
  327. {pyglet-2.0.8 → pyglet-2.0.10}/doc/programming_guide/img/window_xp_dialog.png +0 -0
  328. {pyglet-2.0.8 → pyglet-2.0.10}/doc/programming_guide/img/window_xp_overlay.png +0 -0
  329. {pyglet-2.0.8 → pyglet-2.0.10}/doc/programming_guide/img/window_xp_tool.png +0 -0
  330. {pyglet-2.0.8 → pyglet-2.0.10}/doc/programming_guide/img/window_xp_transparent.png +0 -0
  331. {pyglet-2.0.8 → pyglet-2.0.10}/doc/programming_guide/input.rst +0 -0
  332. {pyglet-2.0.8 → pyglet-2.0.10}/doc/programming_guide/installation.rst +0 -0
  333. {pyglet-2.0.8 → pyglet-2.0.10}/doc/programming_guide/math.rst +0 -0
  334. {pyglet-2.0.8 → pyglet-2.0.10}/doc/programming_guide/migration.rst +0 -0
  335. {pyglet-2.0.8 → pyglet-2.0.10}/doc/programming_guide/mouse.rst +0 -0
  336. {pyglet-2.0.8 → pyglet-2.0.10}/doc/programming_guide/options.rst +0 -0
  337. {pyglet-2.0.8 → pyglet-2.0.10}/doc/programming_guide/resources.rst +0 -0
  338. {pyglet-2.0.8 → pyglet-2.0.10}/doc/programming_guide/shapes.rst +0 -0
  339. {pyglet-2.0.8 → pyglet-2.0.10}/doc/programming_guide/text.rst +0 -0
  340. {pyglet-2.0.8 → pyglet-2.0.10}/doc/programming_guide/time.rst +0 -0
  341. {pyglet-2.0.8 → pyglet-2.0.10}/doc/programming_guide/windowing.rst +0 -0
  342. {pyglet-2.0.8 → pyglet-2.0.10}/doc/requirements.txt +0 -0
  343. {pyglet-2.0.8 → pyglet-2.0.10}/examples/events/events_key_state_handler.py +0 -0
  344. {pyglet-2.0.8 → pyglet-2.0.10}/examples/events/register_event_type.py +0 -0
  345. {pyglet-2.0.8 → pyglet-2.0.10}/examples/events/window_events.py +0 -0
  346. {pyglet-2.0.8 → pyglet-2.0.10}/examples/events/window_platform_event.py +0 -0
  347. {pyglet-2.0.8 → pyglet-2.0.10}/examples/file_dialog.py +0 -0
  348. {pyglet-2.0.8 → pyglet-2.0.10}/examples/game/resources/asteroid.png +0 -0
  349. {pyglet-2.0.8 → pyglet-2.0.10}/examples/game/resources/bullet.png +0 -0
  350. {pyglet-2.0.8 → pyglet-2.0.10}/examples/game/resources/bullet.wav +0 -0
  351. {pyglet-2.0.8 → pyglet-2.0.10}/examples/game/resources/engine_flame.png +0 -0
  352. {pyglet-2.0.8 → pyglet-2.0.10}/examples/game/resources/player.png +0 -0
  353. {pyglet-2.0.8 → pyglet-2.0.10}/examples/game/version1/asteroid.py +0 -0
  354. {pyglet-2.0.8 → pyglet-2.0.10}/examples/game/version1/game/__init__.py +0 -0
  355. {pyglet-2.0.8 → pyglet-2.0.10}/examples/game/version1/game/load.py +0 -0
  356. {pyglet-2.0.8 → pyglet-2.0.10}/examples/game/version1/game/resources.py +0 -0
  357. {pyglet-2.0.8 → pyglet-2.0.10}/examples/game/version2/asteroid.py +0 -0
  358. {pyglet-2.0.8 → pyglet-2.0.10}/examples/game/version2/game/__init__.py +0 -0
  359. {pyglet-2.0.8 → pyglet-2.0.10}/examples/game/version2/game/load.py +0 -0
  360. {pyglet-2.0.8 → pyglet-2.0.10}/examples/game/version2/game/physicalobject.py +0 -0
  361. {pyglet-2.0.8 → pyglet-2.0.10}/examples/game/version2/game/player.py +0 -0
  362. {pyglet-2.0.8 → pyglet-2.0.10}/examples/game/version2/game/resources.py +0 -0
  363. {pyglet-2.0.8 → pyglet-2.0.10}/examples/game/version3/asteroid.py +0 -0
  364. {pyglet-2.0.8 → pyglet-2.0.10}/examples/game/version3/game/__init__.py +0 -0
  365. {pyglet-2.0.8 → pyglet-2.0.10}/examples/game/version3/game/load.py +0 -0
  366. {pyglet-2.0.8 → pyglet-2.0.10}/examples/game/version3/game/physicalobject.py +0 -0
  367. {pyglet-2.0.8 → pyglet-2.0.10}/examples/game/version3/game/player.py +0 -0
  368. {pyglet-2.0.8 → pyglet-2.0.10}/examples/game/version3/game/resources.py +0 -0
  369. {pyglet-2.0.8 → pyglet-2.0.10}/examples/game/version3/game/util.py +0 -0
  370. {pyglet-2.0.8 → pyglet-2.0.10}/examples/game/version4/asteroid.py +0 -0
  371. {pyglet-2.0.8 → pyglet-2.0.10}/examples/game/version4/game/__init__.py +0 -0
  372. {pyglet-2.0.8 → pyglet-2.0.10}/examples/game/version4/game/asteroid.py +0 -0
  373. {pyglet-2.0.8 → pyglet-2.0.10}/examples/game/version4/game/bullet.py +0 -0
  374. {pyglet-2.0.8 → pyglet-2.0.10}/examples/game/version4/game/load.py +0 -0
  375. {pyglet-2.0.8 → pyglet-2.0.10}/examples/game/version4/game/physicalobject.py +0 -0
  376. {pyglet-2.0.8 → pyglet-2.0.10}/examples/game/version4/game/player.py +0 -0
  377. {pyglet-2.0.8 → pyglet-2.0.10}/examples/game/version4/game/resources.py +0 -0
  378. {pyglet-2.0.8 → pyglet-2.0.10}/examples/game/version4/game/util.py +0 -0
  379. {pyglet-2.0.8 → pyglet-2.0.10}/examples/game/version5/asteroid.py +0 -0
  380. {pyglet-2.0.8 → pyglet-2.0.10}/examples/game/version5/game/__init__.py +0 -0
  381. {pyglet-2.0.8 → pyglet-2.0.10}/examples/game/version5/game/asteroid.py +0 -0
  382. {pyglet-2.0.8 → pyglet-2.0.10}/examples/game/version5/game/bullet.py +0 -0
  383. {pyglet-2.0.8 → pyglet-2.0.10}/examples/game/version5/game/load.py +0 -0
  384. {pyglet-2.0.8 → pyglet-2.0.10}/examples/game/version5/game/physicalobject.py +0 -0
  385. {pyglet-2.0.8 → pyglet-2.0.10}/examples/game/version5/game/player.py +0 -0
  386. {pyglet-2.0.8 → pyglet-2.0.10}/examples/game/version5/game/resources.py +0 -0
  387. {pyglet-2.0.8 → pyglet-2.0.10}/examples/game/version5/game/util.py +0 -0
  388. {pyglet-2.0.8 → pyglet-2.0.10}/examples/graphics/image_convert.py +0 -0
  389. {pyglet-2.0.8 → pyglet-2.0.10}/examples/graphics/image_display.py +0 -0
  390. {pyglet-2.0.8 → pyglet-2.0.10}/examples/gui/bar.png +0 -0
  391. {pyglet-2.0.8 → pyglet-2.0.10}/examples/gui/button_down.png +0 -0
  392. {pyglet-2.0.8 → pyglet-2.0.10}/examples/gui/button_hover.png +0 -0
  393. {pyglet-2.0.8 → pyglet-2.0.10}/examples/gui/button_up.png +0 -0
  394. {pyglet-2.0.8 → pyglet-2.0.10}/examples/gui/knob.png +0 -0
  395. {pyglet-2.0.8 → pyglet-2.0.10}/examples/gui/widgets.py +0 -0
  396. {pyglet-2.0.8 → pyglet-2.0.10}/examples/hello_world.py +0 -0
  397. {pyglet-2.0.8 → pyglet-2.0.10}/examples/input/apple_remote.py +0 -0
  398. {pyglet-2.0.8 → pyglet-2.0.10}/examples/input/input.py +0 -0
  399. {pyglet-2.0.8 → pyglet-2.0.10}/examples/input/joystick.py +0 -0
  400. {pyglet-2.0.8 → pyglet-2.0.10}/examples/input/tablet.py +0 -0
  401. {pyglet-2.0.8 → pyglet-2.0.10}/examples/media/media_player.py +0 -0
  402. {pyglet-2.0.8 → pyglet-2.0.10}/examples/media/noisy/README +0 -0
  403. {pyglet-2.0.8 → pyglet-2.0.10}/examples/media/noisy/ball.png +0 -0
  404. {pyglet-2.0.8 → pyglet-2.0.10}/examples/media/noisy/ball.wav +0 -0
  405. {pyglet-2.0.8 → pyglet-2.0.10}/examples/media/noisy/noisy.py +0 -0
  406. {pyglet-2.0.8 → pyglet-2.0.10}/examples/media/synthesizer.py +0 -0
  407. {pyglet-2.0.8 → pyglet-2.0.10}/examples/media/video.py +0 -0
  408. {pyglet-2.0.8 → pyglet-2.0.10}/examples/model/box.mtl +0 -0
  409. {pyglet-2.0.8 → pyglet-2.0.10}/examples/model/box.obj +0 -0
  410. {pyglet-2.0.8 → pyglet-2.0.10}/examples/model/logo3d.mtl +0 -0
  411. {pyglet-2.0.8 → pyglet-2.0.10}/examples/model/logo3d.obj +0 -0
  412. {pyglet-2.0.8 → pyglet-2.0.10}/examples/model/model.py +0 -0
  413. {pyglet-2.0.8 → pyglet-2.0.10}/examples/model/pyglet.png +0 -0
  414. {pyglet-2.0.8 → pyglet-2.0.10}/examples/opengl/egl_context.py +0 -0
  415. {pyglet-2.0.8 → pyglet-2.0.10}/examples/opengl/opengl.py +0 -0
  416. {pyglet-2.0.8 → pyglet-2.0.10}/examples/opengl/opengl_context.py +0 -0
  417. {pyglet-2.0.8 → pyglet-2.0.10}/examples/opengl/opengl_core.py +0 -0
  418. {pyglet-2.0.8 → pyglet-2.0.10}/examples/opengl/opengl_scissor.py +0 -0
  419. {pyglet-2.0.8 → pyglet-2.0.10}/examples/opengl/opengl_shader.py +0 -0
  420. {pyglet-2.0.8 → pyglet-2.0.10}/examples/opengl/pyglet.png +0 -0
  421. {pyglet-2.0.8 → pyglet-2.0.10}/examples/programming_guide/animation.py +0 -0
  422. {pyglet-2.0.8 → pyglet-2.0.10}/examples/programming_guide/dinosaur.gif +0 -0
  423. {pyglet-2.0.8 → pyglet-2.0.10}/examples/programming_guide/events.py +0 -0
  424. {pyglet-2.0.8 → pyglet-2.0.10}/examples/programming_guide/hello_world.py +0 -0
  425. {pyglet-2.0.8 → pyglet-2.0.10}/examples/programming_guide/image_viewer.py +0 -0
  426. {pyglet-2.0.8 → pyglet-2.0.10}/examples/programming_guide/kitten.jpg +0 -0
  427. {pyglet-2.0.8 → pyglet-2.0.10}/examples/programming_guide/window_subclass.py +0 -0
  428. {pyglet-2.0.8 → pyglet-2.0.10}/examples/resources/kitten.jpg +0 -0
  429. {pyglet-2.0.8 → pyglet-2.0.10}/examples/resources/pyglet.png +0 -0
  430. {pyglet-2.0.8 → pyglet-2.0.10}/examples/sprite/depth_sprite.py +0 -0
  431. {pyglet-2.0.8 → pyglet-2.0.10}/examples/sprite/display_sprite.py +0 -0
  432. {pyglet-2.0.8 → pyglet-2.0.10}/examples/sprite/multi_texture_sprite.py +0 -0
  433. {pyglet-2.0.8 → pyglet-2.0.10}/examples/sprite/sprite_batching.py +0 -0
  434. {pyglet-2.0.8 → pyglet-2.0.10}/examples/text/advanced_font.py +0 -0
  435. {pyglet-2.0.8 → pyglet-2.0.10}/examples/text/font_comparison.py +0 -0
  436. {pyglet-2.0.8 → pyglet-2.0.10}/examples/text/html_label.py +0 -0
  437. {pyglet-2.0.8 → pyglet-2.0.10}/examples/text/pyglet.png +0 -0
  438. {pyglet-2.0.8 → pyglet-2.0.10}/examples/text/text_input.py +0 -0
  439. {pyglet-2.0.8 → pyglet-2.0.10}/examples/timer.py +0 -0
  440. {pyglet-2.0.8 → pyglet-2.0.10}/examples/window/camera.py +0 -0
  441. {pyglet-2.0.8 → pyglet-2.0.10}/examples/window/camera_group.py +0 -0
  442. {pyglet-2.0.8 → pyglet-2.0.10}/examples/window/multiple_windows.py +0 -0
  443. {pyglet-2.0.8 → pyglet-2.0.10}/examples/window/overlay_window.py +0 -0
  444. {pyglet-2.0.8 → pyglet-2.0.10}/examples/window/transparent_window.py +0 -0
  445. {pyglet-2.0.8 → pyglet-2.0.10}/experimental/dist_field/README +0 -0
  446. {pyglet-2.0.8 → pyglet-2.0.10}/experimental/dist_field/genfield.py +0 -0
  447. {pyglet-2.0.8 → pyglet-2.0.10}/experimental/dist_field/py.df.png +0 -0
  448. {pyglet-2.0.8 → pyglet-2.0.10}/experimental/dist_field/py.png +0 -0
  449. {pyglet-2.0.8 → pyglet-2.0.10}/experimental/dist_field/renderfield.py +0 -0
  450. {pyglet-2.0.8 → pyglet-2.0.10}/experimental/flaccodec.py +0 -0
  451. {pyglet-2.0.8 → pyglet-2.0.10}/experimental/hello_world.svg +0 -0
  452. {pyglet-2.0.8 → pyglet-2.0.10}/experimental/spritebenchmark.py +0 -0
  453. {pyglet-2.0.8 → pyglet-2.0.10}/experimental/svg_test.py +0 -0
  454. {pyglet-2.0.8 → pyglet-2.0.10}/experimental/wayland/gbm_egl_context.py +0 -0
  455. {pyglet-2.0.8 → pyglet-2.0.10}/experimental/win32priority.py +0 -0
  456. {pyglet-2.0.8 → pyglet-2.0.10}/make.py +0 -0
  457. {pyglet-2.0.8 → pyglet-2.0.10}/pyglet/app/__init__.py +0 -0
  458. {pyglet-2.0.8 → pyglet-2.0.10}/pyglet/app/cocoa.py +0 -0
  459. {pyglet-2.0.8 → pyglet-2.0.10}/pyglet/app/win32.py +0 -0
  460. {pyglet-2.0.8 → pyglet-2.0.10}/pyglet/app/xlib.py +0 -0
  461. {pyglet-2.0.8 → pyglet-2.0.10}/pyglet/canvas/__init__.py +0 -0
  462. {pyglet-2.0.8 → pyglet-2.0.10}/pyglet/canvas/base.py +0 -0
  463. {pyglet-2.0.8 → pyglet-2.0.10}/pyglet/canvas/headless.py +0 -0
  464. {pyglet-2.0.8 → pyglet-2.0.10}/pyglet/canvas/win32.py +0 -0
  465. {pyglet-2.0.8 → pyglet-2.0.10}/pyglet/canvas/xlib.py +0 -0
  466. {pyglet-2.0.8 → pyglet-2.0.10}/pyglet/canvas/xlib_vidmoderestore.py +0 -0
  467. {pyglet-2.0.8 → pyglet-2.0.10}/pyglet/extlibs/__init__.py +0 -0
  468. {pyglet-2.0.8 → pyglet-2.0.10}/pyglet/extlibs/png.py +0 -0
  469. {pyglet-2.0.8 → pyglet-2.0.10}/pyglet/font/__init__.py +0 -0
  470. {pyglet-2.0.8 → pyglet-2.0.10}/pyglet/font/base.py +0 -0
  471. {pyglet-2.0.8 → pyglet-2.0.10}/pyglet/font/fontconfig.py +0 -0
  472. {pyglet-2.0.8 → pyglet-2.0.10}/pyglet/font/freetype.py +0 -0
  473. {pyglet-2.0.8 → pyglet-2.0.10}/pyglet/font/freetype_lib.py +0 -0
  474. {pyglet-2.0.8 → pyglet-2.0.10}/pyglet/font/quartz.py +0 -0
  475. {pyglet-2.0.8 → pyglet-2.0.10}/pyglet/font/ttf.py +0 -0
  476. {pyglet-2.0.8 → pyglet-2.0.10}/pyglet/font/user.py +0 -0
  477. {pyglet-2.0.8 → pyglet-2.0.10}/pyglet/font/win32query.py +0 -0
  478. {pyglet-2.0.8 → pyglet-2.0.10}/pyglet/gl/__init__.py +0 -0
  479. {pyglet-2.0.8 → pyglet-2.0.10}/pyglet/gl/agl.py +0 -0
  480. {pyglet-2.0.8 → pyglet-2.0.10}/pyglet/gl/cocoa.py +0 -0
  481. {pyglet-2.0.8 → pyglet-2.0.10}/pyglet/gl/gl.py +0 -0
  482. {pyglet-2.0.8 → pyglet-2.0.10}/pyglet/gl/gl_compat.py +0 -0
  483. {pyglet-2.0.8 → pyglet-2.0.10}/pyglet/gl/glx.py +0 -0
  484. {pyglet-2.0.8 → pyglet-2.0.10}/pyglet/gl/glx_info.py +0 -0
  485. {pyglet-2.0.8 → pyglet-2.0.10}/pyglet/gl/glxext_arb.py +0 -0
  486. {pyglet-2.0.8 → pyglet-2.0.10}/pyglet/gl/glxext_mesa.py +0 -0
  487. {pyglet-2.0.8 → pyglet-2.0.10}/pyglet/gl/glxext_nv.py +0 -0
  488. {pyglet-2.0.8 → pyglet-2.0.10}/pyglet/gl/headless.py +0 -0
  489. {pyglet-2.0.8 → pyglet-2.0.10}/pyglet/gl/lib_agl.py +0 -0
  490. {pyglet-2.0.8 → pyglet-2.0.10}/pyglet/gl/lib_glx.py +0 -0
  491. {pyglet-2.0.8 → pyglet-2.0.10}/pyglet/gl/lib_wgl.py +0 -0
  492. {pyglet-2.0.8 → pyglet-2.0.10}/pyglet/gl/wgl.py +0 -0
  493. {pyglet-2.0.8 → pyglet-2.0.10}/pyglet/gl/wgl_info.py +0 -0
  494. {pyglet-2.0.8 → pyglet-2.0.10}/pyglet/gl/wglext_arb.py +0 -0
  495. {pyglet-2.0.8 → pyglet-2.0.10}/pyglet/gl/wglext_nv.py +0 -0
  496. {pyglet-2.0.8 → pyglet-2.0.10}/pyglet/gl/xlib.py +0 -0
  497. {pyglet-2.0.8 → pyglet-2.0.10}/pyglet/graphics/allocation.py +0 -0
  498. {pyglet-2.0.8 → pyglet-2.0.10}/pyglet/gui/__init__.py +0 -0
  499. {pyglet-2.0.8 → pyglet-2.0.10}/pyglet/image/animation.py +0 -0
  500. {pyglet-2.0.8 → pyglet-2.0.10}/pyglet/image/codecs/__init__.py +0 -0
  501. {pyglet-2.0.8 → pyglet-2.0.10}/pyglet/image/codecs/bmp.py +0 -0
  502. {pyglet-2.0.8 → pyglet-2.0.10}/pyglet/image/codecs/dds.py +0 -0
  503. {pyglet-2.0.8 → pyglet-2.0.10}/pyglet/image/codecs/gdiplus.py +0 -0
  504. {pyglet-2.0.8 → pyglet-2.0.10}/pyglet/image/codecs/gdkpixbuf2.py +0 -0
  505. {pyglet-2.0.8 → pyglet-2.0.10}/pyglet/image/codecs/gif.py +0 -0
  506. {pyglet-2.0.8 → pyglet-2.0.10}/pyglet/image/codecs/pil.py +0 -0
  507. {pyglet-2.0.8 → pyglet-2.0.10}/pyglet/image/codecs/png.py +0 -0
  508. {pyglet-2.0.8 → pyglet-2.0.10}/pyglet/image/codecs/quartz.py +0 -0
  509. {pyglet-2.0.8 → pyglet-2.0.10}/pyglet/image/codecs/s3tc.py +0 -0
  510. {pyglet-2.0.8 → pyglet-2.0.10}/pyglet/info.py +0 -0
  511. {pyglet-2.0.8 → pyglet-2.0.10}/pyglet/input/__init__.py +0 -0
  512. {pyglet-2.0.8 → pyglet-2.0.10}/pyglet/input/base.py +0 -0
  513. {pyglet-2.0.8 → pyglet-2.0.10}/pyglet/input/controller.py +0 -0
  514. {pyglet-2.0.8 → pyglet-2.0.10}/pyglet/input/linux/__init__.py +0 -0
  515. {pyglet-2.0.8 → pyglet-2.0.10}/pyglet/input/linux/evdev_constants.py +0 -0
  516. {pyglet-2.0.8 → pyglet-2.0.10}/pyglet/input/linux/x11_xinput.py +0 -0
  517. {pyglet-2.0.8 → pyglet-2.0.10}/pyglet/input/linux/x11_xinput_tablet.py +0 -0
  518. {pyglet-2.0.8 → pyglet-2.0.10}/pyglet/input/macos/__init__.py +0 -0
  519. {pyglet-2.0.8 → pyglet-2.0.10}/pyglet/input/macos/darwin_hid.py +0 -0
  520. {pyglet-2.0.8 → pyglet-2.0.10}/pyglet/input/win32/__init__.py +0 -0
  521. {pyglet-2.0.8 → pyglet-2.0.10}/pyglet/input/win32/directinput.py +0 -0
  522. {pyglet-2.0.8 → pyglet-2.0.10}/pyglet/input/win32/wintab.py +0 -0
  523. {pyglet-2.0.8 → pyglet-2.0.10}/pyglet/lib.py +0 -0
  524. {pyglet-2.0.8 → pyglet-2.0.10}/pyglet/libs/__init__.py +0 -0
  525. {pyglet-2.0.8 → pyglet-2.0.10}/pyglet/libs/darwin/__init__.py +0 -0
  526. {pyglet-2.0.8 → pyglet-2.0.10}/pyglet/libs/darwin/cocoapy/__init__.py +0 -0
  527. {pyglet-2.0.8 → pyglet-2.0.10}/pyglet/libs/darwin/cocoapy/cocoatypes.py +0 -0
  528. {pyglet-2.0.8 → pyglet-2.0.10}/pyglet/libs/darwin/cocoapy/runtime.py +0 -0
  529. {pyglet-2.0.8 → pyglet-2.0.10}/pyglet/libs/darwin/coreaudio.py +0 -0
  530. {pyglet-2.0.8 → pyglet-2.0.10}/pyglet/libs/darwin/quartzkey.py +0 -0
  531. {pyglet-2.0.8 → pyglet-2.0.10}/pyglet/libs/egl/__init__.py +0 -0
  532. {pyglet-2.0.8 → pyglet-2.0.10}/pyglet/libs/egl/egl.py +0 -0
  533. {pyglet-2.0.8 → pyglet-2.0.10}/pyglet/libs/egl/eglext.py +0 -0
  534. {pyglet-2.0.8 → pyglet-2.0.10}/pyglet/libs/egl/lib.py +0 -0
  535. {pyglet-2.0.8 → pyglet-2.0.10}/pyglet/libs/wayland/__init__.py +0 -0
  536. {pyglet-2.0.8 → pyglet-2.0.10}/pyglet/libs/wayland/gbm.py +0 -0
  537. {pyglet-2.0.8 → pyglet-2.0.10}/pyglet/libs/wayland/xkbcommon.py +0 -0
  538. {pyglet-2.0.8 → pyglet-2.0.10}/pyglet/libs/win32/constants.py +0 -0
  539. {pyglet-2.0.8 → pyglet-2.0.10}/pyglet/libs/win32/context_managers.py +0 -0
  540. {pyglet-2.0.8 → pyglet-2.0.10}/pyglet/libs/win32/dinput.py +0 -0
  541. {pyglet-2.0.8 → pyglet-2.0.10}/pyglet/libs/win32/libwintab.py +0 -0
  542. {pyglet-2.0.8 → pyglet-2.0.10}/pyglet/libs/win32/winkey.py +0 -0
  543. {pyglet-2.0.8 → pyglet-2.0.10}/pyglet/libs/x11/__init__.py +0 -0
  544. {pyglet-2.0.8 → pyglet-2.0.10}/pyglet/libs/x11/cursorfont.py +0 -0
  545. {pyglet-2.0.8 → pyglet-2.0.10}/pyglet/libs/x11/xf86vmode.py +0 -0
  546. {pyglet-2.0.8 → pyglet-2.0.10}/pyglet/libs/x11/xinerama.py +0 -0
  547. {pyglet-2.0.8 → pyglet-2.0.10}/pyglet/libs/x11/xinput.py +0 -0
  548. {pyglet-2.0.8 → pyglet-2.0.10}/pyglet/libs/x11/xlib.py +0 -0
  549. {pyglet-2.0.8 → pyglet-2.0.10}/pyglet/libs/x11/xsync.py +0 -0
  550. {pyglet-2.0.8 → pyglet-2.0.10}/pyglet/media/__init__.py +0 -0
  551. {pyglet-2.0.8 → pyglet-2.0.10}/pyglet/media/buffered_logger.py +0 -0
  552. {pyglet-2.0.8 → pyglet-2.0.10}/pyglet/media/codecs/__init__.py +0 -0
  553. {pyglet-2.0.8 → pyglet-2.0.10}/pyglet/media/codecs/base.py +0 -0
  554. {pyglet-2.0.8 → pyglet-2.0.10}/pyglet/media/codecs/coreaudio.py +0 -0
  555. {pyglet-2.0.8 → pyglet-2.0.10}/pyglet/media/codecs/ffmpeg.py +0 -0
  556. {pyglet-2.0.8 → pyglet-2.0.10}/pyglet/media/codecs/ffmpeg_lib/__init__.py +0 -0
  557. {pyglet-2.0.8 → pyglet-2.0.10}/pyglet/media/codecs/ffmpeg_lib/compat.py +0 -0
  558. {pyglet-2.0.8 → pyglet-2.0.10}/pyglet/media/codecs/ffmpeg_lib/libavcodec.py +0 -0
  559. {pyglet-2.0.8 → pyglet-2.0.10}/pyglet/media/codecs/ffmpeg_lib/libavformat.py +0 -0
  560. {pyglet-2.0.8 → pyglet-2.0.10}/pyglet/media/codecs/ffmpeg_lib/libavutil.py +0 -0
  561. {pyglet-2.0.8 → pyglet-2.0.10}/pyglet/media/codecs/ffmpeg_lib/libswresample.py +0 -0
  562. {pyglet-2.0.8 → pyglet-2.0.10}/pyglet/media/codecs/ffmpeg_lib/libswscale.py +0 -0
  563. {pyglet-2.0.8 → pyglet-2.0.10}/pyglet/media/codecs/gstreamer.py +0 -0
  564. {pyglet-2.0.8 → pyglet-2.0.10}/pyglet/media/codecs/pyogg.py +0 -0
  565. {pyglet-2.0.8 → pyglet-2.0.10}/pyglet/media/codecs/wave.py +0 -0
  566. {pyglet-2.0.8 → pyglet-2.0.10}/pyglet/media/devices/__init__.py +0 -0
  567. {pyglet-2.0.8 → pyglet-2.0.10}/pyglet/media/drivers/__init__.py +0 -0
  568. {pyglet-2.0.8 → pyglet-2.0.10}/pyglet/media/drivers/directsound/__init__.py +0 -0
  569. {pyglet-2.0.8 → pyglet-2.0.10}/pyglet/media/drivers/directsound/exceptions.py +0 -0
  570. {pyglet-2.0.8 → pyglet-2.0.10}/pyglet/media/drivers/directsound/interface.py +0 -0
  571. {pyglet-2.0.8 → pyglet-2.0.10}/pyglet/media/drivers/openal/__init__.py +0 -0
  572. {pyglet-2.0.8 → pyglet-2.0.10}/pyglet/media/drivers/openal/interface.py +0 -0
  573. {pyglet-2.0.8 → pyglet-2.0.10}/pyglet/media/drivers/openal/lib_alc.py +0 -0
  574. {pyglet-2.0.8 → pyglet-2.0.10}/pyglet/media/drivers/openal/lib_openal.py +0 -0
  575. {pyglet-2.0.8 → pyglet-2.0.10}/pyglet/media/drivers/pulse/__init__.py +0 -0
  576. {pyglet-2.0.8 → pyglet-2.0.10}/pyglet/media/drivers/pulse/adaptation.py +0 -0
  577. {pyglet-2.0.8 → pyglet-2.0.10}/pyglet/media/drivers/pulse/interface.py +0 -0
  578. {pyglet-2.0.8 → pyglet-2.0.10}/pyglet/media/drivers/pulse/lib_pulseaudio.py +0 -0
  579. {pyglet-2.0.8 → pyglet-2.0.10}/pyglet/media/drivers/silent/__init__.py +0 -0
  580. {pyglet-2.0.8 → pyglet-2.0.10}/pyglet/media/drivers/silent/adaptation.py +0 -0
  581. {pyglet-2.0.8 → pyglet-2.0.10}/pyglet/media/drivers/xaudio2/__init__.py +0 -0
  582. {pyglet-2.0.8 → pyglet-2.0.10}/pyglet/media/exceptions.py +0 -0
  583. {pyglet-2.0.8 → pyglet-2.0.10}/pyglet/media/instrumentation.py +0 -0
  584. {pyglet-2.0.8 → pyglet-2.0.10}/pyglet/media/synthesis.py +0 -0
  585. {pyglet-2.0.8 → pyglet-2.0.10}/pyglet/model/codecs/__init__.py +0 -0
  586. {pyglet-2.0.8 → pyglet-2.0.10}/pyglet/model/codecs/gltf.py +0 -0
  587. {pyglet-2.0.8 → pyglet-2.0.10}/pyglet/resource.py +0 -0
  588. {pyglet-2.0.8 → pyglet-2.0.10}/pyglet/text/document.py +0 -0
  589. {pyglet-2.0.8 → pyglet-2.0.10}/pyglet/text/formats/__init__.py +0 -0
  590. {pyglet-2.0.8 → pyglet-2.0.10}/pyglet/text/formats/attributed.py +0 -0
  591. {pyglet-2.0.8 → pyglet-2.0.10}/pyglet/text/formats/html.py +0 -0
  592. {pyglet-2.0.8 → pyglet-2.0.10}/pyglet/text/formats/plaintext.py +0 -0
  593. {pyglet-2.0.8 → pyglet-2.0.10}/pyglet/text/formats/structured.py +0 -0
  594. {pyglet-2.0.8 → pyglet-2.0.10}/pyglet/text/runlist.py +0 -0
  595. {pyglet-2.0.8 → pyglet-2.0.10}/pyglet/window/cocoa/pyglet_delegate.py +0 -0
  596. {pyglet-2.0.8 → pyglet-2.0.10}/pyglet/window/cocoa/pyglet_view.py +0 -0
  597. {pyglet-2.0.8 → pyglet-2.0.10}/pyglet/window/cocoa/pyglet_window.py +0 -0
  598. {pyglet-2.0.8 → pyglet-2.0.10}/pyglet/window/cocoa/systemcursor.py +0 -0
  599. {pyglet-2.0.8 → pyglet-2.0.10}/pyglet/window/event.py +0 -0
  600. {pyglet-2.0.8 → pyglet-2.0.10}/pyglet/window/headless/__init__.py +0 -0
  601. {pyglet-2.0.8 → pyglet-2.0.10}/pyglet/window/mouse.py +0 -0
  602. {pyglet-2.0.8 → pyglet-2.0.10}/pyglet.egg-info/dependency_links.txt +0 -0
  603. {pyglet-2.0.8 → pyglet-2.0.10}/pyglet.egg-info/top_level.txt +0 -0
  604. {pyglet-2.0.8 → pyglet-2.0.10}/pyglet.egg-info/zip-safe +0 -0
  605. {pyglet-2.0.8 → pyglet-2.0.10}/pyproject.toml +0 -0
  606. {pyglet-2.0.8 → pyglet-2.0.10}/pytest.ini +0 -0
  607. {pyglet-2.0.8 → pyglet-2.0.10}/setup.cfg +0 -0
  608. {pyglet-2.0.8 → pyglet-2.0.10}/setup.py +0 -0
  609. {pyglet-2.0.8 → pyglet-2.0.10}/tests/__init__.py +0 -0
  610. {pyglet-2.0.8 → pyglet-2.0.10}/tests/annotations.py +0 -0
  611. {pyglet-2.0.8 → pyglet-2.0.10}/tests/base/__init__.py +0 -0
  612. {pyglet-2.0.8 → pyglet-2.0.10}/tests/base/data.py +0 -0
  613. {pyglet-2.0.8 → pyglet-2.0.10}/tests/base/event_loop.py +0 -0
  614. {pyglet-2.0.8 → pyglet-2.0.10}/tests/base/interactive.py +0 -0
  615. {pyglet-2.0.8 → pyglet-2.0.10}/tests/base/performance.py +0 -0
  616. {pyglet-2.0.8 → pyglet-2.0.10}/tests/base/test_interactive_test_base.py +0 -0
  617. {pyglet-2.0.8 → pyglet-2.0.10}/tests/conftest.py +0 -0
  618. {pyglet-2.0.8 → pyglet-2.0.10}/tests/data/fonts/README +0 -0
  619. {pyglet-2.0.8 → pyglet-2.0.10}/tests/data/fonts/action_man.ttf +0 -0
  620. {pyglet-2.0.8 → pyglet-2.0.10}/tests/data/fonts/action_man_bold.ttf +0 -0
  621. {pyglet-2.0.8 → pyglet-2.0.10}/tests/data/fonts/action_man_bold_italic.ttf +0 -0
  622. {pyglet-2.0.8 → pyglet-2.0.10}/tests/data/fonts/action_man_italic.ttf +0 -0
  623. {pyglet-2.0.8 → pyglet-2.0.10}/tests/data/fonts/courR12-ISO8859-1.pcf +0 -0
  624. {pyglet-2.0.8 → pyglet-2.0.10}/tests/data/images/8bpp.gif +0 -0
  625. {pyglet-2.0.8 → pyglet-2.0.10}/tests/data/images/cursor.png +0 -0
  626. {pyglet-2.0.8 → pyglet-2.0.10}/tests/data/images/dinosaur.gif +0 -0
  627. {pyglet-2.0.8 → pyglet-2.0.10}/tests/data/images/gdk_close.png +0 -0
  628. {pyglet-2.0.8 → pyglet-2.0.10}/tests/data/images/grey_background.png +0 -0
  629. {pyglet-2.0.8 → pyglet-2.0.10}/tests/data/images/icon1.png +0 -0
  630. {pyglet-2.0.8 → pyglet-2.0.10}/tests/data/images/icon_size1.png +0 -0
  631. {pyglet-2.0.8 → pyglet-2.0.10}/tests/data/images/icon_size2.png +0 -0
  632. {pyglet-2.0.8 → pyglet-2.0.10}/tests/data/images/icon_size3.png +0 -0
  633. {pyglet-2.0.8 → pyglet-2.0.10}/tests/data/images/icon_size4.png +0 -0
  634. {pyglet-2.0.8 → pyglet-2.0.10}/tests/data/images/icon_size5.png +0 -0
  635. {pyglet-2.0.8 → pyglet-2.0.10}/tests/data/images/l.png +0 -0
  636. {pyglet-2.0.8 → pyglet-2.0.10}/tests/data/images/la.png +0 -0
  637. {pyglet-2.0.8 → pyglet-2.0.10}/tests/data/images/multitexture.png +0 -0
  638. {pyglet-2.0.8 → pyglet-2.0.10}/tests/data/images/rgb.png +0 -0
  639. {pyglet-2.0.8 → pyglet-2.0.10}/tests/data/images/rgb_16bpp.bmp +0 -0
  640. {pyglet-2.0.8 → pyglet-2.0.10}/tests/data/images/rgb_1bpp.bmp +0 -0
  641. {pyglet-2.0.8 → pyglet-2.0.10}/tests/data/images/rgb_24bpp.bmp +0 -0
  642. {pyglet-2.0.8 → pyglet-2.0.10}/tests/data/images/rgb_32bpp.bmp +0 -0
  643. {pyglet-2.0.8 → pyglet-2.0.10}/tests/data/images/rgb_4bpp.bmp +0 -0
  644. {pyglet-2.0.8 → pyglet-2.0.10}/tests/data/images/rgb_8bpp.bmp +0 -0
  645. {pyglet-2.0.8 → pyglet-2.0.10}/tests/data/images/rgb_8bpp.png +0 -0
  646. {pyglet-2.0.8 → pyglet-2.0.10}/tests/data/images/rgb_8bpp_trans.png +0 -0
  647. {pyglet-2.0.8 → pyglet-2.0.10}/tests/data/images/rgb_dxt1.dds +0 -0
  648. {pyglet-2.0.8 → pyglet-2.0.10}/tests/data/images/rgba.png +0 -0
  649. {pyglet-2.0.8 → pyglet-2.0.10}/tests/data/images/rgba_32bpp.bmp +0 -0
  650. {pyglet-2.0.8 → pyglet-2.0.10}/tests/data/images/rgba_dxt1.dds +0 -0
  651. {pyglet-2.0.8 → pyglet-2.0.10}/tests/data/images/rgba_dxt3.dds +0 -0
  652. {pyglet-2.0.8 → pyglet-2.0.10}/tests/data/images/rgba_dxt5.dds +0 -0
  653. {pyglet-2.0.8 → pyglet-2.0.10}/tests/data/images/tests.interactive.test_interactive_test_base._Test.test_1.001.png +0 -0
  654. {pyglet-2.0.8 → pyglet-2.0.10}/tests/data/media/README +0 -0
  655. {pyglet-2.0.8 → pyglet-2.0.10}/tests/data/media/alert.wav +0 -0
  656. {pyglet-2.0.8 → pyglet-2.0.10}/tests/data/media/login.wav +0 -0
  657. {pyglet-2.0.8 → pyglet-2.0.10}/tests/data/media/logout.wav +0 -0
  658. {pyglet-2.0.8 → pyglet-2.0.10}/tests/data/media/receive.wav +0 -0
  659. {pyglet-2.0.8 → pyglet-2.0.10}/tests/data/media/send.wav +0 -0
  660. {pyglet-2.0.8 → pyglet-2.0.10}/tests/data/media/synthesis_sawtooth_16_11025_1ch.wav +0 -0
  661. {pyglet-2.0.8 → pyglet-2.0.10}/tests/data/media/synthesis_sawtooth_16_44800_1ch.wav +0 -0
  662. {pyglet-2.0.8 → pyglet-2.0.10}/tests/data/media/synthesis_silence_16_11025_1ch.wav +0 -0
  663. {pyglet-2.0.8 → pyglet-2.0.10}/tests/data/media/synthesis_silence_16_44800_1ch.wav +0 -0
  664. {pyglet-2.0.8 → pyglet-2.0.10}/tests/data/media/synthesis_simplefm_16_11025_1ch.wav +0 -0
  665. {pyglet-2.0.8 → pyglet-2.0.10}/tests/data/media/synthesis_simplefm_16_44800_1ch.wav +0 -0
  666. {pyglet-2.0.8 → pyglet-2.0.10}/tests/data/media/synthesis_sine_16_11025_1ch.wav +0 -0
  667. {pyglet-2.0.8 → pyglet-2.0.10}/tests/data/media/synthesis_sine_16_44800_1ch.wav +0 -0
  668. {pyglet-2.0.8 → pyglet-2.0.10}/tests/data/media/synthesis_square_16_11025_1ch.wav +0 -0
  669. {pyglet-2.0.8 → pyglet-2.0.10}/tests/data/media/synthesis_square_16_44800_1ch.wav +0 -0
  670. {pyglet-2.0.8 → pyglet-2.0.10}/tests/data/media/synthesis_triangle_16_11025_1ch.wav +0 -0
  671. {pyglet-2.0.8 → pyglet-2.0.10}/tests/data/media/synthesis_triangle_16_44800_1ch.wav +0 -0
  672. {pyglet-2.0.8 → pyglet-2.0.10}/tests/data/models/logo3d.mtl +0 -0
  673. {pyglet-2.0.8 → pyglet-2.0.10}/tests/data/models/logo3d.obj +0 -0
  674. {pyglet-2.0.8 → pyglet-2.0.10}/tests/integration/__init__.py +0 -0
  675. {pyglet-2.0.8 → pyglet-2.0.10}/tests/integration/app/__init__.py +0 -0
  676. {pyglet-2.0.8 → pyglet-2.0.10}/tests/integration/font/test_fontconfig.py +0 -0
  677. {pyglet-2.0.8 → pyglet-2.0.10}/tests/integration/font/test_freetype_face.py +0 -0
  678. {pyglet-2.0.8 → pyglet-2.0.10}/tests/integration/graphics/__init__.py +0 -0
  679. {pyglet-2.0.8 → pyglet-2.0.10}/tests/integration/graphics/test_allocation.py +0 -0
  680. {pyglet-2.0.8 → pyglet-2.0.10}/tests/integration/image/__init__.py +0 -0
  681. {pyglet-2.0.8 → pyglet-2.0.10}/tests/integration/image/test_gdkpixbuf2.py +0 -0
  682. {pyglet-2.0.8 → pyglet-2.0.10}/tests/integration/media/__init__.py +0 -0
  683. {pyglet-2.0.8 → pyglet-2.0.10}/tests/integration/media/mock_player.py +0 -0
  684. {pyglet-2.0.8 → pyglet-2.0.10}/tests/integration/media/test_directsound.py +0 -0
  685. {pyglet-2.0.8 → pyglet-2.0.10}/tests/integration/media/test_openal.py +0 -0
  686. {pyglet-2.0.8 → pyglet-2.0.10}/tests/integration/media/test_player.py +0 -0
  687. {pyglet-2.0.8 → pyglet-2.0.10}/tests/integration/media/test_pulse.py +0 -0
  688. {pyglet-2.0.8 → pyglet-2.0.10}/tests/integration/model/__init__.py +0 -0
  689. {pyglet-2.0.8 → pyglet-2.0.10}/tests/integration/model/test_loading.py +0 -0
  690. {pyglet-2.0.8 → pyglet-2.0.10}/tests/integration/platform/__init__.py +0 -0
  691. {pyglet-2.0.8 → pyglet-2.0.10}/tests/integration/platform/test_linux_fontconfig.py +0 -0
  692. {pyglet-2.0.8 → pyglet-2.0.10}/tests/integration/platform/test_win_context_managers.py +0 -0
  693. {pyglet-2.0.8 → pyglet-2.0.10}/tests/integration/platform/test_win_multicore_clock.py +0 -0
  694. {pyglet-2.0.8 → pyglet-2.0.10}/tests/integration/resource/__init__.py +0 -0
  695. {pyglet-2.0.8 → pyglet-2.0.10}/tests/integration/resource/dir1/dir1/f3.txt +0 -0
  696. {pyglet-2.0.8 → pyglet-2.0.10}/tests/integration/resource/dir1/f2.txt +0 -0
  697. {pyglet-2.0.8 → pyglet-2.0.10}/tests/integration/resource/dir1/res.zip +0 -0
  698. {pyglet-2.0.8 → pyglet-2.0.10}/tests/integration/resource/dir2/f6.txt +0 -0
  699. {pyglet-2.0.8 → pyglet-2.0.10}/tests/integration/resource/f1.txt +0 -0
  700. {pyglet-2.0.8 → pyglet-2.0.10}/tests/integration/resource/rgbm.png +0 -0
  701. {pyglet-2.0.8 → pyglet-2.0.10}/tests/integration/resource/test_resource_image_loading.py +0 -0
  702. {pyglet-2.0.8 → pyglet-2.0.10}/tests/integration/resource/test_resource_loading.py +0 -0
  703. {pyglet-2.0.8 → pyglet-2.0.10}/tests/integration/text/__init__.py +0 -0
  704. {pyglet-2.0.8 → pyglet-2.0.10}/tests/integration/text/test_empty_document.py +0 -0
  705. {pyglet-2.0.8 → pyglet-2.0.10}/tests/integration/window/__init__.py +0 -0
  706. {pyglet-2.0.8 → pyglet-2.0.10}/tests/integration/window/test_context_share.py +0 -0
  707. {pyglet-2.0.8 → pyglet-2.0.10}/tests/integration/window/test_event_sequence.py +0 -0
  708. {pyglet-2.0.8 → pyglet-2.0.10}/tests/integration/window/test_window_caption.py +0 -0
  709. {pyglet-2.0.8 → pyglet-2.0.10}/tests/interactive/__init__.py +0 -0
  710. {pyglet-2.0.8 → pyglet-2.0.10}/tests/interactive/conftest.py +0 -0
  711. {pyglet-2.0.8 → pyglet-2.0.10}/tests/interactive/graphics/__init__.py +0 -0
  712. {pyglet-2.0.8 → pyglet-2.0.10}/tests/interactive/graphics/test_multitexture.py +0 -0
  713. {pyglet-2.0.8 → pyglet-2.0.10}/tests/interactive/image/__init__.py +0 -0
  714. {pyglet-2.0.8 → pyglet-2.0.10}/tests/interactive/image/test_image.py +0 -0
  715. {pyglet-2.0.8 → pyglet-2.0.10}/tests/interactive/media/__init__.py +0 -0
  716. {pyglet-2.0.8 → pyglet-2.0.10}/tests/interactive/media/test_player.py +0 -0
  717. {pyglet-2.0.8 → pyglet-2.0.10}/tests/interactive/screenshots/committed/README +0 -0
  718. /pyglet-2.0.8/tests/interactive/screenshots/session/tests.interactive.graphics.test_multitexture.test_multitexture.001.png → /pyglet-2.0.10/tests/interactive/screenshots/committed/tests.interactive.image.test_image.test_pil_saving[rgb.png].001.png +0 -0
  719. /pyglet-2.0.8/tests/interactive/screenshots/session/tests.interactive.image.test_image.test_bmp_loading[rgb_16bpp.bmp].001.png → /pyglet-2.0.10/tests/interactive/screenshots/committed/tests.interactive.image.test_image.test_pil_saving[rgba.png].001.png +0 -0
  720. {pyglet-2.0.8 → pyglet-2.0.10}/tests/interactive/screenshots/session/README +0 -0
  721. /pyglet-2.0.8/tests/interactive/screenshots/session/tests.interactive.image.test_image.test_bmp_loading[rgb_1bpp.bmp].001.png → /pyglet-2.0.10/tests/interactive/screenshots/session/tests.interactive.graphics.test_multitexture.test_multitexture.001.png +0 -0
  722. {pyglet-2.0.8 → pyglet-2.0.10}/tests/interactive/screenshots/session/tests.interactive.image.test_image.test_pil_loading[l.png].001.png +0 -0
  723. {pyglet-2.0.8 → pyglet-2.0.10}/tests/interactive/screenshots/session/tests.interactive.image.test_image.test_pypng_loading[l.png].001.png +0 -0
  724. {pyglet-2.0.8 → pyglet-2.0.10}/tests/interactive/text/__init__.py +0 -0
  725. {pyglet-2.0.8 → pyglet-2.0.10}/tests/interactive/text/test_caret_color.py +0 -0
  726. {pyglet-2.0.8 → pyglet-2.0.10}/tests/interactive/text/test_content_valign.py +0 -0
  727. {pyglet-2.0.8 → pyglet-2.0.10}/tests/interactive/text/test_html.py +0 -0
  728. {pyglet-2.0.8 → pyglet-2.0.10}/tests/interactive/window/__init__.py +0 -0
  729. {pyglet-2.0.8 → pyglet-2.0.10}/tests/interactive/window/test_window_events.py +0 -0
  730. {pyglet-2.0.8 → pyglet-2.0.10}/tests/interactive/window/test_window_fullscreen.py +0 -0
  731. {pyglet-2.0.8 → pyglet-2.0.10}/tests/interactive/window/test_window_modes.py +0 -0
  732. {pyglet-2.0.8 → pyglet-2.0.10}/tests/interactive/window/test_window_multisample.py +0 -0
  733. {pyglet-2.0.8 → pyglet-2.0.10}/tests/interactive/window/test_window_open.py +0 -0
  734. {pyglet-2.0.8 → pyglet-2.0.10}/tests/interactive/window/test_window_settings.py +0 -0
  735. {pyglet-2.0.8 → pyglet-2.0.10}/tests/interactive/window/test_window_styles.py +0 -0
  736. {pyglet-2.0.8 → pyglet-2.0.10}/tests/interactive/window/window_util.py +0 -0
  737. {pyglet-2.0.8 → pyglet-2.0.10}/tests/interactive/windowed_test_base.py +0 -0
  738. {pyglet-2.0.8 → pyglet-2.0.10}/tests/requirements.txt +0 -0
  739. {pyglet-2.0.8 → pyglet-2.0.10}/tests/unit/__init__.py +0 -0
  740. {pyglet-2.0.8 → pyglet-2.0.10}/tests/unit/media/__init__.py +0 -0
  741. {pyglet-2.0.8 → pyglet-2.0.10}/tests/unit/media/test_listener.py +0 -0
  742. {pyglet-2.0.8 → pyglet-2.0.10}/tests/unit/media/test_player.py +0 -0
  743. {pyglet-2.0.8 → pyglet-2.0.10}/tests/unit/media/test_sources.py +0 -0
  744. {pyglet-2.0.8 → pyglet-2.0.10}/tests/unit/media/test_synthesis.py +0 -0
  745. {pyglet-2.0.8 → pyglet-2.0.10}/tests/unit/shapes/__init__.py +0 -0
  746. {pyglet-2.0.8 → pyglet-2.0.10}/tests/unit/shapes/conftest.py +0 -0
  747. {pyglet-2.0.8 → pyglet-2.0.10}/tests/unit/shapes/test_bordered_rectangle.py +0 -0
  748. {pyglet-2.0.8 → pyglet-2.0.10}/tests/unit/test_atlas.py +0 -0
  749. {pyglet-2.0.8 → pyglet-2.0.10}/tests/unit/test_clock.py +0 -0
  750. {pyglet-2.0.8 → pyglet-2.0.10}/tests/unit/test_clock_freq.py +0 -0
  751. {pyglet-2.0.8 → pyglet-2.0.10}/tests/unit/test_font.py +0 -0
  752. {pyglet-2.0.8 → pyglet-2.0.10}/tests/unit/test_input.py +0 -0
  753. {pyglet-2.0.8 → pyglet-2.0.10}/tests/unit/test_math.py +0 -0
  754. {pyglet-2.0.8 → pyglet-2.0.10}/tests/unit/test_resource_path.py +0 -0
  755. {pyglet-2.0.8 → pyglet-2.0.10}/tests/unit/test_sprite.py +0 -0
  756. {pyglet-2.0.8 → pyglet-2.0.10}/tests/unit/test_text.py +0 -0
  757. {pyglet-2.0.8 → pyglet-2.0.10}/tests/unit/text/__init__.py +0 -0
  758. {pyglet-2.0.8 → pyglet-2.0.10}/tests/unit/text/test_caret.py +0 -0
  759. {pyglet-2.0.8 → pyglet-2.0.10}/tests/unit/text/test_layout.py +0 -0
  760. {pyglet-2.0.8 → pyglet-2.0.10}/tools/al_info.py +0 -0
  761. {pyglet-2.0.8 → pyglet-2.0.10}/tools/ffmpeg/bokeh_timeline.py +0 -0
  762. {pyglet-2.0.8 → pyglet-2.0.10}/tools/ffmpeg/compare.py +0 -0
  763. {pyglet-2.0.8 → pyglet-2.0.10}/tools/ffmpeg/configure.py +0 -0
  764. {pyglet-2.0.8 → pyglet-2.0.10}/tools/ffmpeg/extractors.py +0 -0
  765. {pyglet-2.0.8 → pyglet-2.0.10}/tools/ffmpeg/fs.py +0 -0
  766. {pyglet-2.0.8 → pyglet-2.0.10}/tools/ffmpeg/mp.py +0 -0
  767. {pyglet-2.0.8 → pyglet-2.0.10}/tools/ffmpeg/mpexceptions.py +0 -0
  768. {pyglet-2.0.8 → pyglet-2.0.10}/tools/ffmpeg/playmany.py +0 -0
  769. {pyglet-2.0.8 → pyglet-2.0.10}/tools/ffmpeg/readme_ffmpeg_debbuging_branch.txt +0 -0
  770. {pyglet-2.0.8 → pyglet-2.0.10}/tools/ffmpeg/readme_run_tests.txt +0 -0
  771. {pyglet-2.0.8 → pyglet-2.0.10}/tools/ffmpeg/report.py +0 -0
  772. {pyglet-2.0.8 → pyglet-2.0.10}/tools/ffmpeg/reports.py +0 -0
  773. {pyglet-2.0.8 → pyglet-2.0.10}/tools/ffmpeg/retry_crashed.py +0 -0
  774. {pyglet-2.0.8 → pyglet-2.0.10}/tools/ffmpeg/run_test_suite.py +0 -0
  775. {pyglet-2.0.8 → pyglet-2.0.10}/tools/ffmpeg/summarize.py +0 -0
  776. {pyglet-2.0.8 → pyglet-2.0.10}/tools/ffmpeg/test_instrumentation.py +0 -0
  777. {pyglet-2.0.8 → pyglet-2.0.10}/tools/ffmpeg/timeline.py +0 -0
  778. {pyglet-2.0.8 → pyglet-2.0.10}/tools/gendist.sh +0 -0
  779. {pyglet-2.0.8 → pyglet-2.0.10}/tools/gengl.py +0 -0
  780. {pyglet-2.0.8 → pyglet-2.0.10}/tools/gengl_old.py +0 -0
  781. {pyglet-2.0.8 → pyglet-2.0.10}/tools/genwrappers.py +0 -0
  782. {pyglet-2.0.8 → pyglet-2.0.10}/tools/gl.template +0 -0
  783. {pyglet-2.0.8 → pyglet-2.0.10}/tools/gl.xml +0 -0
  784. {pyglet-2.0.8 → pyglet-2.0.10}/tools/gl_info.py +0 -0
  785. {pyglet-2.0.8 → pyglet-2.0.10}/tools/inspect_font.py +0 -0
  786. {pyglet-2.0.8 → pyglet-2.0.10}/tools/requirements.txt +0 -0
  787. {pyglet-2.0.8 → pyglet-2.0.10}/tools/wgl.h +0 -0
  788. {pyglet-2.0.8 → pyglet-2.0.10}/tools/wraptypes/__init__.py +0 -0
  789. {pyglet-2.0.8 → pyglet-2.0.10}/tools/wraptypes/cparser.py +0 -0
  790. {pyglet-2.0.8 → pyglet-2.0.10}/tools/wraptypes/ctypesparser.py +0 -0
  791. {pyglet-2.0.8 → pyglet-2.0.10}/tools/wraptypes/lex.py +0 -0
  792. {pyglet-2.0.8 → pyglet-2.0.10}/tools/wraptypes/preprocessor.py +0 -0
  793. {pyglet-2.0.8 → pyglet-2.0.10}/tools/wraptypes/wrap.py +0 -0
  794. {pyglet-2.0.8 → pyglet-2.0.10}/tools/wraptypes/yacc.py +0 -0
  795. {pyglet-2.0.8 → pyglet-2.0.10}/website/LICENSE.txt +0 -0
  796. {pyglet-2.0.8 → pyglet-2.0.10}/website/README.rst +0 -0
  797. {pyglet-2.0.8 → pyglet-2.0.10}/website/assets/favicon.ico +0 -0
  798. {pyglet-2.0.8 → pyglet-2.0.10}/website/assets/static/css/example-custom-styles.css +0 -0
  799. {pyglet-2.0.8 → pyglet-2.0.10}/website/assets/static/images/pyglet.png +0 -0
  800. {pyglet-2.0.8 → pyglet-2.0.10}/website/content/404.html/contents.lr +0 -0
  801. {pyglet-2.0.8 → pyglet-2.0.10}/website/content/404.html/ngc-5793.jpg +0 -0
  802. {pyglet-2.0.8 → pyglet-2.0.10}/website/content/authors/benjamin/contents.lr +0 -0
  803. {pyglet-2.0.8 → pyglet-2.0.10}/website/content/authors/benjamin/pyglet.png +0 -0
  804. {pyglet-2.0.8 → pyglet-2.0.10}/website/content/authors/contents.lr +0 -0
  805. {pyglet-2.0.8 → pyglet-2.0.10}/website/content/blog/contents.lr +0 -0
  806. {pyglet-2.0.8 → pyglet-2.0.10}/website/content/blog/welcome-blog/contents.lr +0 -0
  807. {pyglet-2.0.8 → pyglet-2.0.10}/website/content/contents.lr +0 -0
  808. {pyglet-2.0.8 → pyglet-2.0.10}/website/content/eclipse.jpg +0 -0
  809. {pyglet-2.0.8 → pyglet-2.0.10}/website/pyglet.lektorproject +0 -0
  810. {pyglet-2.0.8 → pyglet-2.0.10}/website/themes/lektor-icon/AUTHORS.txt +0 -0
  811. {pyglet-2.0.8 → pyglet-2.0.10}/website/themes/lektor-icon/CHANGELOG.md +0 -0
  812. {pyglet-2.0.8 → pyglet-2.0.10}/website/themes/lektor-icon/CONTRIBUTING.md +0 -0
  813. {pyglet-2.0.8 → pyglet-2.0.10}/website/themes/lektor-icon/LICENSE.txt +0 -0
  814. {pyglet-2.0.8 → pyglet-2.0.10}/website/themes/lektor-icon/NOTICE.txt +0 -0
  815. {pyglet-2.0.8 → pyglet-2.0.10}/website/themes/lektor-icon/README.md +0 -0
  816. {pyglet-2.0.8 → pyglet-2.0.10}/website/themes/lektor-icon/assets/static/css/bootstrap.css +0 -0
  817. {pyglet-2.0.8 → pyglet-2.0.10}/website/themes/lektor-icon/assets/static/css/icomoon.css +0 -0
  818. {pyglet-2.0.8 → pyglet-2.0.10}/website/themes/lektor-icon/assets/static/css/magnific-popup.css +0 -0
  819. {pyglet-2.0.8 → pyglet-2.0.10}/website/themes/lektor-icon/assets/static/css/style.css +0 -0
  820. {pyglet-2.0.8 → pyglet-2.0.10}/website/themes/lektor-icon/assets/static/fonts/bootstrap/glyphicons-halflings-regular.ttf +0 -0
  821. {pyglet-2.0.8 → pyglet-2.0.10}/website/themes/lektor-icon/assets/static/fonts/bootstrap/glyphicons-halflings-regular.woff +0 -0
  822. {pyglet-2.0.8 → pyglet-2.0.10}/website/themes/lektor-icon/assets/static/fonts/bootstrap/glyphicons-halflings-regular.woff2 +0 -0
  823. {pyglet-2.0.8 → pyglet-2.0.10}/website/themes/lektor-icon/assets/static/fonts/icomoon/icomoon.ttf +0 -0
  824. {pyglet-2.0.8 → pyglet-2.0.10}/website/themes/lektor-icon/assets/static/fonts/icomoon/icomoon.woff +0 -0
  825. {pyglet-2.0.8 → pyglet-2.0.10}/website/themes/lektor-icon/assets/static/images/Preloader_2.gif +0 -0
  826. {pyglet-2.0.8 → pyglet-2.0.10}/website/themes/lektor-icon/assets/static/images/placeholder_person.png +0 -0
  827. {pyglet-2.0.8 → pyglet-2.0.10}/website/themes/lektor-icon/assets/static/js/jquery-3.3.1.min.js +0 -0
  828. {pyglet-2.0.8 → pyglet-2.0.10}/website/themes/lektor-icon/assets/static/js/jquery.easing.min.js +0 -0
  829. {pyglet-2.0.8 → pyglet-2.0.10}/website/themes/lektor-icon/assets/static/js/jquery.magnific-popup.min.js +0 -0
  830. {pyglet-2.0.8 → pyglet-2.0.10}/website/themes/lektor-icon/assets/static/js/jquery.stellar.js +0 -0
  831. {pyglet-2.0.8 → pyglet-2.0.10}/website/themes/lektor-icon/assets/static/js/jquery.stellar.min.js +0 -0
  832. {pyglet-2.0.8 → pyglet-2.0.10}/website/themes/lektor-icon/assets/static/js/jquery.waypoints.min.js +0 -0
  833. {pyglet-2.0.8 → pyglet-2.0.10}/website/themes/lektor-icon/assets/static/js/magnific-popup-options.js +0 -0
  834. {pyglet-2.0.8 → pyglet-2.0.10}/website/themes/lektor-icon/assets/static/js/main-singlelayout.js +0 -0
  835. {pyglet-2.0.8 → pyglet-2.0.10}/website/themes/lektor-icon/assets/static/js/main.js +0 -0
  836. {pyglet-2.0.8 → pyglet-2.0.10}/website/themes/lektor-icon/flowblocks/content.ini +0 -0
  837. {pyglet-2.0.8 → pyglet-2.0.10}/website/themes/lektor-icon/flowblocks/gallery.ini +0 -0
  838. {pyglet-2.0.8 → pyglet-2.0.10}/website/themes/lektor-icon/flowblocks/gallery_item.ini +0 -0
  839. {pyglet-2.0.8 → pyglet-2.0.10}/website/themes/lektor-icon/flowblocks/member.ini +0 -0
  840. {pyglet-2.0.8 → pyglet-2.0.10}/website/themes/lektor-icon/flowblocks/mission.ini +0 -0
  841. {pyglet-2.0.8 → pyglet-2.0.10}/website/themes/lektor-icon/flowblocks/mission_tab.ini +0 -0
  842. {pyglet-2.0.8 → pyglet-2.0.10}/website/themes/lektor-icon/flowblocks/service.ini +0 -0
  843. {pyglet-2.0.8 → pyglet-2.0.10}/website/themes/lektor-icon/flowblocks/services.ini +0 -0
  844. {pyglet-2.0.8 → pyglet-2.0.10}/website/themes/lektor-icon/flowblocks/team.ini +0 -0
  845. {pyglet-2.0.8 → pyglet-2.0.10}/website/themes/lektor-icon/images/blog-index.png +0 -0
  846. {pyglet-2.0.8 → pyglet-2.0.10}/website/themes/lektor-icon/images/full-blog.png +0 -0
  847. {pyglet-2.0.8 → pyglet-2.0.10}/website/themes/lektor-icon/images/full-page.png +0 -0
  848. {pyglet-2.0.8 → pyglet-2.0.10}/website/themes/lektor-icon/images/gallery-404.png +0 -0
  849. {pyglet-2.0.8 → pyglet-2.0.10}/website/themes/lektor-icon/images/gallery-singlepage.png +0 -0
  850. {pyglet-2.0.8 → pyglet-2.0.10}/website/themes/lektor-icon/images/mainpage-screenshots.png +0 -0
  851. {pyglet-2.0.8 → pyglet-2.0.10}/website/themes/lektor-icon/images/responsive-layout.png +0 -0
  852. {pyglet-2.0.8 → pyglet-2.0.10}/website/themes/lektor-icon/models/404.ini +0 -0
  853. {pyglet-2.0.8 → pyglet-2.0.10}/website/themes/lektor-icon/models/author.ini +0 -0
  854. {pyglet-2.0.8 → pyglet-2.0.10}/website/themes/lektor-icon/models/authors.ini +0 -0
  855. {pyglet-2.0.8 → pyglet-2.0.10}/website/themes/lektor-icon/models/blog-post.ini +0 -0
  856. {pyglet-2.0.8 → pyglet-2.0.10}/website/themes/lektor-icon/models/blog.ini +0 -0
  857. {pyglet-2.0.8 → pyglet-2.0.10}/website/themes/lektor-icon/models/page.ini +0 -0
  858. {pyglet-2.0.8 → pyglet-2.0.10}/website/themes/lektor-icon/models/single-layout.ini +0 -0
  859. {pyglet-2.0.8 → pyglet-2.0.10}/website/themes/lektor-icon/templates/404.html +0 -0
  860. {pyglet-2.0.8 → pyglet-2.0.10}/website/themes/lektor-icon/templates/author.html +0 -0
  861. {pyglet-2.0.8 → pyglet-2.0.10}/website/themes/lektor-icon/templates/authors.html +0 -0
  862. {pyglet-2.0.8 → pyglet-2.0.10}/website/themes/lektor-icon/templates/blocks/content.html +0 -0
  863. {pyglet-2.0.8 → pyglet-2.0.10}/website/themes/lektor-icon/templates/blocks/gallery.html +0 -0
  864. {pyglet-2.0.8 → pyglet-2.0.10}/website/themes/lektor-icon/templates/blocks/mission.html +0 -0
  865. {pyglet-2.0.8 → pyglet-2.0.10}/website/themes/lektor-icon/templates/blocks/services.html +0 -0
  866. {pyglet-2.0.8 → pyglet-2.0.10}/website/themes/lektor-icon/templates/blocks/team.html +0 -0
  867. {pyglet-2.0.8 → pyglet-2.0.10}/website/themes/lektor-icon/templates/blog-layout.html +0 -0
  868. {pyglet-2.0.8 → pyglet-2.0.10}/website/themes/lektor-icon/templates/blog-post.html +0 -0
  869. {pyglet-2.0.8 → pyglet-2.0.10}/website/themes/lektor-icon/templates/blog.html +0 -0
  870. {pyglet-2.0.8 → pyglet-2.0.10}/website/themes/lektor-icon/templates/layout.html +0 -0
  871. {pyglet-2.0.8 → pyglet-2.0.10}/website/themes/lektor-icon/templates/macros/blog.html +0 -0
  872. {pyglet-2.0.8 → pyglet-2.0.10}/website/themes/lektor-icon/templates/macros/pagination.html +0 -0
  873. {pyglet-2.0.8 → pyglet-2.0.10}/website/themes/lektor-icon/templates/none.html +0 -0
  874. {pyglet-2.0.8 → pyglet-2.0.10}/website/themes/lektor-icon/templates/page.html +0 -0
  875. {pyglet-2.0.8 → pyglet-2.0.10}/website/themes/lektor-icon/templates/single-layout.html +0 -0
  876. {pyglet-2.0.8 → pyglet-2.0.10}/website/themes/lektor-icon/theme.ini +0 -0
@@ -1,586 +1,774 @@
1
- """Requires: PyQT5
2
- An example using PyQT5 and Pyglet together.
3
- This is a sprite previewer, you can edit the fragment and vertex shaders and compile it to get a live view.
4
- Errors and success will be printed in console.
5
-
6
- To load images, choose File -> Open Image.
7
- Images loaded will be listed in the Images menu.
8
- By selecting an image in the menu list, it will be unloaded.
9
-
10
- Names in parentheses will be used for the sampler2D name.
11
-
12
- You can open a shader (both vert and frag) at the same time. Text is allowed, but will load into the fragment shader.
13
- Saving a shader saves both frag and vertex (IE: test becomes test.vert and test.frag)
14
-
15
- Scrolling mouswheel also zooms in
16
- """
17
-
18
- import os
19
- import sys
20
- import traceback
21
-
22
- from PyQt5.QtGui import QWheelEvent
23
-
24
- import pyglet
25
-
26
- from PyQt5.QtWidgets import QFileDialog
27
- from PyQt5 import QtCore, QtWidgets
28
- from PyQt5.QtWidgets import QOpenGLWidget
29
- from pyglet.gl import glClear, GL_COLOR_BUFFER_BIT, GL_DEPTH_BUFFER_BIT, glActiveTexture, GL_TEXTURE0, glBindTexture, \
30
- GL_BLEND, glEnable, glBlendFunc, glDisable
31
-
32
- default_vertex_src = """#version 150 core
33
- in vec3 translate;
34
- in vec4 colors;
35
- in vec3 tex_coords;
36
- in vec2 scale;
37
- in vec3 position;
38
- in float rotation;
39
-
40
- out vec4 vertex_colors;
41
- out vec3 texture_coords;
42
-
43
- uniform WindowBlock
44
- {
45
- mat4 projection;
46
- mat4 view;
47
- } window;
48
-
49
- mat4 m_scale = mat4(1.0);
50
- mat4 m_rotation = mat4(1.0);
51
- mat4 m_translate = mat4(1.0);
52
-
53
- void main()
54
- {
55
- m_scale[0][0] = scale.x;
56
- m_scale[1][1] = scale.y;
57
- m_translate[3][0] = translate.x;
58
- m_translate[3][1] = translate.y;
59
- m_translate[3][2] = translate.z;
60
- m_rotation[0][0] = cos(-radians(rotation));
61
- m_rotation[0][1] = sin(-radians(rotation));
62
- m_rotation[1][0] = -sin(-radians(rotation));
63
- m_rotation[1][1] = cos(-radians(rotation));
64
-
65
- gl_Position = window.projection * window.view * m_translate * m_rotation * m_scale * vec4(position, 1.0);
66
-
67
- vertex_colors = colors;
68
- texture_coords = tex_coords;
69
- }
70
- """
71
-
72
- default_frag_src = """#version 150 core
73
- in vec4 vertex_colors;
74
- in vec3 texture_coords;
75
- out vec4 final_colors;
76
-
77
- uniform sampler2D sprite_texture0;
78
- uniform sampler2D sprite_texture1;
79
- uniform float time;
80
-
81
- void main()
82
- {
83
- vec2 uv = texture_coords.xy;
84
- vec3 col = 0.5 + 0.5 * cos(time + uv.xyx + vec3(0, 2, 4));
85
-
86
- final_colors = texture(sprite_texture1, uv) * texture(sprite_texture0, uv) * vertex_colors * vec4(col, 1.0);
87
- }"""
88
-
89
-
90
- class MultiTextureSpriteGroup(pyglet.sprite.SpriteGroup):
91
- """A sprite group that uses multiple active textures.
92
- """
93
-
94
- def __init__(self, textures, blend_src, blend_dest, program=None, parent=None):
95
- """Create a sprite group for multiple textures and samplers.
96
- All textures must share the same target type.
97
-
98
- :Parameters:
99
- `textures` : `dict`
100
- Textures in samplername : texture.
101
- `blend_src` : int
102
- OpenGL blend source mode; for example,
103
- ``GL_SRC_ALPHA``.
104
- `blend_dest` : int
105
- OpenGL blend destination mode; for example,
106
- ``GL_ONE_MINUS_SRC_ALPHA``.
107
- `parent` : `~pyglet.graphics.Group`
108
- Optional parent group.
109
- """
110
- self.images = textures
111
- texture = list(self.images.values())[0]
112
- self.target = texture.target
113
- super().__init__(texture, blend_src, blend_dest, program, parent)
114
-
115
- self.program.use()
116
- for idx, name in enumerate(self.images):
117
- try:
118
- self.program[name] = idx
119
- except Exception:
120
- print(f"Uniform: {name} not found.")
121
-
122
- self.program.stop()
123
-
124
- def set_state(self):
125
- self.program.use()
126
-
127
- for i, texture in enumerate(self.images.values()):
128
- glActiveTexture(GL_TEXTURE0 + i)
129
- glBindTexture(self.target, texture.id)
130
-
131
- glEnable(GL_BLEND)
132
- glBlendFunc(self.blend_src, self.blend_dest)
133
-
134
- def unset_state(self):
135
- glDisable(GL_BLEND)
136
- self.program.stop()
137
- glActiveTexture(GL_TEXTURE0)
138
-
139
- def __repr__(self):
140
- return f'{self.__class__.__name__}({self.texture!r}-{int(self.texture.id)})'
141
-
142
- def __eq__(self, other):
143
- return (other.__class__ is self.__class__ and
144
- self.program is other.program and
145
- self.images == other.textures and
146
- self.blend_src == other.blend_src and
147
- self.blend_dest == other.blend_dest)
148
-
149
- def __hash__(self):
150
- return hash((id(self.parent),
151
- id(self.images),
152
- self.blend_src, self.blend_dest))
153
-
154
-
155
- class MultiTextureSprite(pyglet.sprite.AdvancedSprite):
156
-
157
- def __init__(self,
158
- imgs, x=0, y=0, z=0,
159
- blend_src=pyglet.gl.GL_SRC_ALPHA,
160
- blend_dest=pyglet.gl.GL_ONE_MINUS_SRC_ALPHA,
161
- batch=None,
162
- group=None,
163
- subpixel=False,
164
- program=None):
165
-
166
- self._x = x
167
- self._y = y
168
- self._z = z
169
-
170
- self._texture = list(imgs.values())[0]
171
-
172
- if isinstance(self._texture, pyglet.image.TextureArrayRegion):
173
- self._program = program or pyglet.sprite.get_default_array_shader()
174
- else:
175
- self._program = program or pyglet.sprite.get_default_shader()
176
-
177
- self._batch = batch or pyglet.graphics.get_default_batch()
178
-
179
- self._group = MultiTextureSpriteGroup(imgs, blend_src, blend_dest, self.program, group)
180
-
181
- self._subpixel = subpixel
182
- self._create_vertex_list()
183
-
184
-
185
- class Ui_MainWindow:
186
- SPRITE_POSITION = (0, 0)
187
-
188
- def __init__(self):
189
- self.images = []
190
-
191
- self.group = pyglet.graphics.Group()
192
-
193
- self.sprite = None
194
- self.program = None
195
-
196
- def setupUi(self, MainWindow):
197
- self._window = MainWindow
198
-
199
- MainWindow.setObjectName("MainWindow")
200
- MainWindow.resize(820, 855)
201
- self.centralwidget = QtWidgets.QWidget(MainWindow)
202
- self.centralwidget.setObjectName("centralwidget")
203
- self.gridLayout = QtWidgets.QGridLayout(self.centralwidget)
204
- self.gridLayout.setObjectName("gridLayout")
205
- self.verticalLayout_3 = QtWidgets.QVBoxLayout()
206
- self.verticalLayout_3.setObjectName("verticalLayout_3")
207
- self.horizontalLayout = QtWidgets.QHBoxLayout()
208
- self.horizontalLayout.setObjectName("horizontalLayout")
209
- self.verticalLayout = QtWidgets.QVBoxLayout()
210
- self.verticalLayout.setObjectName("verticalLayout")
211
- self.label = QtWidgets.QLabel(self.centralwidget)
212
- self.label.setAlignment(QtCore.Qt.AlignLeading | QtCore.Qt.AlignLeft | QtCore.Qt.AlignVCenter)
213
- self.label.setObjectName("label")
214
- self.verticalLayout.addWidget(self.label)
215
- self.vertex_source_edit = QtWidgets.QTextEdit(self.centralwidget)
216
- self.vertex_source_edit.setAcceptRichText(False)
217
- self.vertex_source_edit.setObjectName("vertex_source_edit")
218
- self.verticalLayout.addWidget(self.vertex_source_edit)
219
- self.horizontalLayout.addLayout(self.verticalLayout)
220
- self.verticalLayout_2 = QtWidgets.QVBoxLayout()
221
- self.verticalLayout_2.setObjectName("verticalLayout_2")
222
- self.label_2 = QtWidgets.QLabel(self.centralwidget)
223
- self.label_2.setObjectName("label_2")
224
- self.verticalLayout_2.addWidget(self.label_2)
225
- self.fragSourceEdit = QtWidgets.QTextEdit(self.centralwidget)
226
- self.fragSourceEdit.setAcceptRichText(False)
227
- self.fragSourceEdit.setObjectName("frag_source_edit")
228
- self.verticalLayout_2.addWidget(self.fragSourceEdit)
229
- self.horizontalLayout.addLayout(self.verticalLayout_2)
230
- self.verticalLayout_3.addLayout(self.horizontalLayout)
231
- self.compileShaderBtn = QtWidgets.QPushButton(self.centralwidget)
232
- self.compileShaderBtn.clicked.connect(self.compileClick)
233
- self.compileShaderBtn.setObjectName("compile_shader_btn")
234
- self.verticalLayout_3.addWidget(self.compileShaderBtn)
235
- self.openGLWidget = PygletWidget(800, 400, self.centralwidget, self)
236
- self.openGLWidget.setMinimumSize(QtCore.QSize(800, 400))
237
- self.openGLWidget.setObjectName("openGLWidget")
238
- self.verticalLayout_3.addWidget(self.openGLWidget)
239
- self.gridLayout.addLayout(self.verticalLayout_3, 0, 0, 1, 1)
240
- MainWindow.setCentralWidget(self.centralwidget)
241
- self.menubar = QtWidgets.QMenuBar(MainWindow)
242
- self.menubar.setGeometry(QtCore.QRect(0, 0, 820, 21))
243
- self.menubar.setObjectName("menubar")
244
- self.menuFile = QtWidgets.QMenu(self.menubar)
245
- self.menuFile.setObjectName("menuFile")
246
- MainWindow.setMenuBar(self.menubar)
247
- self.statusbar = QtWidgets.QStatusBar(MainWindow)
248
- self.statusbar.setObjectName("statusbar")
249
- MainWindow.setStatusBar(self.statusbar)
250
-
251
- self.actionOpen_Image = QtWidgets.QAction(MainWindow)
252
- self.actionOpen_Image.setObjectName("actionOpen_Image")
253
- self.actionOpen_Image.triggered.connect(self.loadImages)
254
- self.actionOpen_Image.setShortcut("Ctrl+I")
255
-
256
- self.actionOpen_Shader = QtWidgets.QAction(MainWindow)
257
- self.actionOpen_Shader.setObjectName("actionOpen_Shader")
258
- self.actionOpen_Shader.triggered.connect(self.loadShaders)
259
- self.actionOpen_Shader.setShortcut("Ctrl+O")
260
-
261
- self.actionSave_Shader = QtWidgets.QAction(MainWindow)
262
- self.actionSave_Shader.setObjectName("actionSave_Shader")
263
- self.actionSave_Shader.triggered.connect(self.saveShaders)
264
- self.actionSave_Shader.setStatusTip('Saves both Shader Files')
265
- self.actionSave_Shader.setShortcut("Ctrl+S")
266
-
267
- self.actionExit = QtWidgets.QAction(MainWindow)
268
- self.actionExit.triggered.connect(self.closeProgram)
269
- self.actionExit.setObjectName("actionExit")
270
- self.menuFile.addAction(self.actionOpen_Image)
271
- self.menuFile.addSeparator()
272
- self.menuFile.addAction(self.actionOpen_Shader)
273
- self.menuFile.addAction(self.actionSave_Shader)
274
- self.menuFile.addSeparator()
275
- self.menuFile.addAction(self.actionExit)
276
- self.menubar.addAction(self.menuFile.menuAction())
277
-
278
- self.imageMenu = QtWidgets.QMenu(self.menubar)
279
- self.imageMenu.setObjectName("imageMenu")
280
- self.noImageAction = QtWidgets.QAction(MainWindow)
281
- self.noImageAction.setDisabled(True)
282
- self.imageMenu.addAction(self.noImageAction)
283
-
284
- self.menubar.addAction(self.imageMenu.menuAction())
285
-
286
- self.retranslateUi(MainWindow)
287
- QtCore.QMetaObject.connectSlotsByName(MainWindow)
288
-
289
- def compileClick(self):
290
- if not self.images:
291
- print("No images have been loaded.")
292
- return
293
-
294
- self.openGLWidget.makeCurrent()
295
-
296
- if self.sprite:
297
- self.sprite.delete()
298
- self.sprite = None
299
-
300
- if self.program:
301
- del self.program
302
- self.program = None
303
-
304
- try:
305
- vertex_ = pyglet.graphics.shader.Shader(self.vertex_source_edit.toPlainText(), 'vertex')
306
- fragment_ = pyglet.graphics.shader.Shader(self.fragSourceEdit.toPlainText(), 'fragment')
307
-
308
- self.program = pyglet.graphics.shader.ShaderProgram(vertex_, fragment_)
309
-
310
- if len(self.images) == 1:
311
- self.sprite = pyglet.sprite.AdvancedSprite(self.images[0], x=self.SPRITE_POSITION[0],
312
- y=self.SPRITE_POSITION[1], group=self.group,
313
- batch=self.openGLWidget.batch, program=self.program)
314
- else:
315
- textures = {image.shader_name: image.get_texture() for image in self.images}
316
- self.sprite = MultiTextureSprite(textures, x=self.SPRITE_POSITION[0], y=self.SPRITE_POSITION[1],
317
- group=self.group, batch=self.openGLWidget.batch, program=self.program)
318
-
319
- if self.program:
320
- print("Successfully compiled shader.")
321
- except pyglet.gl.lib.GLException as err:
322
- print(f"Failed to compile shader: {err}")
323
- except Exception as err:
324
- print("Unexpected error", err)
325
-
326
- def loadImages(self):
327
- options = QFileDialog.Options()
328
- #options |= QFileDialog.DontUseNativeDialog
329
- fileNames, _ = QFileDialog.getOpenFileNames(self._window, "Select Image Files", "", "Image Files (*.png *.jpg *.jpeg *.bmp)",
330
- options=options)
331
- for fileName in fileNames:
332
- if not self.images:
333
- self.imageMenu.removeAction(self.noImageAction)
334
-
335
- action = QtWidgets.QAction(self._window)
336
- shader_name = f"sprite_texture{len(self.images)}"
337
- action.setText(f"{os.path.basename(fileName)} ({shader_name})")
338
- action.fileName = fileName
339
- action.setCheckable(True)
340
- action.setChecked(True)
341
- action.triggered.connect(lambda: self.removeImage(action))
342
- image = pyglet.image.load(fileName)
343
- image.shader_name = shader_name
344
- action.image = image
345
- self.images.append(image)
346
- self.imageMenu.addAction(action)
347
-
348
- def loadShaders(self):
349
- options = QFileDialog.Options()
350
-
351
- #options |= QFileDialog.DontUseNativeDialog
352
- fileNames, _ = QFileDialog.getOpenFileNames(self._window, "Load Shader Files", "", "Shader Files (*.vert *.frag *.txt)",
353
- options=options)
354
- for fileName in fileNames:
355
- ext = os.path.splitext(fileName)[1]
356
- if ext == '.vert':
357
- dest = self.vertex_source_edit
358
- elif ext in ('.txt', '.frag'):
359
- dest = self.fragSourceEdit
360
- else:
361
- dest = self.fragSourceEdit
362
-
363
- with open(fileName, 'r') as f:
364
- text = f.read()
365
- dest.setText(text)
366
-
367
- def saveShaders(self):
368
- options = QFileDialog.Options()
369
-
370
- # options |= QFileDialog.DontUseNativeDialog
371
- fileName, _ = QFileDialog.getSaveFileName(self._window, "Saving Both Shader Files (vert and frag)", "",
372
-
373
- options=options)
374
- if fileName:
375
- vert_filename = f"{fileName}.vert"
376
- frag_filename = f"{fileName}.frag"
377
-
378
- with open(vert_filename, 'w') as f:
379
- f.write(self.vertex_source_edit.toPlainText())
380
-
381
- with open(frag_filename, 'w') as f:
382
- f.write(self.fragSourceEdit.toPlainText())
383
-
384
- def removeImage(self, actionWidget):
385
- if self.imageMenu:
386
- self.imageMenu.removeAction(actionWidget)
387
-
388
- self.images.remove(actionWidget.image)
389
-
390
- # Re-order shader names
391
- for idx, image in enumerate(self.images):
392
- image.shader_name = f"sprite_texture{idx}"
393
-
394
- for action in self.imageMenu.actions():
395
- shader_name = action.image.shader_name
396
- action.setText(f"{os.path.basename(action.fileName)} ({shader_name})")
397
-
398
- if len(self.images) == 0:
399
- self.imageMenu.addAction(self.noImageAction)
400
-
401
- def closeProgram(self):
402
- app.exit()
403
-
404
- def retranslateUi(self, MainWindow):
405
- _translate = QtCore.QCoreApplication.translate
406
- MainWindow.setWindowTitle(_translate("MainWindow", "Sprite Shader Previewer"))
407
- self.label.setText(_translate("MainWindow", "Vertex Source:"))
408
- self.label_2.setText(_translate("MainWindow", "Fragment Source:"))
409
- self.compileShaderBtn.setText(_translate("MainWindow", "Compile Shaders"))
410
- self.menuFile.setTitle(_translate("MainWindow", "File"))
411
- self.actionOpen_Image.setText(_translate("MainWindow", "Open Images"))
412
- self.actionOpen_Shader.setText(_translate("MainWindow", "Open Shader"))
413
- self.actionSave_Shader.setText(_translate("MainWindow", "Save Shader"))
414
- self.actionExit.setText(_translate("MainWindow", "Exit"))
415
- self.imageMenu.setTitle(_translate("MainWindow", "Images"))
416
- self.noImageAction.setText(_translate("MainWindow", "No Images Loaded"))
417
-
418
- self.vertex_source_edit.setText(default_vertex_src)
419
- self.fragSourceEdit.setText(default_frag_src)
420
-
421
-
422
- class PygletWidget(QOpenGLWidget):
423
- _default_vertex_source = """#version 150 core
424
- in vec4 position;
425
-
426
- uniform WindowBlock
427
- {
428
- mat4 projection;
429
- mat4 view;
430
- } window;
431
-
432
- void main()
433
- {
434
- gl_Position = window.projection * window.view * position;
435
- }
436
- """
437
- _default_fragment_source = """#version 150 core
438
- out vec4 color;
439
-
440
- void main()
441
- {
442
- color = vec4(1.0, 0.0, 0.0, 1.0);
443
- }
444
- """
445
-
446
- def __init__(self, width, height, parent, mainWindow):
447
- super().__init__(parent)
448
- self.mainWindow = mainWindow
449
- self.setMinimumSize(width, height)
450
-
451
- self.timer = QtCore.QTimer()
452
- self.timer.timeout.connect(self._pyglet_update)
453
- self.timer.setInterval(0)
454
- self.timer.start()
455
-
456
- self.zoom = 1.0
457
-
458
- self.elapsed = 0
459
-
460
- pyglet.clock.schedule_interval(self.update_time_uniform, 1 / 60.0)
461
-
462
- def wheelEvent(self, event: QWheelEvent):
463
- super().wheelEvent(event)
464
- if event.angleDelta().y() > 0:
465
- self.zoom *= 2
466
- else:
467
- self.zoom /= 2
468
-
469
- self.zoom = pyglet.math.clamp(self.zoom, 0.125, 40.0)
470
-
471
- self.view = pyglet.math.Mat4().scale((self.zoom, self.zoom, 1.0))
472
- event.accept()
473
-
474
- def update_time_uniform(self, dt):
475
- self.elapsed += dt
476
-
477
- if self.mainWindow.program:
478
- self.mainWindow.program.use()
479
-
480
- # Ignore time if it doesn't exist.
481
- try:
482
- self.mainWindow.program['time'] = self.elapsed
483
- except Exception:
484
- pass
485
-
486
- self.mainWindow.program.stop()
487
-
488
- def _pyglet_update(self):
489
- # Tick the pyglet clock, so scheduled events can work.
490
- pyglet.clock.tick()
491
-
492
- # Force widget to update, otherwise paintGL will not be called.
493
- self.update() # self.updateGL() for pyqt5
494
-
495
- def paintGL(self):
496
- """Pyglet equivalent of on_draw event for window"""
497
- glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT)
498
-
499
- self.batch.draw()
500
-
501
- def resizeGL(self, width, height):
502
- self.projection = pyglet.math.Mat4.orthogonal_projection(0, width, 0, height, -255, 255)
503
-
504
- self.viewport = 0, 0, width, height
505
-
506
- def initializeGL(self):
507
- """Call anything that needs a context to be created."""
508
-
509
- self._projection_matrix = pyglet.math.Mat4()
510
- self._view_matrix = pyglet.math.Mat4()
511
-
512
- self.batch = pyglet.graphics.Batch()
513
-
514
- self._default_program = pyglet.graphics.shader.ShaderProgram(
515
- pyglet.graphics.shader.Shader(self._default_vertex_source, 'vertex'),
516
- pyglet.graphics.shader.Shader(self._default_fragment_source, 'fragment'))
517
-
518
- self.ubo = self._default_program.uniform_blocks['WindowBlock'].create_ubo()
519
-
520
- self.view = pyglet.math.Mat4()
521
- self.projection = pyglet.math.Mat4.orthogonal_projection(0, self.width(), 0, self.height(), -255, 255)
522
- self.viewport = 0, 0, self.width(), self.height()
523
-
524
- @property
525
- def viewport(self):
526
- """The Window viewport
527
-
528
- The Window viewport, expressed as (x, y, width, height).
529
-
530
- :rtype: (int, int, int, int)
531
- :return: The viewport size as a tuple of four ints.
532
- """
533
- return self._viewport
534
-
535
- @viewport.setter
536
- def viewport(self, values):
537
- self._viewport = values
538
- pr = 1.0
539
- x, y, w, h = values
540
- pyglet.gl.glViewport(int(x * pr), int(y * pr), int(w * pr), int(h * pr))
541
-
542
- @property
543
- def projection(self):
544
- return self._projection_matrix
545
-
546
- @projection.setter
547
- def projection(self, matrix: pyglet.math.Mat4):
548
- with self.ubo as window_block:
549
- window_block.projection[:] = matrix
550
-
551
- self._projection_matrix = matrix
552
-
553
- @property
554
- def view(self):
555
- """The OpenGL window view matrix. Read-write.
556
-
557
- The default view is an identity matrix, but a custom
558
- :py:class:`pyglet.math.Mat4` instance can be set.
559
- Alternatively, you can supply a flat tuple of 16 values.
560
-
561
- :type: :py:class:`pyglet.math.Mat4`
562
- """
563
- return self._view_matrix
564
-
565
- @view.setter
566
- def view(self, matrix: pyglet.math.Mat4):
567
-
568
- with self.ubo as window_block:
569
- window_block.view[:] = matrix
570
-
571
- self._view_matrix = matrix
572
-
573
-
574
- def excepthook(exc_type, exc_value, exc_tb):
575
- tb = "".join(traceback.format_exception(exc_type, exc_value, exc_tb))
576
- print(tb)
577
-
578
-
579
- if __name__ == "__main__":
580
- app = QtWidgets.QApplication(sys.argv)
581
- ui = Ui_MainWindow()
582
- sys.excepthook = excepthook
583
- window = QtWidgets.QMainWindow()
584
- ui.setupUi(window)
585
- window.show()
586
- sys.exit(app.exec_())
1
+ """An example sprite previewer using Qt and pyglet together.
2
+
3
+ It allows you to edit the fragment and vertex shaders, then compile them
4
+ to get a live view. Errors and success will be printed to the console.
5
+ A brief feature overview is located after the license notes below.
6
+
7
+
8
+ Important license notes:
9
+
10
+ 1. Libraries can use licenses which impose requirements beyond those of
11
+ pyglet's BSD-style style license.
12
+ 2. This example defaults to using PySide2 by default, but can also use
13
+ PyQt5 due to their nearly-identical APIs.
14
+ 3. PySide2 uses the LGPL license while PyQt5 uses a GPL / commercial
15
+ dual-license approach.
16
+
17
+ To the best knowledge of the contributors, this example and derivatives
18
+ are only obligated to meet the restrictions of the LGPL because it does
19
+ not use any PyQt5-specific features. Please see the following for more
20
+ information:
21
+
22
+ * The licenses and documentation for the libraries you plan to use
23
+ * https://www.pythonguis.com/faq/pyqt5-vs-pyside2/
24
+
25
+ If you need additional certainty, please consult a legal professional.
26
+
27
+
28
+ Example features:
29
+
30
+ You can choose the current Qt binding in two ways:
31
+
32
+ 1. Add PySide2 or PyQt5 as the first argument after the launch command
33
+ when running the script in the terminal
34
+ 2. Set the PYGLET_QT_BACKEND environment variable to either PySide2 or
35
+ PyQt5.
36
+
37
+ The priority order is:
38
+
39
+ 1. positional argument
40
+ 2. environment variable
41
+ 3. default to PySide2
42
+
43
+ To load images, choose File -> Open Image.
44
+
45
+ Images loaded will be listed in the Images menu. By selecting an image in
46
+ the menu list, it will be unloaded. Names in parentheses will be used for
47
+ the sampler2D name.
48
+
49
+ You can open a shader (both vert and frag) at the same time. Text is
50
+ allowed, but will load into the fragment shader. Saving a shader saves
51
+ both frag and vertex (IE: test becomes test.vert and test.frag)
52
+
53
+ Scrolling the mousewheel also zooms in.
54
+ """
55
+
56
+ import os
57
+ import sys
58
+ import traceback
59
+ import argparse
60
+ from pathlib import Path
61
+
62
+ from textwrap import dedent
63
+ from typing import TYPE_CHECKING, Final, Dict, List, Optional, Tuple, Mapping
64
+
65
+ # Constants for choosing a Qt backend and summarizing their licensing
66
+ ENV_VARIABLE: Final[str] = 'PYGLET_QT_BACKEND'
67
+
68
+ PYSIDE2: Final[str] = 'PySide2'
69
+ PYQT5: Final[str] = 'PyQt5'
70
+
71
+ valid_backends: Final[Dict[str, str]] = {
72
+ PYSIDE2: "LGPL; may allow releasing under non-GPL licenses",
73
+ PYQT5: "Dual GPL / Commercial license; requires GPL or a fee"
74
+ }
75
+
76
+ # Default to PySide2 as part of allowing non-GPL licenses
77
+ # This is necessary but not sufficient to allow this.
78
+ DEFAULT: Final[str] = PYSIDE2
79
+
80
+
81
+ # Argument parser for run-time config as __main__
82
+ parser = argparse.ArgumentParser(
83
+ description=dedent('''\
84
+ A sprite & shader previewer using Qt and pyglet together.
85
+
86
+ It defaults to PySide2, but can run on PyQt5. The details of how may
87
+ be helpful to users who want to avoid spreading PyQt5's GPL license
88
+ while using it as a fallback. See the docstrings and comments in the
89
+ source to learn more.
90
+ '''),
91
+ formatter_class=argparse.RawTextHelpFormatter)
92
+
93
+ # On Python 3.9+, argparse.BooleanOptionalAction is more concise
94
+ # See https://docs.python.org/3.9/library/argparse.html#action
95
+ parser.add_argument(
96
+ '--use-qt-file-dialog', dest='native_file_dialog', action='store_false',
97
+ help="Use Qt's file chooser instead of the system's. Helpful on Gnome DE."
98
+ )
99
+ parser.set_defaults(native_file_dialog=True)
100
+
101
+
102
+ # Generate options help text lines
103
+ backend_column_width: Final[int] = max(map(len, valid_backends))
104
+ help_lines: List[str] = ["Which Qt binding to use.\n"]
105
+
106
+ for backend, description in valid_backends.items():
107
+ line_parts = [
108
+ f"{backend: <{backend_column_width}} - ",
109
+ '(Default) ' if backend == DEFAULT else '',
110
+ description
111
+ ]
112
+ help_lines.append(''.join(line_parts))
113
+
114
+ # Add an optional single-value positional argument
115
+ parser.add_argument('backend', nargs='?',
116
+ choices=valid_backends.keys(),
117
+ help='\n'.join(help_lines))
118
+
119
+
120
+ # Use the 1st non-None Qt binding value: argument, env var, or default
121
+ arguments = None
122
+ if __name__ == "__main__":
123
+ arguments = parser.parse_args()
124
+
125
+ reasons_with_backend_values: Final[Dict[str, Optional[str]]] = {
126
+ 'first positional argument' : None if not arguments else arguments.backend,
127
+ # An environment variable allows specifying the binding when
128
+ # importing the module instead of running it as a main program.
129
+ f'{ENV_VARIABLE!r} env variable' : os.environ.get(ENV_VARIABLE, None),
130
+ 'default' : DEFAULT
131
+ }
132
+ reason, backend = next(filter(
133
+ lambda t: t[1] is not None, reasons_with_backend_values.items()))
134
+
135
+ print(f"Selected {backend} as the Qt binding from the {reason}'s value.")
136
+
137
+
138
+ # Perform UI imports according to the detected configuration
139
+ import pyglet
140
+
141
+ # Use PySide2 for type checking, static analysis, tests, and linting
142
+ # to help avoid infection by PyQt5's GPL license since tools will mark
143
+ # uses of PyQt5-specific features as missing. For example, pyright is
144
+ # one of the strict type checking and linting tools which can help.
145
+ if TYPE_CHECKING or backend == PYSIDE2:
146
+ from PySide2.QtGui import QWheelEvent
147
+ from PySide2.QtWidgets import QFileDialog
148
+ from PySide2 import QtCore, QtWidgets
149
+ from PySide2.QtWidgets import QOpenGLWidget
150
+
151
+ elif backend == PYQT5:
152
+ from PyQt5.QtGui import QWheelEvent
153
+ from PyQt5.QtWidgets import QFileDialog
154
+ from PyQt5 import QtCore, QtWidgets
155
+ from PyQt5.QtWidgets import QOpenGLWidget
156
+
157
+ else: # Handle import edge cases
158
+ raise ValueError(
159
+ f"Expected a value in {valid_backends},"
160
+ f" but got {backend!r} via {reason}")
161
+
162
+ # Import the other constants after the UI libraries to avoid
163
+ # cluttering the symbol table when debugging import problems.
164
+ from pyglet.gl import (
165
+ glClear, GL_COLOR_BUFFER_BIT, GL_DEPTH_BUFFER_BIT, glActiveTexture,
166
+ GL_TEXTURE0, glBindTexture, GL_BLEND, glEnable, glBlendFunc, glDisable
167
+ )
168
+
169
+
170
+ default_vertex_src = """#version 150 core
171
+ in vec3 translate;
172
+ in vec4 colors;
173
+ in vec3 tex_coords;
174
+ in vec2 scale;
175
+ in vec3 position;
176
+ in float rotation;
177
+
178
+ out vec4 vertex_colors;
179
+ out vec3 texture_coords;
180
+
181
+ uniform WindowBlock
182
+ {
183
+ mat4 projection;
184
+ mat4 view;
185
+ } window;
186
+
187
+ mat4 m_scale = mat4(1.0);
188
+ mat4 m_rotation = mat4(1.0);
189
+ mat4 m_translate = mat4(1.0);
190
+
191
+ void main()
192
+ {
193
+ m_scale[0][0] = scale.x;
194
+ m_scale[1][1] = scale.y;
195
+ m_translate[3][0] = translate.x;
196
+ m_translate[3][1] = translate.y;
197
+ m_translate[3][2] = translate.z;
198
+ m_rotation[0][0] = cos(-radians(rotation));
199
+ m_rotation[0][1] = sin(-radians(rotation));
200
+ m_rotation[1][0] = -sin(-radians(rotation));
201
+ m_rotation[1][1] = cos(-radians(rotation));
202
+
203
+ gl_Position = window.projection * window.view * m_translate * m_rotation * m_scale * vec4(position, 1.0);
204
+
205
+ vertex_colors = colors;
206
+ texture_coords = tex_coords;
207
+ }
208
+ """
209
+
210
+ default_frag_src = """#version 150 core
211
+ in vec4 vertex_colors;
212
+ in vec3 texture_coords;
213
+ out vec4 final_colors;
214
+
215
+ uniform sampler2D sprite_texture0;
216
+ uniform sampler2D sprite_texture1;
217
+ uniform float time;
218
+
219
+ void main()
220
+ {
221
+ vec2 uv = texture_coords.xy;
222
+ vec3 col = 0.5 + 0.5 * cos(time + uv.xyx + vec3(0, 2, 4));
223
+
224
+ final_colors = texture(sprite_texture1, uv) * texture(sprite_texture0, uv) * vertex_colors * vec4(col, 1.0);
225
+ }"""
226
+
227
+
228
+ class MultiTextureSpriteGroup(pyglet.sprite.SpriteGroup):
229
+ """A sprite group which uses multiple textures and samplers."""
230
+
231
+ def __init__(
232
+ self,
233
+ textures: Mapping[str, pyglet.image.Texture],
234
+ blend_src: int,
235
+ blend_dest: int,
236
+ program: Optional[pyglet.graphics.shader.ShaderProgram] = None,
237
+ parent: Optional[pyglet.graphics.Group] = None
238
+ ) -> None:
239
+ """Create a sprite group for multiple textures and samplers.
240
+
241
+ All textures must share the same target type.
242
+
243
+ :Parameters:
244
+ `textures` :
245
+ A mapping of sampler names to texture data.
246
+ `blend_src` :
247
+ OpenGL blend source mode; for example,
248
+ ``GL_SRC_ALPHA``.
249
+ `blend_dest` :
250
+ OpenGL blend destination mode; for example,
251
+ ``GL_ONE_MINUS_SRC_ALPHA``.
252
+ `parent` :
253
+ Optional parent group.
254
+ """
255
+ self.images = textures
256
+ texture = list(self.images.values())[0]
257
+ self.target = texture.target
258
+ super().__init__(texture, blend_src, blend_dest, program, parent)
259
+
260
+ self.program.use()
261
+ for idx, name in enumerate(self.images):
262
+ try:
263
+ self.program[name] = idx
264
+ except pyglet.graphics.shader.ShaderException as e:
265
+ print(e)
266
+
267
+ self.program.stop()
268
+
269
+ def set_state(self) -> None:
270
+ self.program.use()
271
+
272
+ for i, texture in enumerate(self.images.values()):
273
+ glActiveTexture(GL_TEXTURE0 + i)
274
+ glBindTexture(self.target, texture.id)
275
+
276
+ glEnable(GL_BLEND)
277
+ glBlendFunc(self.blend_src, self.blend_dest)
278
+
279
+ def unset_state(self) -> None:
280
+ glDisable(GL_BLEND)
281
+ self.program.stop()
282
+ glActiveTexture(GL_TEXTURE0)
283
+
284
+ def __repr__(self) -> str:
285
+ return f'{self.__class__.__name__}({self.texture!r}-{int(self.texture.id)})'
286
+
287
+ def __eq__(self, other) -> bool:
288
+ return (other.__class__ is self.__class__ and
289
+ self.program is other.program and
290
+ self.images == other.textures and
291
+ self.blend_src == other.blend_src and
292
+ self.blend_dest == other.blend_dest)
293
+
294
+ def __hash__(self) -> int:
295
+ return hash((id(self.parent),
296
+ id(self.images),
297
+ self.blend_src, self.blend_dest))
298
+
299
+
300
+ class MultiTextureSprite(pyglet.sprite.AdvancedSprite):
301
+
302
+ def __init__(
303
+ self,
304
+ imgs: Mapping[str, pyglet.image.Texture],
305
+ x: float = 0, y: float = 0, z: float = 0,
306
+ blend_src: int = pyglet.gl.GL_SRC_ALPHA,
307
+ blend_dest: int = pyglet.gl.GL_ONE_MINUS_SRC_ALPHA,
308
+ batch: Optional[pyglet.graphics.Batch] = None,
309
+ group: Optional[MultiTextureSpriteGroup] = None,
310
+ subpixel: bool = False,
311
+ program: pyglet.graphics.shader.ShaderProgram = None
312
+ ) -> None:
313
+
314
+ self._x = x
315
+ self._y = y
316
+ self._z = z
317
+
318
+ self._texture = list(imgs.values())[0]
319
+
320
+ if isinstance(self._texture, pyglet.image.TextureArrayRegion):
321
+ self._program = program or pyglet.sprite.get_default_array_shader()
322
+ else:
323
+ self._program = program or pyglet.sprite.get_default_shader()
324
+
325
+ self._batch = batch or pyglet.graphics.get_default_batch()
326
+
327
+ self._group = MultiTextureSpriteGroup(imgs, blend_src, blend_dest, self.program, group)
328
+
329
+ self._subpixel = subpixel
330
+ self._create_vertex_list()
331
+
332
+
333
+ class Ui_MainWindow:
334
+ SPRITE_POSITION = (0, 0)
335
+
336
+ def __init__(self, use_native_file_dialog: bool = True):
337
+ self.use_native_file_dialog: bool = use_native_file_dialog
338
+
339
+ self.images = []
340
+
341
+ self.group = pyglet.graphics.Group()
342
+
343
+ self.sprite = None
344
+ self.program = None
345
+
346
+ def get_file_dialog_options(self) -> QFileDialog.Options:
347
+ """Convert instance attributes to a file dialog options object.
348
+
349
+ At the moment, it supports choosing which dialog to use. This is
350
+ helpful on certain Gnome and tiling Linux desktop configurations
351
+ which can have issues with the system file picker.
352
+
353
+ You may want to expand on this in your own application with
354
+ additional options.
355
+ """
356
+ options = QFileDialog.Options()
357
+ if not self.use_native_file_dialog:
358
+ options |= QFileDialog.DontUseNativeDialog
359
+
360
+ return options
361
+
362
+ def setupUi(self, MainWindow: QtWidgets.QMainWindow) -> None:
363
+ self._window = MainWindow
364
+
365
+ # Set up the central window widget object
366
+ MainWindow.setObjectName("MainWindow")
367
+ MainWindow.resize(820, 855)
368
+ self.centralwidget = QtWidgets.QWidget(MainWindow)
369
+ self.centralwidget.setObjectName("centralwidget")
370
+
371
+ # Create layout for shader editing
372
+ self.gridLayout = QtWidgets.QGridLayout(self.centralwidget)
373
+ self.gridLayout.setObjectName("gridLayout")
374
+ self.verticalLayout_3 = QtWidgets.QVBoxLayout()
375
+ self.verticalLayout_3.setObjectName("verticalLayout_3")
376
+ self.horizontalLayout = QtWidgets.QHBoxLayout()
377
+ self.horizontalLayout.setObjectName("horizontalLayout")
378
+ self.verticalLayout = QtWidgets.QVBoxLayout()
379
+ self.verticalLayout.setObjectName("verticalLayout")
380
+ self.label = QtWidgets.QLabel(self.centralwidget)
381
+ self.label.setAlignment(QtCore.Qt.AlignLeading | QtCore.Qt.AlignLeft | QtCore.Qt.AlignVCenter)
382
+ self.label.setObjectName("label")
383
+ self.verticalLayout.addWidget(self.label)
384
+ self.vertex_source_edit = QtWidgets.QTextEdit(self.centralwidget)
385
+ self.vertex_source_edit.setAcceptRichText(False)
386
+ self.vertex_source_edit.setObjectName("vertex_source_edit")
387
+ self.verticalLayout.addWidget(self.vertex_source_edit)
388
+ self.horizontalLayout.addLayout(self.verticalLayout)
389
+ self.verticalLayout_2 = QtWidgets.QVBoxLayout()
390
+ self.verticalLayout_2.setObjectName("verticalLayout_2")
391
+ self.label_2 = QtWidgets.QLabel(self.centralwidget)
392
+ self.label_2.setObjectName("label_2")
393
+ self.verticalLayout_2.addWidget(self.label_2)
394
+ self.fragSourceEdit = QtWidgets.QTextEdit(self.centralwidget)
395
+ self.fragSourceEdit.setAcceptRichText(False)
396
+ self.fragSourceEdit.setObjectName("frag_source_edit")
397
+ self.verticalLayout_2.addWidget(self.fragSourceEdit)
398
+ self.horizontalLayout.addLayout(self.verticalLayout_2)
399
+ self.verticalLayout_3.addLayout(self.horizontalLayout)
400
+ self.compileShaderBtn = QtWidgets.QPushButton(self.centralwidget)
401
+ self.compileShaderBtn.clicked.connect(self.compileClick)
402
+ self.compileShaderBtn.setObjectName("compile_shader_btn")
403
+ self.verticalLayout_3.addWidget(self.compileShaderBtn)
404
+
405
+ # Initialize the pyglet widget we'll draw to and lay out the window
406
+ self.openGLWidget = PygletWidget(800, 400, self.centralwidget, self)
407
+ self.openGLWidget.setMinimumSize(QtCore.QSize(800, 400))
408
+ self.openGLWidget.setObjectName("openGLWidget")
409
+ self.verticalLayout_3.addWidget(self.openGLWidget)
410
+ self.gridLayout.addLayout(self.verticalLayout_3, 0, 0, 1, 1)
411
+
412
+ MainWindow.setCentralWidget(self.centralwidget)
413
+
414
+ # Set up the root top menu & status bar
415
+ self.menubar = QtWidgets.QMenuBar(MainWindow)
416
+ self.menubar.setGeometry(QtCore.QRect(0, 0, 820, 21))
417
+ self.menubar.setObjectName("menubar")
418
+ self.menuFile = QtWidgets.QMenu(self.menubar)
419
+ self.menuFile.setObjectName("menuFile")
420
+ MainWindow.setMenuBar(self.menubar)
421
+ self.statusbar = QtWidgets.QStatusBar(MainWindow)
422
+ self.statusbar.setObjectName("statusbar")
423
+ MainWindow.setStatusBar(self.statusbar)
424
+
425
+ # Add menu bar menus, entries, and hotkeys
426
+ self.actionOpen_Image = QtWidgets.QAction(MainWindow)
427
+ self.actionOpen_Image.setObjectName("actionOpen_Image")
428
+ self.actionOpen_Image.triggered.connect(self.loadImages)
429
+ self.actionOpen_Image.setShortcut("Ctrl+I")
430
+
431
+ self.actionOpen_Shader = QtWidgets.QAction(MainWindow)
432
+ self.actionOpen_Shader.setObjectName("actionOpen_Shader")
433
+ self.actionOpen_Shader.triggered.connect(self.loadShaders)
434
+ self.actionOpen_Shader.setShortcut("Ctrl+O")
435
+
436
+ self.actionSave_Shader = QtWidgets.QAction(MainWindow)
437
+ self.actionSave_Shader.setObjectName("actionSave_Shader")
438
+ self.actionSave_Shader.triggered.connect(self.saveShaders)
439
+ self.actionSave_Shader.setStatusTip('Saves both Shader Files')
440
+ self.actionSave_Shader.setShortcut("Ctrl+S")
441
+
442
+ self.actionExit = QtWidgets.QAction(MainWindow)
443
+ self.actionExit.triggered.connect(self.closeProgram)
444
+ self.actionExit.setObjectName("actionExit")
445
+ self.menuFile.addAction(self.actionOpen_Image)
446
+ self.menuFile.addSeparator()
447
+ self.menuFile.addAction(self.actionOpen_Shader)
448
+ self.menuFile.addAction(self.actionSave_Shader)
449
+ self.menuFile.addSeparator()
450
+ self.menuFile.addAction(self.actionExit)
451
+ self.menubar.addAction(self.menuFile.menuAction())
452
+
453
+ self.imageMenu = QtWidgets.QMenu(self.menubar)
454
+ self.imageMenu.setObjectName("imageMenu")
455
+ self.noImageAction = QtWidgets.QAction(MainWindow)
456
+ self.noImageAction.setDisabled(True)
457
+ self.imageMenu.addAction(self.noImageAction)
458
+
459
+ self.menubar.addAction(self.imageMenu.menuAction())
460
+
461
+ # Perform localization & start accepting UI events
462
+ self.retranslateUi(MainWindow)
463
+ QtCore.QMetaObject.connectSlotsByName(MainWindow)
464
+
465
+ def compileClick(self) -> None:
466
+ if not self.images:
467
+ print("No images have been loaded.")
468
+ return
469
+
470
+ self.openGLWidget.makeCurrent()
471
+
472
+ if self.sprite:
473
+ self.sprite.delete()
474
+ self.sprite = None
475
+
476
+ if self.program:
477
+ del self.program
478
+ self.program = None
479
+
480
+ try:
481
+ vertex_ = pyglet.graphics.shader.Shader(self.vertex_source_edit.toPlainText(), 'vertex')
482
+ fragment_ = pyglet.graphics.shader.Shader(self.fragSourceEdit.toPlainText(), 'fragment')
483
+
484
+ self.program = pyglet.graphics.shader.ShaderProgram(vertex_, fragment_)
485
+
486
+ if len(self.images) == 1:
487
+ self.sprite = pyglet.sprite.AdvancedSprite(
488
+ self.images[0],
489
+ x=self.SPRITE_POSITION[0], y=self.SPRITE_POSITION[1],
490
+ group=self.group, batch=self.openGLWidget.batch,
491
+ program=self.program)
492
+ else:
493
+ textures = {image.shader_name: image.get_texture() for image in self.images}
494
+ self.sprite = MultiTextureSprite(
495
+ textures,
496
+ x=self.SPRITE_POSITION[0], y=self.SPRITE_POSITION[1],
497
+ group=self.group, batch=self.openGLWidget.batch,
498
+ program=self.program)
499
+
500
+ if self.program:
501
+ print("Successfully compiled shader.")
502
+ except pyglet.gl.lib.GLException as err:
503
+ print(f"Failed to compile shader: {err}")
504
+ except Exception as err:
505
+ print("Unexpected error", err)
506
+ def loadImages(self) -> None:
507
+ options = self.get_file_dialog_options()
508
+ fileNames, _ = QFileDialog.getOpenFileNames(
509
+ self._window, "Select Image Files", "", "Image Files (*.png *.jpg *.jpeg *.bmp)",
510
+ options=options)
511
+
512
+ for fileName in fileNames:
513
+ if not self.images:
514
+ self.imageMenu.removeAction(self.noImageAction)
515
+
516
+ action = QtWidgets.QAction(self._window)
517
+ shader_name = f"sprite_texture{len(self.images)}"
518
+ action.setText(f"{os.path.basename(fileName)} ({shader_name})")
519
+ action.fileName = fileName
520
+ action.setCheckable(True)
521
+ action.setChecked(True)
522
+ action.triggered.connect(lambda: self.removeImage(action))
523
+ image = pyglet.image.load(fileName)
524
+ image.shader_name = shader_name
525
+ action.image = image
526
+ self.images.append(image)
527
+ self.imageMenu.addAction(action)
528
+
529
+ def loadShaders(self) -> None:
530
+ options = self.get_file_dialog_options()
531
+ file_names, _ = QFileDialog.getOpenFileNames(
532
+ self._window, "Load Shader Files", "", "Shader Files (*.vert *.frag *.txt)",
533
+ options=options)
534
+
535
+ for file_name in file_names:
536
+ file_path = Path(file_name)
537
+ ext = file_path.suffixes[-1]
538
+
539
+ if ext == '.vert':
540
+ dest = self.vertex_source_edit
541
+ elif ext in ('.txt', '.frag'):
542
+ dest = self.fragSourceEdit
543
+ else:
544
+ dest = self.fragSourceEdit
545
+
546
+ text = file_path.read_text()
547
+ dest.setText(text)
548
+
549
+ def saveShaders(self) -> None:
550
+ options = self.get_file_dialog_options()
551
+ file_name, _ = QFileDialog.getSaveFileName(
552
+ self._window, "Saving Both Shader Files (vert and frag)", "",
553
+ options=options)
554
+
555
+ if file_name:
556
+ base_path = Path(file_name)
557
+ vert_filename = base_path.with_suffix(".vert")
558
+ frag_filename = base_path.with_suffix(".frag")
559
+
560
+ vert_filename.write_text(self.vertex_source_edit.toPlainText())
561
+ frag_filename.write_text(self.fragSourceEdit.toPlainText())
562
+
563
+ def removeImage(self, actionWidget: QtWidgets.QAction) -> None:
564
+ if self.imageMenu:
565
+ self.imageMenu.removeAction(actionWidget)
566
+
567
+ self.images.remove(actionWidget.image)
568
+
569
+ # Re-order shader names
570
+ for idx, image in enumerate(self.images):
571
+ image.shader_name = f"sprite_texture{idx}"
572
+
573
+ for action in self.imageMenu.actions():
574
+ shader_name = action.image.shader_name
575
+ action.setText(f"{os.path.basename(action.fileName)} ({shader_name})")
576
+
577
+ if len(self.images) == 0:
578
+ self.imageMenu.addAction(self.noImageAction)
579
+
580
+ def closeProgram(self) -> None:
581
+ app.exit()
582
+
583
+ def retranslateUi(self, MainWindow: QtWidgets.QMainWindow) -> None:
584
+ _translate = QtCore.QCoreApplication.translate
585
+ MainWindow.setWindowTitle(_translate("MainWindow", "Sprite Shader Previewer"))
586
+ self.label.setText(_translate("MainWindow", "Vertex Source:"))
587
+ self.label_2.setText(_translate("MainWindow", "Fragment Source:"))
588
+ self.compileShaderBtn.setText(_translate("MainWindow", "Compile Shaders"))
589
+ self.menuFile.setTitle(_translate("MainWindow", "File"))
590
+ self.actionOpen_Image.setText(_translate("MainWindow", "Open Images"))
591
+ self.actionOpen_Shader.setText(_translate("MainWindow", "Open Shader"))
592
+ self.actionSave_Shader.setText(_translate("MainWindow", "Save Shader"))
593
+ self.actionExit.setText(_translate("MainWindow", "Exit"))
594
+ self.imageMenu.setTitle(_translate("MainWindow", "Images"))
595
+ self.noImageAction.setText(_translate("MainWindow", "No Images Loaded"))
596
+
597
+ self.vertex_source_edit.setText(default_vertex_src)
598
+ self.fragSourceEdit.setText(default_frag_src)
599
+
600
+
601
+ class PygletWidget(QOpenGLWidget):
602
+ _default_vertex_source = """#version 150 core
603
+ in vec4 position;
604
+
605
+ uniform WindowBlock
606
+ {
607
+ mat4 projection;
608
+ mat4 view;
609
+ } window;
610
+
611
+ void main()
612
+ {
613
+ gl_Position = window.projection * window.view * position;
614
+ }
615
+ """
616
+ _default_fragment_source = """#version 150 core
617
+ out vec4 color;
618
+
619
+ void main()
620
+ {
621
+ color = vec4(1.0, 0.0, 0.0, 1.0);
622
+ }
623
+ """
624
+
625
+ def __init__(self, width, height, parent, mainWindow) -> None:
626
+ super().__init__(parent)
627
+ self.mainWindow = mainWindow
628
+ self.setMinimumSize(width, height)
629
+
630
+ self.timer = QtCore.QTimer()
631
+ self.timer.timeout.connect(self._pyglet_update)
632
+ self.timer.setInterval(0)
633
+ self.timer.start()
634
+
635
+ self.zoom = 1.0
636
+
637
+ self.elapsed = 0
638
+
639
+ pyglet.clock.schedule_interval(self.update_time_uniform, 1 / 60.0)
640
+
641
+ def wheelEvent(self, event: QWheelEvent) -> None:
642
+ super().wheelEvent(event)
643
+ if event.angleDelta().y() > 0:
644
+ self.zoom *= 2
645
+ else:
646
+ self.zoom /= 2
647
+
648
+ self.zoom = pyglet.math.clamp(self.zoom, 0.125, 40.0)
649
+ self.view = pyglet.math.Mat4().scale(pyglet.math.Vec3(
650
+ self.zoom, self.zoom, 1.0))
651
+
652
+ event.accept()
653
+
654
+ def update_time_uniform(self, dt: float) -> None:
655
+ self.elapsed += dt
656
+
657
+ if self.mainWindow.program:
658
+ self.mainWindow.program.use()
659
+
660
+ # Ignore time if it doesn't exist.
661
+ try:
662
+ self.mainWindow.program['time'] = self.elapsed
663
+ except Exception:
664
+ pass
665
+
666
+ self.mainWindow.program.stop()
667
+
668
+ def _pyglet_update(self) -> None:
669
+ # Tick the pyglet clock, so scheduled events can work.
670
+ pyglet.clock.tick()
671
+
672
+ # Force widget to update, otherwise paintGL will not be called.
673
+ self.update() # self.updateGL() for pyqt5
674
+
675
+ def paintGL(self) -> None:
676
+ """Pyglet equivalent of on_draw event for window"""
677
+ glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT)
678
+
679
+ self.batch.draw()
680
+
681
+ def resizeGL(self, width: int, height: int) -> None:
682
+ self.projection = pyglet.math.Mat4.orthogonal_projection(0, width, 0, height, -255, 255)
683
+
684
+ self.viewport = 0, 0, width, height
685
+
686
+ def initializeGL(self) -> None:
687
+ """Call anything that needs a context to be created."""
688
+
689
+ self._projection_matrix = pyglet.math.Mat4()
690
+ self._view_matrix = pyglet.math.Mat4()
691
+
692
+ self.batch = pyglet.graphics.Batch()
693
+
694
+ self._default_program = pyglet.graphics.shader.ShaderProgram(
695
+ pyglet.graphics.shader.Shader(self._default_vertex_source, 'vertex'),
696
+ pyglet.graphics.shader.Shader(self._default_fragment_source, 'fragment'))
697
+
698
+ self.ubo = self._default_program.uniform_blocks['WindowBlock'].create_ubo()
699
+
700
+ self.view = pyglet.math.Mat4()
701
+ self.projection = pyglet.math.Mat4.orthogonal_projection(0, self.width(), 0, self.height(), -255, 255)
702
+ self.viewport = 0, 0, self.width(), self.height()
703
+
704
+ @property
705
+ def viewport(self) -> Tuple[int, int, int, int]:
706
+ """The Window viewport
707
+
708
+ The Window viewport, expressed as (x, y, width, height).
709
+
710
+ :return: The viewport size as a tuple of four ints.
711
+ """
712
+ return self._viewport
713
+
714
+ @viewport.setter
715
+ def viewport(self, values: Tuple[int, int, int, int]) -> None:
716
+ self._viewport = values
717
+ pr = 1.0
718
+ x, y, w, h = values
719
+ pyglet.gl.glViewport(int(x * pr), int(y * pr), int(w * pr), int(h * pr))
720
+
721
+ @property
722
+ def projection(self) -> pyglet.math.Mat4:
723
+ return self._projection_matrix
724
+
725
+ @projection.setter
726
+ def projection(self, matrix: pyglet.math.Mat4) -> None:
727
+ with self.ubo as window_block:
728
+ window_block.projection[:] = matrix
729
+
730
+ self._projection_matrix = matrix
731
+
732
+ @property
733
+ def view(self) -> pyglet.math.Mat4:
734
+ """The OpenGL window view matrix. Read-write.
735
+
736
+ The default view is an identity matrix, but a custom
737
+ :py:class:`pyglet.math.Mat4` instance can be set.
738
+ Alternatively, you can supply a flat tuple of 16 values.
739
+ """
740
+ return self._view_matrix
741
+
742
+ @view.setter
743
+ def view(self, matrix: pyglet.math.Mat4) -> None:
744
+
745
+ with self.ubo as window_block:
746
+ window_block.view[:] = matrix
747
+
748
+ self._view_matrix = matrix
749
+
750
+
751
+ def excepthook(exc_type, exc_value, exc_tb) -> None:
752
+ """Replacement for Python's default exception handler function.
753
+
754
+ See the following for more information:
755
+ https://docs.python.org/3/library/sys.html#sys.excepthook
756
+ """
757
+ tb = "".join(traceback.format_exception(exc_type, exc_value, exc_tb))
758
+ print(tb)
759
+
760
+
761
+ if __name__ == "__main__":
762
+ # Create the base Qt application and initialize the UI
763
+ app = QtWidgets.QApplication(sys.argv)
764
+ ui = Ui_MainWindow(use_native_file_dialog=arguments.native_file_dialog)
765
+ qt_window = QtWidgets.QMainWindow()
766
+ ui.setupUi(qt_window)
767
+ qt_window.show()
768
+
769
+ # Replace the default exception handling *after* everything is
770
+ # initialized to avoid swallowing fatal errors such as GL issues.
771
+ sys.excepthook = excepthook
772
+
773
+ # Start the application and return its exit code
774
+ sys.exit(app.exec_())