sonolus.py 0.3.0__py3-none-any.whl → 0.3.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.

Potentially problematic release.


This version of sonolus.py might be problematic. Click here for more details.

@@ -1,6 +1,7 @@
1
1
  from math import cos, sin
2
2
  from typing import Self
3
3
 
4
+ from sonolus.script.interval import lerp, remap
4
5
  from sonolus.script.quad import Quad, QuadLike
5
6
  from sonolus.script.record import Record
6
7
  from sonolus.script.vec import Vec2
@@ -396,3 +397,291 @@ class Transform2d(Record):
396
397
  tl=self.transform_vec(quad.tl),
397
398
  tr=self.transform_vec(quad.tr),
398
399
  )
400
+
401
+
402
+ class InvertibleTransform2d(Record):
403
+ """A transformation matrix for 2D points that can be inverted.
404
+
405
+ Usage:
406
+ ```python
407
+ InvertibleTransform2d.new()
408
+ ```
409
+ """
410
+
411
+ forward: Transform2d
412
+ inverse: Transform2d
413
+
414
+ @classmethod
415
+ def new(cls) -> Self:
416
+ """Create a new identity transform.
417
+
418
+ Returns:
419
+ A new identity transform.
420
+ """
421
+ return cls(
422
+ forward=Transform2d.new(),
423
+ inverse=Transform2d.new(),
424
+ )
425
+
426
+ def translate(self, translation: Vec2, /) -> Self:
427
+ """Translate along the x and y axes and return a new transform.
428
+
429
+ Args:
430
+ translation: The translation vector.
431
+
432
+ Returns:
433
+ A new invertible transform after translation.
434
+ """
435
+ return InvertibleTransform2d(
436
+ forward=self.forward.translate(translation),
437
+ inverse=Transform2d.new().translate(-translation).compose(self.inverse),
438
+ )
439
+
440
+ def scale(self, factor: Vec2, /) -> Self:
441
+ """Scale about the origin and return a new transform.
442
+
443
+ Args:
444
+ factor: The scale factor vector.
445
+
446
+ Returns:
447
+ A new invertible transform after scaling.
448
+ """
449
+ return InvertibleTransform2d(
450
+ forward=self.forward.scale(factor),
451
+ inverse=Transform2d.new().scale(Vec2.one() / factor).compose(self.inverse),
452
+ )
453
+
454
+ def scale_about(self, factor: Vec2, /, pivot: Vec2) -> Self:
455
+ """Scale about the pivot and return a new transform.
456
+
457
+ Args:
458
+ factor: The scale factor vector.
459
+ pivot: The pivot point for scaling.
460
+
461
+ Returns:
462
+ A new invertible transform after scaling.
463
+ """
464
+ return InvertibleTransform2d(
465
+ forward=self.forward.scale_about(factor, pivot),
466
+ inverse=Transform2d.new().scale_about(Vec2.one() / factor, pivot).compose(self.inverse),
467
+ )
468
+
469
+ def rotate(self, angle: float, /) -> Self:
470
+ """Rotate about the origin and return a new transform.
471
+
472
+ Args:
473
+ angle: The angle of rotation in radians.
474
+
475
+ Returns:
476
+ A new invertible transform after rotation.
477
+ """
478
+ return InvertibleTransform2d(
479
+ forward=self.forward.rotate(angle),
480
+ inverse=Transform2d.new().rotate(-angle).compose(self.inverse),
481
+ )
482
+
483
+ def rotate_about(self, angle: float, /, pivot: Vec2) -> Self:
484
+ """Rotate about the pivot and return a new transform.
485
+
486
+ Args:
487
+ angle: The angle of rotation in radians.
488
+ pivot: The pivot point for rotation.
489
+
490
+ Returns:
491
+ A new invertible transform after rotation.
492
+ """
493
+ return InvertibleTransform2d(
494
+ forward=self.forward.rotate_about(angle, pivot),
495
+ inverse=Transform2d.new().rotate_about(-angle, pivot).compose(self.inverse),
496
+ )
497
+
498
+ def shear_x(self, m: float, /) -> Self:
499
+ """Shear along the x-axis and return a new transform.
500
+
501
+ Args:
502
+ m: The shear factor along the x-axis.
503
+
504
+ Returns:
505
+ A new invertible transform after shearing.
506
+ """
507
+ return InvertibleTransform2d(
508
+ forward=self.forward.shear_x(m),
509
+ inverse=Transform2d.new().shear_x(-m).compose(self.inverse),
510
+ )
511
+
512
+ def shear_y(self, m: float, /) -> Self:
513
+ """Shear along the y-axis and return a new transform.
514
+
515
+ Args:
516
+ m: The shear factor along the y-axis.
517
+
518
+ Returns:
519
+ A new invertible transform after shearing.
520
+ """
521
+ return InvertibleTransform2d(
522
+ forward=self.forward.shear_y(m),
523
+ inverse=Transform2d.new().shear_y(-m).compose(self.inverse),
524
+ )
525
+
526
+ def simple_perspective_x(self, x: float, /) -> Self:
527
+ """Apply perspective along the x-axis with vanishing point at the given x coordinate and return a new transform.
528
+
529
+ Args:
530
+ x: The x coordinate of the vanishing point.
531
+
532
+ Returns:
533
+ A new invertible transform after applying perspective.
534
+ """
535
+ return InvertibleTransform2d(
536
+ forward=self.forward.simple_perspective_x(x),
537
+ inverse=Transform2d.new().simple_perspective_x(-x).compose(self.inverse),
538
+ )
539
+
540
+ def simple_perspective_y(self, y: float, /) -> Self:
541
+ """Apply perspective along the y-axis with vanishing point at the given y coordinate and return a new transform.
542
+
543
+ Args:
544
+ y: The y coordinate of the vanishing point.
545
+
546
+ Returns:
547
+ A new invertible transform after applying perspective.
548
+ """
549
+ return InvertibleTransform2d(
550
+ forward=self.forward.simple_perspective_y(y),
551
+ inverse=Transform2d.new().simple_perspective_y(-y).compose(self.inverse),
552
+ )
553
+
554
+ def perspective_x(self, foreground_x: float, vanishing_point: Vec2, /) -> Self:
555
+ """Apply a perspective transformation along the x-axis and return a new transform.
556
+
557
+ Args:
558
+ foreground_x: The foreground x-coordinate.
559
+ vanishing_point: The vanishing point vector.
560
+
561
+ Returns:
562
+ A new invertible transform after applying perspective.
563
+ """
564
+ return InvertibleTransform2d(
565
+ forward=self.forward.perspective_x(foreground_x, vanishing_point),
566
+ inverse=Transform2d.new().inverse_perspective_x(foreground_x, vanishing_point).compose(self.inverse),
567
+ )
568
+
569
+ def perspective_y(self, foreground_y: float, vanishing_point: Vec2, /) -> Self:
570
+ """Apply a perspective transformation along the y-axis and return a new transform.
571
+
572
+ Args:
573
+ foreground_y: The foreground y-coordinate.
574
+ vanishing_point: The vanishing point vector.
575
+
576
+ Returns:
577
+ A new invertible transform after applying perspective.
578
+ """
579
+ return InvertibleTransform2d(
580
+ forward=self.forward.perspective_y(foreground_y, vanishing_point),
581
+ inverse=Transform2d.new().inverse_perspective_y(foreground_y, vanishing_point).compose(self.inverse),
582
+ )
583
+
584
+ def normalize(self) -> Self:
585
+ """Normalize the transform to have a 1 in the bottom right corner and return a new transform.
586
+
587
+ This may fail in some special cases involving perspective transformations where the bottom right corner is 0.
588
+
589
+ Returns:
590
+ A new normalized invertible transform.
591
+ """
592
+ return InvertibleTransform2d(
593
+ forward=self.forward.normalize(),
594
+ inverse=self.inverse.normalize(),
595
+ )
596
+
597
+ def compose(self, other: Self, /) -> Self:
598
+ """Compose with another invertible transform which is applied after this transform and return a new transform.
599
+
600
+ Args:
601
+ other: The other invertible transform to compose with.
602
+
603
+ Returns:
604
+ A new invertible transform resulting from the composition.
605
+ """
606
+ return InvertibleTransform2d(
607
+ forward=self.forward.compose(other.forward),
608
+ inverse=other.inverse.compose(self.inverse),
609
+ )
610
+
611
+ def compose_before(self, other: Self, /) -> Self:
612
+ """Compose with another invertible transform which is applied before this transform and return a new transform.
613
+
614
+ Args:
615
+ other: The other invertible transform to compose with.
616
+
617
+ Returns:
618
+ A new invertible transform resulting from the composition.
619
+ """
620
+ return other.compose(self)
621
+
622
+ def transform_vec(self, v: Vec2) -> Vec2:
623
+ """Transform a [`Vec2`][sonolus.script.vec.Vec2] and return a new [`Vec2`][sonolus.script.vec.Vec2].
624
+
625
+ Args:
626
+ v: The vector to transform.
627
+
628
+ Returns:
629
+ A new transformed vector.
630
+ """
631
+ return self.forward.transform_vec(v)
632
+
633
+ def inverse_transform_vec(self, v: Vec2) -> Vec2:
634
+ """Inverse transform a [`Vec2`][sonolus.script.vec.Vec2] and return a new [`Vec2`][sonolus.script.vec.Vec2].
635
+
636
+ Args:
637
+ v: The vector to inverse transform.
638
+
639
+ Returns:
640
+ A new inverse transformed vector.
641
+ """
642
+ return self.inverse.transform_vec(v)
643
+
644
+ def transform_quad(self, quad: QuadLike) -> Quad:
645
+ """Transform a [`Quad`][sonolus.script.quad.Quad] and return a new [`Quad`][sonolus.script.quad.Quad].
646
+
647
+ Args:
648
+ quad: The quad to transform.
649
+
650
+ Returns:
651
+ A new transformed quad.
652
+ """
653
+ return self.forward.transform_quad(quad)
654
+
655
+ def inverse_transform_quad(self, quad: QuadLike) -> Quad:
656
+ """Inverse transform a [`Quad`][sonolus.script.quad.Quad] and return a new [`Quad`][sonolus.script.quad.Quad].
657
+
658
+ Args:
659
+ quad: The quad to inverse transform.
660
+
661
+ Returns:
662
+ A new inverse transformed quad.
663
+ """
664
+ return self.inverse.transform_quad(quad)
665
+
666
+
667
+ def perspective_approach(
668
+ distance_ratio: float,
669
+ progress: float,
670
+ ) -> float:
671
+ """Calculate the perspective correct approach curve given the initial distance, target distance, and progress.
672
+
673
+ For typical engines with stage tilt, distance_ratio is the displayed width of a lane at the judge line divided
674
+ by the displayed width of a lane at note spawn. For flat stages, this will be 1.0, and this function would simply
675
+ return progress unchanged.
676
+
677
+ Args:
678
+ distance_ratio: The ratio of the distance at note spawn to the distance at the judge line.
679
+ progress: The progress value, where 0 corresponds to note spawn and 1 corresponds to the judge line.
680
+
681
+ Returns:
682
+ The perspective-corrected progress value.
683
+ """
684
+ d_0 = distance_ratio
685
+ d_1 = 1.0
686
+ d = max(lerp(d_0, d_1, progress), 1e-6) # Avoid a zero or negative distance
687
+ return remap(1 / d_0, 1 / d_1, 0, 1, 1 / d)
sonolus/script/values.py CHANGED
@@ -19,13 +19,19 @@ def alloc[T](type_: type[T]) -> T:
19
19
 
20
20
  @meta_fn
21
21
  def zeros[T](type_: type[T]) -> T:
22
- """Make a new instance of the given type initialized with zeros."""
22
+ """Make a new instance of the given type initialized with zeros.
23
+
24
+ Generally works the same as the unary `+` operator on record and array types.
25
+ """
23
26
  return validate_concrete_type(type_)._zero_()
24
27
 
25
28
 
26
29
  @meta_fn
27
30
  def copy[T](value: T) -> T:
28
- """Make a deep copy of the given value."""
31
+ """Make a deep copy of the given value.
32
+
33
+ Generally works the same as the unary `+` operator on records and arrays.
34
+ """
29
35
  value = validate_value(value)
30
36
  if ctx():
31
37
  return value._copy_()
@@ -34,7 +40,7 @@ def copy[T](value: T) -> T:
34
40
 
35
41
 
36
42
  def swap[T](a: T, b: T):
37
- """Swap the values of the two given arguments."""
43
+ """Swap the values of the two provided mutable values."""
38
44
  temp = copy(a)
39
45
  a @= b
40
46
  b @= temp
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: sonolus.py
3
- Version: 0.3.0
3
+ Version: 0.3.2
4
4
  Summary: Sonolus engine development in Python
5
5
  License-File: LICENSE
6
6
  Requires-Python: >=3.12
@@ -7,70 +7,70 @@ sonolus/backend/finalize.py,sha256=vNUGLCUDxNqXGxweNRA1NpRvtij7Tks9to1V_JTs7Jo,4
7
7
  sonolus/backend/interpret.py,sha256=B0jqlLmEGoyO2mxpcvwRwV17Tq_gOE9wLNt26Q5QOfs,14306
8
8
  sonolus/backend/ir.py,sha256=TCDLMvlX2S8emFDQwFVeD2OUC4fnhbrMObgYtoa_7PQ,2845
9
9
  sonolus/backend/mode.py,sha256=NkcPZJm8dn83LX35uP24MtQOCnfRDFZ280dHeEEfauE,613
10
- sonolus/backend/node.py,sha256=H8qgnNyIseR-DhfgtcbDX03SUmhAJSSrYAlUEJTkkUo,999
10
+ sonolus/backend/node.py,sha256=eEzPP14jzWJp2xrZCAaPlNtokxdoqg0bSM7xQiwx1j8,1254
11
11
  sonolus/backend/ops.py,sha256=7DERBPU6z9Bz3i6UxyLdFTXYcCpvRZVNWw4ZQ-Djwnk,10510
12
12
  sonolus/backend/place.py,sha256=jABvLNNE-2pklTcb9WnyfHK8c-tYxn0ObsoLp5LYd5I,4703
13
- sonolus/backend/utils.py,sha256=9-mmCUwGlNdjp51jKrNBN2dGxCAXVV2PdJn031kaXHM,1717
14
- sonolus/backend/visitor.py,sha256=GvAEx8D3_YijTMUYBmir0IvDPAEpK1ObAuQOAcAMKm0,48157
13
+ sonolus/backend/utils.py,sha256=BuJHI-qTVn-vYlQkSr4fSDPpgckkiO2RJmwlDXY_KzM,1818
14
+ sonolus/backend/visitor.py,sha256=DyFXhhSMtpn0T0muQZz59pfbCMJtapz59CxctqRGxyk,49315
15
15
  sonolus/backend/optimize/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
16
- sonolus/backend/optimize/allocate.py,sha256=LCqxvT8YsVGTaVAu58fb6lrrytVLWx1LNbcOfx8CqL8,5671
16
+ sonolus/backend/optimize/allocate.py,sha256=-cpnCQ7S6wH3y-hCUGb2KT5TMuREifhsMXMI0-YtNjY,7380
17
17
  sonolus/backend/optimize/constant_evaluation.py,sha256=ozYB__haE2A_L2NBh2H3IT__Z65FBBtbjh6BJfQRC_A,15988
18
18
  sonolus/backend/optimize/copy_coalesce.py,sha256=4vUe-y2w8sGyrguSlp8O_p0uy9rEUu5M-smI0F5UMQw,4404
19
19
  sonolus/backend/optimize/dead_code.py,sha256=qYmUqBmAp-O5mUpNusOoMEJVkbc9YIHx6Ynrg6dyNGY,8077
20
20
  sonolus/backend/optimize/dominance.py,sha256=oTFUqN8twrw6lTzqr1nlYs-Gk1NzIa-4qGdEQvDGzlM,3217
21
- sonolus/backend/optimize/flow.py,sha256=mMf5Um2uxwF65nw13UiIv7dFMHZZHnyWv2WaOVnGw2c,4266
21
+ sonolus/backend/optimize/flow.py,sha256=poqsv1BKPIencXjFNJT4Wn0R5UuCiEWGnNv1pWdrCH0,4771
22
22
  sonolus/backend/optimize/inlining.py,sha256=jwTiuHivSq9bB7FfVbD9Wd_Ztaz8ml_5CRnikr2d6yU,5719
23
23
  sonolus/backend/optimize/liveness.py,sha256=c0ejVf1LNcYBlByf3rxkNs18IoXmiOdCFwEk3Afv8DE,7121
24
- sonolus/backend/optimize/optimize.py,sha256=It_z8fAaTsG8bRNrvR5mQzVjmwZT5I1whBvy4F-Xoos,1473
24
+ sonolus/backend/optimize/optimize.py,sha256=MEyQHwAj3enyMZsh-pQUTCgcqUjuc5diYq7BFe7fQwM,1324
25
25
  sonolus/backend/optimize/passes.py,sha256=BQy-BovGu234Y12c-vpBmTaNNl9oeW4qZ8A3q5y5nLs,1684
26
26
  sonolus/backend/optimize/simplify.py,sha256=Tz4RftjH5TpIxoIOwiZuLchsrwzI9GaS_exdjAW6HKk,7927
27
27
  sonolus/backend/optimize/ssa.py,sha256=D3CQm3s3gcuU0_k_0pXVrwirm4xjAZsX6corrTDS1Co,9013
28
28
  sonolus/build/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
29
- sonolus/build/cli.py,sha256=zWkiY2frHHIk3nqP8XrzV1ez1zU67deNZ7WeFR5SfVo,8801
29
+ sonolus/build/cli.py,sha256=L-djaIsD6Pgo2_5sGXEUfyKYsNU7aikpV-D8N1vKZho,8964
30
30
  sonolus/build/collection.py,sha256=kOVnpQC_KHAsyTM4nAplSh6QE16CgO-H6PP1GItWm78,12187
31
31
  sonolus/build/compile.py,sha256=nWtQRao_k-ChJhjmYFpPMRlPgxFI0t9wtMWSRHQcnbQ,5586
32
- sonolus/build/engine.py,sha256=AYzJHRcYaR-PidR9eG6Tbr4Xz5-spHTOp4S9F4nm-UY,11178
32
+ sonolus/build/engine.py,sha256=F5p7lyhYkRvWG-cyWSmkFsOx6LvP_DNTzrozIx4MdBc,11178
33
33
  sonolus/build/level.py,sha256=AjvK4725nqDcg7oGn5kWocBdG-AcirXpku74T7c2epA,673
34
34
  sonolus/build/node.py,sha256=gnX71RYDUOK_gYMpinQi-bLWO4csqcfiG5gFmhxzSec,1330
35
35
  sonolus/build/project.py,sha256=DhNqgHnm73qKUOhrg1JPlWEL0Vg7VxcGUbNokpMWzVE,6315
36
36
  sonolus/script/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
37
- sonolus/script/archetype.py,sha256=s9ucFQKIihYkxDlN1eA4SIOWzzIxVrDQSTBeCbllKJ0,40120
38
- sonolus/script/array.py,sha256=cZcDd_UqTdDFP3fD_r6qdOCtdKSZyVvsDQtcr0hTmMs,11483
39
- sonolus/script/array_like.py,sha256=gnpjSUZVTxe13ILcSWHAm3tGVMl6tmNUEzJZg8kH_zo,8552
37
+ sonolus/script/archetype.py,sha256=3pvTrQbVimNeU9EDO_2RVoqak3EF0D67OEnCcdaWz1w,40548
38
+ sonolus/script/array.py,sha256=RxdZ-2Df-sYhiMT1xMsPJEGX1oCtDIE3TTntRsk56iA,11760
39
+ sonolus/script/array_like.py,sha256=wFw_drg6aPk_17upAl2G2l-i5fE3rzaUtB8kYEkyJEk,8557
40
40
  sonolus/script/bucket.py,sha256=YFSyKS4ZngxerBlKwFBSCRAVewgQdwZ1-NqfPKcPZxI,7519
41
- sonolus/script/containers.py,sha256=QUFUk1lDwM2AzIPH6uHkZtZXT2D4_xT3P6pJIp6i7Ew,17640
42
- sonolus/script/debug.py,sha256=aYyFm8DuoifK0L0pY4G7ZZEEeSqbig90Yogy6Z_M8Yg,3135
41
+ sonolus/script/containers.py,sha256=PXwixFp1k1gqjp-gMfnlE1IadEfavFzAS99XH8kaw8Q,17640
42
+ sonolus/script/debug.py,sha256=JIMcGD6cQVWtIw3IIhq-5WenZZu0iArH6SAS1-XfR_8,5076
43
43
  sonolus/script/easing.py,sha256=7zaDKIfM_whUpb4FBz1DAF4NNG2vk_nDjl8kL2Y90aU,11396
44
44
  sonolus/script/effect.py,sha256=V9bJvMzs1O4C1PjTOKgsAXov-l4AnDb2h38-DzmeWpI,5838
45
45
  sonolus/script/engine.py,sha256=BhhQTrHuGAAAD6JPQ3R0jvHdimwW83PPghEIdAdtGMA,10683
46
- sonolus/script/globals.py,sha256=Z8RfLkgDuXPIKiq-aOqblP0s__ALGmvcKdlyWZH21EM,9166
46
+ sonolus/script/globals.py,sha256=gUvSbxXW1ZOsyQF6qb5iMRnW-eRrg07rWOK1PAYRwsE,9741
47
47
  sonolus/script/instruction.py,sha256=PNfxC1dhT_hB0BxhDV3KXMn_kKxfI0t1iZmg8m6ddMU,6725
48
48
  sonolus/script/interval.py,sha256=IYNgJx0ngREnEVu_yMAu0MrA_Q7mZuToT8U3fbdb3Sc,9122
49
- sonolus/script/iterator.py,sha256=OHnIOKRchzVCMaN33Tubo6EzqV61ZYUxDWIJ2S5G6iQ,4590
49
+ sonolus/script/iterator.py,sha256=wH6IM3ozLuMtCJZzhahIN3o2ykwUzDftU7ylbWo2UF8,4575
50
50
  sonolus/script/level.py,sha256=wR23xk-NOcW_JMRb3R12sqIXCLSZL-7cM3y7IpMF1J0,6333
51
51
  sonolus/script/metadata.py,sha256=ttRK27eojHf3So50KQJ-8yj3udZoN1bli5iD-knaeLw,753
52
- sonolus/script/num.py,sha256=x8KSAGK4iwj92nTvJ54X5H6ZmLUEnyUmND5g0YkDbgc,14749
53
- sonolus/script/options.py,sha256=ZD9I898wMrpPQ8IyuDoYef804rZzhSvPoC_0bxovIec,8245
52
+ sonolus/script/num.py,sha256=6un0Vdaporn0Ft_T71FlUAY57IFjJkCdio91e7FV6KU,15130
53
+ sonolus/script/options.py,sha256=OqvIPgdHbj03Ffzn857R_SrSJVUstrGy8o7Em6vv0y4,9419
54
54
  sonolus/script/particle.py,sha256=oeVQF01xOeW2BEn04ZK1ZOP2HGvQzxBJCpITFjy9woQ,8353
55
55
  sonolus/script/pointer.py,sha256=IH2_a0XE76uG_UyYM9jAYIf7qZ5LhUNc9ksXDIvAPZA,1511
56
56
  sonolus/script/printing.py,sha256=mNYu9QWiacBBGZrnePZQMVwbbguoelUps9GiOK_aVRU,2096
57
57
  sonolus/script/project.py,sha256=jLndgGJHdkqFYe-lDl_IzTjQ4gOSuy80en8WoSWXnB8,3340
58
- sonolus/script/quad.py,sha256=TwmQEsa7_UDSly4uXjN9RRQBVu7Qc_-rpDvhy6cy3KQ,10109
59
- sonolus/script/record.py,sha256=ouS5f7HVjH60esC0ryVOJL4q7Lt48CHokspgdf2kiH4,11742
60
- sonolus/script/runtime.py,sha256=MIGqDqNitlI6vFtZ2SP32D6LCLJ3RAuGKSxKKl-1tJw,20303
58
+ sonolus/script/quad.py,sha256=QgA4CdgLPGm2MtANKZPpxaM0qyh3DjxcXZi3D2QuLQs,10213
59
+ sonolus/script/record.py,sha256=ZgQPmkA1GGoQ7aVpMB2xQ3ju4cyTru7nzEVl76P6dV0,12356
60
+ sonolus/script/runtime.py,sha256=8UOedRhtnLQofChpApS-DHZh0VjEWBBktWsNaEubatQ,32245
61
61
  sonolus/script/sprite.py,sha256=CMcRAZ2hejXnaBmY2_n1_rj6hGOgPP5zEW-BpyaEVOY,16256
62
- sonolus/script/stream.py,sha256=CIPTwRPRx_oIWXxmCkmh5HcXBhw38hsfF4O5pcuQ8b4,19136
62
+ sonolus/script/stream.py,sha256=S6ukJ251EHQaSYxuqqYa0BO_LGImYgNqd512rc_l_vA,24062
63
63
  sonolus/script/text.py,sha256=wxujIgKYcCfl2AD2_Im8g3vh0lDEHYwTSRZg9wsBPEU,13402
64
64
  sonolus/script/timing.py,sha256=ZR0ypV2PIoDCMHHGOMfCeezStCsBQdzomdqaz5VKex0,2981
65
- sonolus/script/transform.py,sha256=iFY51p6Q0_VlAjlGCDxB14Vj5NlvAB_9VNzDjHeaxDs,10884
65
+ sonolus/script/transform.py,sha256=qtqh_Dpom698VrkKeMZLD3DjWtd3utkqx_nLrrIyWyY,20740
66
66
  sonolus/script/ui.py,sha256=DYPGWIjHj1IFPxW1zaEuIUQx0b32FJPXtiwCvrtJ6oo,7528
67
- sonolus/script/values.py,sha256=kyjJ9ODkBi_eJE-t4WYt0wGkbSMNMRkTqpUPZzVVPOU,1289
67
+ sonolus/script/values.py,sha256=woSW3we5OZZ1IaO3Qr0OAs_yuIpAzGw_IjwELKQHzv4,1469
68
68
  sonolus/script/vec.py,sha256=4ntfJ96zxKR-nVZluUgHd-Ud4vNfButfiv7EsroZxfE,7002
69
69
  sonolus/script/internal/__init__.py,sha256=T6rzLoiOUaiSQtaHMZ88SNO-ijSjSSv33TKtUwu-Ms8,136
70
- sonolus/script/internal/builtin_impls.py,sha256=w9QqxJQ2YR5pVy820qWmAy0utbsW4hcSzMvA_yNgsvg,8186
70
+ sonolus/script/internal/builtin_impls.py,sha256=3e1jzDtyyB1QiCqkp4bRhLnnTMlviBi0QjKvhYwd3q8,8209
71
71
  sonolus/script/internal/callbacks.py,sha256=vWzJG8uiJoEtsNnbeZPqOHogCwoLpz2D1MnHY2wVV8s,2801
72
72
  sonolus/script/internal/constant.py,sha256=k4kIBoy-c74UbfUR7GKzyTT6syhE-lSRJfw0nGuc8ZY,3904
73
- sonolus/script/internal/context.py,sha256=xW7yFWr13yf77Uk4C_F7v9Kp4ZP1o30uZuBkvK1KyLA,14157
73
+ sonolus/script/internal/context.py,sha256=v6DbyqqhieSajcIYf__he4gFSB7UpCMljZaR3SYewzM,15473
74
74
  sonolus/script/internal/descriptor.py,sha256=XRFey-EjiAm_--KsNl-8N0Mi_iyQwlPh68gDp0pKf3E,392
75
75
  sonolus/script/internal/dict_impl.py,sha256=alu_wKGSk1kZajNf64qbe7t71shEzD4N5xNIATH8Swo,1885
76
76
  sonolus/script/internal/error.py,sha256=ZNnsvQVQAnFKzcvsm6-sste2lo-tP5pPI8sD7XlAZWc,490
@@ -81,11 +81,12 @@ sonolus/script/internal/math_impls.py,sha256=Xk7tLMnV2npzPJWtHlspONQHt09Gh2YLdHh
81
81
  sonolus/script/internal/native.py,sha256=XKlNnWSJ-lxbwVGWhGj_CSSoWsVN18imqT5sAsDJT1w,1551
82
82
  sonolus/script/internal/random.py,sha256=6Ku5edRcDUh7rtqEEYCJz0BQavw69RALsVHS25z50pI,1695
83
83
  sonolus/script/internal/range.py,sha256=lrTanQFHU7RuQxSSPwDdoC30Y8FnHGxcP1Ahditu3zU,2297
84
+ sonolus/script/internal/simulation_context.py,sha256=jUgNxCOEc_b99w1yFyVz0nVb6rgkEsyuCBvcYxq34Vk,4819
84
85
  sonolus/script/internal/transient.py,sha256=d6iYhM9f6DPUX5nkYQGm-x0b9XEfZUmB4AtUNnyhixo,1636
85
- sonolus/script/internal/tuple_impl.py,sha256=vjXmScLVdeTkDn3t9fgIRqtW31iwngnaP2rmA6nlsLw,3431
86
+ sonolus/script/internal/tuple_impl.py,sha256=BVImJ5q8E9APMtSnHYnbFh6x8c36yktepewnnaQVWg4,3515
86
87
  sonolus/script/internal/value.py,sha256=gQVNQD_xGpgrN4-UXFDmWRZCJCe8wPZ_wYv4QoPRJkM,5379
87
- sonolus_py-0.3.0.dist-info/METADATA,sha256=p45irB_drbeGk58GpNSTg1m6spbsFpPdnTT_JUjHaRc,302
88
- sonolus_py-0.3.0.dist-info/WHEEL,sha256=qtCwoSJWgHk21S1Kb4ihdzI2rlJ1ZKaIurTj_ngOhyQ,87
89
- sonolus_py-0.3.0.dist-info/entry_points.txt,sha256=oTYspY_b7SA8TptEMTDxh4-Aj-ZVPnYC9f1lqH6s9G4,54
90
- sonolus_py-0.3.0.dist-info/licenses/LICENSE,sha256=JEKpqVhQYfEc7zg3Mj462sKbKYmO1K7WmvX1qvg9IJk,1067
91
- sonolus_py-0.3.0.dist-info/RECORD,,
88
+ sonolus_py-0.3.2.dist-info/METADATA,sha256=IcdTSXe5sjwmMh50kkhB2JZVSAU3GUUjqQzQFh_yGm0,302
89
+ sonolus_py-0.3.2.dist-info/WHEEL,sha256=qtCwoSJWgHk21S1Kb4ihdzI2rlJ1ZKaIurTj_ngOhyQ,87
90
+ sonolus_py-0.3.2.dist-info/entry_points.txt,sha256=oTYspY_b7SA8TptEMTDxh4-Aj-ZVPnYC9f1lqH6s9G4,54
91
+ sonolus_py-0.3.2.dist-info/licenses/LICENSE,sha256=JEKpqVhQYfEc7zg3Mj462sKbKYmO1K7WmvX1qvg9IJk,1067
92
+ sonolus_py-0.3.2.dist-info/RECORD,,