shaderflow 0.4.0.dev2__py2.py3-none-any.whl → 0.5.0.dev0__py2.py3-none-any.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -107,8 +107,8 @@ class BrokenAudio:
107
107
  def get_data_between_seconds(self, start: Seconds, end: Seconds) -> numpy.ndarray:
108
108
  return self.get_data_between_samples(start*self.samplerate, end*self.samplerate)
109
109
 
110
- def get_last_n_samples(self, n: Samples) -> numpy.ndarray:
111
- return self.data[:, -int(n):]
110
+ def get_last_n_samples(self, n: Samples, *, offset: Samples=0) -> numpy.ndarray:
111
+ return self.data[:, (-1)*(int(n+offset) + 1) : (-1)*(int(offset) + 1)]
112
112
 
113
113
  def get_last_n_seconds(self, n: Seconds) -> numpy.ndarray:
114
114
  return self.get_last_n_samples(n*self.samplerate)
@@ -77,17 +77,12 @@
77
77
  Camera CameraRay2D(Camera camera) {
78
78
 
79
79
  // Calculate the interstion with the plane define by a point and norm
80
+ // Note: (t < 0) the intersection is behind the camera
80
81
  // https://en.wikipedia.org/wiki/Line%E2%80%93plane_intersection
81
82
  float num = dot(camera.plane_point - camera.origin, camera.plane_normal);
82
83
  float den = dot(camera.ray, camera.plane_normal);
83
84
  float t = num/den;
84
85
 
85
- // The ray intersects the plane behind the camera
86
- if (t < 0) {
87
- camera.out_of_bounds = true;
88
- return camera;
89
- }
90
-
91
86
  // Calculate the intersection point
92
87
  camera.gluv = (camera.origin + (t*camera.ray)).xy;
93
88
  camera.stuv = gluv2stuv(camera.gluv);
@@ -95,6 +90,7 @@
95
90
  camera.astuv = gluv2stuv(camera.agluv);
96
91
  camera.stxy = (iResolution * camera.astuv);
97
92
  camera.glxy = (camera.stxy - iResolution/2.0);
93
+ camera.out_of_bounds = (t < 0) || (abs(gluv.x) > iWantAspect);
98
94
  return camera;
99
95
  }
100
96
 
ShaderFlow/Scene.py CHANGED
@@ -25,6 +25,7 @@ import imgui
25
25
  import moderngl
26
26
  import PIL
27
27
  import tqdm
28
+ import turbopipe
28
29
  from attr import Factory, define, field
29
30
  from dotmap import DotMap
30
31
  from moderngl_window.context.base import BaseWindow as ModernglWindow
@@ -109,7 +110,7 @@ class ShaderScene(ShaderModule):
109
110
 
110
111
  def __post__(self):
111
112
  self.typer.description = (self.typer.description or self.__class__.__doc__)
112
- self.typer._panel = "🔥 Scene Commands"
113
+ self.typer._panel = "🔥 Scene commands"
113
114
  self.typer.command(self.main, context=True)
114
115
  self.build()
115
116
 
@@ -118,13 +119,8 @@ class ShaderScene(ShaderModule):
118
119
  the `main` method. Must not start with `sys.executable`, so send `sys.argv[1:]` or direct"""
119
120
  self.typer(flatten(args))
120
121
 
121
- __built__: OnceTracker = Factory(OnceTracker)
122
-
122
+ @OnceTracker.decorator
123
123
  def build(self):
124
- if self.__built__():
125
- return
126
-
127
- # Init Imgui
128
124
  imgui.create_context()
129
125
  self.imguio = imgui.get_io()
130
126
  self.imguio.font_global_scale = 1
@@ -302,7 +298,7 @@ class ShaderScene(ShaderModule):
302
298
 
303
299
  # # Video modes and monitor
304
300
 
305
- monitor: int = os.environ.get("MONITOR", 0)
301
+ monitor: int = os.getenv("MONITOR", 0)
306
302
 
307
303
  @property
308
304
  def glfw_monitor(self) -> Optional[glfw._GLFWmonitor]:
@@ -487,7 +483,7 @@ class ShaderScene(ShaderModule):
487
483
  # ---------------------------------------------------------------------------------------------|
488
484
  # Window, OpenGL, Backend
489
485
 
490
- backend: WindowBackend = WindowBackend.get(os.environ.get("WINDOW_BACKEND", WindowBackend.GLFW))
486
+ backend: WindowBackend = WindowBackend.get(os.getenv("WINDOW_BACKEND", WindowBackend.GLFW))
491
487
  """The ModernGL Window Backend. **Cannot be changed after creation**. Can also be set with the
492
488
  environment variable `WINDOW_BACKEND=<backend>`, where `backend = {glfw, headless}`"""
493
489
 
@@ -510,8 +506,9 @@ class ShaderScene(ShaderModule):
510
506
  raise RuntimeError("Window backend cannot be changed after creation")
511
507
 
512
508
  # Use EGL for creating a OpenGL context, allows true headless with GPU acceleration
513
- # https://forums.developer.nvidia.com/t/81412 - Comments 2 and 6
514
- backend = "egl" if (os.environ.get("WINDOW_EGL", "1") == "1") else None
509
+ # Comments 2 and 6: (https://forums.developer.nvidia.com/t/81412)
510
+ # Note: For the cloud, see (https://brokensrc.dev/get/docker/)
511
+ backend = "egl" if (os.getenv("WINDOW_EGL", "1") == "1") else None
515
512
 
516
513
  # Dynamically import the ModernGL Window Backend and instantiate it. Vsync is on our side 😉
517
514
  module = f"moderngl_window.context.{denum(self.backend).lower()}"
@@ -549,7 +546,7 @@ class ShaderScene(ShaderModule):
549
546
  ShaderKeyboard.Keys.LEFT_CTRL = glfw.KEY_LEFT_CONTROL
550
547
  ShaderKeyboard.Keys.LEFT_ALT = glfw.KEY_LEFT_ALT
551
548
 
552
- log.debug(f"{self.who} Finished Window creation")
549
+ log.info(f"OpenGL Renderer: {self.opengl.info['GL_RENDERER']}")
553
550
 
554
551
  def read_screen(self) -> bytes:
555
552
  """Take a screenshot of the screen and return raw bytes. Length `width*height*components`"""
@@ -706,10 +703,10 @@ class ShaderScene(ShaderModule):
706
703
  self.headless = (self.rendering)
707
704
  self.fps = (fps or self.monitor_framerate)
708
705
  self.title = f"ShaderFlow | {self.__name__}"
709
- self.fullscreen = fullscreen
710
706
  self.quality = quality or self.quality
711
707
  self.repeat = repeat or self.repeat
712
708
  self.ssaa = ssaa or self.ssaa
709
+ self.fullscreen = fullscreen
713
710
  self.time = 0
714
711
  self.tempo.set(tempo or self.tempo.value)
715
712
 
@@ -729,11 +726,9 @@ class ShaderScene(ShaderModule):
729
726
 
730
727
  # Configure FFmpeg and Popen it
731
728
  if (self.rendering):
732
-
733
- # Get video output path - if not absolute, save to data directory
734
729
  export = Path(output or f"({export_started}) {self.__name__}")
735
730
  export = export if export.is_absolute() else (self.export_base/export)
736
- export = export.with_suffix(export.suffix or f".{self.export_format}")
731
+ export = export.with_suffix("." + (self.export_format or export.suffix).replace(".", ""))
737
732
  export = self.export_name(export)
738
733
 
739
734
  self.ffmpeg = (BrokenFFmpeg(time=self.runtime).quiet()
@@ -753,7 +748,7 @@ class ShaderScene(ShaderModule):
753
748
 
754
749
  if self.exporting:
755
750
  buffer = self.opengl.buffer(reserve=self._final.texture.size_t)
756
- self.ffmpeg = self.ffmpeg.popen(stdin=PIPE, wrapper=True)
751
+ self.ffmpeg = self.ffmpeg.popen(stdin=PIPE)
757
752
 
758
753
  # Status tracker
759
754
  status = DotMap(
@@ -798,17 +793,8 @@ class ShaderScene(ShaderModule):
798
793
 
799
794
  # Write a new frame to FFmpeg
800
795
  if self.exporting:
801
- if (_STANDARD_METHOD := False):
802
- frame = self._final.texture.fbo().read()
803
- self.ffmpeg.stdin.write(frame)
804
- elif (_BUFFER_PROXY := True):
805
- self._final.texture.fbo().read_into(buffer)
806
- self.ffmpeg.stdin.write(buffer.read())
807
- elif (_MGL_FORK_METHOD := False):
808
- self._final.texture.fbo().read_into(buffer)
809
- buffer.read_into(self.ffmpeg.stdin)
810
- else:
811
- raise RuntimeError("No read method selected")
796
+ self._final.texture.fbo().read_into(buffer)
797
+ turbopipe.pipe(buffer, self.ffmpeg.stdin.fileno())
812
798
 
813
799
  # Finish exporting condition
814
800
  if (status.bar.n < self.total_frames):
@@ -816,7 +802,8 @@ class ShaderScene(ShaderModule):
816
802
  status.bar.close()
817
803
 
818
804
  if self.exporting:
819
- log.info("Waiting for FFmpeg process to finish (Queue writes, codecs lookahead, etc)")
805
+ log.info("Waiting for FFmpeg process to finish (Queued writes, codecs lookahead, buffers, etc)")
806
+ turbopipe.close()
820
807
  self.ffmpeg.stdin.close()
821
808
  outputs.append(export)
822
809
 
@@ -897,6 +884,7 @@ class ShaderScene(ShaderModule):
897
884
  yield ShaderVariable("uniform", "float", "iDuration", self.duration)
898
885
  yield ShaderVariable("uniform", "float", "iDeltaTime", self.dt)
899
886
  yield ShaderVariable("uniform", "vec2", "iResolution", self.resolution)
887
+ yield ShaderVariable("uniform", "float", "iWantAspect", self.aspect_ratio)
900
888
  yield ShaderVariable("uniform", "float", "iQuality", self.quality/100)
901
889
  yield ShaderVariable("uniform", "float", "iSSAA", self.ssaa)
902
890
  yield ShaderVariable("uniform", "float", "iFrameRate", self.fps)
@@ -919,7 +907,6 @@ class ShaderScene(ShaderModule):
919
907
  self.imgui.resize(width, height)
920
908
  self._width, self._height = width, height
921
909
  self.relay(ShaderMessage.Shader.RecreateTextures)
922
- self.relay(ShaderMessage.Shader.Render)
923
910
 
924
911
  def __window_close__(self) -> None:
925
912
  self.relay(ShaderMessage.Window.Close())
ShaderFlow/Shader.py CHANGED
@@ -327,7 +327,7 @@ class ShaderObject(ShaderModule):
327
327
  self.compile()
328
328
  self.render()
329
329
 
330
- SKIP_GPU: bool = (os.environ.get("SKIP_GPU", "0") == "1")
330
+ SKIP_GPU: bool = (os.getenv("SKIP_GPU", "0") == "1")
331
331
  """Do not render shaders, useful for benchmarking raw Python performance"""
332
332
 
333
333
  def render_fbo(self, fbo: moderngl.Framebuffer, clear: bool=True) -> None:
ShaderFlow/Texture.py CHANGED
@@ -343,10 +343,11 @@ class ShaderTexture(ShaderModule):
343
343
  list.append(fill())
344
344
  return list
345
345
 
346
- def _populate(self) -> Self:
346
+ def _populate(self) -> Iterable[Tuple[int, int, TextureBox]]:
347
347
  self._pop_fill(self.matrix, deque, self.temporal)
348
348
  for row in self.matrix:
349
349
  self._pop_fill(row, TextureBox, self.layers)
350
+ return self.boxes
350
351
 
351
352
  @property
352
353
  def boxes(self) -> Iterable[Tuple[int, int, TextureBox]]:
@@ -358,12 +359,13 @@ class ShaderTexture(ShaderModule):
358
359
  yield from self.matrix[n]
359
360
 
360
361
  def make(self) -> Self:
361
- if (max(self.size) > 2**15):
362
- raise Exception(f"Texture size likely too large {self.size}")
362
+ if (max(self.size) > (limit := self.scene.opengl.info['GL_MAX_VIEWPORT_DIMS'][0])):
363
+ raise Exception(f"Texture size too large for this OpenGL context: {self.size} > {limit}")
363
364
 
364
- self._populate()
365
+ # Recreate texture boxes to match new length
365
366
  for (_, _, box) in self.boxes:
366
367
  box.release()
368
+ for (_, _, box) in self._populate():
367
369
  box.texture = self.scene.opengl.texture(
368
370
  components=self.components,
369
371
  dtype=self.dtype.name,
@@ -457,15 +459,15 @@ class ShaderTexture(ShaderModule):
457
459
  # ------------------------------------------|
458
460
 
459
461
  @property
460
- def nbytes(self) -> int:
462
+ def bytes_per_pixel(self) -> int:
461
463
  return self.dtype.value().nbytes * self.components
462
464
 
463
465
  def sample_xy(self, x: float, y: float, temporal: int=0, layer: int=-1) -> numpy.ndarray:
464
466
  """Get the Pixel at a XY coordinate: Origin at Top Right (0, 0); Bottom Left (width, height)"""
465
467
  box = self.box(temporal=temporal, layer=layer)
466
468
  data = (box.data or box.texture.read())
467
- start = int((y*self.width + x) * self.nbytes)
468
- return numpy.frombuffer(data, dtype=self.dtype.value)[start:start + self.nbytes]
469
+ start = int((y*self.width + x) * self.bytes_per_pixel)
470
+ return numpy.frombuffer(data, dtype=self.dtype.value)[start:start + self.bytes_per_pixel]
469
471
 
470
472
  def sample_stxy(self, x: float, y: float, temporal: int=0, layer: int=-1) -> numpy.ndarray:
471
473
  """Get the Pixel at a XY coordinate: Origin at Bottom left (0, 0); Top right (width, height)"""
ShaderFlow/__main__.py CHANGED
@@ -2,7 +2,7 @@ from Broken import BrokenApp
2
2
  from ShaderFlow import SHADERFLOW
3
3
 
4
4
  SHADERFLOW_ABOUT = """
5
- 🌵 Imagine ShaderToy, on a Manim-like architecture. That's ShaderFlow.\n
5
+ 🔥 Imagine ShaderToy, on a Manim-like architecture. That's ShaderFlow.\n
6
6
  • Tip: run "shaderflow (scene) --help" for More Options ✨
7
7
  • Warn: Make sure you trust the file you are running
8
8
 
@@ -1,19 +1,26 @@
1
1
  Metadata-Version: 2.3
2
2
  Name: shaderflow
3
- Version: 0.4.0.dev2
4
- Summary: Imagine ShaderToy, on a Manim-like architecture. That's ShaderFlow.
5
- Project-URL: issues, https://github.com/BrokenSource/ShaderFlow/issues
6
- Project-URL: repository, https://github.com/BrokenSource/ShaderFlow
7
- Project-URL: documentation, https://brokensrc.dev/shaderflow
8
- Project-URL: homepage, https://brokensrc.dev
3
+ Version: 0.5.0.dev0
4
+ Summary: 🔥 Imagine ShaderToy, on a Manim-like architecture. That's ShaderFlow.
5
+ Project-URL: Changelog, https://brokensrc.dev/news/category/releases
6
+ Project-URL: GitHub, https://github.com/BrokenSource/ShaderFlow
7
+ Project-URL: Funding, https://brokensrc.dev/about/sponsors
8
+ Project-URL: Contact, https://brokensrc.dev/about/contact
9
+ Project-URL: Credits, https://brokensrc.dev/about/credits
10
+ Project-URL: License, https://brokensrc.dev/about/license
11
+ Project-URL: Download, https://brokensrc.dev/get/releases
12
+ Project-URL: Docs, https://brokensrc.dev/shaderflow
13
+ Project-URL: Homepage, https://brokensrc.dev
9
14
  Author-email: Tremeschin <29046864+Tremeschin@users.noreply.github.com>
10
15
  License-Expression: AGPL-3.0
11
- Requires-Dist: broken-source[shaderflow]==0.4.0.dev2
16
+ Requires-Dist: broken-source[shaderflow]==0.5.0.dev0
12
17
  Description-Content-Type: text/markdown
13
18
 
14
- <sup>⚠️ **Warning**: This repository [**shouldn't be cloned alone**](https://brokensrc.dev/get/source), per [**monorepo**](https://github.com/BrokenSource/BrokenSource) structure</sup>
19
+ > [!IMPORTANT]
20
+ > <sub>This repository is part of a [**monorepo**](https://github.com/BrokenSource/BrokenSource) and [**shouldn't be cloned alone**](https://brokensrc.dev/get/source)</sub>
21
+
15
22
  <div align="center">
16
- <a href="https://brokensrc.dev/shaderflow"><img src="https://raw.githubusercontent.com/BrokenSource/ShaderFlow/Master/ShaderFlow/Resources/Images/ShaderFlow.png" width="200"></a>
23
+ <a href="https://brokensrc.dev/shaderflow"><img src="https://raw.githubusercontent.com/BrokenSource/ShaderFlow/main/ShaderFlow/Resources/Images/ShaderFlow.png" width="200"></a>
17
24
  <h1>ShaderFlow</h1>
18
25
  <br>
19
26
  Imagine <a href="https://www.shadertoy.com"><b>ShaderToy</b></a>, on a <a href="https://github.com/3b1b/manim"><b>Manim</b></a>-like Architecture. That's <a href="https://brokensrc.dev/shaderflow/"><b>ShaderFlow</b></a>
@@ -27,22 +34,21 @@ Description-Content-Type: text/markdown
27
34
 
28
35
  A **Framework** for Creating, Exporting **Real Time** and **Audio Reactive** Shaders
29
36
 
30
- - **🛡️ Open Source**, Trust and Transparency, Cross Platform, Configurable
31
- - **🧸 80% ShaderToy** Compatible, Easily transfer your Knowledge
32
- - **📔 Video Codecs**: Easily export to H264, HEVC, AV1, (+NVENC)
33
- - **🚀 Physics-like** Animations with Control Systems Dynamics
34
- - **🔱 High Quality**, Any Resolution, Framerate, Bitrate, SSAA
35
- - **🎵 Audio Reactive**, Live Music, Professional Video
36
- - **🌊 Audio Waveforms** and Oscilloscope Support
37
- - **🎥 Video as Texture**: Real Time 4k Processing
38
- - **♻️ Live Reload** Shaders, Instant Feedback
39
- - **🎨 No Watermarks**, User First Experience
40
- - **⏳ Perfect Frametimes**, No Jitter, No Lag
41
- - **🌵 Fastest** Rendering times in the West
37
+ - **🛡️ Open Source**, trust and transparency, cross platform, configurable
38
+ - **🧸 80% ShaderToy** compatible, easily transfer your knowledge
39
+ - **📔 Video Codecs**: easily export to H264, HEVC, AV1, (+NVENC)
40
+ - **🚀 Physics-like** animations with control systems dynamics
41
+ - **🔱 High Quality**, any resolution, framerate, bitrate, SSAA
42
+ - **🎵 Audio Reactive**, live music, professional video
43
+ - **🌊 Audio Waveforms** and oscilloscope support
44
+ - **🎥 Video as Texture**: real time 4k processing
45
+ - **♻️ Live Reload** shaders, instant feedback
46
+ - **🎨 No Watermarks**, user first experience
47
+ - **⏳ Perfect Frametimes**, no jitter, no lag
48
+ - **🌵 Fastest** rendering times in the west
42
49
  - **👁 Built-in Camera** 2D, 3D, 360°, VR
43
50
  - **🎹 Piano Roll** scene, the smoothest
44
51
 
45
- <br>
46
52
  <br>
47
53
 
48
54
  # 📸 Showcase
@@ -1,15 +1,15 @@
1
1
  ShaderFlow/Message.py,sha256=AC1aJmEQ1fitlatsCFRabVBUbDU4kXlcXkNXCU5g7uc,2574
2
2
  ShaderFlow/Module.py,sha256=P14eJuSr5I4cCmczFS1k6HDE6nVKVw_RJO9ZNFrT7Qk,6200
3
- ShaderFlow/Scene.py,sha256=BDGgoQ1N-szPfWMinRPBJjO5PxXDuHit2CZNZxZdVxc,47515
4
- ShaderFlow/Shader.py,sha256=oUU9l2EiXJ6SGnrfCPyi7vcirGwM7GHPtCP9sS7E4YA,13873
5
- ShaderFlow/Texture.py,sha256=VBWNWNExwfzgb8rKlhDQvXZmnbykVgO-Ai9esQOnjS8,15921
3
+ ShaderFlow/Scene.py,sha256=ZgvWRX0fQ7rJ09WcRiSDf_QvVyYeYpZEMmewnKwSDIc,47019
4
+ ShaderFlow/Shader.py,sha256=_4Fnwlzy_fZwznEYVvvfP0atvuAjA_gDP9_HAc9uWj8,13868
5
+ ShaderFlow/Texture.py,sha256=1W8y-sle6dIupwM7Z91AZHdXqMELfoYrHEKaO9LoFaI,16163
6
6
  ShaderFlow/Variable.py,sha256=7faHZYBxw2vyIVk9vpDu2SOfxniUiAdSZ1tGKED8In8,4167
7
7
  ShaderFlow/__init__.py,sha256=jd0CrCN355xoJqNuojUwNEvtPG5-En5Udk_lvAp_i18,304
8
- ShaderFlow/__main__.py,sha256=ipDlt-66J2HG5ZNxOKKJHnmbCaIOeacf7xBl6vh4dLU,586
8
+ ShaderFlow/__main__.py,sha256=FC9TxumaTjq0A3mUJt2BmQUQWpsMg0JaLyFHNcTiecY,586
9
9
  ShaderFlow/Common/Imgui.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
10
10
  ShaderFlow/Common/Notes.py,sha256=wFm9qJbQDfnp_HwJo_-ntk9O4WeADCF6b36MTl7tNqQ,3855
11
11
  ShaderFlow/Common/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
12
- ShaderFlow/Modules/Audio.py,sha256=Q8W7o0F2k2_Vt6HeEHNwco1BSWNX_UUb8LBxiRPa2hw,14777
12
+ ShaderFlow/Modules/Audio.py,sha256=p9nDL7ErAFLCDnBFAOSt2T0dEA4OgAS2DnIVMyCs7sg,14840
13
13
  ShaderFlow/Modules/Bouncing.py,sha256=-2Zmq2xaGWuPtp8QaoYRWoLcrlkbnzqMLDTRenthuw0,3144
14
14
  ShaderFlow/Modules/Camera.py,sha256=zipKr9ZLIFv9edSxJSaJVqPY2ot5n1GekInihtxRK_4,17918
15
15
  ShaderFlow/Modules/Depth.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
@@ -41,11 +41,11 @@ ShaderFlow/Resources/Shaders/Fragment/Default.glsl,sha256=syBoZdAkdvRF2_3GkEb3iw
41
41
  ShaderFlow/Resources/Shaders/Fragment/Final.glsl,sha256=J37od3zzSmO6XbRZ-1ZUiyU8rcaA-6gdCMPp4C9Fk48,155
42
42
  ShaderFlow/Resources/Shaders/Fragment/Loading.frag,sha256=gIGMnh611vEJsOpB-DmjBI9EW6_4clkghbZVqB1czDA,895
43
43
  ShaderFlow/Resources/Shaders/Fragment/Missing.glsl,sha256=NEiuErlE1z0CE2r6WGS_rn6k7Wd4q9qnCoq7E1wBGfs,574
44
- ShaderFlow/Resources/Shaders/Include/Camera.glsl,sha256=ZR_DjaEErVc7lRfkKISzjeUM1p4GX7ghA776jnUYas0,5396
44
+ ShaderFlow/Resources/Shaders/Include/Camera.glsl,sha256=8ne-rE9Gp4wwDlqAyjNpujyyNJxHts3Gy_FmCSPhLLE,5372
45
45
  ShaderFlow/Resources/Shaders/Include/Complex.glsl,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
46
46
  ShaderFlow/Resources/Shaders/Include/ShaderFlow.glsl,sha256=b5gb_cnF49lPJHBVFz2orJdaIO-eRInjgTViO45gKgU,13268
47
47
  ShaderFlow/Resources/Shaders/Vertex/Default.glsl,sha256=mptLPRKopeWq7ybJL5kV4xT_yL3hMeUAxe2LsJYX4gA,538
48
- shaderflow-0.4.0.dev2.dist-info/METADATA,sha256=fCFa9XJu6E5jiFDdsytBz6QV4IE59nPyIdC7dgmIc5E,4046
49
- shaderflow-0.4.0.dev2.dist-info/WHEEL,sha256=fl6v0VwpzfGBVsGtkAkhILUlJxROXbA3HvRL6Fe3140,105
50
- shaderflow-0.4.0.dev2.dist-info/entry_points.txt,sha256=Jft0cKd9FhDHp9byhoIlpXjxb_DFSa2W6vVAtl1-Kr4,56
51
- shaderflow-0.4.0.dev2.dist-info/RECORD,,
48
+ shaderflow-0.5.0.dev0.dist-info/METADATA,sha256=eP3fXV8iR463U3QQY4ojQ0HVj4OkujdlXQDp2KWitb0,4320
49
+ shaderflow-0.5.0.dev0.dist-info/WHEEL,sha256=fl6v0VwpzfGBVsGtkAkhILUlJxROXbA3HvRL6Fe3140,105
50
+ shaderflow-0.5.0.dev0.dist-info/entry_points.txt,sha256=Jft0cKd9FhDHp9byhoIlpXjxb_DFSa2W6vVAtl1-Kr4,56
51
+ shaderflow-0.5.0.dev0.dist-info/RECORD,,