@codexo/exojs 0.8.4 → 0.10.0
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 +99 -0
- package/README.md +34 -13
- package/dist/esm/animation/Tween.d.ts +20 -3
- package/dist/esm/animation/Tween.js +16 -8
- package/dist/esm/animation/Tween.js.map +1 -1
- package/dist/esm/animation/TweenManager.d.ts +16 -1
- package/dist/esm/animation/TweenManager.js +27 -2
- package/dist/esm/animation/TweenManager.js.map +1 -1
- package/dist/esm/audio/AudioAnalyser.d.ts +2 -0
- package/dist/esm/audio/AudioAnalyser.js +24 -9
- package/dist/esm/audio/AudioAnalyser.js.map +1 -1
- package/dist/esm/audio/AudioBus.d.ts +1 -0
- package/dist/esm/audio/AudioBus.js +8 -4
- package/dist/esm/audio/AudioBus.js.map +1 -1
- package/dist/esm/audio/AudioListener.d.ts +1 -0
- package/dist/esm/audio/AudioListener.js +7 -5
- package/dist/esm/audio/AudioListener.js.map +1 -1
- package/dist/esm/audio/AudioManager.d.ts +8 -2
- package/dist/esm/audio/AudioManager.js +14 -1
- package/dist/esm/audio/AudioManager.js.map +1 -1
- package/dist/esm/audio/BeatDetector.d.ts +2 -0
- package/dist/esm/audio/BeatDetector.js +27 -661
- package/dist/esm/audio/BeatDetector.js.map +1 -1
- package/dist/esm/audio/Music.d.ts +1 -0
- package/dist/esm/audio/Music.js +7 -3
- package/dist/esm/audio/Music.js.map +1 -1
- package/dist/esm/audio/OscillatorSound.d.ts +1 -0
- package/dist/esm/audio/OscillatorSound.js +7 -3
- package/dist/esm/audio/OscillatorSound.js.map +1 -1
- package/dist/esm/audio/Sound.d.ts +1 -0
- package/dist/esm/audio/Sound.js +7 -3
- package/dist/esm/audio/Sound.js.map +1 -1
- package/dist/esm/audio/audio-context.d.ts +2 -2
- package/dist/esm/audio/audio-context.js +4 -4
- package/dist/esm/audio/audio-context.js.map +1 -1
- package/dist/esm/audio/filters/ChorusFilter.d.ts +1 -0
- package/dist/esm/audio/filters/ChorusFilter.js +7 -3
- package/dist/esm/audio/filters/ChorusFilter.js.map +1 -1
- package/dist/esm/audio/filters/CompressorFilter.d.ts +1 -0
- package/dist/esm/audio/filters/CompressorFilter.js +7 -3
- package/dist/esm/audio/filters/CompressorFilter.js.map +1 -1
- package/dist/esm/audio/filters/DelayFilter.d.ts +1 -0
- package/dist/esm/audio/filters/DelayFilter.js +7 -3
- package/dist/esm/audio/filters/DelayFilter.js.map +1 -1
- package/dist/esm/audio/filters/EqualizerFilter.d.ts +1 -0
- package/dist/esm/audio/filters/EqualizerFilter.js +7 -3
- package/dist/esm/audio/filters/EqualizerFilter.js.map +1 -1
- package/dist/esm/audio/filters/GranularFilter.js +1 -86
- package/dist/esm/audio/filters/GranularFilter.js.map +1 -1
- package/dist/esm/audio/filters/HighpassFilter.d.ts +1 -0
- package/dist/esm/audio/filters/HighpassFilter.js +7 -3
- package/dist/esm/audio/filters/HighpassFilter.js.map +1 -1
- package/dist/esm/audio/filters/LowpassFilter.d.ts +1 -0
- package/dist/esm/audio/filters/LowpassFilter.js +7 -3
- package/dist/esm/audio/filters/LowpassFilter.js.map +1 -1
- package/dist/esm/audio/filters/PitchShiftFilter.js +1 -71
- package/dist/esm/audio/filters/PitchShiftFilter.js.map +1 -1
- package/dist/esm/audio/filters/ReverbFilter.d.ts +1 -0
- package/dist/esm/audio/filters/ReverbFilter.js +7 -3
- package/dist/esm/audio/filters/ReverbFilter.js.map +1 -1
- package/dist/esm/audio/filters/VocoderFilter.js +1 -89
- package/dist/esm/audio/filters/VocoderFilter.js.map +1 -1
- package/dist/esm/audio/filters/WorkletFilter.d.ts +2 -0
- package/dist/esm/audio/filters/WorkletFilter.js +10 -5
- package/dist/esm/audio/filters/WorkletFilter.js.map +1 -1
- package/dist/esm/audio/index.d.ts +15 -10
- package/dist/esm/audio/worklet/registerWorklet.d.ts +1 -1
- package/dist/esm/audio/worklet/registerWorklet.js +2 -2
- package/dist/esm/audio/worklet/registerWorklet.js.map +1 -1
- package/dist/esm/audio/worklets/beat-detector.worklet.d.ts +1 -0
- package/dist/esm/audio/worklets/beat-detector.worklet.js +647 -0
- package/dist/esm/audio/worklets/beat-detector.worklet.js.map +1 -0
- package/dist/esm/audio/worklets/granular.worklet.d.ts +1 -0
- package/dist/esm/audio/worklets/granular.worklet.js +89 -0
- package/dist/esm/audio/worklets/granular.worklet.js.map +1 -0
- package/dist/esm/audio/worklets/pitch-shift.worklet.d.ts +1 -0
- package/dist/esm/audio/worklets/pitch-shift.worklet.js +74 -0
- package/dist/esm/audio/worklets/pitch-shift.worklet.js.map +1 -0
- package/dist/esm/audio/worklets/vocoder.worklet.d.ts +1 -0
- package/dist/esm/audio/worklets/vocoder.worklet.js +92 -0
- package/dist/esm/audio/worklets/vocoder.worklet.js.map +1 -0
- package/dist/esm/core/Application.d.ts +86 -29
- package/dist/esm/core/Application.js +157 -47
- package/dist/esm/core/Application.js.map +1 -1
- package/dist/esm/core/Color.d.ts +0 -8
- package/dist/esm/core/Color.js +0 -24
- package/dist/esm/core/Color.js.map +1 -1
- package/dist/esm/core/Perf.d.ts +23 -0
- package/dist/esm/core/Perf.js +49 -0
- package/dist/esm/core/Perf.js.map +1 -0
- package/dist/esm/core/Scene.d.ts +40 -80
- package/dist/esm/core/Scene.js +63 -43
- package/dist/esm/core/Scene.js.map +1 -1
- package/dist/esm/core/SceneManager.d.ts +11 -25
- package/dist/esm/core/SceneManager.js +37 -100
- package/dist/esm/core/SceneManager.js.map +1 -1
- package/dist/esm/core/SceneNode.d.ts +28 -17
- package/dist/esm/core/SceneNode.js +66 -42
- package/dist/esm/core/SceneNode.js.map +1 -1
- package/dist/esm/core/Signal.d.ts +24 -28
- package/dist/esm/core/Signal.js +64 -50
- package/dist/esm/core/Signal.js.map +1 -1
- package/dist/esm/core/Timer.d.ts +1 -0
- package/dist/esm/core/Timer.js +3 -0
- package/dist/esm/core/Timer.js.map +1 -1
- package/dist/esm/core/capabilities.d.ts +2 -0
- package/dist/esm/core/capabilities.js +15 -0
- package/dist/esm/core/capabilities.js.map +1 -1
- package/dist/esm/core/index.d.ts +1 -0
- package/dist/esm/core/types.d.ts +1 -1
- package/dist/esm/core/utils.d.ts +12 -0
- package/dist/esm/core/utils.js +18 -1
- package/dist/esm/core/utils.js.map +1 -1
- package/dist/esm/debug/BoundingBoxesLayer.js +1 -1
- package/dist/esm/debug/BoundingBoxesLayer.js.map +1 -1
- package/dist/esm/debug/HitTestLayer.js +1 -1
- package/dist/esm/debug/HitTestLayer.js.map +1 -1
- package/dist/esm/debug/PerformanceLayer.js +1 -2
- package/dist/esm/debug/PerformanceLayer.js.map +1 -1
- package/dist/esm/debug/PointerStackLayer.js +1 -2
- package/dist/esm/debug/PointerStackLayer.js.map +1 -1
- package/dist/esm/debug/RenderPassInspectorLayer.js +1 -2
- package/dist/esm/debug/RenderPassInspectorLayer.js.map +1 -1
- package/dist/esm/index.js +37 -10
- package/dist/esm/index.js.map +1 -1
- package/dist/esm/input/InputManager.d.ts +1 -0
- package/dist/esm/input/InputManager.js +30 -3
- package/dist/esm/input/InputManager.js.map +1 -1
- package/dist/esm/input/InteractionManager.d.ts +5 -2
- package/dist/esm/input/InteractionManager.js +29 -18
- package/dist/esm/input/InteractionManager.js.map +1 -1
- package/dist/esm/input/Pointer.js +3 -2
- package/dist/esm/input/Pointer.js.map +1 -1
- package/dist/esm/input/internal/interactionManagerRegistry.d.ts +9 -0
- package/dist/esm/input/internal/interactionManagerRegistry.js +10 -0
- package/dist/esm/input/internal/interactionManagerRegistry.js.map +1 -0
- package/dist/esm/math/AbstractVector.d.ts +1 -7
- package/dist/esm/math/AbstractVector.js +6 -20
- package/dist/esm/math/AbstractVector.js.map +1 -1
- package/dist/esm/math/Circle.js +0 -2
- package/dist/esm/math/Circle.js.map +1 -1
- package/dist/esm/math/Collision.d.ts +9 -3
- package/dist/esm/math/Ellipse.d.ts +2 -5
- package/dist/esm/math/Ellipse.js +10 -7
- package/dist/esm/math/Ellipse.js.map +1 -1
- package/dist/esm/math/ObservableVector.d.ts +1 -1
- package/dist/esm/math/ObservableVector.js +3 -3
- package/dist/esm/math/ObservableVector.js.map +1 -1
- package/dist/esm/math/Polygon.d.ts +0 -2
- package/dist/esm/math/Polygon.js +1 -9
- package/dist/esm/math/Polygon.js.map +1 -1
- package/dist/esm/math/Rectangle.js +0 -2
- package/dist/esm/math/Rectangle.js.map +1 -1
- package/dist/esm/math/collision-detection.d.ts +19 -4
- package/dist/esm/math/collision-detection.js +61 -4
- package/dist/esm/math/collision-detection.js.map +1 -1
- package/dist/esm/math/swept-collision.d.ts +16 -12
- package/dist/esm/math/swept-collision.js +109 -19
- package/dist/esm/math/swept-collision.js.map +1 -1
- package/dist/esm/particles/ParticleSystem.d.ts +8 -5
- package/dist/esm/particles/ParticleSystem.js +10 -6
- package/dist/esm/particles/ParticleSystem.js.map +1 -1
- package/dist/esm/particles/distributions/{Gradient.d.ts → ColorGradient.d.ts} +5 -5
- package/dist/esm/particles/distributions/{Gradient.js → ColorGradient.js} +5 -5
- package/dist/esm/particles/distributions/ColorGradient.js.map +1 -0
- package/dist/esm/particles/distributions/Distribution.d.ts +2 -2
- package/dist/esm/particles/distributions/index.d.ts +2 -2
- package/dist/esm/particles/gpu/ParticleGpuState.js +1 -1
- package/dist/esm/particles/index.d.ts +1 -0
- package/dist/esm/particles/modules/ColorOverLifetime.d.ts +3 -3
- package/dist/esm/particles/modules/ColorOverLifetime.js.map +1 -1
- package/dist/esm/particles/modules/ColorOverSpeed.d.ts +3 -3
- package/dist/esm/particles/modules/ColorOverSpeed.js.map +1 -1
- package/dist/esm/particles/modules/UpdateModule.d.ts +2 -2
- package/dist/esm/particles/modules/UpdateModule.js +1 -1
- package/dist/esm/particles/modules/WgslContribution.d.ts +2 -2
- package/dist/esm/rendering/CallbackRenderPass.d.ts +1 -0
- package/dist/esm/rendering/CallbackRenderPass.js +1 -0
- package/dist/esm/rendering/CallbackRenderPass.js.map +1 -1
- package/dist/esm/rendering/Camera.d.ts +33 -0
- package/dist/esm/rendering/Camera.js +38 -0
- package/dist/esm/rendering/Camera.js.map +1 -0
- package/dist/esm/rendering/Container.d.ts +7 -25
- package/dist/esm/rendering/Container.js +25 -87
- package/dist/esm/rendering/Container.js.map +1 -1
- package/dist/esm/rendering/Drawable.d.ts +8 -10
- package/dist/esm/rendering/Drawable.js +12 -20
- package/dist/esm/rendering/Drawable.js.map +1 -1
- package/dist/esm/rendering/RenderBackend.d.ts +19 -0
- package/dist/esm/rendering/RenderNode.d.ts +82 -11
- package/dist/esm/rendering/RenderNode.js +133 -163
- package/dist/esm/rendering/RenderNode.js.map +1 -1
- package/dist/esm/rendering/RenderPass.d.ts +1 -0
- package/dist/esm/rendering/RenderStats.d.ts +9 -0
- package/dist/esm/rendering/RenderStats.js +2 -0
- package/dist/esm/rendering/RenderStats.js.map +1 -1
- package/dist/esm/rendering/RenderTarget.d.ts +13 -0
- package/dist/esm/rendering/RenderTarget.js +13 -0
- package/dist/esm/rendering/RenderTarget.js.map +1 -1
- package/dist/esm/rendering/RenderTargetPass.js +17 -0
- package/dist/esm/rendering/RenderTargetPass.js.map +1 -1
- package/dist/esm/rendering/RendererRegistry.d.ts +1 -0
- package/dist/esm/rendering/RendererRegistry.js +1 -0
- package/dist/esm/rendering/RendererRegistry.js.map +1 -1
- package/dist/esm/rendering/RenderingContext.d.ts +87 -0
- package/dist/esm/rendering/RenderingContext.js +157 -0
- package/dist/esm/rendering/RenderingContext.js.map +1 -0
- package/dist/esm/rendering/TransformBuffer.d.ts +38 -0
- package/dist/esm/rendering/TransformBuffer.js +116 -0
- package/dist/esm/rendering/TransformBuffer.js.map +1 -0
- package/dist/esm/rendering/View.d.ts +23 -0
- package/dist/esm/rendering/View.js +42 -0
- package/dist/esm/rendering/View.js.map +1 -1
- package/dist/esm/rendering/filters/WebGpuShaderFilter.js +5 -12
- package/dist/esm/rendering/filters/WebGpuShaderFilter.js.map +1 -1
- package/dist/esm/rendering/geometry/Geometry.d.ts +40 -0
- package/dist/esm/rendering/geometry/Geometry.js +228 -0
- package/dist/esm/rendering/geometry/Geometry.js.map +1 -0
- package/dist/esm/rendering/geometry/GeometryAttribute.d.ts +32 -0
- package/dist/esm/rendering/geometry/QuadGeometry.d.ts +5 -0
- package/dist/esm/rendering/gradient/Gradient.d.ts +34 -0
- package/dist/esm/rendering/gradient/Gradient.js +114 -0
- package/dist/esm/rendering/gradient/Gradient.js.map +1 -0
- package/dist/esm/rendering/gradient/LinearGradient.d.ts +10 -0
- package/dist/esm/rendering/gradient/LinearGradient.js +26 -0
- package/dist/esm/rendering/gradient/LinearGradient.js.map +1 -0
- package/dist/esm/rendering/gradient/RadialGradient.d.ts +10 -0
- package/dist/esm/rendering/gradient/RadialGradient.js +25 -0
- package/dist/esm/rendering/gradient/RadialGradient.js.map +1 -0
- package/dist/esm/rendering/index.d.ts +103 -59
- package/dist/esm/rendering/material/Material.d.ts +114 -0
- package/dist/esm/rendering/material/Material.js +111 -0
- package/dist/esm/rendering/material/Material.js.map +1 -0
- package/dist/esm/rendering/material/MaterialKey.d.ts +18 -0
- package/dist/esm/rendering/material/MaterialKey.js +82 -0
- package/dist/esm/rendering/material/MaterialKey.js.map +1 -0
- package/dist/esm/rendering/material/MeshMaterial.d.ts +16 -0
- package/dist/esm/rendering/material/MeshMaterial.js +21 -0
- package/dist/esm/rendering/material/MeshMaterial.js.map +1 -0
- package/dist/esm/rendering/{mesh/MeshShader.d.ts → material/ShaderSource.d.ts} +30 -62
- package/dist/esm/rendering/{mesh/MeshShader.js → material/ShaderSource.js} +36 -62
- package/dist/esm/rendering/material/ShaderSource.js.map +1 -0
- package/dist/esm/rendering/material/SpriteMaterial.d.ts +15 -0
- package/dist/esm/rendering/material/SpriteMaterial.js +20 -0
- package/dist/esm/rendering/material/SpriteMaterial.js.map +1 -0
- package/dist/esm/rendering/mesh/Mesh.d.ts +29 -12
- package/dist/esm/rendering/mesh/Mesh.js +123 -4
- package/dist/esm/rendering/mesh/Mesh.js.map +1 -1
- package/dist/esm/rendering/pass/RenderPassCoordinator.d.ts +63 -0
- package/dist/esm/rendering/pass/RenderPassDescriptor.d.ts +48 -0
- package/dist/esm/rendering/pass/RenderPassDescriptor.js +16 -0
- package/dist/esm/rendering/pass/RenderPassDescriptor.js.map +1 -0
- package/dist/esm/rendering/plan/RenderCommand.d.ts +67 -0
- package/dist/esm/rendering/plan/RenderCommand.js +94 -0
- package/dist/esm/rendering/plan/RenderCommand.js.map +1 -0
- package/dist/esm/rendering/plan/RenderEffectExecutor.d.ts +10 -0
- package/dist/esm/rendering/plan/RenderEffectExecutor.js +159 -0
- package/dist/esm/rendering/plan/RenderEffectExecutor.js.map +1 -0
- package/dist/esm/rendering/plan/RenderPlan.d.ts +23 -0
- package/dist/esm/rendering/plan/RenderPlan.js +12 -0
- package/dist/esm/rendering/plan/RenderPlan.js.map +1 -0
- package/dist/esm/rendering/plan/RenderPlanBuilder.d.ts +31 -0
- package/dist/esm/rendering/plan/RenderPlanBuilder.js +242 -0
- package/dist/esm/rendering/plan/RenderPlanBuilder.js.map +1 -0
- package/dist/esm/rendering/plan/RenderPlanOptimizer.d.ts +10 -0
- package/dist/esm/rendering/plan/RenderPlanOptimizer.js +180 -0
- package/dist/esm/rendering/plan/RenderPlanOptimizer.js.map +1 -0
- package/dist/esm/rendering/plan/RenderPlanPlayer.d.ts +9 -0
- package/dist/esm/rendering/plan/RenderPlanPlayer.js +56 -0
- package/dist/esm/rendering/plan/RenderPlanPlayer.js.map +1 -0
- package/dist/esm/rendering/plan/RenderScope.d.ts +70 -0
- package/dist/esm/rendering/plan/RenderScope.js +16 -0
- package/dist/esm/rendering/plan/RenderScope.js.map +1 -0
- package/dist/esm/rendering/plan/playRenderTree.d.ts +4 -0
- package/dist/esm/rendering/plan/playRenderTree.js +19 -0
- package/dist/esm/rendering/plan/playRenderTree.js.map +1 -0
- package/dist/esm/rendering/shader/Shader.d.ts +1 -0
- package/dist/esm/rendering/shader/Shader.js +1 -0
- package/dist/esm/rendering/shader/Shader.js.map +1 -1
- package/dist/esm/rendering/shader/ShaderUniform.d.ts +1 -0
- package/dist/esm/rendering/shader/ShaderUniform.js +1 -0
- package/dist/esm/rendering/shader/ShaderUniform.js.map +1 -1
- package/dist/esm/rendering/sprite/Sprite.d.ts +25 -3
- package/dist/esm/rendering/sprite/Sprite.js +48 -15
- package/dist/esm/rendering/sprite/Sprite.js.map +1 -1
- package/dist/esm/rendering/sprite/spriteMaterialSources.d.ts +36 -0
- package/dist/esm/rendering/sprite/spriteMaterialSources.js +128 -0
- package/dist/esm/rendering/sprite/spriteMaterialSources.js.map +1 -0
- package/dist/esm/rendering/text/AbstractText.d.ts +36 -0
- package/dist/esm/rendering/text/AbstractText.js +49 -0
- package/dist/esm/rendering/text/AbstractText.js.map +1 -0
- package/dist/esm/rendering/text/BitmapText.d.ts +97 -0
- package/dist/esm/rendering/text/BitmapText.js +220 -0
- package/dist/esm/rendering/text/BitmapText.js.map +1 -0
- package/dist/esm/rendering/text/BmFont.d.ts +50 -0
- package/dist/esm/rendering/text/BmFont.js +24 -0
- package/dist/esm/rendering/text/BmFont.js.map +1 -0
- package/dist/esm/rendering/text/GlyphAtlas.d.ts +104 -0
- package/dist/esm/rendering/text/GlyphAtlas.js +347 -0
- package/dist/esm/rendering/text/GlyphAtlas.js.map +1 -0
- package/dist/esm/rendering/text/GlyphAtlasPool.d.ts +40 -0
- package/dist/esm/rendering/text/GlyphAtlasPool.js +67 -0
- package/dist/esm/rendering/text/GlyphAtlasPool.js.map +1 -0
- package/dist/esm/rendering/text/GlyphSdf.d.ts +92 -0
- package/dist/esm/rendering/text/GlyphSdf.js +220 -0
- package/dist/esm/rendering/text/GlyphSdf.js.map +1 -0
- package/dist/esm/rendering/text/HTMLText.d.ts +107 -0
- package/dist/esm/rendering/text/HTMLText.js +284 -0
- package/dist/esm/rendering/text/HTMLText.js.map +1 -0
- package/dist/esm/rendering/text/LayoutOptions.d.ts +30 -0
- package/dist/esm/rendering/text/Text.d.ts +89 -20
- package/dist/esm/rendering/text/Text.js +176 -101
- package/dist/esm/rendering/text/Text.js.map +1 -1
- package/dist/esm/rendering/text/TextLayout.d.ts +20 -8
- package/dist/esm/rendering/text/TextLayout.js +234 -25
- package/dist/esm/rendering/text/TextLayout.js.map +1 -1
- package/dist/esm/rendering/text/TextStyle.d.ts +154 -87
- package/dist/esm/rendering/text/TextStyle.js +257 -203
- package/dist/esm/rendering/text/TextStyle.js.map +1 -1
- package/dist/esm/rendering/text/types.d.ts +73 -13
- package/dist/esm/rendering/texture/DataTexture.d.ts +5 -0
- package/dist/esm/rendering/texture/DataTexture.js +7 -0
- package/dist/esm/rendering/texture/DataTexture.js.map +1 -1
- package/dist/esm/rendering/texture/Texture.d.ts +1 -0
- package/dist/esm/rendering/texture/Texture.js +1 -0
- package/dist/esm/rendering/texture/Texture.js.map +1 -1
- package/dist/esm/rendering/types.d.ts +3 -1
- package/dist/esm/rendering/types.js +2 -0
- package/dist/esm/rendering/types.js.map +1 -1
- package/dist/esm/rendering/video/Video.d.ts +5 -8
- package/dist/esm/rendering/video/Video.js +12 -13
- package/dist/esm/rendering/video/Video.js.map +1 -1
- package/dist/esm/rendering/webgl2/WebGl2Backend.d.ts +40 -0
- package/dist/esm/rendering/webgl2/WebGl2Backend.js +344 -27
- package/dist/esm/rendering/webgl2/WebGl2Backend.js.map +1 -1
- package/dist/esm/rendering/webgl2/WebGl2MeshRenderer.d.ts +22 -2
- package/dist/esm/rendering/webgl2/WebGl2MeshRenderer.js +404 -112
- package/dist/esm/rendering/webgl2/WebGl2MeshRenderer.js.map +1 -1
- package/dist/esm/rendering/webgl2/WebGl2PassCoordinator.d.ts +57 -0
- package/dist/esm/rendering/webgl2/WebGl2PassCoordinator.js +79 -0
- package/dist/esm/rendering/webgl2/WebGl2PassCoordinator.js.map +1 -0
- package/dist/esm/rendering/webgl2/WebGl2SpriteRenderer.d.ts +12 -0
- package/dist/esm/rendering/webgl2/WebGl2SpriteRenderer.js +214 -58
- package/dist/esm/rendering/webgl2/WebGl2SpriteRenderer.js.map +1 -1
- package/dist/esm/rendering/webgl2/WebGl2StencilClipper.d.ts +34 -0
- package/dist/esm/rendering/webgl2/WebGl2StencilClipper.js +169 -0
- package/dist/esm/rendering/webgl2/WebGl2StencilClipper.js.map +1 -0
- package/dist/esm/rendering/webgl2/WebGl2TextRenderer.d.ts +56 -0
- package/dist/esm/rendering/webgl2/WebGl2TextRenderer.js +486 -0
- package/dist/esm/rendering/webgl2/WebGl2TextRenderer.js.map +1 -0
- package/dist/esm/rendering/webgl2/glsl/mesh.frag.js +1 -1
- package/dist/esm/rendering/webgl2/glsl/mesh.vert.js +1 -1
- package/dist/esm/rendering/webgl2/glsl/stencil-clip.frag.js +4 -0
- package/dist/esm/rendering/webgl2/glsl/stencil-clip.frag.js.map +1 -0
- package/dist/esm/rendering/webgl2/glsl/stencil-clip.vert.js +4 -0
- package/dist/esm/rendering/webgl2/glsl/stencil-clip.vert.js.map +1 -0
- package/dist/esm/rendering/webgl2/glsl/text-color.frag.js +4 -0
- package/dist/esm/rendering/webgl2/glsl/text-color.frag.js.map +1 -0
- package/dist/esm/rendering/webgl2/glsl/text-msdf.frag.js +4 -0
- package/dist/esm/rendering/webgl2/glsl/text-msdf.frag.js.map +1 -0
- package/dist/esm/rendering/webgl2/glsl/text-sdf.frag.js +4 -0
- package/dist/esm/rendering/webgl2/glsl/text-sdf.frag.js.map +1 -0
- package/dist/esm/rendering/webgl2/glsl/text.vert.js +4 -0
- package/dist/esm/rendering/webgl2/glsl/text.vert.js.map +1 -0
- package/dist/esm/rendering/webgpu/WebGpuBackend.d.ts +50 -0
- package/dist/esm/rendering/webgpu/WebGpuBackend.js +151 -27
- package/dist/esm/rendering/webgpu/WebGpuBackend.js.map +1 -1
- package/dist/esm/rendering/webgpu/WebGpuBlendState.js +26 -0
- package/dist/esm/rendering/webgpu/WebGpuBlendState.js.map +1 -1
- package/dist/esm/rendering/webgpu/WebGpuMaskCompositor.js +22 -17
- package/dist/esm/rendering/webgpu/WebGpuMaskCompositor.js.map +1 -1
- package/dist/esm/rendering/webgpu/WebGpuMeshRenderer.d.ts +26 -2
- package/dist/esm/rendering/webgpu/WebGpuMeshRenderer.js +511 -89
- package/dist/esm/rendering/webgpu/WebGpuMeshRenderer.js.map +1 -1
- package/dist/esm/rendering/webgpu/WebGpuParticleRenderer.js +13 -17
- package/dist/esm/rendering/webgpu/WebGpuParticleRenderer.js.map +1 -1
- package/dist/esm/rendering/webgpu/WebGpuPassCoordinator.d.ts +141 -0
- package/dist/esm/rendering/webgpu/WebGpuPassCoordinator.js +270 -0
- package/dist/esm/rendering/webgpu/WebGpuPassCoordinator.js.map +1 -0
- package/dist/esm/rendering/webgpu/WebGpuSpriteRenderer.d.ts +16 -0
- package/dist/esm/rendering/webgpu/WebGpuSpriteRenderer.js +344 -27
- package/dist/esm/rendering/webgpu/WebGpuSpriteRenderer.js.map +1 -1
- package/dist/esm/rendering/webgpu/WebGpuStencilClipper.d.ts +57 -0
- package/dist/esm/rendering/webgpu/WebGpuStencilClipper.js +257 -0
- package/dist/esm/rendering/webgpu/WebGpuStencilClipper.js.map +1 -0
- package/dist/esm/rendering/webgpu/WebGpuStencilState.d.ts +14 -0
- package/dist/esm/rendering/webgpu/WebGpuStencilState.js +36 -0
- package/dist/esm/rendering/webgpu/WebGpuStencilState.js.map +1 -0
- package/dist/esm/rendering/webgpu/WebGpuTextRenderer.d.ts +70 -0
- package/dist/esm/rendering/webgpu/WebGpuTextRenderer.js +775 -0
- package/dist/esm/rendering/webgpu/WebGpuTextRenderer.js.map +1 -0
- package/dist/esm/rendering/webgpu/WebGpuTransformStorage.d.ts +16 -0
- package/dist/esm/rendering/webgpu/WebGpuTransformStorage.js +57 -0
- package/dist/esm/rendering/webgpu/WebGpuTransformStorage.js.map +1 -0
- package/dist/esm/rendering/webgpu/compute/WebGpuComputePipeline.js +96 -0
- package/dist/esm/rendering/webgpu/compute/WebGpuComputePipeline.js.map +1 -0
- package/dist/esm/rendering/webgpu/compute/WebGpuStorageBuffer.js +68 -0
- package/dist/esm/rendering/webgpu/compute/WebGpuStorageBuffer.js.map +1 -0
- package/dist/esm/resources/Asset.d.ts +23 -0
- package/dist/esm/resources/Asset.js +23 -0
- package/dist/esm/resources/Asset.js.map +1 -0
- package/dist/esm/resources/AssetDefinitions.d.ts +137 -0
- package/dist/esm/resources/Assets.d.ts +35 -0
- package/dist/esm/resources/Assets.js +32 -0
- package/dist/esm/resources/Assets.js.map +1 -0
- package/dist/esm/resources/IndexedDbDatabase.js +17 -1
- package/dist/esm/resources/IndexedDbDatabase.js.map +1 -1
- package/dist/esm/resources/IndexedDbStore.js +17 -1
- package/dist/esm/resources/IndexedDbStore.js.map +1 -1
- package/dist/esm/resources/JsonStore.d.ts +18 -0
- package/dist/esm/resources/JsonStore.js +62 -0
- package/dist/esm/resources/JsonStore.js.map +1 -0
- package/dist/esm/resources/Loader.d.ts +244 -18
- package/dist/esm/resources/Loader.js +456 -50
- package/dist/esm/resources/Loader.js.map +1 -1
- package/dist/esm/resources/LoadingQueue.d.ts +28 -0
- package/dist/esm/resources/LoadingQueue.js +59 -0
- package/dist/esm/resources/LoadingQueue.js.map +1 -0
- package/dist/esm/resources/factories/BmFontFactory.d.ts +25 -0
- package/dist/esm/resources/factories/BmFontFactory.js +96 -0
- package/dist/esm/resources/factories/BmFontFactory.js.map +1 -0
- package/dist/esm/resources/factories/CsvFactory.d.ts +35 -0
- package/dist/esm/resources/factories/CsvFactory.js +87 -0
- package/dist/esm/resources/factories/CsvFactory.js.map +1 -0
- package/dist/esm/resources/factories/ImageFactory.d.ts +14 -8
- package/dist/esm/resources/factories/ImageFactory.js +13 -6
- package/dist/esm/resources/factories/ImageFactory.js.map +1 -1
- package/dist/esm/resources/factories/MusicFactory.d.ts +8 -2
- package/dist/esm/resources/factories/MusicFactory.js +25 -14
- package/dist/esm/resources/factories/MusicFactory.js.map +1 -1
- package/dist/esm/resources/factories/SoundFactory.d.ts +2 -2
- package/dist/esm/resources/factories/SoundFactory.js.map +1 -1
- package/dist/esm/resources/factories/SubtitleFactory.d.ts +28 -0
- package/dist/esm/resources/factories/SubtitleFactory.js +203 -0
- package/dist/esm/resources/factories/SubtitleFactory.js.map +1 -0
- package/dist/esm/resources/factories/SvgFactory.d.ts +18 -1
- package/dist/esm/resources/factories/SvgFactory.js +21 -2
- package/dist/esm/resources/factories/SvgFactory.js.map +1 -1
- package/dist/esm/resources/factories/TextureFactory.d.ts +4 -4
- package/dist/esm/resources/factories/TextureFactory.js +8 -4
- package/dist/esm/resources/factories/TextureFactory.js.map +1 -1
- package/dist/esm/resources/factories/VideoFactory.d.ts +8 -2
- package/dist/esm/resources/factories/VideoFactory.js +27 -20
- package/dist/esm/resources/factories/VideoFactory.js.map +1 -1
- package/dist/esm/resources/factories/XmlFactory.d.ts +24 -0
- package/dist/esm/resources/factories/XmlFactory.js +37 -0
- package/dist/esm/resources/factories/XmlFactory.js.map +1 -0
- package/dist/esm/resources/index.d.ts +9 -1
- package/dist/esm/resources/tokens.d.ts +49 -3
- package/dist/esm/resources/tokens.js +50 -4
- package/dist/esm/resources/tokens.js.map +1 -1
- package/dist/exo.esm.js +15382 -8078
- package/dist/exo.esm.js.map +1 -1
- package/package.json +34 -16
- package/dist/esm/input/interaction-hooks.d.ts +0 -34
- package/dist/esm/input/interaction-hooks.js +0 -35
- package/dist/esm/input/interaction-hooks.js.map +0 -1
- package/dist/esm/particles/distributions/Gradient.js.map +0 -1
- package/dist/esm/rendering/mesh/MeshShader.js.map +0 -1
- package/dist/esm/rendering/text/DynamicGlyphAtlas.d.ts +0 -33
- package/dist/esm/rendering/text/DynamicGlyphAtlas.js +0 -134
- package/dist/esm/rendering/text/DynamicGlyphAtlas.js.map +0 -1
- package/dist/esm/rendering/text/atlas-singleton.d.ts +0 -7
- package/dist/esm/rendering/text/atlas-singleton.js +0 -17
- package/dist/esm/rendering/text/atlas-singleton.js.map +0 -1
- package/dist/esm/resources/factories/VttFactory.d.ts +0 -24
- package/dist/esm/resources/factories/VttFactory.js +0 -158
- package/dist/esm/resources/factories/VttFactory.js.map +0 -1
- package/dist/esm/vendor/webgl-debug.js +0 -1160
- package/dist/esm/vendor/webgl-debug.js.map +0 -1
|
@@ -33,11 +33,40 @@ class Mesh extends Drawable {
|
|
|
33
33
|
indices;
|
|
34
34
|
uvs;
|
|
35
35
|
colors;
|
|
36
|
-
|
|
36
|
+
/** Custom material attached to this mesh, or `null` for the default mesh path. */
|
|
37
|
+
material;
|
|
38
|
+
/** Source geometry when constructed from the geometry form, otherwise `null`. */
|
|
39
|
+
geometry;
|
|
37
40
|
_texture;
|
|
38
41
|
constructor(options) {
|
|
39
42
|
super();
|
|
40
|
-
const {
|
|
43
|
+
const { texture = null, material = null } = options;
|
|
44
|
+
let vertices;
|
|
45
|
+
let indices;
|
|
46
|
+
let uvs;
|
|
47
|
+
let colors;
|
|
48
|
+
let geometry;
|
|
49
|
+
if (options.geometry !== undefined) {
|
|
50
|
+
if (options.vertices !== undefined) {
|
|
51
|
+
throw new Error('Mesh accepts either `vertices` or `geometry`, not both.');
|
|
52
|
+
}
|
|
53
|
+
geometry = options.geometry;
|
|
54
|
+
const data = readGeometry(geometry);
|
|
55
|
+
vertices = data.vertices;
|
|
56
|
+
uvs = data.uvs;
|
|
57
|
+
colors = data.colors;
|
|
58
|
+
indices = data.indices;
|
|
59
|
+
}
|
|
60
|
+
else {
|
|
61
|
+
if (options.vertices === undefined) {
|
|
62
|
+
throw new Error('Mesh requires either `vertices` or `geometry`.');
|
|
63
|
+
}
|
|
64
|
+
geometry = null;
|
|
65
|
+
vertices = options.vertices;
|
|
66
|
+
indices = options.indices ?? null;
|
|
67
|
+
uvs = options.uvs ?? null;
|
|
68
|
+
colors = options.colors ?? null;
|
|
69
|
+
}
|
|
41
70
|
if (vertices.length === 0 || vertices.length % 2 !== 0) {
|
|
42
71
|
throw new Error(`Mesh vertices must be a non-empty flat array of (x,y) pairs (got length ${vertices.length}).`);
|
|
43
72
|
}
|
|
@@ -68,7 +97,8 @@ class Mesh extends Drawable {
|
|
|
68
97
|
this.indices = indices;
|
|
69
98
|
this.uvs = uvs;
|
|
70
99
|
this.colors = colors;
|
|
71
|
-
this.
|
|
100
|
+
this.material = material;
|
|
101
|
+
this.geometry = geometry;
|
|
72
102
|
this._texture = texture;
|
|
73
103
|
this.recomputeLocalBounds();
|
|
74
104
|
}
|
|
@@ -109,11 +139,100 @@ class Mesh extends Drawable {
|
|
|
109
139
|
if (y > maxY)
|
|
110
140
|
maxY = y;
|
|
111
141
|
}
|
|
112
|
-
this.
|
|
142
|
+
this.getLocalBounds().set(minX, minY, maxX - minX, maxY - minY);
|
|
113
143
|
this._invalidateBoundsCascade();
|
|
114
144
|
return this;
|
|
115
145
|
}
|
|
116
146
|
}
|
|
147
|
+
const positionAttributeNames = new Set(['a_position', 'position']);
|
|
148
|
+
const texcoordAttributeNames = new Set(['a_texcoord', 'texcoord', 'a_uv', 'uv']);
|
|
149
|
+
const colorAttributeNames = new Set(['a_color', 'color']);
|
|
150
|
+
const findAttribute = (attributes, names) => attributes.find(attribute => names.has(attribute.name));
|
|
151
|
+
/**
|
|
152
|
+
* Read a {@link Geometry}'s standard mesh attributes into the flat
|
|
153
|
+
* `vertices`/`uvs`/`colors` arrays the mesh renderers consume. Only the
|
|
154
|
+
* `triangle-list` topology and the canonical attribute layout (`f32` position
|
|
155
|
+
* and texcoord, `u8`/`u32`/`f32` color) are supported — this is the immediate
|
|
156
|
+
* (non-batched) bridge; shared GPU buffers and instancing arrive later.
|
|
157
|
+
*/
|
|
158
|
+
function readGeometry(geometry) {
|
|
159
|
+
if (geometry.topology !== 'triangle-list') {
|
|
160
|
+
throw new Error(`Mesh only supports triangle-list geometry (got "${geometry.topology}").`);
|
|
161
|
+
}
|
|
162
|
+
const position = findAttribute(geometry.attributes, positionAttributeNames);
|
|
163
|
+
if (position === undefined) {
|
|
164
|
+
throw new Error('Mesh geometry requires a position attribute named `a_position` or `position`.');
|
|
165
|
+
}
|
|
166
|
+
if (position.type !== 'f32' || position.size < 2) {
|
|
167
|
+
throw new Error('Mesh geometry position attribute must be a float vector with at least 2 components.');
|
|
168
|
+
}
|
|
169
|
+
const texcoord = findAttribute(geometry.attributes, texcoordAttributeNames);
|
|
170
|
+
if (texcoord !== undefined && (texcoord.type !== 'f32' || texcoord.size < 2)) {
|
|
171
|
+
throw new Error('Mesh geometry texcoord attribute must be a float vector with at least 2 components.');
|
|
172
|
+
}
|
|
173
|
+
const color = findAttribute(geometry.attributes, colorAttributeNames);
|
|
174
|
+
const vertexCount = geometry.vertexCount;
|
|
175
|
+
const { stride } = geometry;
|
|
176
|
+
const source = geometry.vertexData;
|
|
177
|
+
const view = source instanceof Float32Array ? new DataView(source.buffer, source.byteOffset, source.byteLength) : new DataView(source);
|
|
178
|
+
const vertices = new Float32Array(vertexCount * 2);
|
|
179
|
+
const uvs = texcoord !== undefined ? new Float32Array(vertexCount * 2) : null;
|
|
180
|
+
const colors = color !== undefined ? new Uint32Array(vertexCount) : null;
|
|
181
|
+
for (let i = 0; i < vertexCount; i++) {
|
|
182
|
+
const base = i * stride;
|
|
183
|
+
vertices[i * 2] = view.getFloat32(base + position.offset, true);
|
|
184
|
+
vertices[i * 2 + 1] = view.getFloat32(base + position.offset + 4, true);
|
|
185
|
+
if (uvs !== null && texcoord !== undefined) {
|
|
186
|
+
uvs[i * 2] = view.getFloat32(base + texcoord.offset, true);
|
|
187
|
+
uvs[i * 2 + 1] = view.getFloat32(base + texcoord.offset + 4, true);
|
|
188
|
+
}
|
|
189
|
+
if (colors !== null && color !== undefined) {
|
|
190
|
+
colors[i] = readPackedColor(view, base + color.offset, color);
|
|
191
|
+
}
|
|
192
|
+
}
|
|
193
|
+
const indices = readIndices(geometry.indices, vertexCount);
|
|
194
|
+
return { vertices, uvs, colors, indices };
|
|
195
|
+
}
|
|
196
|
+
/** Pack a geometry color attribute into the mesh's RGBA8 u32 representation. */
|
|
197
|
+
function readPackedColor(view, offset, attribute) {
|
|
198
|
+
if (attribute.type === 'u32' && attribute.size === 1) {
|
|
199
|
+
return view.getUint32(offset, true) >>> 0;
|
|
200
|
+
}
|
|
201
|
+
if (attribute.type === 'u8' && attribute.size === 4) {
|
|
202
|
+
const r = view.getUint8(offset);
|
|
203
|
+
const g = view.getUint8(offset + 1);
|
|
204
|
+
const b = view.getUint8(offset + 2);
|
|
205
|
+
const a = view.getUint8(offset + 3);
|
|
206
|
+
return (r | (g << 8) | (b << 16) | (a << 24)) >>> 0;
|
|
207
|
+
}
|
|
208
|
+
if (attribute.type === 'f32' && attribute.size === 4) {
|
|
209
|
+
const r = Math.round(clamp01(view.getFloat32(offset, true)) * 255);
|
|
210
|
+
const g = Math.round(clamp01(view.getFloat32(offset + 4, true)) * 255);
|
|
211
|
+
const b = Math.round(clamp01(view.getFloat32(offset + 8, true)) * 255);
|
|
212
|
+
const a = Math.round(clamp01(view.getFloat32(offset + 12, true)) * 255);
|
|
213
|
+
return (r | (g << 8) | (b << 16) | (a << 24)) >>> 0;
|
|
214
|
+
}
|
|
215
|
+
throw new Error('Mesh geometry color attribute must be u8x4, u32x1, or f32x4.');
|
|
216
|
+
}
|
|
217
|
+
function readIndices(indices, vertexCount) {
|
|
218
|
+
if (indices === null) {
|
|
219
|
+
return null;
|
|
220
|
+
}
|
|
221
|
+
if (indices instanceof Uint16Array) {
|
|
222
|
+
return indices;
|
|
223
|
+
}
|
|
224
|
+
if (vertexCount > 0xffff) {
|
|
225
|
+
throw new Error(`Mesh geometry with ${vertexCount} vertices exceeds the 16-bit index limit.`);
|
|
226
|
+
}
|
|
227
|
+
return Uint16Array.from(indices);
|
|
228
|
+
}
|
|
229
|
+
function clamp01(value) {
|
|
230
|
+
if (value < 0)
|
|
231
|
+
return 0;
|
|
232
|
+
if (value > 1)
|
|
233
|
+
return 1;
|
|
234
|
+
return value;
|
|
235
|
+
}
|
|
117
236
|
|
|
118
237
|
export { Mesh };
|
|
119
238
|
//# sourceMappingURL=Mesh.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Mesh.js","sources":["../../../../../src/rendering/mesh/Mesh.ts"],"sourcesContent":[null],"names":[],"mappings":";;
|
|
1
|
+
{"version":3,"file":"Mesh.js","sources":["../../../../../src/rendering/mesh/Mesh.ts"],"sourcesContent":[null],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,63 @@
|
|
|
1
|
+
import type { Matrix } from '@/math/Matrix';
|
|
2
|
+
import type { Rectangle } from '@/math/Rectangle';
|
|
3
|
+
import type { Geometry } from '../geometry/Geometry';
|
|
4
|
+
import type { RenderTarget } from '../RenderTarget';
|
|
5
|
+
import type { View } from '../View';
|
|
6
|
+
import type { RenderPassDescriptor, RenderPassLoad } from './RenderPassDescriptor';
|
|
7
|
+
/**
|
|
8
|
+
* Internal, backend-owned owner of render-pass lifecycle: target / view / clear
|
|
9
|
+
* orchestration, the scissor and stencil-clip stacks, and — on WebGPU, from
|
|
10
|
+
* phase 12D — the active `GPURenderPassEncoder`.
|
|
11
|
+
*
|
|
12
|
+
* There is no public RenderPass API. This abstraction exists so the WebGL2 and
|
|
13
|
+
* WebGPU backends can share the orchestration shape that geometric stencil
|
|
14
|
+
* clipping needs, while each maps it onto its own state model: WebGL2 onto
|
|
15
|
+
* ambient GL state (bound framebuffer, viewport, scissor, stencil), WebGPU onto
|
|
16
|
+
* explicit render passes built up front with their attachments.
|
|
17
|
+
* @internal
|
|
18
|
+
*/
|
|
19
|
+
export interface RenderPassCoordinator {
|
|
20
|
+
/** The target the active pass draws into (the backend root when idle). */
|
|
21
|
+
readonly activeTarget: RenderTarget;
|
|
22
|
+
/** The view the active pass renders with. */
|
|
23
|
+
readonly activeView: View;
|
|
24
|
+
/** Whether a pass is currently open. */
|
|
25
|
+
readonly hasActivePass: boolean;
|
|
26
|
+
/** Open a pass for `descriptor`, applying its target / view / clear / stencil state. */
|
|
27
|
+
beginPass(descriptor: RenderPassDescriptor): void;
|
|
28
|
+
/** Close the active pass, flushing any pending draws into it. */
|
|
29
|
+
endPass(): void;
|
|
30
|
+
/**
|
|
31
|
+
* Run `body` inside a child pass described by `descriptor`, restoring the
|
|
32
|
+
* previous target and view afterwards — even if `body` throws. Preserves the
|
|
33
|
+
* save / restore semantics of {@link RenderTargetPass}.
|
|
34
|
+
*/
|
|
35
|
+
withChildPass(descriptor: RenderPassDescriptor, body: () => void): void;
|
|
36
|
+
/** Push an axis-aligned scissor rectangle; nested rectangles intersect. */
|
|
37
|
+
pushScissorRect(bounds: Rectangle): void;
|
|
38
|
+
/** Pop the most recently pushed scissor rectangle. */
|
|
39
|
+
popScissorRect(): void;
|
|
40
|
+
/** Push a geometric stencil clip — the `shape` silhouette under `transform`. */
|
|
41
|
+
pushStencilClip(shape: Geometry, transform: Matrix): void;
|
|
42
|
+
/** Pop the most recently pushed stencil clip. */
|
|
43
|
+
popStencilClip(): void;
|
|
44
|
+
/**
|
|
45
|
+
* Decide whether `target` should be cleared or loaded given an explicit clear
|
|
46
|
+
* request. Centralizes the clear-vs-load / content-preservation decision so a
|
|
47
|
+
* render texture's contents survive across multiple passes in one frame.
|
|
48
|
+
*/
|
|
49
|
+
resolveLoad(target: RenderTarget, clearRequested: boolean): RenderPassLoad;
|
|
50
|
+
}
|
|
51
|
+
/**
|
|
52
|
+
* Duck-typing host for backends that own a {@link RenderPassCoordinator}.
|
|
53
|
+
*
|
|
54
|
+
* Generic, `RenderBackend`-typed orchestration code ({@link RenderTargetPass},
|
|
55
|
+
* {@link RenderingContext.renderTo}) reaches the coordinator through this
|
|
56
|
+
* optional accessor and falls back to a legacy inline target/view save-restore
|
|
57
|
+
* when it is absent (e.g. test stub backends), mirroring the `_beginDrawPlan?`
|
|
58
|
+
* hook pattern used by `RenderPlanPlayer`.
|
|
59
|
+
* @internal
|
|
60
|
+
*/
|
|
61
|
+
export interface RenderPassCoordinatorHost {
|
|
62
|
+
readonly _passCoordinator: RenderPassCoordinator;
|
|
63
|
+
}
|
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
import type { Color } from '@/core/Color';
|
|
2
|
+
import type { RenderTarget } from '../RenderTarget';
|
|
3
|
+
import type { View } from '../View';
|
|
4
|
+
/**
|
|
5
|
+
* Whether a render pass carries a stencil attachment.
|
|
6
|
+
*
|
|
7
|
+
* WebGL2 stencil is ambient per-target GL state, so this flag is largely
|
|
8
|
+
* informational there; the WebGPU backend (from phase 12D onwards) uses it to
|
|
9
|
+
* decide whether a pass descriptor needs a `depthStencilAttachment`.
|
|
10
|
+
* @internal
|
|
11
|
+
*/
|
|
12
|
+
export declare enum StencilAttachmentMode {
|
|
13
|
+
None = 0,
|
|
14
|
+
Enabled = 1
|
|
15
|
+
}
|
|
16
|
+
/** Load behaviour for a pass's colour attachment. @internal */
|
|
17
|
+
export type RenderPassLoad = 'clear' | 'load';
|
|
18
|
+
/**
|
|
19
|
+
* Backend-agnostic description of a single render pass: which target and view
|
|
20
|
+
* it draws into, whether it clears or loads its colour attachment, and whether
|
|
21
|
+
* it carries a stencil attachment.
|
|
22
|
+
*
|
|
23
|
+
* WebGL2 maps this onto ambient framebuffer / viewport / scissor / stencil
|
|
24
|
+
* state; WebGPU (phase 12D onwards) maps it onto a `GPURenderPassEncoder`.
|
|
25
|
+
* @internal
|
|
26
|
+
*/
|
|
27
|
+
export interface RenderPassDescriptor {
|
|
28
|
+
/** Target to draw into. `null` selects the backend's root (canvas) target. */
|
|
29
|
+
readonly target: RenderTarget | null;
|
|
30
|
+
/** View to render with. `null` inherits the target's current view. */
|
|
31
|
+
readonly view: View | null;
|
|
32
|
+
/** Whether the colour attachment is cleared or preserved when the pass begins. */
|
|
33
|
+
readonly load: RenderPassLoad;
|
|
34
|
+
/** Clear colour used when `load === 'clear'`. `null` keeps the backend's current clear colour. */
|
|
35
|
+
readonly clearColor: Color | null;
|
|
36
|
+
/** Whether this pass carries a stencil attachment. */
|
|
37
|
+
readonly stencil: StencilAttachmentMode;
|
|
38
|
+
}
|
|
39
|
+
/**
|
|
40
|
+
* Snapshot of the pass currently open on a {@link RenderPassCoordinator}. The
|
|
41
|
+
* WebGPU coordinator exposes the live encoder alongside these fields from phase
|
|
42
|
+
* 12D; the shared shape lives here so both backends agree on it.
|
|
43
|
+
* @internal
|
|
44
|
+
*/
|
|
45
|
+
export interface ActiveRenderPass {
|
|
46
|
+
readonly view: View;
|
|
47
|
+
readonly stencilEnabled: boolean;
|
|
48
|
+
}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Whether a render pass carries a stencil attachment.
|
|
3
|
+
*
|
|
4
|
+
* WebGL2 stencil is ambient per-target GL state, so this flag is largely
|
|
5
|
+
* informational there; the WebGPU backend (from phase 12D onwards) uses it to
|
|
6
|
+
* decide whether a pass descriptor needs a `depthStencilAttachment`.
|
|
7
|
+
* @internal
|
|
8
|
+
*/
|
|
9
|
+
var StencilAttachmentMode;
|
|
10
|
+
(function (StencilAttachmentMode) {
|
|
11
|
+
StencilAttachmentMode[StencilAttachmentMode["None"] = 0] = "None";
|
|
12
|
+
StencilAttachmentMode[StencilAttachmentMode["Enabled"] = 1] = "Enabled";
|
|
13
|
+
})(StencilAttachmentMode || (StencilAttachmentMode = {}));
|
|
14
|
+
|
|
15
|
+
export { StencilAttachmentMode };
|
|
16
|
+
//# sourceMappingURL=RenderPassDescriptor.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"RenderPassDescriptor.js","sources":["../../../../../src/rendering/pass/RenderPassDescriptor.ts"],"sourcesContent":[null],"names":[],"mappings":"AAKA;;;;;;;AAOG;IACS;AAAZ,CAAA,UAAY,qBAAqB,EAAA;AAC/B,IAAA,qBAAA,CAAA,qBAAA,CAAA,MAAA,CAAA,GAAA,CAAA,CAAA,GAAA,MAAQ;AACR,IAAA,qBAAA,CAAA,qBAAA,CAAA,SAAA,CAAA,GAAA,CAAA,CAAA,GAAA,SAAW;AACb,CAAC,EAHW,qBAAqB,KAArB,qBAAqB,GAAA,EAAA,CAAA,CAAA;;;;"}
|
|
@@ -0,0 +1,67 @@
|
|
|
1
|
+
import type { Drawable } from '@/rendering/Drawable';
|
|
2
|
+
import type { RenderBackend } from '@/rendering/RenderBackend';
|
|
3
|
+
import type { BlendModes } from '@/rendering/types';
|
|
4
|
+
/** @internal */
|
|
5
|
+
export declare const enum RenderEntryKind {
|
|
6
|
+
Draw = 0,
|
|
7
|
+
Group = 1,
|
|
8
|
+
Barrier = 2
|
|
9
|
+
}
|
|
10
|
+
/**
|
|
11
|
+
* @internal
|
|
12
|
+
*
|
|
13
|
+
* Stable material identity used for safe draw-command grouping and
|
|
14
|
+
* eventual instanced batching.
|
|
15
|
+
*
|
|
16
|
+
* - {@link pipelineKey} drives pipeline/program reuse: identical key ⇒
|
|
17
|
+
* identical GPU pipeline state (shader + blend + sampler). Two draws
|
|
18
|
+
* with the same pipeline key can be issued with a single pipeline bind.
|
|
19
|
+
* - {@link bindKey} drives texture-bind reuse: identical key ⇒ identical
|
|
20
|
+
* texture bindings. Two draws with the same bind key can share a bind
|
|
21
|
+
* group / texture-slot state.
|
|
22
|
+
*
|
|
23
|
+
* When the drawable carries a {@link Material}, both keys are taken
|
|
24
|
+
* directly from `material.pipelineKey` and `material.bindKey` (Phase 4+
|
|
25
|
+
* Material system). When the drawable uses its default path (no material),
|
|
26
|
+
* the keys are derived conservatively from renderer identity, blend mode,
|
|
27
|
+
* and texture identity so grouping never accidentally merges draws with
|
|
28
|
+
* incompatible state.
|
|
29
|
+
*/
|
|
30
|
+
export interface MaterialKey {
|
|
31
|
+
readonly rendererId: number;
|
|
32
|
+
readonly blendMode: BlendModes;
|
|
33
|
+
readonly textureId: number;
|
|
34
|
+
readonly shaderId: number;
|
|
35
|
+
readonly pipelineKey: number;
|
|
36
|
+
readonly bindKey: number;
|
|
37
|
+
}
|
|
38
|
+
/** @internal */
|
|
39
|
+
export interface DrawCommand {
|
|
40
|
+
readonly kind: RenderEntryKind.Draw;
|
|
41
|
+
readonly drawable: Drawable;
|
|
42
|
+
nodeIndex: number;
|
|
43
|
+
seq: number;
|
|
44
|
+
zIndex: number;
|
|
45
|
+
material: MaterialKey;
|
|
46
|
+
/** Assigned by the optimizer; consecutive draws with the same groupIndex
|
|
47
|
+
* form a batch-safe unit. Undefined before optimisation. */
|
|
48
|
+
groupIndex?: number;
|
|
49
|
+
minX: number;
|
|
50
|
+
minY: number;
|
|
51
|
+
maxX: number;
|
|
52
|
+
maxY: number;
|
|
53
|
+
}
|
|
54
|
+
/**
|
|
55
|
+
* Derive a stable material key from the drawable.
|
|
56
|
+
*
|
|
57
|
+
* When the drawable carries a {@link Material} (e.g. a {@link MeshMaterial}
|
|
58
|
+
* or {@link SpriteMaterial}), the pipeline and bind keys are taken directly
|
|
59
|
+
* from the material so identically configured materials group together.
|
|
60
|
+
* When the drawable uses its default rendering path, both keys fall back
|
|
61
|
+
* to a conservative derivation from renderer identity, blend mode, and
|
|
62
|
+
* texture identity — keeping grouping safe but still enabling adjacency
|
|
63
|
+
* coalescing for default-pipeline draws of the same type.
|
|
64
|
+
*
|
|
65
|
+
* @internal
|
|
66
|
+
*/
|
|
67
|
+
export declare const makeMaterialKey: (drawable: Drawable, backend: RenderBackend | null) => MaterialKey;
|
|
@@ -0,0 +1,94 @@
|
|
|
1
|
+
/** @internal */
|
|
2
|
+
var RenderEntryKind;
|
|
3
|
+
(function (RenderEntryKind) {
|
|
4
|
+
RenderEntryKind[RenderEntryKind["Draw"] = 0] = "Draw";
|
|
5
|
+
RenderEntryKind[RenderEntryKind["Group"] = 1] = "Group";
|
|
6
|
+
RenderEntryKind[RenderEntryKind["Barrier"] = 2] = "Barrier";
|
|
7
|
+
})(RenderEntryKind || (RenderEntryKind = {}));
|
|
8
|
+
const rendererIds = new WeakMap();
|
|
9
|
+
const constructorRendererIds = new WeakMap();
|
|
10
|
+
const textureIds = new WeakMap();
|
|
11
|
+
const shaderIds = new WeakMap();
|
|
12
|
+
let nextRendererId = 1;
|
|
13
|
+
let nextTextureId = 1;
|
|
14
|
+
let nextShaderId = 1;
|
|
15
|
+
const getOrCreateId = (map, target, allocate) => {
|
|
16
|
+
const cached = map.get(target);
|
|
17
|
+
if (cached !== undefined) {
|
|
18
|
+
return cached;
|
|
19
|
+
}
|
|
20
|
+
const id = allocate();
|
|
21
|
+
map.set(target, id);
|
|
22
|
+
return id;
|
|
23
|
+
};
|
|
24
|
+
const getRendererId = (drawable, backend) => {
|
|
25
|
+
const registry = backend?.rendererRegistry;
|
|
26
|
+
if (registry && typeof registry.resolve === 'function') {
|
|
27
|
+
try {
|
|
28
|
+
const renderer = registry.resolve(drawable);
|
|
29
|
+
if (renderer && typeof renderer === 'object') {
|
|
30
|
+
return getOrCreateId(rendererIds, renderer, () => nextRendererId++);
|
|
31
|
+
}
|
|
32
|
+
}
|
|
33
|
+
catch {
|
|
34
|
+
// Resolve can throw if no renderer is registered for a custom drawable.
|
|
35
|
+
// Fall back to a conservative constructor-based id.
|
|
36
|
+
}
|
|
37
|
+
}
|
|
38
|
+
const ctor = drawable.constructor;
|
|
39
|
+
if (ctor && typeof ctor === 'function') {
|
|
40
|
+
return getOrCreateId(constructorRendererIds, ctor, () => nextRendererId++);
|
|
41
|
+
}
|
|
42
|
+
return 0;
|
|
43
|
+
};
|
|
44
|
+
const getTextureId = (drawable) => {
|
|
45
|
+
const texture = drawable.texture;
|
|
46
|
+
if (texture && typeof texture === 'object') {
|
|
47
|
+
return getOrCreateId(textureIds, texture, () => nextTextureId++);
|
|
48
|
+
}
|
|
49
|
+
return -1;
|
|
50
|
+
};
|
|
51
|
+
const getShaderId = (drawable) => {
|
|
52
|
+
const shader = drawable.shader;
|
|
53
|
+
if (shader && typeof shader === 'object') {
|
|
54
|
+
return getOrCreateId(shaderIds, shader, () => nextShaderId++);
|
|
55
|
+
}
|
|
56
|
+
return -1;
|
|
57
|
+
};
|
|
58
|
+
const getMaterial = (drawable) => {
|
|
59
|
+
const material = drawable.material;
|
|
60
|
+
return material ?? null;
|
|
61
|
+
};
|
|
62
|
+
/**
|
|
63
|
+
* Derive a stable material key from the drawable.
|
|
64
|
+
*
|
|
65
|
+
* When the drawable carries a {@link Material} (e.g. a {@link MeshMaterial}
|
|
66
|
+
* or {@link SpriteMaterial}), the pipeline and bind keys are taken directly
|
|
67
|
+
* from the material so identically configured materials group together.
|
|
68
|
+
* When the drawable uses its default rendering path, both keys fall back
|
|
69
|
+
* to a conservative derivation from renderer identity, blend mode, and
|
|
70
|
+
* texture identity — keeping grouping safe but still enabling adjacency
|
|
71
|
+
* coalescing for default-pipeline draws of the same type.
|
|
72
|
+
*
|
|
73
|
+
* @internal
|
|
74
|
+
*/
|
|
75
|
+
const makeMaterialKey = (drawable, backend) => {
|
|
76
|
+
const rendererId = getRendererId(drawable, backend);
|
|
77
|
+
const blendMode = drawable.blendMode;
|
|
78
|
+
const textureId = getTextureId(drawable);
|
|
79
|
+
const shaderId = getShaderId(drawable);
|
|
80
|
+
const material = getMaterial(drawable);
|
|
81
|
+
const pipelineKey = material !== null ? material.pipelineKey : rendererId * 31 + blendMode;
|
|
82
|
+
const bindKey = material !== null ? material.bindKey : rendererId * 31 + (textureId > 0 ? textureId : 0);
|
|
83
|
+
return {
|
|
84
|
+
rendererId,
|
|
85
|
+
blendMode,
|
|
86
|
+
textureId,
|
|
87
|
+
shaderId,
|
|
88
|
+
pipelineKey,
|
|
89
|
+
bindKey,
|
|
90
|
+
};
|
|
91
|
+
};
|
|
92
|
+
|
|
93
|
+
export { RenderEntryKind, makeMaterialKey };
|
|
94
|
+
//# sourceMappingURL=RenderCommand.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"RenderCommand.js","sources":["../../../../../src/rendering/plan/RenderCommand.ts"],"sourcesContent":[null],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import type { RenderBackend } from '@/rendering/RenderBackend';
|
|
2
|
+
import { type BarrierScope, type GroupScope } from './RenderScope';
|
|
3
|
+
/** @internal */
|
|
4
|
+
export declare class RenderEffectExecutor {
|
|
5
|
+
static play(barrier: BarrierScope, backend: RenderBackend, playScope: (scope: GroupScope) => void): void;
|
|
6
|
+
private static _withClip;
|
|
7
|
+
private static _withRectClip;
|
|
8
|
+
private static _withMask;
|
|
9
|
+
private static _resolveMaskTexture;
|
|
10
|
+
}
|
|
@@ -0,0 +1,159 @@
|
|
|
1
|
+
import { Rectangle } from '../../math/Rectangle.js';
|
|
2
|
+
import { RenderTexture } from '../texture/RenderTexture.js';
|
|
3
|
+
import { Texture } from '../texture/Texture.js';
|
|
4
|
+
import { ClipKind } from './RenderScope.js';
|
|
5
|
+
|
|
6
|
+
/** @internal */
|
|
7
|
+
class RenderEffectExecutor {
|
|
8
|
+
static play(barrier, backend, playScope) {
|
|
9
|
+
const { node, effect } = barrier;
|
|
10
|
+
const hasFilters = effect.filters.length > 0;
|
|
11
|
+
const needsBitmapCache = effect.cacheAsBitmap;
|
|
12
|
+
const { left, top, width, height } = barrier;
|
|
13
|
+
if (!hasFilters && !needsBitmapCache) {
|
|
14
|
+
this._withClip(node, backend, barrier, () => {
|
|
15
|
+
if (barrier.childPlan !== null) {
|
|
16
|
+
playScope(barrier.childPlan);
|
|
17
|
+
}
|
|
18
|
+
});
|
|
19
|
+
return;
|
|
20
|
+
}
|
|
21
|
+
if (needsBitmapCache && barrier.childPlan === null) {
|
|
22
|
+
const cachedTexture = node._renderPlanGetCacheTexture();
|
|
23
|
+
if (cachedTexture !== null) {
|
|
24
|
+
this._withClip(node, backend, barrier, () => {
|
|
25
|
+
node._renderPlanDrawTexture(backend, cachedTexture, left, top, width, height, effect.blendMode);
|
|
26
|
+
});
|
|
27
|
+
}
|
|
28
|
+
return;
|
|
29
|
+
}
|
|
30
|
+
const cacheTexture = needsBitmapCache ? node._renderPlanEnsureCacheTexture(width, height) : null;
|
|
31
|
+
let pooledTexture = null;
|
|
32
|
+
try {
|
|
33
|
+
const sourceTexture = needsBitmapCache && !hasFilters ? cacheTexture : backend.acquireRenderTexture(width, height);
|
|
34
|
+
if (sourceTexture !== cacheTexture) {
|
|
35
|
+
pooledTexture = sourceTexture;
|
|
36
|
+
}
|
|
37
|
+
node._renderPlanRenderToTexture(backend, sourceTexture, left, top, width, height, () => {
|
|
38
|
+
if (barrier.childPlan !== null) {
|
|
39
|
+
playScope(barrier.childPlan);
|
|
40
|
+
}
|
|
41
|
+
});
|
|
42
|
+
let finalTexture = sourceTexture;
|
|
43
|
+
if (hasFilters) {
|
|
44
|
+
for (let index = 0; index < effect.filters.length; index++) {
|
|
45
|
+
const isLast = index === effect.filters.length - 1;
|
|
46
|
+
const output = isLast && needsBitmapCache ? cacheTexture : backend.acquireRenderTexture(width, height);
|
|
47
|
+
try {
|
|
48
|
+
effect.filters[index].apply(backend, finalTexture, output);
|
|
49
|
+
}
|
|
50
|
+
catch (error) {
|
|
51
|
+
if (output !== cacheTexture) {
|
|
52
|
+
backend.releaseRenderTexture(output);
|
|
53
|
+
}
|
|
54
|
+
throw error;
|
|
55
|
+
}
|
|
56
|
+
if (pooledTexture !== null) {
|
|
57
|
+
backend.releaseRenderTexture(pooledTexture);
|
|
58
|
+
pooledTexture = null;
|
|
59
|
+
}
|
|
60
|
+
finalTexture = output;
|
|
61
|
+
if (output !== cacheTexture) {
|
|
62
|
+
pooledTexture = output;
|
|
63
|
+
}
|
|
64
|
+
}
|
|
65
|
+
}
|
|
66
|
+
if (needsBitmapCache) {
|
|
67
|
+
node._renderPlanStoreCacheTexture(cacheTexture, left, top, width, height);
|
|
68
|
+
}
|
|
69
|
+
this._withClip(node, backend, barrier, () => {
|
|
70
|
+
node._renderPlanDrawTexture(backend, finalTexture, left, top, width, height, effect.blendMode);
|
|
71
|
+
});
|
|
72
|
+
}
|
|
73
|
+
finally {
|
|
74
|
+
if (pooledTexture !== null) {
|
|
75
|
+
backend.releaseRenderTexture(pooledTexture);
|
|
76
|
+
}
|
|
77
|
+
}
|
|
78
|
+
}
|
|
79
|
+
// Clip wraps the mask block as the outermost effect boundary, so it acts on
|
|
80
|
+
// the final filtered/masked output. Stencil (Geometry) is outermost; the Rect
|
|
81
|
+
// scissor sits between it and the alpha-mask machinery; both compose with any
|
|
82
|
+
// existing mask scissor since scissors/stencil are all restrictive.
|
|
83
|
+
static _withClip(node, backend, barrier, callback) {
|
|
84
|
+
if (barrier.effect.clip === ClipKind.Stencil) {
|
|
85
|
+
backend.pushStencilClip(barrier.effect.clipShape, node.getGlobalTransform());
|
|
86
|
+
try {
|
|
87
|
+
this._withRectClip(node, backend, barrier, callback);
|
|
88
|
+
}
|
|
89
|
+
finally {
|
|
90
|
+
backend.popStencilClip();
|
|
91
|
+
}
|
|
92
|
+
return;
|
|
93
|
+
}
|
|
94
|
+
this._withRectClip(node, backend, barrier, callback);
|
|
95
|
+
}
|
|
96
|
+
static _withRectClip(node, backend, barrier, callback) {
|
|
97
|
+
if (barrier.effect.clip === ClipKind.Rect) {
|
|
98
|
+
const rect = barrier.effect.clipShape ?? node.getBounds();
|
|
99
|
+
if (rect.width <= 0 || rect.height <= 0) {
|
|
100
|
+
return;
|
|
101
|
+
}
|
|
102
|
+
backend.pushScissorRect(rect);
|
|
103
|
+
try {
|
|
104
|
+
this._withMask(node, backend, barrier, callback);
|
|
105
|
+
}
|
|
106
|
+
finally {
|
|
107
|
+
backend.popScissorRect();
|
|
108
|
+
}
|
|
109
|
+
return;
|
|
110
|
+
}
|
|
111
|
+
this._withMask(node, backend, barrier, callback);
|
|
112
|
+
}
|
|
113
|
+
static _withMask(node, backend, barrier, callback) {
|
|
114
|
+
const mask = barrier.effect.maskSource;
|
|
115
|
+
if (mask === null) {
|
|
116
|
+
callback();
|
|
117
|
+
return;
|
|
118
|
+
}
|
|
119
|
+
if (mask instanceof Rectangle) {
|
|
120
|
+
if (mask.width <= 0 || mask.height <= 0) {
|
|
121
|
+
return;
|
|
122
|
+
}
|
|
123
|
+
backend.pushScissorRect(mask);
|
|
124
|
+
try {
|
|
125
|
+
callback();
|
|
126
|
+
}
|
|
127
|
+
finally {
|
|
128
|
+
backend.popScissorRect();
|
|
129
|
+
}
|
|
130
|
+
return;
|
|
131
|
+
}
|
|
132
|
+
const contentTexture = backend.acquireRenderTexture(barrier.width, barrier.height);
|
|
133
|
+
const releasePool = [contentTexture];
|
|
134
|
+
try {
|
|
135
|
+
node._renderPlanRenderToTexture(backend, contentTexture, barrier.left, barrier.top, barrier.width, barrier.height, callback);
|
|
136
|
+
const maskTexture = this._resolveMaskTexture(node, backend, mask, barrier, releasePool);
|
|
137
|
+
backend.composeWithAlphaMask(contentTexture, maskTexture, barrier.left, barrier.top, barrier.width, barrier.height, barrier.effect.blendMode);
|
|
138
|
+
}
|
|
139
|
+
finally {
|
|
140
|
+
for (const texture of releasePool) {
|
|
141
|
+
backend.releaseRenderTexture(texture);
|
|
142
|
+
}
|
|
143
|
+
}
|
|
144
|
+
}
|
|
145
|
+
static _resolveMaskTexture(node, backend, mask, barrier, releasePool) {
|
|
146
|
+
if (!(mask instanceof Texture) && !(mask instanceof RenderTexture)) {
|
|
147
|
+
const maskTexture = backend.acquireRenderTexture(barrier.width, barrier.height);
|
|
148
|
+
releasePool.push(maskTexture);
|
|
149
|
+
node._renderPlanRenderToTexture(backend, maskTexture, barrier.left, barrier.top, barrier.width, barrier.height, () => {
|
|
150
|
+
mask.render(backend);
|
|
151
|
+
});
|
|
152
|
+
return maskTexture;
|
|
153
|
+
}
|
|
154
|
+
return mask;
|
|
155
|
+
}
|
|
156
|
+
}
|
|
157
|
+
|
|
158
|
+
export { RenderEffectExecutor };
|
|
159
|
+
//# sourceMappingURL=RenderEffectExecutor.js.map
|