yta-editor-nodes-gpu 0.0.1__py3-none-any.whl → 0.0.2__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.
@@ -0,0 +1,680 @@
1
+ """
2
+ TODO: This module doesn't use 't' but 'progress'
3
+ so it is not a child of 'processor.video', maybe
4
+ we should move it to be 'processor.transitions'
5
+ instead of 'processor.video.transitions'... (?)
6
+ """
7
+ from yta_video_opengl.abstract import _OpenGLBase
8
+ from yta_validation.parameter import ParameterValidator
9
+ from typing import Union
10
+
11
+ import numpy as np
12
+ import moderngl
13
+
14
+
15
+ class _TransitionProcessorGPU(_OpenGLBase):
16
+ """
17
+ *Abstract class*
18
+
19
+ *For internal use only*
20
+
21
+ A transition between the frames of 2 videos.
22
+
23
+ This transition is made with GPU (OpenGL).
24
+ """
25
+
26
+ @property
27
+ def fragment_shader(
28
+ self
29
+ ) -> str:
30
+ """
31
+ The code of the fragment shader.
32
+ """
33
+ return (
34
+ '''
35
+ #version 330
36
+ uniform sampler2D first_texture;
37
+ uniform sampler2D second_texture;
38
+ uniform float progress; // 0.0 → full A, 1.0 → full B
39
+ in vec2 v_uv;
40
+ out vec4 output_color;
41
+
42
+ void main() {
43
+ // Horizontal version (right to left)
44
+ vec2 uv_first = v_uv + vec2(-progress, 0.0);
45
+ vec2 uv_second = v_uv + vec2(1.0 - progress, 0.0);
46
+
47
+ vec4 color_first = texture(first_texture, uv_first);
48
+ vec4 color_second = texture(second_texture, uv_second);
49
+
50
+ if (uv_first.x < 0.0) {
51
+ output_color = color_second;
52
+ } else if (uv_second.x > 1.0) {
53
+ output_color = color_first;
54
+ } else {
55
+ // A and B frames are shown at the same time
56
+ output_color = mix(color_first, color_second, progress);
57
+ }
58
+ }
59
+ '''
60
+ )
61
+
62
+ def __init__(
63
+ self,
64
+ opengl_context: Union[moderngl.Context, None],
65
+ output_size: tuple[int, int],
66
+ **kwargs
67
+ ):
68
+ super().__init__(
69
+ opengl_context = opengl_context,
70
+ output_size = output_size,
71
+ **kwargs
72
+ )
73
+
74
+ def _prepare_input_textures(
75
+ self
76
+ ) -> '_OpenGLBase':
77
+ """
78
+ *For internal use only*
79
+
80
+ *This method should be overwritten*
81
+
82
+ Set the input texture variables and handlers
83
+ we need to manage this. This method has to be
84
+ called only once, just to set the slot for
85
+ the different textures we will use (and are
86
+ registered as textures in the shader).
87
+ """
88
+ self.textures.add('first_texture', 0)
89
+ self.textures.add('second_texture', 1)
90
+
91
+ return self
92
+
93
+ def process(
94
+ self,
95
+ first_input: Union[moderngl.Texture, np.ndarray],
96
+ second_input: Union[moderngl.Texture, np.ndarray],
97
+ progress: float,
98
+ output_size: Union[tuple[int, int], None] = None,
99
+ **kwargs
100
+ ) -> moderngl.Texture:
101
+ """
102
+ Validate the parameters, set the textures map, process
103
+ it and return the result according to the `progress`
104
+ provided.
105
+
106
+ You can provide any additional parameter
107
+ in the **kwargs, but be careful because
108
+ this could overwrite other uniforms that
109
+ were previously set.
110
+
111
+ We use and return textures to maintain
112
+ the process in GPU and optimize it.
113
+ """
114
+ ParameterValidator.validate_mandatory_instance_of('first_input', first_input, [moderngl.Texture, np.ndarray])
115
+ ParameterValidator.validate_mandatory_instance_of('second_input', second_input, [moderngl.Texture, np.ndarray])
116
+ ParameterValidator.validate_mandatory_positive_float('progress', progress, do_include_zero = True)
117
+
118
+ textures_map = {
119
+ 'first_texture': first_input,
120
+ 'second_texture': second_input
121
+ }
122
+
123
+ return self._process_common(
124
+ textures_map = textures_map,
125
+ output_size = output_size,
126
+ progress = progress,
127
+ **kwargs
128
+ )
129
+
130
+ # Specific implementations here below:
131
+ class SlideTransitionProcessorGPU(_TransitionProcessorGPU):
132
+ """
133
+ A transition between the frames of 2 videos, sliding
134
+ from right to left.
135
+
136
+ This transition is made with GPU (OpenGL).
137
+ """
138
+
139
+ # TODO: I know it is the same as in the base class
140
+ # but I want it like that
141
+ @property
142
+ def fragment_shader(
143
+ self
144
+ ) -> str:
145
+ """
146
+ The code of the fragment shader.
147
+ """
148
+ return (
149
+ '''
150
+ #version 330
151
+ uniform sampler2D first_texture;
152
+ uniform sampler2D second_texture;
153
+ uniform float progress; // 0.0 → full A, 1.0 → full B
154
+ in vec2 v_uv;
155
+ out vec4 output_color;
156
+
157
+ void main() {
158
+ // Horizontal version (right to left)
159
+ vec2 uv_first = v_uv + vec2(-progress, 0.0);
160
+ vec2 uv_second = v_uv + vec2(1.0 - progress, 0.0);
161
+
162
+ vec4 color_first = texture(first_texture, uv_first);
163
+ vec4 color_second = texture(second_texture, uv_second);
164
+
165
+ if (uv_first.x < 0.0) {
166
+ output_color = color_second;
167
+ } else if (uv_second.x > 1.0) {
168
+ output_color = color_first;
169
+ } else {
170
+ // A and B frames are shown at the same time
171
+ output_color = mix(color_first, color_second, progress);
172
+ }
173
+ }
174
+ '''
175
+ )
176
+
177
+ class CrossfadeTransitionProcessorGPU(_TransitionProcessorGPU):
178
+ """
179
+ A transition between the frames of 2 videos,
180
+ transforming the first one into the second one.
181
+
182
+ This transition is made with GPU (OpenGL).
183
+ """
184
+
185
+ @property
186
+ def fragment_shader(
187
+ self
188
+ ) -> str:
189
+ return (
190
+ """
191
+ #version 330
192
+ uniform sampler2D first_texture;
193
+ uniform sampler2D second_texture;
194
+ uniform float progress; // 0 = full A, 1 = full B
195
+ in vec2 v_uv;
196
+ out vec4 output_color;
197
+ void main() {
198
+ vec4 color_first = texture(first_texture, v_uv);
199
+ vec4 color_second = texture(second_texture, v_uv);
200
+ output_color = mix(color_first, color_second, progress);
201
+ }
202
+ """
203
+ )
204
+
205
+ class DistortedCrossfadeTransitionProcessorGPU(_TransitionProcessorGPU):
206
+ """
207
+ A transition between the frames of 2 videos,
208
+ transforming the first one into the second one
209
+ with a distortion in between.
210
+
211
+ This transition is made with GPU (OpenGL).
212
+ """
213
+
214
+ @property
215
+ def fragment_shader(
216
+ self
217
+ ) -> str:
218
+ return (
219
+ """
220
+ #version 330
221
+ uniform sampler2D first_texture;
222
+ uniform sampler2D second_texture;
223
+ uniform float progress; // 0.0 -> A, 1.0 -> B
224
+ uniform float intensity; // Distortion control
225
+ in vec2 v_uv;
226
+ out vec4 output_color;
227
+
228
+ const int passes = 6;
229
+
230
+ void main() {
231
+ vec4 c1 = vec4(0.0);
232
+ vec4 c2 = vec4(0.0);
233
+
234
+ float disp = intensity * (0.5 - distance(0.5, progress));
235
+ for (int xi=0; xi<passes; xi++) {
236
+ float x = float(xi) / float(passes) - 0.5;
237
+ for (int yi=0; yi<passes; yi++) {
238
+ float y = float(yi) / float(passes) - 0.5;
239
+ vec2 v = vec2(x, y);
240
+ float d = disp;
241
+ c1 += texture(first_texture, v_uv + d * v);
242
+ c2 += texture(second_texture, v_uv + d * v);
243
+ }
244
+ }
245
+ c1 /= float(passes * passes);
246
+ c2 /= float(passes * passes);
247
+ output_color = mix(c1, c2, progress);
248
+ }
249
+ """
250
+ )
251
+
252
+ def __init__(
253
+ self,
254
+ opengl_context: Union[moderngl.Context, None],
255
+ # TODO: Review this
256
+ output_size: tuple[int, int] = (1920, 1080),
257
+ intensity: float = 1.0,
258
+ **kwargs
259
+ ):
260
+ super().__init__(
261
+ opengl_context = opengl_context,
262
+ output_size = output_size,
263
+ intensity = intensity,
264
+ **kwargs
265
+ )
266
+
267
+ class AlphaPediaMaskTransitionProcessorGPU(_TransitionProcessorGPU):
268
+ """
269
+ A transition made by using a custom mask to
270
+ join the 2 videos. This mask is specifically
271
+ obtained from the AlphaPediaYT channel in which
272
+ we upload specific masking videos.
273
+
274
+ Both videos will be placed occupying the whole
275
+ scene, just overlapping by using the transition
276
+ video mask, but not moving the frame through
277
+ the screen like other classes do (like the
278
+ FallingBars).
279
+ """
280
+
281
+ # TODO: I think I don't need a 'progress' but just
282
+ # mix both frames as much as the alpha (or white
283
+ # presence) tells
284
+ @property
285
+ def fragment_shader(
286
+ self
287
+ ) -> str:
288
+ return (
289
+ """
290
+ #version 330
291
+
292
+ uniform sampler2D first_texture;
293
+ uniform sampler2D second_texture;
294
+ uniform sampler2D mask_texture;
295
+
296
+ uniform float progress; // 0.0 → full A, 1.0 → full B
297
+ uniform bool use_alpha_channel; // True to use the alpha channel
298
+ //uniform float contrast; // Optional contrast to magnify the result
299
+
300
+ in vec2 v_uv;
301
+ out vec4 output_color;
302
+
303
+ void main() {
304
+ vec4 first_color = texture(first_texture, v_uv);
305
+ vec4 second_color = texture(second_texture, v_uv);
306
+ vec4 mask_color = texture(mask_texture, v_uv);
307
+
308
+ // Mask alpha or red?
309
+ float mask_value = use_alpha_channel ? mask_color.a : mask_color.r;
310
+
311
+ // Optional contrast
312
+ //mask_value = clamp((mask_value - 0.5) * contrast + 0.5, 0.0, 1.0);
313
+ mask_value = clamp((mask_value - 0.5) + 0.5, 0.0, 1.0);
314
+
315
+ float t = smoothstep(0.0, 1.0, mask_value + progress - 0.5);
316
+
317
+ output_color = mix(first_color, second_color, t);
318
+ }
319
+ """
320
+ )
321
+
322
+ def _prepare_input_textures(
323
+ self
324
+ ) -> None:
325
+ """
326
+ *For internal use only*
327
+
328
+ Set the input texture variables and handlers
329
+ we need to manage this.
330
+ """
331
+ self.textures.add('first_texture', 0)
332
+ self.textures.add('second_texture', 1)
333
+ self.textures.add('mask_texture', 2)
334
+
335
+ def process(
336
+ self,
337
+ input_a: Union[moderngl.Texture, 'np.ndarray'],
338
+ input_b: Union[moderngl.Texture, 'np.ndarray'],
339
+ input_mask: Union[moderngl.Texture, 'np.ndarray'],
340
+ progress: float,
341
+ output_size: Union[tuple[int, int], None] = None,
342
+ **kwargs
343
+ ) -> moderngl.Texture:
344
+ """
345
+ Apply the shader to the 'input', that
346
+ must be a frame or a texture, and return
347
+ the new resulting texture.
348
+
349
+ You can provide any additional parameter
350
+ in the **kwargs, but be careful because
351
+ this could overwrite other uniforms that
352
+ were previously set.
353
+
354
+ We use and return textures to maintain
355
+ the process in GPU and optimize it.
356
+ """
357
+ ParameterValidator.validate_mandatory_instance_of('input_a', input_a, [moderngl.Texture, np.ndarray])
358
+ ParameterValidator.validate_mandatory_instance_of('input_b', input_b, [moderngl.Texture, np.ndarray])
359
+ ParameterValidator.validate_mandatory_instance_of('input_mask', input_mask, [moderngl.Texture, np.ndarray])
360
+ ParameterValidator.validate_mandatory_positive_float('progress', progress, do_include_zero = True)
361
+
362
+ textures_map = {
363
+ 'first_texture': input_a,
364
+ 'second_texture': input_b,
365
+ 'mask_texture': input_mask
366
+ }
367
+
368
+ # TODO: There is an 'use_alpha_channel' uniform to use
369
+ # the alpha instead of the red color of the frame value,
370
+ # but the red is working for our AlphaPedia videos, so...
371
+
372
+ kwargs = {
373
+ **kwargs,
374
+ 'progress': progress
375
+ }
376
+
377
+ return self._process_common(
378
+ textures_map = textures_map,
379
+ output_size = output_size,
380
+ **kwargs
381
+ )
382
+
383
+ class CircleOpeningTransitionProcessorGPU(_TransitionProcessorGPU):
384
+ """
385
+ A transition between the frames of 2 videos in
386
+ which the frames are mixed by generating a circle
387
+ that grows from the middle to end fitting the
388
+ whole screen.
389
+
390
+ This transition is made with GPU (OpenGL).
391
+ """
392
+
393
+ @property
394
+ def fragment_shader(
395
+ self
396
+ ) -> str:
397
+ return (
398
+ """
399
+ #version 330
400
+ #define UNIQUE_ID_{id(self)}
401
+ uniform sampler2D first_texture;
402
+ uniform sampler2D second_texture;
403
+ uniform float progress; // 0.0 → full A, 1.0 → full B
404
+ uniform float border_smoothness; // 0.02 is a good value
405
+
406
+ in vec2 v_uv;
407
+ out vec4 output_color;
408
+
409
+ void main() {
410
+ // Obtain the size automatically from the texture
411
+ vec2 output_size = vec2(textureSize(first_texture, 0));
412
+
413
+ vec2 pos = v_uv * output_size;
414
+ vec2 center = output_size * 0.5;
415
+
416
+ // Distance from center
417
+ float dist = distance(pos, center);
418
+
419
+ // Radius of current circle
420
+ float max_radius = length(center);
421
+ float radius = progress * max_radius;
422
+
423
+ vec4 first_color = texture(first_texture, v_uv);
424
+ vec4 second_color = texture(second_texture, v_uv);
425
+
426
+ // With smooth circle
427
+ // TODO: Make this customizable
428
+ float mask = 1.0 - smoothstep(radius - border_smoothness * max_radius, radius + border_smoothness * max_radius, dist);
429
+ output_color = mix(first_color, second_color, mask);
430
+ }
431
+ """
432
+ )
433
+
434
+ def __init__(
435
+ self,
436
+ opengl_context: Union[moderngl.Context, None],
437
+ # TODO: Review this
438
+ output_size: tuple[int, int] = (1920, 1080),
439
+ border_smoothness: float = 0.02,
440
+ **kwargs
441
+ ):
442
+ super().__init__(
443
+ opengl_context = opengl_context,
444
+ # TODO: Maybe 'output_size' has to be the texture size
445
+ # by default
446
+ output_size = output_size,
447
+ border_smoothness = border_smoothness,
448
+ **kwargs
449
+ )
450
+
451
+ class CircleClosingTransitionProcessorGPU(_TransitionProcessorGPU):
452
+ """
453
+ A transition between the frames of 2 videos in
454
+ which the frames are mixed by generating a circle
455
+ that grows from the middle to end fitting the
456
+ whole screen.
457
+
458
+ This transition is made with GPU (OpenGL).
459
+ """
460
+
461
+ @property
462
+ def fragment_shader(
463
+ self
464
+ ) -> str:
465
+ return (
466
+ """
467
+ #version 330
468
+
469
+ uniform sampler2D first_texture;
470
+ uniform sampler2D second_texture;
471
+ uniform float progress; // 0.0 → full A, 1.0 → full B
472
+ uniform float border_smoothness; // 0.02 is a good value
473
+
474
+ in vec2 v_uv;
475
+ out vec4 output_color;
476
+
477
+ void main() {
478
+ // Obtain the size automatically from the texture
479
+ vec2 output_size = vec2(textureSize(first_texture, 0));
480
+
481
+ vec2 pos = v_uv * output_size;
482
+ vec2 center = output_size * 0.5;
483
+
484
+ // Distance from center
485
+ float dist = distance(pos, center);
486
+
487
+ // Radius of current circle
488
+ float max_radius = length(center);
489
+ float radius = (1.0 - progress) * max_radius;
490
+
491
+ vec4 first_color = texture(first_texture, v_uv);
492
+ vec4 second_color = texture(second_texture, v_uv);
493
+
494
+ // With smooth circle
495
+ // TODO: Make this customizable
496
+ float mask = smoothstep(radius - border_smoothness * max_radius, radius + border_smoothness * max_radius, dist);
497
+ output_color = mix(first_color, second_color, mask);
498
+ }
499
+ """
500
+ )
501
+
502
+ def __init__(
503
+ self,
504
+ opengl_context: Union[moderngl.Context, None],
505
+ # TODO: Review this
506
+ output_size: tuple[int, int] = (1920, 1080),
507
+ border_smoothness: float = 0.02,
508
+ **kwargs
509
+ ):
510
+ super().__init__(
511
+ opengl_context = opengl_context,
512
+ # TODO: Maybe 'output_size' has to be the texture size
513
+ # by default
514
+ output_size = output_size,
515
+ border_smoothness = border_smoothness,
516
+ **kwargs
517
+ )
518
+
519
+ # TODO: This effect is not working according to
520
+ # the progress, you cannot use normal timing
521
+ class BarsFallingTransitionProcessorGPU(_TransitionProcessorGPU):
522
+ """
523
+ A transition between the frames of 2 videos in which
524
+ a set of bars fall with the first video to let the
525
+ second one be seen.
526
+
527
+ Extracted from here:
528
+ - https://gl-transitions.com/editor/DoomScreenTransition
529
+
530
+ This transition is made with GPU (OpenGL).
531
+ """
532
+
533
+ @property
534
+ def fragment_shader(
535
+ self
536
+ ) -> str:
537
+ return (
538
+ """
539
+ #version 330
540
+
541
+ uniform sampler2D first_texture;
542
+ uniform sampler2D second_texture;
543
+ uniform float progress; // 0.0 → start, 1.0 → end
544
+
545
+ uniform int number_of_bars;
546
+ uniform float amplitude; // Speed
547
+ uniform float noise; // Extra noise [0.0, 1.0]
548
+ uniform float frequency; // Wave frequency
549
+ uniform float drip_scale; // Falling from center
550
+
551
+ in vec2 v_uv;
552
+ out vec4 output_color;
553
+
554
+ // pseudo-random from integer
555
+ float rand(int num) {
556
+ return fract(mod(float(num) * 67123.313, 12.0) * sin(float(num) * 10.3) * cos(float(num)));
557
+ }
558
+
559
+ // Wave for vertical distortion
560
+ float wave(int num) {
561
+ float fn = float(num) * frequency * 0.1 * float(number_of_bars);
562
+ return cos(fn * 0.5) * cos(fn * 0.13) * sin((fn + 10.0) * 0.3) / 2.0 + 0.5;
563
+ }
564
+
565
+ // Vertical curve to borders
566
+ float drip(int num) {
567
+ return sin(float(num) / float(number_of_bars - 1) * 3.141592) * drip_scale;
568
+ }
569
+
570
+ // Displacement for a bar
571
+ float pos(int num) {
572
+ float w = wave(num);
573
+ float r = rand(num);
574
+ float base = (noise == 0.0) ? w : mix(w, r, noise);
575
+ return base + ((drip_scale == 0.0) ? 0.0 : drip(num));
576
+ }
577
+
578
+ void main() {
579
+ int bar = int(v_uv.x * float(number_of_bars));
580
+
581
+ float scale = 1.0 + pos(bar) * amplitude;
582
+ float phase = progress * scale;
583
+ float pos_y = v_uv.y;
584
+
585
+ vec2 p;
586
+ vec4 color;
587
+
588
+ if (phase + pos_y < 1.0) {
589
+ // Frame A is visible
590
+ p = vec2(v_uv.x, v_uv.y + mix(0.0, 1.0, phase));
591
+ color = texture(first_texture, p);
592
+ } else {
593
+ // Frame B is visible
594
+ color = texture(second_texture, v_uv);
595
+ }
596
+
597
+ output_color = color;
598
+ }
599
+ """
600
+ )
601
+
602
+ def __init__(
603
+ self,
604
+ opengl_context: Union[moderngl.Context, None],
605
+ # TODO: Review this
606
+ output_size: tuple[int, int] = (1920, 1080),
607
+ number_of_bars: int = 30,
608
+ amplitude: float = 2.0,
609
+ noise: float = 0.1, # [0.0, 1.0]
610
+ frequency: float = 0.5,
611
+ drip_scale: float = 0.5,
612
+ **kwargs
613
+ ):
614
+ super().__init__(
615
+ opengl_context = opengl_context,
616
+ output_size = output_size,
617
+ number_of_bars = number_of_bars,
618
+ amplitude = amplitude,
619
+ noise = noise,
620
+ frequency = frequency,
621
+ drip_scale = drip_scale,
622
+ **kwargs
623
+ )
624
+
625
+
626
+ """
627
+ Note for the developer:
628
+
629
+ Here below you have a shader that allows you
630
+ to create more slide transitions (vertical,
631
+ diagonal) but have to be refactored because
632
+ the mixing part is not working properly
633
+ according to the position. The code was made
634
+ for an horizontal slide but has to be adapted
635
+ to the other movements.
636
+
637
+ Code here below:
638
+
639
+ #version 330
640
+
641
+ // FRAGMENT SHADER — Slide horizontal
642
+ uniform sampler2D texA;
643
+ uniform sampler2D texB;
644
+ uniform float progress; // 0.0 → full A, 1.0 → full B
645
+
646
+ in vec2 frag_uv;
647
+ out vec4 frag_color;
648
+
649
+ void main() {
650
+ // Horizontal version (right to left)
651
+ vec2 uvA = frag_uv + vec2(-progress, 0.0);
652
+ vec2 uvB = frag_uv + vec2(1.0 - progress, 0.0);
653
+
654
+ // Horizontal version (left to right)
655
+ //vec2 uvA = frag_uv + vec2(progress, 0.0);
656
+ //vec2 uvB = frag_uv + vec2(-1.0 + progress, 0.0);
657
+
658
+ // Vertical version (top to bottom)
659
+ // TODO: We need to adjust the color mixin
660
+ // to make it fit the type of transition
661
+ //vec2 uvA = frag_uv + vec2(0.0, -progress);
662
+ //vec2 uvB = frag_uv + vec2(0.0, 1.0 - progress);
663
+
664
+ // Diagonal version (top left to bottom right)
665
+ //vec2 uvA = frag_uv + vec2(-progress, -progress);
666
+ //vec2 uvB = frag_uv + vec2(1.0 - progress, 1.0 - progress);
667
+
668
+ vec4 colorA = texture(texA, uvA);
669
+ vec4 colorB = texture(texB, uvB);
670
+
671
+ if (uvA.x < 0.0) {
672
+ frag_color = colorB;
673
+ } else if (uvB.x > 1.0) {
674
+ frag_color = colorA;
675
+ } else {
676
+ // A and B frames are shown at the same time
677
+ frag_color = mix(colorA, colorB, progress);
678
+ }
679
+ }
680
+ """
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: yta-editor-nodes-gpu
3
- Version: 0.0.1
3
+ Version: 0.0.2
4
4
  Summary: Youtube Autonomous Main Editor Nodes GPU module
5
5
  License-File: LICENSE
6
6
  Author: danialcala94
@@ -8,6 +8,10 @@ Author-email: danielalcalavalera@gmail.com
8
8
  Requires-Python: ==3.9
9
9
  Classifier: Programming Language :: Python :: 3
10
10
  Classifier: Programming Language :: Python :: 3.9
11
+ Requires-Dist: moderngl (>=0.0.1,<9.0.0)
12
+ Requires-Dist: yta_programming (>=0.0.1,<1.0.0)
13
+ Requires-Dist: yta_validation (>=0.0.1,<1.0.0)
14
+ Requires-Dist: yta_video_opengl (>=0.0.1,<1.0.0)
11
15
  Description-Content-Type: text/markdown
12
16
 
13
17
  # Youtube Autonomous Main Editor Nodes GPU module
@@ -0,0 +1,11 @@
1
+ yta_editor_nodes_gpu/__init__.py,sha256=ohwm0tjEayNGJQqEz_xPEXYaqd4qEvPLmQtfuMnoIhc,145
2
+ yta_editor_nodes_gpu/processor/__init__.py,sha256=KpJSIHss2FH-hWzRpc0Z0r2xGSQJVAoET-1vyk8zimg,5457
3
+ yta_editor_nodes_gpu/processor/blender/__init__.py,sha256=fiDX0wxeks2o6BbINQaYrt1rASE2kdWGEc7Pt7aRnIE,15614
4
+ yta_editor_nodes_gpu/processor/blender/utils.py,sha256=MpPMZ_pYpVUyIo-hcVQHKrbBWTpG1yEE8d80k9npJpI,1762
5
+ yta_editor_nodes_gpu/processor/video/__init__.py,sha256=FwL8sbxu9EgBog-17_PF25O1iS-upHd3aGGB-UKKe4E,7009
6
+ yta_editor_nodes_gpu/processor/video/experimental.py,sha256=BKOXlCZXuOhlcDC4pHcS2EoQI4_ur7971ktyteLklk0,21262
7
+ yta_editor_nodes_gpu/processor/video/transitions/__init__.py,sha256=VR79hr0I7Oiuvt3ufKOwvkgwbywjXPj2sPfyLZHUeQw,22500
8
+ yta_editor_nodes_gpu-0.0.2.dist-info/licenses/LICENSE,sha256=6kbiFSfobTZ7beWiKnHpN902HgBx-Jzgcme0SvKqhKY,1091
9
+ yta_editor_nodes_gpu-0.0.2.dist-info/METADATA,sha256=DctAdSG7Fiq3DFeIfgG8EOXyb_yqmTOxVuqzBQsVgEk,663
10
+ yta_editor_nodes_gpu-0.0.2.dist-info/WHEEL,sha256=M5asmiAlL6HEcOq52Yi5mmk9KmTVjY2RDPtO4p9DMrc,88
11
+ yta_editor_nodes_gpu-0.0.2.dist-info/RECORD,,