@codexo/exojs 0.14.0 → 0.15.1
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.
- package/CHANGELOG.md +183 -0
- package/README.md +2 -4
- package/dist/esm/animation/Tween.d.ts.map +1 -1
- package/dist/esm/animation/Tween.js +0 -1
- package/dist/esm/animation/Tween.js.map +1 -1
- package/dist/esm/animation/TweenManager.d.ts +44 -5
- package/dist/esm/animation/TweenManager.d.ts.map +1 -1
- package/dist/esm/animation/TweenManager.js +57 -5
- package/dist/esm/animation/TweenManager.js.map +1 -1
- package/dist/esm/animation/TweenSequencer.d.ts +139 -0
- package/dist/esm/animation/TweenSequencer.d.ts.map +1 -0
- package/dist/esm/animation/TweenSequencer.js +305 -0
- package/dist/esm/animation/TweenSequencer.js.map +1 -0
- package/dist/esm/animation/index.d.ts +1 -0
- package/dist/esm/animation/index.d.ts.map +1 -1
- package/dist/esm/audio/Playable.d.ts +6 -1
- package/dist/esm/audio/Playable.d.ts.map +1 -1
- package/dist/esm/audio/WorkletEffect.d.ts +34 -20
- package/dist/esm/audio/WorkletEffect.d.ts.map +1 -1
- package/dist/esm/audio/WorkletEffect.js +92 -25
- package/dist/esm/audio/WorkletEffect.js.map +1 -1
- package/dist/esm/core/Application.d.ts +43 -5
- package/dist/esm/core/Application.d.ts.map +1 -1
- package/dist/esm/core/Application.js +83 -9
- package/dist/esm/core/Application.js.map +1 -1
- package/dist/esm/core/BuildInfo.js +2 -2
- package/dist/esm/core/Codec.d.ts +41 -0
- package/dist/esm/core/Codec.d.ts.map +1 -0
- package/dist/esm/core/Codec.js +79 -0
- package/dist/esm/core/Codec.js.map +1 -0
- package/dist/esm/core/FixedTimestep.d.ts +28 -0
- package/dist/esm/core/FixedTimestep.d.ts.map +1 -0
- package/dist/esm/core/FixedTimestep.js +62 -0
- package/dist/esm/core/FixedTimestep.js.map +1 -0
- package/dist/esm/core/Scene.d.ts +14 -0
- package/dist/esm/core/Scene.d.ts.map +1 -1
- package/dist/esm/core/Scene.js +18 -0
- package/dist/esm/core/Scene.js.map +1 -1
- package/dist/esm/core/SceneManager.d.ts +7 -0
- package/dist/esm/core/SceneManager.d.ts.map +1 -1
- package/dist/esm/core/SceneManager.js +20 -4
- package/dist/esm/core/SceneManager.js.map +1 -1
- package/dist/esm/core/SceneNode.d.ts +46 -7
- package/dist/esm/core/SceneNode.d.ts.map +1 -1
- package/dist/esm/core/SceneNode.js +73 -12
- package/dist/esm/core/SceneNode.js.map +1 -1
- package/dist/esm/core/Stage.d.ts +7 -0
- package/dist/esm/core/Stage.d.ts.map +1 -1
- package/dist/esm/core/SystemRegistry.d.ts +5 -0
- package/dist/esm/core/SystemRegistry.d.ts.map +1 -1
- package/dist/esm/core/SystemRegistry.js +10 -0
- package/dist/esm/core/SystemRegistry.js.map +1 -1
- package/dist/esm/core/index.d.ts +4 -0
- package/dist/esm/core/index.d.ts.map +1 -1
- package/dist/esm/core/logging.d.ts +34 -0
- package/dist/esm/core/logging.d.ts.map +1 -0
- package/dist/esm/core/logging.js +59 -0
- package/dist/esm/core/logging.js.map +1 -0
- package/dist/esm/core/serialization/commonFields.d.ts.map +1 -1
- package/dist/esm/core/serialization/commonFields.js +6 -0
- package/dist/esm/core/serialization/commonFields.js.map +1 -1
- package/dist/esm/core/serialization/renderingSerializers.d.ts.map +1 -1
- package/dist/esm/core/serialization/renderingSerializers.js +14 -5
- package/dist/esm/core/serialization/renderingSerializers.js.map +1 -1
- package/dist/esm/debug/BoundingBoxesLayer.d.ts.map +1 -1
- package/dist/esm/debug/BoundingBoxesLayer.js +2 -1
- package/dist/esm/debug/BoundingBoxesLayer.js.map +1 -1
- package/dist/esm/debug/HitTestLayer.js +4 -4
- package/dist/esm/debug/HitTestLayer.js.map +1 -1
- package/dist/esm/debug/PerformanceLayer.js +1 -1
- package/dist/esm/debug/PerformanceLayer.js.map +1 -1
- package/dist/esm/debug/RenderPassInspectorLayer.js +2 -2
- package/dist/esm/debug/RenderPassInspectorLayer.js.map +1 -1
- package/dist/esm/index.js +7 -2
- package/dist/esm/index.js.map +1 -1
- package/dist/esm/input/Gamepad.d.ts +10 -0
- package/dist/esm/input/Gamepad.d.ts.map +1 -1
- package/dist/esm/input/Gamepad.js +12 -0
- package/dist/esm/input/Gamepad.js.map +1 -1
- package/dist/esm/input/InputManager.d.ts.map +1 -1
- package/dist/esm/input/InputManager.js +5 -0
- package/dist/esm/input/InputManager.js.map +1 -1
- package/dist/esm/input/InteractionManager.js +4 -4
- package/dist/esm/input/InteractionManager.js.map +1 -1
- package/dist/esm/math/AbstractVector.d.ts +4 -3
- package/dist/esm/math/AbstractVector.d.ts.map +1 -1
- package/dist/esm/math/AbstractVector.js +5 -4
- package/dist/esm/math/AbstractVector.js.map +1 -1
- package/dist/esm/math/ObservableVector.d.ts +2 -0
- package/dist/esm/math/ObservableVector.d.ts.map +1 -1
- package/dist/esm/math/ObservableVector.js +9 -0
- package/dist/esm/math/ObservableVector.js.map +1 -1
- package/dist/esm/math/Polygon.d.ts.map +1 -1
- package/dist/esm/math/Polygon.js +4 -1
- package/dist/esm/math/Polygon.js.map +1 -1
- package/dist/esm/math/collision-detection.d.ts.map +1 -1
- package/dist/esm/math/collision-detection.js +14 -14
- package/dist/esm/math/collision-detection.js.map +1 -1
- package/dist/esm/math/collision-primitives.d.ts +1 -1
- package/dist/esm/math/collision-primitives.d.ts.map +1 -1
- package/dist/esm/math/collision-primitives.js +4 -1
- package/dist/esm/math/collision-primitives.js.map +1 -1
- package/dist/esm/rendering/BackendTargetPass.d.ts +1 -1
- package/dist/esm/rendering/BackendTargetPass.d.ts.map +1 -1
- package/dist/esm/rendering/CallbackRenderPass.d.ts +14 -10
- package/dist/esm/rendering/CallbackRenderPass.d.ts.map +1 -1
- package/dist/esm/rendering/CallbackRenderPass.js +16 -11
- package/dist/esm/rendering/CallbackRenderPass.js.map +1 -1
- package/dist/esm/rendering/DrawContext.d.ts +48 -0
- package/dist/esm/rendering/DrawContext.d.ts.map +1 -0
- package/dist/esm/rendering/PassContext.d.ts +42 -0
- package/dist/esm/rendering/PassContext.d.ts.map +1 -0
- package/dist/esm/rendering/PassContext.js +48 -0
- package/dist/esm/rendering/PassContext.js.map +1 -0
- package/dist/esm/rendering/RenderBackend.d.ts +14 -0
- package/dist/esm/rendering/RenderBackend.d.ts.map +1 -1
- package/dist/esm/rendering/RenderNode.d.ts.map +1 -1
- package/dist/esm/rendering/RenderNode.js +2 -2
- package/dist/esm/rendering/RenderNode.js.map +1 -1
- package/dist/esm/rendering/RenderNodePass.d.ts +1 -1
- package/dist/esm/rendering/RenderNodePass.d.ts.map +1 -1
- package/dist/esm/rendering/RenderingContext.d.ts +47 -16
- package/dist/esm/rendering/RenderingContext.d.ts.map +1 -1
- package/dist/esm/rendering/RenderingContext.js +134 -36
- package/dist/esm/rendering/RenderingContext.js.map +1 -1
- package/dist/esm/rendering/TransformBuffer.d.ts +23 -0
- package/dist/esm/rendering/TransformBuffer.d.ts.map +1 -1
- package/dist/esm/rendering/TransformBuffer.js +58 -0
- package/dist/esm/rendering/TransformBuffer.js.map +1 -1
- package/dist/esm/rendering/View.d.ts +38 -0
- package/dist/esm/rendering/View.d.ts.map +1 -1
- package/dist/esm/rendering/View.js +37 -0
- package/dist/esm/rendering/View.js.map +1 -1
- package/dist/esm/rendering/filters/WebGpuShaderFilter.d.ts.map +1 -1
- package/dist/esm/rendering/filters/WebGpuShaderFilter.js +9 -2
- package/dist/esm/rendering/filters/WebGpuShaderFilter.js.map +1 -1
- package/dist/esm/rendering/material/MeshMaterial.d.ts +20 -1
- package/dist/esm/rendering/material/MeshMaterial.d.ts.map +1 -1
- package/dist/esm/rendering/material/MeshMaterial.js +17 -0
- package/dist/esm/rendering/material/MeshMaterial.js.map +1 -1
- package/dist/esm/rendering/material/SpriteMaterial.d.ts +20 -1
- package/dist/esm/rendering/material/SpriteMaterial.d.ts.map +1 -1
- package/dist/esm/rendering/material/SpriteMaterial.js +17 -0
- package/dist/esm/rendering/material/SpriteMaterial.js.map +1 -1
- package/dist/esm/rendering/plan/RenderEffectExecutor.d.ts.map +1 -1
- package/dist/esm/rendering/plan/RenderEffectExecutor.js +7 -2
- package/dist/esm/rendering/plan/RenderEffectExecutor.js.map +1 -1
- package/dist/esm/rendering/plan/RenderInstruction.d.ts +5 -2
- package/dist/esm/rendering/plan/RenderInstruction.d.ts.map +1 -1
- package/dist/esm/rendering/plan/RenderPlanBuilder.d.ts.map +1 -1
- package/dist/esm/rendering/plan/RenderPlanBuilder.js +23 -5
- package/dist/esm/rendering/plan/RenderPlanBuilder.js.map +1 -1
- package/dist/esm/rendering/plan/RenderScope.d.ts +7 -0
- package/dist/esm/rendering/plan/RenderScope.d.ts.map +1 -1
- package/dist/esm/rendering/primitives/Graphics.d.ts +17 -1
- package/dist/esm/rendering/primitives/Graphics.d.ts.map +1 -1
- package/dist/esm/rendering/primitives/Graphics.js +50 -15
- package/dist/esm/rendering/primitives/Graphics.js.map +1 -1
- package/dist/esm/rendering/public.d.ts +5 -5
- package/dist/esm/rendering/public.d.ts.map +1 -1
- package/dist/esm/rendering/sprite/AnimatedSprite.d.ts +57 -19
- package/dist/esm/rendering/sprite/AnimatedSprite.d.ts.map +1 -1
- package/dist/esm/rendering/sprite/AnimatedSprite.js +138 -31
- package/dist/esm/rendering/sprite/AnimatedSprite.js.map +1 -1
- package/dist/esm/rendering/sprite/Sprite.d.ts.map +1 -1
- package/dist/esm/rendering/sprite/Sprite.js +8 -0
- package/dist/esm/rendering/sprite/Sprite.js.map +1 -1
- package/dist/esm/rendering/text/BitmapText.d.ts.map +1 -1
- package/dist/esm/rendering/text/BitmapText.js +2 -0
- package/dist/esm/rendering/text/BitmapText.js.map +1 -1
- package/dist/esm/rendering/text/HTMLText.d.ts.map +1 -1
- package/dist/esm/rendering/text/HTMLText.js +2 -2
- package/dist/esm/rendering/text/HTMLText.js.map +1 -1
- package/dist/esm/rendering/text/Text.d.ts.map +1 -1
- package/dist/esm/rendering/text/Text.js +2 -0
- package/dist/esm/rendering/text/Text.js.map +1 -1
- package/dist/esm/rendering/text/TextLayout.d.ts.map +1 -1
- package/dist/esm/rendering/text/TextLayout.js +2 -3
- package/dist/esm/rendering/text/TextLayout.js.map +1 -1
- package/dist/esm/rendering/types.d.ts +37 -13
- package/dist/esm/rendering/types.d.ts.map +1 -1
- package/dist/esm/rendering/types.js +37 -13
- package/dist/esm/rendering/types.js.map +1 -1
- package/dist/esm/rendering/webgl2/WebGl2BackdropBlendCompositor.d.ts +41 -0
- package/dist/esm/rendering/webgl2/WebGl2BackdropBlendCompositor.d.ts.map +1 -0
- package/dist/esm/rendering/webgl2/WebGl2BackdropBlendCompositor.js +222 -0
- package/dist/esm/rendering/webgl2/WebGl2BackdropBlendCompositor.js.map +1 -0
- package/dist/esm/rendering/webgl2/WebGl2Backend.d.ts +34 -1
- package/dist/esm/rendering/webgl2/WebGl2Backend.d.ts.map +1 -1
- package/dist/esm/rendering/webgl2/WebGl2Backend.js +108 -60
- package/dist/esm/rendering/webgl2/WebGl2Backend.js.map +1 -1
- package/dist/esm/rendering/webgl2/WebGl2TextRenderer.d.ts.map +1 -1
- package/dist/esm/rendering/webgl2/WebGl2TextRenderer.js +50 -11
- package/dist/esm/rendering/webgl2/WebGl2TextRenderer.js.map +1 -1
- package/dist/esm/rendering/webgl2/glsl/backdrop-blend.frag.js +4 -0
- package/dist/esm/rendering/webgl2/glsl/backdrop-blend.frag.js.map +1 -0
- package/dist/esm/rendering/webgl2/glsl/backdrop-blend.vert.js +4 -0
- package/dist/esm/rendering/webgl2/glsl/backdrop-blend.vert.js.map +1 -0
- package/dist/esm/rendering/webgl2/glsl/text.vert.js +1 -1
- package/dist/esm/rendering/webgpu/WebGpuBackdropBlendCompositor.d.ts +72 -0
- package/dist/esm/rendering/webgpu/WebGpuBackdropBlendCompositor.d.ts.map +1 -0
- package/dist/esm/rendering/webgpu/WebGpuBackdropBlendCompositor.js +494 -0
- package/dist/esm/rendering/webgpu/WebGpuBackdropBlendCompositor.js.map +1 -0
- package/dist/esm/rendering/webgpu/WebGpuBackend.d.ts +27 -0
- package/dist/esm/rendering/webgpu/WebGpuBackend.d.ts.map +1 -1
- package/dist/esm/rendering/webgpu/WebGpuBackend.js +157 -60
- package/dist/esm/rendering/webgpu/WebGpuBackend.js.map +1 -1
- package/dist/esm/rendering/webgpu/WebGpuBlendState.d.ts.map +1 -1
- package/dist/esm/rendering/webgpu/WebGpuBlendState.js +5 -29
- package/dist/esm/rendering/webgpu/WebGpuBlendState.js.map +1 -1
- package/dist/esm/rendering/webgpu/WebGpuMaskCompositor.d.ts +2 -0
- package/dist/esm/rendering/webgpu/WebGpuMaskCompositor.d.ts.map +1 -1
- package/dist/esm/rendering/webgpu/WebGpuMaskCompositor.js +2 -1
- package/dist/esm/rendering/webgpu/WebGpuMaskCompositor.js.map +1 -1
- package/dist/esm/rendering/webgpu/WebGpuMeshRenderer.d.ts +4 -0
- package/dist/esm/rendering/webgpu/WebGpuMeshRenderer.d.ts.map +1 -1
- package/dist/esm/rendering/webgpu/WebGpuMeshRenderer.js +3 -1
- package/dist/esm/rendering/webgpu/WebGpuMeshRenderer.js.map +1 -1
- package/dist/esm/rendering/webgpu/WebGpuNineSliceSpriteRenderer.d.ts +2 -0
- package/dist/esm/rendering/webgpu/WebGpuNineSliceSpriteRenderer.d.ts.map +1 -1
- package/dist/esm/rendering/webgpu/WebGpuNineSliceSpriteRenderer.js +2 -1
- package/dist/esm/rendering/webgpu/WebGpuNineSliceSpriteRenderer.js.map +1 -1
- package/dist/esm/rendering/webgpu/WebGpuPassCoordinator.d.ts +8 -0
- package/dist/esm/rendering/webgpu/WebGpuPassCoordinator.d.ts.map +1 -1
- package/dist/esm/rendering/webgpu/WebGpuPassCoordinator.js +20 -0
- package/dist/esm/rendering/webgpu/WebGpuPassCoordinator.js.map +1 -1
- package/dist/esm/rendering/webgpu/WebGpuRepeatingSpriteRenderer.d.ts +6 -0
- package/dist/esm/rendering/webgpu/WebGpuRepeatingSpriteRenderer.d.ts.map +1 -1
- package/dist/esm/rendering/webgpu/WebGpuRepeatingSpriteRenderer.js +4 -1
- package/dist/esm/rendering/webgpu/WebGpuRepeatingSpriteRenderer.js.map +1 -1
- package/dist/esm/rendering/webgpu/WebGpuSpriteRenderer.d.ts +2 -0
- package/dist/esm/rendering/webgpu/WebGpuSpriteRenderer.d.ts.map +1 -1
- package/dist/esm/rendering/webgpu/WebGpuSpriteRenderer.js +2 -1
- package/dist/esm/rendering/webgpu/WebGpuSpriteRenderer.js.map +1 -1
- package/dist/esm/rendering/webgpu/WebGpuStencilClipper.d.ts +2 -0
- package/dist/esm/rendering/webgpu/WebGpuStencilClipper.d.ts.map +1 -1
- package/dist/esm/rendering/webgpu/WebGpuStencilClipper.js +2 -1
- package/dist/esm/rendering/webgpu/WebGpuStencilClipper.js.map +1 -1
- package/dist/esm/rendering/webgpu/WebGpuTextRenderer.d.ts +2 -0
- package/dist/esm/rendering/webgpu/WebGpuTextRenderer.d.ts.map +1 -1
- package/dist/esm/rendering/webgpu/WebGpuTextRenderer.js +3 -2
- package/dist/esm/rendering/webgpu/WebGpuTextRenderer.js.map +1 -1
- package/dist/esm/rendering/webgpu/WebGpuTransformStorage.d.ts +3 -1
- package/dist/esm/rendering/webgpu/WebGpuTransformStorage.d.ts.map +1 -1
- package/dist/esm/rendering/webgpu/WebGpuTransformStorage.js +29 -5
- package/dist/esm/rendering/webgpu/WebGpuTransformStorage.js.map +1 -1
- package/dist/esm/resources/Loader.d.ts +13 -0
- package/dist/esm/resources/Loader.d.ts.map +1 -1
- package/dist/esm/resources/Loader.js +67 -7
- package/dist/esm/resources/Loader.js.map +1 -1
- package/dist/esm/resources/coreAssetBindings.d.ts +11 -0
- package/dist/esm/resources/coreAssetBindings.d.ts.map +1 -1
- package/dist/esm/resources/coreAssetBindings.js +10 -2
- package/dist/esm/resources/coreAssetBindings.js.map +1 -1
- package/dist/esm/ui/ScrollContainer.d.ts +63 -0
- package/dist/esm/ui/ScrollContainer.d.ts.map +1 -0
- package/dist/esm/ui/ScrollContainer.js +99 -0
- package/dist/esm/ui/ScrollContainer.js.map +1 -0
- package/dist/esm/ui/Tooltip.d.ts +67 -0
- package/dist/esm/ui/Tooltip.d.ts.map +1 -0
- package/dist/esm/ui/Tooltip.js +133 -0
- package/dist/esm/ui/Tooltip.js.map +1 -0
- package/dist/esm/ui/index.d.ts +4 -0
- package/dist/esm/ui/index.d.ts.map +1 -1
- package/dist/exo.debug.esm.js +1 -1
- package/dist/exo.debug.esm.js.map +1 -1
- package/dist/exo.esm.js +1 -1
- package/dist/exo.esm.js.map +1 -1
- package/dist/exo.iife.js +45273 -0
- package/dist/exo.iife.js.map +1 -0
- package/dist/exo.iife.min.js +2 -0
- package/dist/exo.iife.min.js.map +1 -0
- package/package.json +15 -3
- package/dist/esm/rendering/Camera.d.ts +0 -34
- package/dist/esm/rendering/Camera.d.ts.map +0 -1
- package/dist/esm/rendering/Camera.js +0 -38
- package/dist/esm/rendering/Camera.js.map +0 -1
package/CHANGELOG.md
CHANGED
|
@@ -4,6 +4,189 @@ All notable changes to ExoJS are documented in this file.
|
|
|
4
4
|
|
|
5
5
|
The format follows [Keep a Changelog](https://keepachangelog.com/en/1.1.0/) and the project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
|
|
6
6
|
|
|
7
|
+
## [0.15.1] - 2026-07-04
|
|
8
|
+
|
|
9
|
+
Bugfix release. Twelve engine defects back-ported from the v0.16 line —
|
|
10
|
+
notably several long-standing collision-detection and vector-math errors
|
|
11
|
+
that affect physics-adjacent code.
|
|
12
|
+
|
|
13
|
+
### Fixed
|
|
14
|
+
|
|
15
|
+
- **Collision: circle-vs-polygon false negatives.** `Collision.intersects.circlePoly`
|
|
16
|
+
used a sign-inverted frame transform, so circles deep inside a polygon or
|
|
17
|
+
overlapping most of its edges/vertices were reported as _not_ intersecting;
|
|
18
|
+
a second defect in the right-Voronoi exclusion measured the distance to the
|
|
19
|
+
wrong vertex. Both now mirror the (correct) `Collision.resolve.polygonCircle`.
|
|
20
|
+
- **Collision: circle-vs-circle MTV magnitude.** `Collision.resolve.circleCircle`
|
|
21
|
+
scaled the _unnormalized_ center delta by the overlap, making `projectionV`'s
|
|
22
|
+
magnitude `distance × overlap` instead of `overlap` as documented (and as
|
|
23
|
+
every other resolver computes it).
|
|
24
|
+
- **Positioned polygons.** `Polygon.project()` and `Polygon.contains()` (via
|
|
25
|
+
`Collision.intersects.pointPoly`) ignored the polygon's `x`/`y` position, so
|
|
26
|
+
every SAT path and point containment test was wrong for polygons placed via
|
|
27
|
+
their position instead of baked-in point coordinates.
|
|
28
|
+
- **Vector angle convention.** The `angle` getter measured from the positive
|
|
29
|
+
Y-axis (`atan2(x, y)`) while the angle/length setters and `PolarVector` use
|
|
30
|
+
the standard X-axis convention. The getter now returns `atan2(y, x)`: setting
|
|
31
|
+
`angle` rotates as documented, setting `length` preserves direction, and
|
|
32
|
+
`PolarVector.fromVector(v).toVector()` round-trips again.
|
|
33
|
+
- **`ObservableVector.angle`/`length` accessors.** Setter-only overrides
|
|
34
|
+
shadowed the inherited getters, so reads returned `undefined` and the setters
|
|
35
|
+
NaNed the vector. The getters are now declared alongside the overrides.
|
|
36
|
+
- **Text: justify with monospace fonts.** `align: 'justify'` detected word
|
|
37
|
+
boundaries by comparing glyph advances against the space glyph, which breaks
|
|
38
|
+
down when every glyph shares the same advance. Boundaries are now detected
|
|
39
|
+
from the characters themselves.
|
|
40
|
+
- **Root-absolute sub-asset paths.** The BmFont page, Tiled TMJ→TSJ→image, and
|
|
41
|
+
Aseprite sheet-image resolvers stripped the leading slash from root-absolute
|
|
42
|
+
bases, so sub-assets 404ed when an app was deployed under a sub-path.
|
|
43
|
+
- **Anchored sprites across texture-frame changes.** `AnimatedSprite` kept a
|
|
44
|
+
stale pixel origin when switching from the full atlas to a frame (rendering
|
|
45
|
+
far off-canvas), and origins were derived from world bounds, double-applying
|
|
46
|
+
scale when the anchor was set after transforming. Origins now re-derive from
|
|
47
|
+
local bounds on frame changes.
|
|
48
|
+
- **Debug layers invisible.** `BoundingBoxesLayer`, `HitTestLayer`,
|
|
49
|
+
`PerformanceLayer`, and `RenderPassInspectorLayer` built colors with 0..1
|
|
50
|
+
components where `Color` expects 0..255, drawing black-on-black.
|
|
51
|
+
- **Shape outline gaps.** Stroked `Graphics` primitives (`drawRectangle`,
|
|
52
|
+
`drawCircle`, …) never stroked the closing segment, leaving every outline
|
|
53
|
+
visibly open at its start corner.
|
|
54
|
+
- **Spatializable position setter.** `Voice.position` now accepts any `{ x, y }`
|
|
55
|
+
point (values are copied), matching the documented usage for moving a live
|
|
56
|
+
spatial voice.
|
|
57
|
+
|
|
58
|
+
## [0.15.0] - 2026-07-02
|
|
59
|
+
|
|
60
|
+
The rendering-views and audio-effects release. Core's render surface is
|
|
61
|
+
reworked around `View` (folding in `Camera`), a scoped `PassContext` that
|
|
62
|
+
stops pass callbacks from leaking state across targets, and multi-view
|
|
63
|
+
viewport parity between WebGL2 and WebGPU (split-screen, picture-in-picture,
|
|
64
|
+
minimaps). `@codexo/exojs-audio-fx` gains ten new insert effects and a
|
|
65
|
+
flagship-hardened `BeatDetector` (correct tempo tracking across 50–300 BPM,
|
|
66
|
+
92–99% recall, 1–4 ms beat offsets). `@codexo/exojs-ldtk`, `-aseprite`, and
|
|
67
|
+
`-tiled` reach format completeness (multi-world LDtk, Aseprite frame
|
|
68
|
+
direction/repeat/slices, structured Tiled/LDtk property values). This is a
|
|
69
|
+
pre-1.0 release and includes intentional breaking changes; see **Changed**
|
|
70
|
+
and **Removed**.
|
|
71
|
+
|
|
72
|
+
### Added
|
|
73
|
+
|
|
74
|
+
- **View API.** `View.from(options)` (`center`/`size`/`viewport`/`rotation`/
|
|
75
|
+
`zoom`) and a fluent `View.setViewport(x, y, w, h)` using SFML-style
|
|
76
|
+
normalized (0..1) viewport rectangles, enabling split-screen,
|
|
77
|
+
picture-in-picture, and minimap compositions (#217).
|
|
78
|
+
- **Scoped pass context.** `DrawContext` and `PassContext` give a pass
|
|
79
|
+
callback a read-only `target`/`view` and route `clear`/`render`/`renderTo`/
|
|
80
|
+
`draw*` through the owning `RenderingContext`, so a callback can no longer
|
|
81
|
+
reset the active view or leak draws onto another target (#217).
|
|
82
|
+
- **`@codexo/exojs-audio-fx` — ten new insert effects.** Native:
|
|
83
|
+
`DistortionEffect`, `PhaserEffect`, `FlangerEffect`, `TremoloEffect`
|
|
84
|
+
(auto-pan), `PingPongDelayEffect`, `LimiterEffect`, `AutoWahEffect`,
|
|
85
|
+
`RingModulatorEffect`, `ConvolutionEffect` (real impulse-response
|
|
86
|
+
convolution via `ConvolverNode`). Worklet: `BitCrusherEffect`. Each follows
|
|
87
|
+
the dry/wet-gain, bypass-until-ready, ramped-setter template (#219, #221).
|
|
88
|
+
- **`WorkletEffect` dry/wet gain-staging primitive.** Dry/wet fan-out and a
|
|
89
|
+
`wet` getter/setter move into the `WorkletEffect` base class, plus
|
|
90
|
+
dry-latency compensation (a dry-path `DelayNode` time-aligned to each
|
|
91
|
+
worklet's algorithmic latency); `PitchShiftEffect`, `GranularEffect`, and
|
|
92
|
+
`VocoderEffect` migrate to emit pure wet through the shared base (#220).
|
|
93
|
+
- **`PitchShiftEffect` SOLA algorithm** replacing the previous approach, with
|
|
94
|
+
acoustic-contract tests across the worklet effects (#218).
|
|
95
|
+
- **`BeatDetector` flagship hardening.** Octave-error fix (mean-subtracted
|
|
96
|
+
ACF, log-Gaussian metric prior, subdivision-aware super-harmonic penalty,
|
|
97
|
+
and 3:2/2:3 hysteresis), adaptive onset detection, a bounded PLL phase
|
|
98
|
+
tracker, dual fast/stable tempo windows, and provisional/locked beat
|
|
99
|
+
states. Correct tempo across 50–300 BPM (previously locked to a
|
|
100
|
+
sub-harmonic above ~90 BPM), recall 92–99% (previously 11–42%), beat
|
|
101
|
+
offsets 1–4 ms. A seeded synthetic testbench and committed golden baseline
|
|
102
|
+
make the detector objectively measurable (#221).
|
|
103
|
+
- **`AnimatedSprite.repeat`** — finite N-cycle playback (`-1` loops
|
|
104
|
+
indefinitely, `1` plays once, `N` plays exactly N cycles), replacing
|
|
105
|
+
`loop: boolean`. Aseprite `direction` (pingpong/reverse) frame expansion,
|
|
106
|
+
`slices` exposure, per-frame `frameDurations` (hold-frame timing), and
|
|
107
|
+
`frameOffsets` (trim/`spriteSourceSize` anchoring) (#222).
|
|
108
|
+
- **LDtk format completeness.** External `.ldtkl` level resolution, IntGrid
|
|
109
|
+
value exposure, level `fieldInstances`, entity pivot correction, and
|
|
110
|
+
multi-world support (`worlds[]` flattened with an `ldtkWorldIid` tag,
|
|
111
|
+
single-world docs unaffected) (#222).
|
|
112
|
+
- **Structured `TilePropertyValue` variants** (Point/EntityRef/Tile) for LDtk
|
|
113
|
+
fields and Tiled `object`/`class`-typed custom properties, previously
|
|
114
|
+
dropped or left untagged (#222).
|
|
115
|
+
- **`WheelJoint` suspension-travel limit** (`enableLimit`/`lowerTranslation`/
|
|
116
|
+
`upperTranslation`), matching `PrismaticJoint`'s existing limit (#224).
|
|
117
|
+
- **React `useSignal` hook** bridges an engine `Signal` into React via
|
|
118
|
+
`useSyncExternalStore`; `ExoCanvas`/`useExoApplication` gain an `onError`
|
|
119
|
+
counterpart to `onReady`, wired to `Application.onError` (#224).
|
|
120
|
+
- **WebGPU CI lane** now runs against Mesa lavapipe (a real Vulkan software
|
|
121
|
+
rasterizer) as a required, blocking check, with real GPU-side pixel
|
|
122
|
+
readback and a WGSL compile-coverage test mirroring the existing GLSL one
|
|
123
|
+
(#222).
|
|
124
|
+
|
|
125
|
+
### Changed
|
|
126
|
+
|
|
127
|
+
- **BREAKING — `Camera` folded into `View`.** The `Camera` class is removed;
|
|
128
|
+
`RenderingContext.camera` becomes `RenderingContext.view` (the `view` alias
|
|
129
|
+
is gone). `screenView` is unchanged (#217).
|
|
130
|
+
- **BREAKING — `CallbackRenderPass` callbacks receive a `PassContext`**
|
|
131
|
+
instead of the raw `RenderingContext`. The previous allocating `renderTo`
|
|
132
|
+
is renamed `capture()`; a new caller-owned `renderTo` (accepting `target`,
|
|
133
|
+
`view`, and `clear`) and coordinator-routed `context.clear(color)` are
|
|
134
|
+
added (#217).
|
|
135
|
+
- **Graphics fill is now opt-in.** `drawRectangle`/`drawCircle`/etc. no
|
|
136
|
+
longer build a hidden opaque-black fill mesh by default — outline-only
|
|
137
|
+
shapes stop silently painting a fill (#217).
|
|
138
|
+
- **Multi-view viewport parity.** WebGL2 partial top-left viewports
|
|
139
|
+
(split-screen/picture-in-picture/minimap) no longer land at the wrong edge
|
|
140
|
+
(GL's viewport origin is bottom-left); WebGPU's pass coordinator now
|
|
141
|
+
applies the active view's viewport to match. Any view used in a render
|
|
142
|
+
ticks its follow/shake automatically next frame — `trackView`/`untrackView`
|
|
143
|
+
are now only an escape hatch (#217).
|
|
144
|
+
- **Raw `console.*` calls routed through the DEV-gated logger.**
|
|
145
|
+
`Tween`/`Application`/`SceneManager`/`HTMLText` warnings and errors go
|
|
146
|
+
through `logger`/`warnOnce` instead of `console.*`, so they no longer ship
|
|
147
|
+
in production builds (#216).
|
|
148
|
+
- **`LimiterEffect.ratio`/`.knee`** are now configurable, matching sibling
|
|
149
|
+
`CompressorEffect` (defaults unchanged) (#224).
|
|
150
|
+
- **German (`de/`) locale pages** render the real English content directly
|
|
151
|
+
instead of a "translation coming soon" stub (#224).
|
|
152
|
+
|
|
153
|
+
### Removed
|
|
154
|
+
|
|
155
|
+
- **BREAKING — `PhysicsWorldOptions.interpolation` and
|
|
156
|
+
`BindingOptions.drive: 'node-to-body'`** — both were documented as
|
|
157
|
+
"reserved, no effect yet" and referenced nowhere (#224).
|
|
158
|
+
|
|
159
|
+
### Fixed
|
|
160
|
+
|
|
161
|
+
- **WebGL2 text rendering.** `WebGl2TextRenderer` bypassed the backend's
|
|
162
|
+
texture-unit cache when binding its node-data texture; when text rendered
|
|
163
|
+
first in a frame the atlas bound to the wrong unit and every glyph went
|
|
164
|
+
transparent (#215).
|
|
165
|
+
- **Gamepad input froze after connect.** `InputManager.updateGamepads` never
|
|
166
|
+
re-read `navigator.getGamepads()` for already-connected pads; button/axis
|
|
167
|
+
state is now polled fresh every frame (#215).
|
|
168
|
+
- **WebGPU shader filters rendered a black screen** (`crt-scanlines`,
|
|
169
|
+
`chromatic-aberration`) when the canvas' preferred texture format differed
|
|
170
|
+
from the filter's offscreen `rgba8unorm` output — `WebGpuShaderFilter`
|
|
171
|
+
cached its pipeline against whichever format was bound at first use instead
|
|
172
|
+
of its own output texture's format (#226).
|
|
173
|
+
- Audio-fx ducking logged a spurious `setTargetAtTime` out-of-range warning
|
|
174
|
+
every frame; its attack/release params are `[0,1]` smoothing coefficients,
|
|
175
|
+
not times (#215).
|
|
176
|
+
- Several playground examples (svg-drawable, trail-feedback,
|
|
177
|
+
tiled-physics-actor) fixed: a 0×0 rasterized SVG texture, a render-target
|
|
178
|
+
feedback loop, and a broken relative import in the playground's import map
|
|
179
|
+
(#215).
|
|
180
|
+
|
|
181
|
+
### Docs
|
|
182
|
+
|
|
183
|
+
- Audio effects guide extended with all ten effects added in #218–#221;
|
|
184
|
+
README quickstart switched to the `load()` lifecycle hook (#223).
|
|
185
|
+
- Guide coverage catch-up: the full 18-mode W3C blend suite, `Tooltip`/
|
|
186
|
+
`ScrollContainer` widgets, loader progress signals and `Logger`, live
|
|
187
|
+
`sizingMode`/`clearColor`, `cullArea`, `fixedUpdate`/`frameAlpha`, and the
|
|
188
|
+
IIFE/CDN bundle path (#225).
|
|
189
|
+
|
|
7
190
|
## [0.14.0] - 2026-06-26
|
|
8
191
|
|
|
9
192
|
The architecture and hardening release. Two new packages —
|
package/README.md
CHANGED
|
@@ -106,14 +106,12 @@ npm install @codexo/exojs-audio-fx
|
|
|
106
106
|
## Quickstart
|
|
107
107
|
|
|
108
108
|
```ts
|
|
109
|
-
import { Application, Scene, Graphics, Color, type RenderingContext, type Time } from '@codexo/exojs';
|
|
109
|
+
import { Application, Scene, Graphics, Color, Loader, type RenderingContext, type Time } from '@codexo/exojs';
|
|
110
110
|
|
|
111
111
|
class HelloScene extends Scene {
|
|
112
112
|
private readonly box = new Graphics();
|
|
113
113
|
|
|
114
|
-
public
|
|
115
|
-
super();
|
|
116
|
-
|
|
114
|
+
public override init(loader: Loader): void {
|
|
117
115
|
this.box.fillColor = Color.white;
|
|
118
116
|
this.box.drawRectangle(-32, -32, 64, 64);
|
|
119
117
|
this.box.setPosition(400, 300);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Tween.d.ts","sourceRoot":"","sources":["../../../src/animation/Tween.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"Tween.d.ts","sourceRoot":"","sources":["../../../src/animation/Tween.ts"],"names":[],"mappings":"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"}
|
|
@@ -299,7 +299,6 @@ class Tween {
|
|
|
299
299
|
for (const key of keys) {
|
|
300
300
|
const val = this._target[key];
|
|
301
301
|
if (typeof val !== 'number') {
|
|
302
|
-
console.warn(`Tween: property "${String(key)}" is not a number on target ` + `(got ${typeof val}). It will be skipped.`);
|
|
303
302
|
continue;
|
|
304
303
|
}
|
|
305
304
|
snap[String(key)] = val;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Tween.js","sources":["../../../../src/animation/Tween.ts"],"sourcesContent":[null],"names":[],"mappings":";;;
|
|
1
|
+
{"version":3,"file":"Tween.js","sources":["../../../../src/animation/Tween.ts"],"sourcesContent":[null],"names":[],"mappings":"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"}
|
|
@@ -1,12 +1,20 @@
|
|
|
1
1
|
import type { System } from '#core/System';
|
|
2
2
|
import type { Time } from '#core/Time';
|
|
3
3
|
import { Tween } from './Tween';
|
|
4
|
+
import { TweenSequencer } from './TweenSequencer';
|
|
5
|
+
/** Any object that can be driven each frame by a delta in seconds. @internal */
|
|
6
|
+
interface Ticker {
|
|
7
|
+
update(deltaSeconds: number): void;
|
|
8
|
+
}
|
|
4
9
|
/**
|
|
5
10
|
* Owns and advances a collection of {@link Tween} instances, driving them
|
|
6
11
|
* once per frame from {@link Application.update}. Created tweens are tracked
|
|
7
12
|
* automatically; manually constructed tweens can be opted in via
|
|
8
13
|
* {@link TweenManager.add}.
|
|
9
14
|
*
|
|
15
|
+
* Custom updatables (such as {@link TweenSequencer}) can be registered via
|
|
16
|
+
* {@link TweenManager.addTicker} so they share the same frame tick.
|
|
17
|
+
*
|
|
10
18
|
* Update iteration uses a snapshot so callbacks may freely add or remove
|
|
11
19
|
* tweens during the same frame without corrupting the loop. Completed and
|
|
12
20
|
* stopped tweens are evicted automatically.
|
|
@@ -16,6 +24,7 @@ export declare class TweenManager implements System {
|
|
|
16
24
|
/** App-systems tick band — tweens after audio. @internal */
|
|
17
25
|
readonly order = 400;
|
|
18
26
|
private _tweens;
|
|
27
|
+
private _tickers;
|
|
19
28
|
private _destroyed;
|
|
20
29
|
/**
|
|
21
30
|
* Create a new Tween targeting `target`, register it with this manager, and
|
|
@@ -36,6 +45,22 @@ export declare class TweenManager implements System {
|
|
|
36
45
|
* ```
|
|
37
46
|
*/
|
|
38
47
|
sequence(tweens: readonly Tween[]): Tween;
|
|
48
|
+
/**
|
|
49
|
+
* Create a new {@link TweenSequencer} bound to this manager and return it.
|
|
50
|
+
* The sequencer registers itself automatically when {@link TweenSequencer.start}
|
|
51
|
+
* is called, so no manual wiring is needed.
|
|
52
|
+
*
|
|
53
|
+
* @example
|
|
54
|
+
* ```ts
|
|
55
|
+
* scene.tweens.createSequencer()
|
|
56
|
+
* .then(fadeIn)
|
|
57
|
+
* .wait(0.5)
|
|
58
|
+
* .then([moveLeft, scaleUp])
|
|
59
|
+
* .onComplete(() => console.log('done'))
|
|
60
|
+
* .start();
|
|
61
|
+
* ```
|
|
62
|
+
*/
|
|
63
|
+
createSequencer(): TweenSequencer;
|
|
39
64
|
/**
|
|
40
65
|
* Explicitly add a stand-alone Tween (created via `new Tween(target)`)
|
|
41
66
|
* to this manager so it participates in the update loop.
|
|
@@ -44,17 +69,31 @@ export declare class TweenManager implements System {
|
|
|
44
69
|
/** Remove a tween from the manager. Called automatically on stop/complete. */
|
|
45
70
|
remove(tween: Tween): this;
|
|
46
71
|
/**
|
|
47
|
-
*
|
|
48
|
-
*
|
|
49
|
-
*
|
|
72
|
+
* Register a custom updatable so it is driven each frame alongside tweens.
|
|
73
|
+
* Idempotent — registering the same ticker twice is a no-op.
|
|
74
|
+
*
|
|
75
|
+
* Used internally by {@link TweenSequencer}.
|
|
76
|
+
*/
|
|
77
|
+
addTicker(ticker: Ticker): this;
|
|
78
|
+
/**
|
|
79
|
+
* Remove a previously registered ticker. Called automatically by
|
|
80
|
+
* {@link TweenSequencer} when it completes or is stopped.
|
|
81
|
+
*/
|
|
82
|
+
removeTicker(ticker: Ticker): this;
|
|
83
|
+
/**
|
|
84
|
+
* Advance all active tweens by the frame `delta` (read as seconds), then
|
|
85
|
+
* advance all registered tickers. Ticked once per frame via
|
|
86
|
+
* {@link Application.systems}. Uses snapshots so callbacks that add or
|
|
87
|
+
* remove tweens/tickers do not corrupt mid-iteration.
|
|
50
88
|
*/
|
|
51
89
|
update(delta: Time): void;
|
|
52
90
|
/**
|
|
53
|
-
* Remove all tweens immediately. No callbacks
|
|
91
|
+
* Remove all tweens and tickers immediately. No callbacks fire.
|
|
54
92
|
* The tweens' states are left as-is; they are simply evicted from the list.
|
|
55
93
|
*/
|
|
56
94
|
clear(): this;
|
|
57
|
-
/** Tear down the manager. Clears tweens and makes subsequent updates no-ops. */
|
|
95
|
+
/** Tear down the manager. Clears tweens and tickers and makes subsequent updates no-ops. */
|
|
58
96
|
destroy(): void;
|
|
59
97
|
}
|
|
98
|
+
export {};
|
|
60
99
|
//# sourceMappingURL=TweenManager.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"TweenManager.d.ts","sourceRoot":"","sources":["../../../src/animation/TweenManager.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,cAAc,CAAC;AAC3C,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,YAAY,CAAC;AAEvC,OAAO,EAAE,KAAK,EAAE,MAAM,SAAS,CAAC;
|
|
1
|
+
{"version":3,"file":"TweenManager.d.ts","sourceRoot":"","sources":["../../../src/animation/TweenManager.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,cAAc,CAAC;AAC3C,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,YAAY,CAAC;AAEvC,OAAO,EAAE,KAAK,EAAE,MAAM,SAAS,CAAC;AAChC,OAAO,EAAE,cAAc,EAAE,MAAM,kBAAkB,CAAC;AAElD,gFAAgF;AAChF,UAAU,MAAM;IACd,MAAM,CAAC,YAAY,EAAE,MAAM,GAAG,IAAI,CAAC;CACpC;AAED;;;;;;;;;;;;;GAaG;AACH,qBAAa,YAAa,YAAW,MAAM;IACzC,4DAA4D;IAC5D,SAAgB,KAAK,OAAO;IAC5B,OAAO,CAAC,OAAO,CAAe;IAC9B,OAAO,CAAC,QAAQ,CAAgB;IAChC,OAAO,CAAC,UAAU,CAAS;IAE3B;;;OAGG;IACI,MAAM,CAAC,CAAC,SAAS,MAAM,EAAE,MAAM,EAAE,CAAC,GAAG,KAAK,CAAC,CAAC,CAAC;IAQpD;;;;;;;;;;;;OAYG;IACI,QAAQ,CAAC,MAAM,EAAE,SAAS,KAAK,EAAE,GAAG,KAAK;IAoBhD;;;;;;;;;;;;;;OAcG;IACI,eAAe,IAAI,cAAc;IAIxC;;;OAGG;IACI,GAAG,CAAC,KAAK,EAAE,KAAK,GAAG,IAAI;IAU9B,8EAA8E;IACvE,MAAM,CAAC,KAAK,EAAE,KAAK,GAAG,IAAI;IAUjC;;;;;OAKG;IACI,SAAS,CAAC,MAAM,EAAE,MAAM,GAAG,IAAI;IAQtC;;;OAGG;IACI,YAAY,CAAC,MAAM,EAAE,MAAM,GAAG,IAAI;IAUzC;;;;;OAKG;IACI,MAAM,CAAC,KAAK,EAAE,IAAI,GAAG,IAAI;IAgBhC;;;OAGG;IACI,KAAK,IAAI,IAAI;IAOpB,4FAA4F;IACrF,OAAO,IAAI,IAAI;CAIvB"}
|
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import { Tween } from './Tween.js';
|
|
2
|
+
import { TweenSequencer } from './TweenSequencer.js';
|
|
2
3
|
|
|
3
4
|
/**
|
|
4
5
|
* Owns and advances a collection of {@link Tween} instances, driving them
|
|
@@ -6,6 +7,9 @@ import { Tween } from './Tween.js';
|
|
|
6
7
|
* automatically; manually constructed tweens can be opted in via
|
|
7
8
|
* {@link TweenManager.add}.
|
|
8
9
|
*
|
|
10
|
+
* Custom updatables (such as {@link TweenSequencer}) can be registered via
|
|
11
|
+
* {@link TweenManager.addTicker} so they share the same frame tick.
|
|
12
|
+
*
|
|
9
13
|
* Update iteration uses a snapshot so callbacks may freely add or remove
|
|
10
14
|
* tweens during the same frame without corrupting the loop. Completed and
|
|
11
15
|
* stopped tweens are evicted automatically.
|
|
@@ -15,6 +19,7 @@ class TweenManager {
|
|
|
15
19
|
/** App-systems tick band — tweens after audio. @internal */
|
|
16
20
|
order = 400;
|
|
17
21
|
_tweens = [];
|
|
22
|
+
_tickers = [];
|
|
18
23
|
_destroyed = false;
|
|
19
24
|
/**
|
|
20
25
|
* Create a new Tween targeting `target`, register it with this manager, and
|
|
@@ -55,6 +60,24 @@ class TweenManager {
|
|
|
55
60
|
}
|
|
56
61
|
return first;
|
|
57
62
|
}
|
|
63
|
+
/**
|
|
64
|
+
* Create a new {@link TweenSequencer} bound to this manager and return it.
|
|
65
|
+
* The sequencer registers itself automatically when {@link TweenSequencer.start}
|
|
66
|
+
* is called, so no manual wiring is needed.
|
|
67
|
+
*
|
|
68
|
+
* @example
|
|
69
|
+
* ```ts
|
|
70
|
+
* scene.tweens.createSequencer()
|
|
71
|
+
* .then(fadeIn)
|
|
72
|
+
* .wait(0.5)
|
|
73
|
+
* .then([moveLeft, scaleUp])
|
|
74
|
+
* .onComplete(() => console.log('done'))
|
|
75
|
+
* .start();
|
|
76
|
+
* ```
|
|
77
|
+
*/
|
|
78
|
+
createSequencer() {
|
|
79
|
+
return new TweenSequencer(this);
|
|
80
|
+
}
|
|
58
81
|
/**
|
|
59
82
|
* Explicitly add a stand-alone Tween (created via `new Tween(target)`)
|
|
60
83
|
* to this manager so it participates in the update loop.
|
|
@@ -75,9 +98,33 @@ class TweenManager {
|
|
|
75
98
|
return this;
|
|
76
99
|
}
|
|
77
100
|
/**
|
|
78
|
-
*
|
|
79
|
-
*
|
|
80
|
-
*
|
|
101
|
+
* Register a custom updatable so it is driven each frame alongside tweens.
|
|
102
|
+
* Idempotent — registering the same ticker twice is a no-op.
|
|
103
|
+
*
|
|
104
|
+
* Used internally by {@link TweenSequencer}.
|
|
105
|
+
*/
|
|
106
|
+
addTicker(ticker) {
|
|
107
|
+
if (!this._tickers.includes(ticker)) {
|
|
108
|
+
this._tickers.push(ticker);
|
|
109
|
+
}
|
|
110
|
+
return this;
|
|
111
|
+
}
|
|
112
|
+
/**
|
|
113
|
+
* Remove a previously registered ticker. Called automatically by
|
|
114
|
+
* {@link TweenSequencer} when it completes or is stopped.
|
|
115
|
+
*/
|
|
116
|
+
removeTicker(ticker) {
|
|
117
|
+
const index = this._tickers.indexOf(ticker);
|
|
118
|
+
if (index !== -1) {
|
|
119
|
+
this._tickers.splice(index, 1);
|
|
120
|
+
}
|
|
121
|
+
return this;
|
|
122
|
+
}
|
|
123
|
+
/**
|
|
124
|
+
* Advance all active tweens by the frame `delta` (read as seconds), then
|
|
125
|
+
* advance all registered tickers. Ticked once per frame via
|
|
126
|
+
* {@link Application.systems}. Uses snapshots so callbacks that add or
|
|
127
|
+
* remove tweens/tickers do not corrupt mid-iteration.
|
|
81
128
|
*/
|
|
82
129
|
update(delta) {
|
|
83
130
|
if (this._destroyed)
|
|
@@ -86,16 +133,21 @@ class TweenManager {
|
|
|
86
133
|
for (const tween of snapshot) {
|
|
87
134
|
tween.update(delta.seconds);
|
|
88
135
|
}
|
|
136
|
+
const tickerSnapshot = [...this._tickers];
|
|
137
|
+
for (const ticker of tickerSnapshot) {
|
|
138
|
+
ticker.update(delta.seconds);
|
|
139
|
+
}
|
|
89
140
|
}
|
|
90
141
|
/**
|
|
91
|
-
* Remove all tweens immediately. No callbacks
|
|
142
|
+
* Remove all tweens and tickers immediately. No callbacks fire.
|
|
92
143
|
* The tweens' states are left as-is; they are simply evicted from the list.
|
|
93
144
|
*/
|
|
94
145
|
clear() {
|
|
95
146
|
this._tweens = [];
|
|
147
|
+
this._tickers = [];
|
|
96
148
|
return this;
|
|
97
149
|
}
|
|
98
|
-
/** Tear down the manager. Clears tweens and makes subsequent updates no-ops. */
|
|
150
|
+
/** Tear down the manager. Clears tweens and tickers and makes subsequent updates no-ops. */
|
|
99
151
|
destroy() {
|
|
100
152
|
this.clear();
|
|
101
153
|
this._destroyed = true;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"TweenManager.js","sources":["../../../../src/animation/TweenManager.ts"],"sourcesContent":[null],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"TweenManager.js","sources":["../../../../src/animation/TweenManager.ts"],"sourcesContent":[null],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,139 @@
|
|
|
1
|
+
import type { Tween } from './Tween';
|
|
2
|
+
import type { TweenManager } from './TweenManager';
|
|
3
|
+
/**
|
|
4
|
+
* Lifecycle states of a {@link TweenSequencer}. Mirrors {@link TweenState}
|
|
5
|
+
* semantics: starts `Idle`, becomes `Active` on {@link TweenSequencer.start},
|
|
6
|
+
* and ends in `Complete` (all stages exhausted) or `Stopped` (cancelled via
|
|
7
|
+
* {@link TweenSequencer.stop}). `Paused` is reachable from `Active` only.
|
|
8
|
+
*/
|
|
9
|
+
export declare enum TweenSequencerState {
|
|
10
|
+
Idle = "idle",
|
|
11
|
+
Active = "active",
|
|
12
|
+
Paused = "paused",
|
|
13
|
+
Complete = "complete",
|
|
14
|
+
Stopped = "stopped"
|
|
15
|
+
}
|
|
16
|
+
/**
|
|
17
|
+
* Composes multiple {@link Tween} instances into a multi-stage animation.
|
|
18
|
+
*
|
|
19
|
+
* Each stage added via {@link TweenSequencer.then} plays after the previous
|
|
20
|
+
* one finishes. Within a single stage, multiple tweens run simultaneously
|
|
21
|
+
* (parallel); the stage advances when **all** of them complete.
|
|
22
|
+
*
|
|
23
|
+
* Delay stages inserted via {@link TweenSequencer.wait} create a timed pause
|
|
24
|
+
* between stages without needing a dummy tween.
|
|
25
|
+
*
|
|
26
|
+
* The sequencer integrates with {@link TweenManager} via
|
|
27
|
+
* {@link TweenManager.addTicker} so it is driven automatically each frame.
|
|
28
|
+
* It can also be used stand-alone by calling {@link TweenSequencer.update}
|
|
29
|
+
* manually — in that mode the sequencer also advances its child tweens.
|
|
30
|
+
*
|
|
31
|
+
* @example
|
|
32
|
+
* ```ts
|
|
33
|
+
* app.tweens.createSequencer()
|
|
34
|
+
* .then(fadeIn)
|
|
35
|
+
* .wait(0.5)
|
|
36
|
+
* .then([moveLeft, scaleUp])
|
|
37
|
+
* .then(fadeOut)
|
|
38
|
+
* .onComplete(() => console.log('done!'))
|
|
39
|
+
* .start();
|
|
40
|
+
* ```
|
|
41
|
+
* @stable
|
|
42
|
+
*/
|
|
43
|
+
export declare class TweenSequencer {
|
|
44
|
+
private readonly _stages;
|
|
45
|
+
private _state;
|
|
46
|
+
private readonly _manager;
|
|
47
|
+
/** Index into `_stages` for the current pass (0-based). */
|
|
48
|
+
private _currentStageIndex;
|
|
49
|
+
/** 1 = forward through stages, -1 = reversed (yoyo pass). */
|
|
50
|
+
private _direction;
|
|
51
|
+
/** Remaining repeat cycles. -1 = infinite. */
|
|
52
|
+
private _repeatCount;
|
|
53
|
+
/** The value configured by {@link TweenSequencer.repeat}. Preserved for restart. */
|
|
54
|
+
private _repeatTotal;
|
|
55
|
+
private _yoyo;
|
|
56
|
+
/** Accumulated seconds within the current delay stage. */
|
|
57
|
+
private _delayElapsed;
|
|
58
|
+
private _onStartCb;
|
|
59
|
+
private _onCompleteCb;
|
|
60
|
+
private _startFired;
|
|
61
|
+
constructor(manager?: TweenManager);
|
|
62
|
+
/** Current lifecycle state of the sequencer. */
|
|
63
|
+
get state(): TweenSequencerState;
|
|
64
|
+
/**
|
|
65
|
+
* Playback progress in 0..1, advancing in discrete steps as each stage
|
|
66
|
+
* completes. Equals `1` when the entire sequence has finished.
|
|
67
|
+
*/
|
|
68
|
+
get progress(): number;
|
|
69
|
+
/**
|
|
70
|
+
* Append a stage to the sequence.
|
|
71
|
+
*
|
|
72
|
+
* - **Single tween**: the stage plays that tween, then advances.
|
|
73
|
+
* - **Array of tweens**: all start simultaneously; the stage advances when
|
|
74
|
+
* every tween in the array has completed.
|
|
75
|
+
*/
|
|
76
|
+
then(tween: Tween | Tween[]): this;
|
|
77
|
+
/** Insert a fixed pause of `seconds` between stages. */
|
|
78
|
+
wait(seconds: number): this;
|
|
79
|
+
/**
|
|
80
|
+
* Number of additional repeat cycles. -1 = infinite. Default 0 (plays once).
|
|
81
|
+
*
|
|
82
|
+
* `repeat(2)` plays the full sequence three times total (initial pass + 2
|
|
83
|
+
* repeats).
|
|
84
|
+
*/
|
|
85
|
+
repeat(count: number): this;
|
|
86
|
+
/**
|
|
87
|
+
* Reverse stage order on each repeat cycle. Only meaningful when combined
|
|
88
|
+
* with {@link TweenSequencer.repeat}.
|
|
89
|
+
*/
|
|
90
|
+
yoyo(enabled?: boolean): this;
|
|
91
|
+
/**
|
|
92
|
+
* Register a callback fired once on the first {@link TweenSequencer.update}
|
|
93
|
+
* call after {@link TweenSequencer.start}.
|
|
94
|
+
*/
|
|
95
|
+
onStart(cb: () => void): this;
|
|
96
|
+
/**
|
|
97
|
+
* Register a callback fired when the sequence finishes naturally (all stages
|
|
98
|
+
* and repeat cycles exhausted). Does NOT fire when stopped via
|
|
99
|
+
* {@link TweenSequencer.stop}.
|
|
100
|
+
*/
|
|
101
|
+
onComplete(cb: () => void): this;
|
|
102
|
+
/**
|
|
103
|
+
* Start (or restart) the sequence from stage 0. Resets all internal state
|
|
104
|
+
* and re-registers with the manager if one is attached.
|
|
105
|
+
*/
|
|
106
|
+
start(): this;
|
|
107
|
+
/**
|
|
108
|
+
* Pause the sequence. Tweens in the current stage are also paused. The
|
|
109
|
+
* elapsed timer in delay stages is frozen.
|
|
110
|
+
*/
|
|
111
|
+
pause(): this;
|
|
112
|
+
/** Resume a paused sequence (and its current-stage tweens) from where they left off. */
|
|
113
|
+
resume(): this;
|
|
114
|
+
/**
|
|
115
|
+
* Stop the sequence without finishing. Active tweens are stopped.
|
|
116
|
+
* {@link TweenSequencer.onComplete} does NOT fire. The sequencer is removed
|
|
117
|
+
* from its manager if one is assigned.
|
|
118
|
+
*/
|
|
119
|
+
stop(): this;
|
|
120
|
+
/**
|
|
121
|
+
* Advance the sequencer by `deltaSeconds`. Called automatically by the
|
|
122
|
+
* attached {@link TweenManager} each frame. When used stand-alone (no
|
|
123
|
+
* manager), call this manually and child tweens will also be advanced.
|
|
124
|
+
*/
|
|
125
|
+
update(deltaSeconds: number): void;
|
|
126
|
+
/**
|
|
127
|
+
* Map the logical `_currentStageIndex` to the real index in `_stages`,
|
|
128
|
+
* accounting for yoyo reversal.
|
|
129
|
+
*/
|
|
130
|
+
private _getActualStageIndex;
|
|
131
|
+
private _startCurrentStage;
|
|
132
|
+
private _advanceStage;
|
|
133
|
+
private _finish;
|
|
134
|
+
private _getCurrentStageTweens;
|
|
135
|
+
private _pauseCurrentStageTweens;
|
|
136
|
+
private _resumeCurrentStageTweens;
|
|
137
|
+
private _stopCurrentStageTweens;
|
|
138
|
+
}
|
|
139
|
+
//# sourceMappingURL=TweenSequencer.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"TweenSequencer.d.ts","sourceRoot":"","sources":["../../../src/animation/TweenSequencer.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,SAAS,CAAC;AACrC,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAC;AAenD;;;;;GAKG;AACH,oBAAY,mBAAmB;IAC7B,IAAI,SAAS;IACb,MAAM,WAAW;IACjB,MAAM,WAAW;IACjB,QAAQ,aAAa;IACrB,OAAO,YAAY;CACpB;AAED;;;;;;;;;;;;;;;;;;;;;;;;;;GA0BG;AACH,qBAAa,cAAc;IACzB,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAe;IACvC,OAAO,CAAC,MAAM,CAAiD;IAC/D,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAsB;IAE/C,2DAA2D;IAC3D,OAAO,CAAC,kBAAkB,CAAK;IAE/B,6DAA6D;IAC7D,OAAO,CAAC,UAAU,CAAa;IAE/B,8CAA8C;IAC9C,OAAO,CAAC,YAAY,CAAK;IACzB,oFAAoF;IACpF,OAAO,CAAC,YAAY,CAAK;IACzB,OAAO,CAAC,KAAK,CAAS;IAEtB,0DAA0D;IAC1D,OAAO,CAAC,aAAa,CAAK;IAE1B,OAAO,CAAC,UAAU,CAA6B;IAC/C,OAAO,CAAC,aAAa,CAA6B;IAClD,OAAO,CAAC,WAAW,CAAS;gBAET,OAAO,CAAC,EAAE,YAAY;IAMzC,gDAAgD;IAChD,IAAW,KAAK,IAAI,mBAAmB,CAEtC;IAED;;;OAGG;IACH,IAAW,QAAQ,IAAI,MAAM,CAI5B;IAID;;;;;;OAMG;IACI,IAAI,CAAC,KAAK,EAAE,KAAK,GAAG,KAAK,EAAE,GAAG,IAAI;IAMzC,wDAAwD;IACjD,IAAI,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI;IAKlC;;;;;OAKG;IACI,MAAM,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI;IAKlC;;;OAGG;IACI,IAAI,CAAC,OAAO,UAAO,GAAG,IAAI;IAKjC;;;OAGG;IACI,OAAO,CAAC,EAAE,EAAE,MAAM,IAAI,GAAG,IAAI;IAKpC;;;;OAIG;IACI,UAAU,CAAC,EAAE,EAAE,MAAM,IAAI,GAAG,IAAI;IAOvC;;;OAGG;IACI,KAAK,IAAI,IAAI;IAWpB;;;OAGG;IACI,KAAK,IAAI,IAAI;IAQpB,wFAAwF;IACjF,MAAM,IAAI,IAAI;IAQrB;;;;OAIG;IACI,IAAI,IAAI,IAAI;IAWnB;;;;OAIG;IACI,MAAM,CAAC,YAAY,EAAE,MAAM,GAAG,IAAI;IA2CzC;;;OAGG;IACH,OAAO,CAAC,oBAAoB;IAK5B,OAAO,CAAC,kBAAkB;IAmB1B,OAAO,CAAC,aAAa;IA0BrB,OAAO,CAAC,OAAO;IAMf,OAAO,CAAC,sBAAsB;IAQ9B,OAAO,CAAC,wBAAwB;IAMhC,OAAO,CAAC,yBAAyB;IAMjC,OAAO,CAAC,uBAAuB;CAKhC"}
|