@lightningtv/renderer 3.0.0-beta1 → 3.2.3
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/NOTICE +4 -0
- package/README.md +22 -28
- package/dist/exports/canvas-shaders.js +0 -16
- package/dist/exports/canvas-shaders.js.map +1 -1
- package/dist/exports/canvas.d.ts +1 -1
- package/dist/exports/canvas.js +1 -19
- package/dist/exports/canvas.js.map +1 -1
- package/dist/exports/index.d.ts +2 -5
- package/dist/exports/index.js +1 -23
- package/dist/exports/index.js.map +1 -1
- package/dist/exports/inspector.js +0 -18
- package/dist/exports/inspector.js.map +1 -1
- package/dist/exports/utils.d.ts +2 -1
- package/dist/exports/utils.js +2 -19
- package/dist/exports/utils.js.map +1 -1
- package/dist/exports/webgl-shaders.js +0 -16
- package/dist/exports/webgl-shaders.js.map +1 -1
- package/dist/exports/webgl.d.ts +2 -1
- package/dist/exports/webgl.js +2 -19
- package/dist/exports/webgl.js.map +1 -1
- package/dist/src/common/CommonTypes.d.ts +15 -3
- package/dist/src/common/CommonTypes.js +0 -18
- package/dist/src/common/CommonTypes.js.map +1 -1
- package/dist/src/common/EventEmitter.js +0 -18
- package/dist/src/common/EventEmitter.js.map +1 -1
- package/dist/src/common/IEventEmitter.js +0 -16
- package/dist/src/common/IEventEmitter.js.map +1 -1
- package/dist/src/core/Autosizer.d.ts +35 -0
- package/dist/src/core/Autosizer.js +178 -0
- package/dist/src/core/Autosizer.js.map +1 -0
- package/dist/src/core/CoreNode.d.ts +140 -102
- package/dist/src/core/CoreNode.js +812 -528
- package/dist/src/core/CoreNode.js.map +1 -1
- package/dist/src/core/CoreShaderManager.d.ts +3 -3
- package/dist/src/core/CoreShaderManager.js +0 -18
- package/dist/src/core/CoreShaderManager.js.map +1 -1
- package/dist/src/core/CoreTextNode.d.ts +75 -87
- package/dist/src/core/CoreTextNode.js +380 -258
- package/dist/src/core/CoreTextNode.js.map +1 -1
- package/dist/src/core/CoreTextureManager.d.ts +25 -14
- package/dist/src/core/CoreTextureManager.js +82 -139
- package/dist/src/core/CoreTextureManager.js.map +1 -1
- package/dist/src/core/Stage.d.ts +102 -36
- package/dist/src/core/Stage.js +424 -191
- package/dist/src/core/Stage.js.map +1 -1
- package/dist/src/core/TextureError.d.ts +11 -0
- package/dist/src/core/TextureError.js +37 -0
- package/dist/src/core/TextureError.js.map +1 -0
- package/dist/src/core/TextureMemoryManager.d.ts +11 -4
- package/dist/src/core/TextureMemoryManager.js +114 -134
- package/dist/src/core/TextureMemoryManager.js.map +1 -1
- package/dist/src/core/animations/AnimationManager.js +0 -18
- package/dist/src/core/animations/AnimationManager.js.map +1 -1
- package/dist/src/core/animations/CoreAnimation.d.ts +3 -3
- package/dist/src/core/animations/CoreAnimation.js +8 -24
- package/dist/src/core/animations/CoreAnimation.js.map +1 -1
- package/dist/src/core/animations/CoreAnimationController.d.ts +1 -0
- package/dist/src/core/animations/CoreAnimationController.js +11 -22
- package/dist/src/core/animations/CoreAnimationController.js.map +1 -1
- package/dist/src/core/lib/ContextSpy.js +0 -18
- package/dist/src/core/lib/ContextSpy.js.map +1 -1
- package/dist/src/core/lib/ImageWorker.d.ts +2 -2
- package/dist/src/core/lib/ImageWorker.js +33 -31
- package/dist/src/core/lib/ImageWorker.js.map +1 -1
- package/dist/src/core/lib/Matrix3d.d.ts +1 -0
- package/dist/src/core/lib/Matrix3d.js +7 -19
- package/dist/src/core/lib/Matrix3d.js.map +1 -1
- package/dist/src/core/lib/RenderCoords.d.ts +9 -10
- package/dist/src/core/lib/RenderCoords.js +27 -55
- package/dist/src/core/lib/RenderCoords.js.map +1 -1
- package/dist/src/core/lib/WebGlContextWrapper.d.ts +83 -8
- package/dist/src/core/lib/WebGlContextWrapper.js +150 -25
- package/dist/src/core/lib/WebGlContextWrapper.js.map +1 -1
- package/dist/src/core/lib/collectionUtils.d.ts +5 -0
- package/dist/src/core/lib/collectionUtils.js +82 -0
- package/dist/src/core/lib/collectionUtils.js.map +1 -0
- package/dist/src/core/lib/colorCache.d.ts +1 -0
- package/dist/src/core/lib/colorCache.js +19 -0
- package/dist/src/core/lib/colorCache.js.map +1 -0
- package/dist/src/core/{renderers/canvas/internal/ColorUtils.js → lib/colorParser.js} +1 -19
- package/dist/src/core/lib/colorParser.js.map +1 -0
- package/dist/src/core/lib/textureCompression.d.ts +14 -2
- package/dist/src/core/lib/textureCompression.js +320 -85
- package/dist/src/core/lib/textureCompression.js.map +1 -1
- package/dist/src/core/lib/textureSvg.js +0 -18
- package/dist/src/core/lib/textureSvg.js.map +1 -1
- package/dist/src/core/lib/utils.d.ts +8 -1
- package/dist/src/core/lib/utils.js +44 -20
- package/dist/src/core/lib/utils.js.map +1 -1
- package/dist/src/core/lib/validateImageBitmap.d.ts +2 -1
- package/dist/src/core/lib/validateImageBitmap.js +4 -4
- package/dist/src/core/lib/validateImageBitmap.js.map +1 -1
- package/dist/src/core/platforms/Platform.d.ts +42 -0
- package/dist/src/core/platforms/Platform.js +4 -0
- package/dist/src/core/platforms/Platform.js.map +1 -0
- package/dist/src/core/platforms/web/WebPlatform.d.ts +10 -0
- package/dist/src/core/platforms/web/WebPlatform.js +90 -0
- package/dist/src/core/platforms/web/WebPlatform.js.map +1 -0
- package/dist/src/core/renderers/CoreContextTexture.d.ts +2 -1
- package/dist/src/core/renderers/CoreContextTexture.js +0 -18
- package/dist/src/core/renderers/CoreContextTexture.js.map +1 -1
- package/dist/src/core/renderers/CoreRenderOp.js +0 -18
- package/dist/src/core/renderers/CoreRenderOp.js.map +1 -1
- package/dist/src/core/renderers/CoreRenderer.d.ts +15 -3
- package/dist/src/core/renderers/CoreRenderer.js +1 -18
- package/dist/src/core/renderers/CoreRenderer.js.map +1 -1
- package/dist/src/core/renderers/CoreShaderNode.d.ts +13 -3
- package/dist/src/core/renderers/CoreShaderNode.js +25 -2
- package/dist/src/core/renderers/CoreShaderNode.js.map +1 -1
- package/dist/src/core/renderers/CoreShaderProgram.js +0 -18
- package/dist/src/core/renderers/CoreShaderProgram.js.map +1 -1
- package/dist/src/core/renderers/canvas/CanvasRenderer.d.ts +4 -5
- package/dist/src/core/renderers/canvas/CanvasRenderer.js +89 -83
- package/dist/src/core/renderers/canvas/CanvasRenderer.js.map +1 -1
- package/dist/src/core/renderers/canvas/CanvasShaderNode.js +3 -21
- package/dist/src/core/renderers/canvas/CanvasShaderNode.js.map +1 -1
- package/dist/src/core/renderers/canvas/CanvasTexture.d.ts +3 -2
- package/dist/src/core/renderers/canvas/CanvasTexture.js +18 -31
- package/dist/src/core/renderers/canvas/CanvasTexture.js.map +1 -1
- package/dist/src/core/renderers/webgl/SdfRenderOp.d.ts +33 -0
- package/dist/src/core/renderers/webgl/SdfRenderOp.js +80 -0
- package/dist/src/core/renderers/webgl/SdfRenderOp.js.map +1 -0
- package/dist/src/core/renderers/webgl/WebGlCtxRenderTexture.d.ts +2 -0
- package/dist/src/core/renderers/webgl/WebGlCtxRenderTexture.js +14 -24
- package/dist/src/core/renderers/webgl/WebGlCtxRenderTexture.js.map +1 -1
- package/dist/src/core/renderers/webgl/WebGlCtxSubTexture.d.ts +13 -0
- package/dist/src/core/renderers/webgl/WebGlCtxSubTexture.js +34 -23
- package/dist/src/core/renderers/webgl/WebGlCtxSubTexture.js.map +1 -1
- package/dist/src/core/renderers/webgl/WebGlCtxTexture.d.ts +16 -6
- package/dist/src/core/renderers/webgl/WebGlCtxTexture.js +102 -70
- package/dist/src/core/renderers/webgl/WebGlCtxTexture.js.map +1 -1
- package/dist/src/core/renderers/webgl/WebGlRenderer.d.ts +34 -20
- package/dist/src/core/renderers/webgl/WebGlRenderer.js +319 -195
- package/dist/src/core/renderers/webgl/WebGlRenderer.js.map +1 -1
- package/dist/src/core/renderers/webgl/WebGlShaderNode.d.ts +2 -3
- package/dist/src/core/renderers/webgl/WebGlShaderNode.js +1 -4
- package/dist/src/core/renderers/webgl/WebGlShaderNode.js.map +1 -1
- package/dist/src/core/renderers/webgl/WebGlShaderProgram.d.ts +9 -7
- package/dist/src/core/renderers/webgl/WebGlShaderProgram.js +99 -48
- package/dist/src/core/renderers/webgl/WebGlShaderProgram.js.map +1 -1
- package/dist/src/core/renderers/webgl/internal/BufferCollection.d.ts +1 -0
- package/dist/src/core/renderers/webgl/internal/BufferCollection.js +12 -21
- package/dist/src/core/renderers/webgl/internal/BufferCollection.js.map +1 -1
- package/dist/src/core/renderers/webgl/internal/RendererUtils.js +0 -18
- package/dist/src/core/renderers/webgl/internal/RendererUtils.js.map +1 -1
- package/dist/src/core/renderers/webgl/internal/ShaderUtils.js +0 -18
- package/dist/src/core/renderers/webgl/internal/ShaderUtils.js.map +1 -1
- package/dist/src/core/renderers/webgl/internal/WebGlUtils.js +0 -18
- package/dist/src/core/renderers/webgl/internal/WebGlUtils.js.map +1 -1
- package/dist/src/core/shaders/canvas/Border.d.ts +8 -2
- package/dist/src/core/shaders/canvas/Border.js +67 -41
- package/dist/src/core/shaders/canvas/Border.js.map +1 -1
- package/dist/src/core/shaders/canvas/HolePunch.js +3 -19
- package/dist/src/core/shaders/canvas/HolePunch.js.map +1 -1
- package/dist/src/core/shaders/canvas/LinearGradient.js +7 -21
- package/dist/src/core/shaders/canvas/LinearGradient.js.map +1 -1
- package/dist/src/core/shaders/canvas/RadialGradient.js +14 -28
- package/dist/src/core/shaders/canvas/RadialGradient.js.map +1 -1
- package/dist/src/core/shaders/canvas/Rounded.js +1 -17
- package/dist/src/core/shaders/canvas/Rounded.js.map +1 -1
- package/dist/src/core/shaders/canvas/RoundedWithBorder.d.ts +6 -3
- package/dist/src/core/shaders/canvas/RoundedWithBorder.js +44 -22
- package/dist/src/core/shaders/canvas/RoundedWithBorder.js.map +1 -1
- package/dist/src/core/shaders/canvas/RoundedWithBorderAndShadow.d.ts +2 -3
- package/dist/src/core/shaders/canvas/RoundedWithBorderAndShadow.js +47 -25
- package/dist/src/core/shaders/canvas/RoundedWithBorderAndShadow.js.map +1 -1
- package/dist/src/core/shaders/canvas/RoundedWithShadow.js +9 -21
- package/dist/src/core/shaders/canvas/RoundedWithShadow.js.map +1 -1
- package/dist/src/core/shaders/canvas/Shadow.js +0 -16
- package/dist/src/core/shaders/canvas/Shadow.js.map +1 -1
- package/dist/src/core/shaders/canvas/utils/render.d.ts +1 -1
- package/dist/src/core/shaders/canvas/utils/render.js +31 -34
- package/dist/src/core/shaders/canvas/utils/render.js.map +1 -1
- package/dist/src/core/shaders/templates/BorderTemplate.d.ts +12 -2
- package/dist/src/core/shaders/templates/BorderTemplate.js +31 -27
- package/dist/src/core/shaders/templates/BorderTemplate.js.map +1 -1
- package/dist/src/core/shaders/templates/HolePunchTemplate.d.ts +2 -2
- package/dist/src/core/shaders/templates/HolePunchTemplate.js +3 -19
- package/dist/src/core/shaders/templates/HolePunchTemplate.js.map +1 -1
- package/dist/src/core/shaders/templates/LinearGradientTemplate.js +0 -16
- package/dist/src/core/shaders/templates/LinearGradientTemplate.js.map +1 -1
- package/dist/src/core/shaders/templates/RadialGradientTemplate.d.ts +8 -6
- package/dist/src/core/shaders/templates/RadialGradientTemplate.js +2 -18
- package/dist/src/core/shaders/templates/RadialGradientTemplate.js.map +1 -1
- package/dist/src/core/shaders/templates/RoundedTemplate.js +1 -17
- package/dist/src/core/shaders/templates/RoundedTemplate.js.map +1 -1
- package/dist/src/core/shaders/templates/RoundedWithBorderAndShadowTemplate.d.ts +1 -1
- package/dist/src/core/shaders/templates/RoundedWithBorderAndShadowTemplate.js +0 -16
- package/dist/src/core/shaders/templates/RoundedWithBorderAndShadowTemplate.js.map +1 -1
- package/dist/src/core/shaders/templates/RoundedWithBorderTemplate.d.ts +4 -2
- package/dist/src/core/shaders/templates/RoundedWithBorderTemplate.js +3 -17
- package/dist/src/core/shaders/templates/RoundedWithBorderTemplate.js.map +1 -1
- package/dist/src/core/shaders/templates/RoundedWithShadowTemplate.d.ts +1 -1
- package/dist/src/core/shaders/templates/RoundedWithShadowTemplate.js +0 -16
- package/dist/src/core/shaders/templates/RoundedWithShadowTemplate.js.map +1 -1
- package/dist/src/core/shaders/templates/ShadowTemplate.d.ts +1 -1
- package/dist/src/core/shaders/templates/ShadowTemplate.js +0 -16
- package/dist/src/core/shaders/templates/ShadowTemplate.js.map +1 -1
- package/dist/src/core/shaders/{templates/shaderUtils.d.ts → utils.d.ts} +1 -1
- package/dist/src/core/shaders/utils.js +25 -0
- package/dist/src/core/shaders/utils.js.map +1 -0
- package/dist/src/core/shaders/webgl/Border.js +118 -51
- package/dist/src/core/shaders/webgl/Border.js.map +1 -1
- package/dist/src/core/shaders/webgl/Default.js +6 -41
- package/dist/src/core/shaders/webgl/Default.js.map +1 -1
- package/dist/src/core/shaders/webgl/HolePunch.js +4 -19
- package/dist/src/core/shaders/webgl/HolePunch.js.map +1 -1
- package/dist/src/core/shaders/webgl/LinearGradient.js +73 -34
- package/dist/src/core/shaders/webgl/LinearGradient.js.map +1 -1
- package/dist/src/core/shaders/webgl/RadialGradient.js +56 -48
- package/dist/src/core/shaders/webgl/RadialGradient.js.map +1 -1
- package/dist/src/core/shaders/webgl/Rounded.js +25 -23
- package/dist/src/core/shaders/webgl/Rounded.js.map +1 -1
- package/dist/src/core/shaders/webgl/RoundedWithBorder.js +160 -55
- package/dist/src/core/shaders/webgl/RoundedWithBorder.js.map +1 -1
- package/dist/src/core/shaders/webgl/RoundedWithBorderAndShadow.js +168 -58
- package/dist/src/core/shaders/webgl/RoundedWithBorderAndShadow.js.map +1 -1
- package/dist/src/core/shaders/webgl/RoundedWithShadow.js +73 -34
- package/dist/src/core/shaders/webgl/RoundedWithShadow.js.map +1 -1
- package/dist/src/core/shaders/webgl/SdfShader.d.ts +0 -2
- package/dist/src/core/shaders/webgl/SdfShader.js +8 -36
- package/dist/src/core/shaders/webgl/SdfShader.js.map +1 -1
- package/dist/src/core/shaders/webgl/Shadow.js +39 -34
- package/dist/src/core/shaders/webgl/Shadow.js.map +1 -1
- package/dist/src/core/text-rendering/CanvasFontHandler.d.ts +59 -0
- package/dist/src/core/text-rendering/CanvasFontHandler.js +206 -0
- package/dist/src/core/text-rendering/CanvasFontHandler.js.map +1 -0
- package/dist/src/core/text-rendering/CanvasTextRenderer.d.ts +17 -0
- package/dist/src/core/text-rendering/CanvasTextRenderer.js +139 -0
- package/dist/src/core/text-rendering/CanvasTextRenderer.js.map +1 -0
- package/dist/src/core/text-rendering/SdfFontHandler.d.ts +167 -0
- package/dist/src/core/text-rendering/SdfFontHandler.js +371 -0
- package/dist/src/core/text-rendering/SdfFontHandler.js.map +1 -0
- package/dist/src/core/text-rendering/SdfTextRenderer.d.ts +18 -0
- package/dist/src/core/text-rendering/SdfTextRenderer.js +301 -0
- package/dist/src/core/text-rendering/SdfTextRenderer.js.map +1 -0
- package/dist/src/core/text-rendering/TextLayoutEngine.d.ts +18 -0
- package/dist/src/core/text-rendering/TextLayoutEngine.js +380 -0
- package/dist/src/core/text-rendering/TextLayoutEngine.js.map +1 -0
- package/dist/src/core/text-rendering/TextRenderer.d.ts +384 -0
- package/dist/src/core/text-rendering/TextRenderer.js +2 -0
- package/dist/src/core/text-rendering/TextRenderer.js.map +1 -0
- package/dist/src/core/text-rendering/Utils.d.ts +30 -0
- package/dist/src/core/text-rendering/Utils.js +66 -0
- package/dist/src/core/text-rendering/Utils.js.map +1 -0
- package/dist/src/core/textures/ColorTexture.d.ts +1 -1
- package/dist/src/core/textures/ColorTexture.js +3 -22
- package/dist/src/core/textures/ColorTexture.js.map +1 -1
- package/dist/src/core/textures/ImageTexture.d.ts +13 -6
- package/dist/src/core/textures/ImageTexture.js +57 -66
- package/dist/src/core/textures/ImageTexture.js.map +1 -1
- package/dist/src/core/textures/NoiseTexture.d.ts +3 -3
- package/dist/src/core/textures/NoiseTexture.js +8 -26
- package/dist/src/core/textures/NoiseTexture.js.map +1 -1
- package/dist/src/core/textures/RenderTexture.d.ts +7 -7
- package/dist/src/core/textures/RenderTexture.js +12 -30
- package/dist/src/core/textures/RenderTexture.js.map +1 -1
- package/dist/src/core/textures/SubTexture.d.ts +6 -8
- package/dist/src/core/textures/SubTexture.js +19 -55
- package/dist/src/core/textures/SubTexture.js.map +1 -1
- package/dist/src/core/textures/Texture.d.ts +90 -12
- package/dist/src/core/textures/Texture.js +160 -35
- package/dist/src/core/textures/Texture.js.map +1 -1
- package/dist/src/core/utils.d.ts +2 -1
- package/dist/src/core/utils.js +1 -19
- package/dist/src/core/utils.js.map +1 -1
- package/dist/src/main-api/INode.js.map +1 -1
- package/dist/src/main-api/Inspector.d.ts +135 -2
- package/dist/src/main-api/Inspector.js +507 -30
- package/dist/src/main-api/Inspector.js.map +1 -1
- package/dist/src/main-api/Renderer.d.ts +294 -81
- package/dist/src/main-api/Renderer.js +225 -96
- package/dist/src/main-api/Renderer.js.map +1 -1
- package/dist/src/utils.d.ts +19 -6
- package/dist/src/utils.js +32 -27
- package/dist/src/utils.js.map +1 -1
- package/dist/tsconfig.dist.tsbuildinfo +1 -1
- package/dist/tsconfig.tsbuildinfo +1 -0
- package/exports/canvas-shaders.ts +0 -17
- package/exports/canvas.ts +1 -19
- package/exports/index.ts +6 -27
- package/exports/inspector.ts +0 -19
- package/exports/utils.ts +7 -19
- package/exports/webgl-shaders.ts +0 -16
- package/exports/webgl.ts +3 -20
- package/package.json +23 -22
- package/src/common/CommonTypes.ts +20 -22
- package/src/common/EventEmitter.ts +0 -19
- package/src/common/IAnimationController.ts +0 -18
- package/src/common/IEventEmitter.ts +0 -17
- package/src/core/Autosizer.ts +205 -0
- package/src/core/CoreNode.test.ts +376 -45
- package/src/core/CoreNode.ts +1015 -656
- package/src/core/CoreShaderManager.ts +3 -21
- package/src/core/CoreTextNode.ts +457 -314
- package/src/core/CoreTextureManager.ts +110 -167
- package/src/core/Stage.ts +526 -236
- package/src/core/TextureError.ts +46 -0
- package/src/core/TextureMemoryManager.ts +150 -167
- package/src/core/animations/AnimationManager.ts +0 -19
- package/src/core/animations/CoreAnimation.ts +15 -32
- package/src/core/animations/CoreAnimationController.ts +13 -23
- package/src/core/lib/ContextSpy.ts +0 -19
- package/src/core/lib/ImageWorker.ts +45 -32
- package/src/core/lib/Matrix3d.ts +7 -20
- package/src/core/lib/RenderCoords.ts +36 -67
- package/src/core/lib/WebGlContextWrapper.ts +196 -72
- package/src/core/lib/collectionUtils.ts +99 -0
- package/src/core/lib/colorCache.ts +20 -0
- package/src/core/{renderers/canvas/internal/ColorUtils.ts → lib/colorParser.ts} +2 -21
- package/src/core/lib/textureCompression.ts +433 -93
- package/src/core/lib/textureSvg.ts +0 -19
- package/src/core/lib/utils.ts +58 -19
- package/src/core/lib/validateImageBitmap.ts +17 -6
- package/src/core/platforms/Platform.ts +64 -0
- package/src/core/platforms/web/WebPlatform.ts +132 -0
- package/src/core/renderers/CoreContextTexture.ts +2 -20
- package/src/core/renderers/CoreRenderOp.ts +0 -19
- package/src/core/renderers/CoreRenderer.ts +16 -23
- package/src/core/renderers/CoreShaderNode.ts +37 -6
- package/src/core/renderers/CoreShaderProgram.ts +0 -19
- package/src/core/renderers/canvas/CanvasRenderer.ts +108 -137
- package/src/core/renderers/canvas/CanvasShaderNode.ts +3 -23
- package/src/core/renderers/canvas/CanvasTexture.ts +25 -37
- package/src/core/renderers/webgl/SdfRenderOp.ts +88 -0
- package/src/core/renderers/webgl/WebGlCtxRenderTexture.ts +18 -34
- package/src/core/renderers/webgl/WebGlCtxSubTexture.ts +50 -24
- package/src/core/renderers/webgl/WebGlCtxTexture.ts +134 -103
- package/src/core/renderers/webgl/WebGlRenderer.ts +368 -233
- package/src/core/renderers/webgl/WebGlShaderNode.ts +4 -7
- package/src/core/renderers/webgl/WebGlShaderProgram.ts +122 -76
- package/src/core/renderers/webgl/internal/BufferCollection.ts +15 -23
- package/src/core/renderers/webgl/internal/RendererUtils.ts +0 -19
- package/src/core/renderers/webgl/internal/ShaderUtils.ts +0 -19
- package/src/core/renderers/webgl/internal/WebGlUtils.ts +0 -19
- package/src/core/shaders/canvas/Border.ts +91 -50
- package/src/core/shaders/canvas/HolePunch.ts +4 -28
- package/src/core/shaders/canvas/LinearGradient.ts +10 -25
- package/src/core/shaders/canvas/RadialGradient.ts +23 -54
- package/src/core/shaders/canvas/Rounded.ts +2 -19
- package/src/core/shaders/canvas/RoundedWithBorder.ts +72 -35
- package/src/core/shaders/canvas/RoundedWithBorderAndShadow.ts +77 -47
- package/src/core/shaders/canvas/RoundedWithShadow.ts +21 -34
- package/src/core/shaders/canvas/Shadow.ts +0 -17
- package/src/core/shaders/canvas/utils/render.ts +45 -53
- package/src/core/shaders/templates/BorderTemplate.ts +42 -29
- package/src/core/shaders/templates/HolePunchTemplate.ts +5 -22
- package/src/core/shaders/templates/LinearGradientTemplate.ts +0 -17
- package/src/core/shaders/templates/RadialGradientTemplate.ts +10 -25
- package/src/core/shaders/templates/RoundedTemplate.ts +1 -18
- package/src/core/shaders/templates/RoundedWithBorderAndShadowTemplate.ts +1 -18
- package/src/core/shaders/templates/RoundedWithBorderTemplate.ts +7 -19
- package/src/core/shaders/templates/RoundedWithShadowTemplate.ts +1 -18
- package/src/core/shaders/templates/ShadowTemplate.ts +1 -18
- package/src/core/shaders/utils.ts +30 -0
- package/src/core/shaders/webgl/Border.ts +118 -55
- package/src/core/shaders/webgl/Default.ts +6 -43
- package/src/core/shaders/webgl/HolePunch.ts +4 -24
- package/src/core/shaders/webgl/LinearGradient.ts +73 -35
- package/src/core/shaders/webgl/RadialGradient.ts +58 -51
- package/src/core/shaders/webgl/Rounded.ts +25 -45
- package/src/core/shaders/webgl/RoundedWithBorder.ts +161 -63
- package/src/core/shaders/webgl/RoundedWithBorderAndShadow.ts +169 -68
- package/src/core/shaders/webgl/RoundedWithShadow.ts +73 -39
- package/src/core/shaders/webgl/SdfShader.ts +8 -41
- package/src/core/shaders/webgl/Shadow.ts +39 -35
- package/src/core/text-rendering/CanvasFontHandler.ts +285 -0
- package/src/core/text-rendering/CanvasTextRenderer.ts +236 -0
- package/src/core/text-rendering/SdfFontHandler.ts +566 -0
- package/src/core/text-rendering/SdfTextRenderer.ts +406 -0
- package/src/core/text-rendering/TextLayoutEngine.ts +672 -0
- package/src/core/text-rendering/TextRenderer.ts +426 -0
- package/src/core/text-rendering/Utils.ts +80 -0
- package/src/core/text-rendering/tests/TextLayoutEngine.test.ts +434 -0
- package/src/core/textures/ColorTexture.ts +7 -24
- package/src/core/textures/ImageTexture.ts +110 -92
- package/src/core/textures/NoiseTexture.ts +14 -31
- package/src/core/textures/RenderTexture.ts +18 -35
- package/src/core/textures/SubTexture.ts +25 -65
- package/src/core/textures/Texture.ts +214 -46
- package/src/core/utils.ts +9 -26
- package/src/main-api/INode.ts +0 -18
- package/src/main-api/Inspector.ts +794 -38
- package/src/main-api/Renderer.ts +519 -159
- package/src/utils.ts +64 -29
- package/dist/src/core/platform.d.ts +0 -10
- package/dist/src/core/platform.js +0 -56
- package/dist/src/core/platform.js.map +0 -1
- package/dist/src/core/renderers/canvas/internal/C2DShaderUtils.d.ts +0 -1
- package/dist/src/core/renderers/canvas/internal/C2DShaderUtils.js +0 -217
- package/dist/src/core/renderers/canvas/internal/C2DShaderUtils.js.map +0 -1
- package/dist/src/core/renderers/canvas/internal/ColorUtils.js.map +0 -1
- package/dist/src/core/renderers/webgl/WebGlRenderOp.d.ts +0 -36
- package/dist/src/core/renderers/webgl/WebGlRenderOp.js +0 -107
- package/dist/src/core/renderers/webgl/WebGlRenderOp.js.map +0 -1
- package/dist/src/core/shaders/templates/shaderUtils.js +0 -41
- package/dist/src/core/shaders/templates/shaderUtils.js.map +0 -1
- package/dist/src/core/text-rendering/TextRenderingUtils.d.ts +0 -12
- package/dist/src/core/text-rendering/TextRenderingUtils.js +0 -14
- package/dist/src/core/text-rendering/TextRenderingUtils.js.map +0 -1
- package/dist/src/core/text-rendering/TextTextureRendererUtils.d.ts +0 -72
- package/dist/src/core/text-rendering/TextTextureRendererUtils.js +0 -217
- package/dist/src/core/text-rendering/TextTextureRendererUtils.js.map +0 -1
- package/dist/src/core/text-rendering/TrFontManager.d.ts +0 -26
- package/dist/src/core/text-rendering/TrFontManager.js +0 -131
- package/dist/src/core/text-rendering/TrFontManager.js.map +0 -1
- package/dist/src/core/text-rendering/font-face-types/SdfTrFontFace/SdfTrFontFace.d.ts +0 -39
- package/dist/src/core/text-rendering/font-face-types/SdfTrFontFace/SdfTrFontFace.js +0 -125
- package/dist/src/core/text-rendering/font-face-types/SdfTrFontFace/SdfTrFontFace.js.map +0 -1
- package/dist/src/core/text-rendering/font-face-types/SdfTrFontFace/internal/FontShaper.d.ts +0 -103
- package/dist/src/core/text-rendering/font-face-types/SdfTrFontFace/internal/FontShaper.js +0 -21
- package/dist/src/core/text-rendering/font-face-types/SdfTrFontFace/internal/FontShaper.js.map +0 -1
- package/dist/src/core/text-rendering/font-face-types/SdfTrFontFace/internal/SdfFontShaper.d.ts +0 -62
- package/dist/src/core/text-rendering/font-face-types/SdfTrFontFace/internal/SdfFontShaper.js +0 -88
- package/dist/src/core/text-rendering/font-face-types/SdfTrFontFace/internal/SdfFontShaper.js.map +0 -1
- package/dist/src/core/text-rendering/font-face-types/TrFontFace.d.ts +0 -118
- package/dist/src/core/text-rendering/font-face-types/TrFontFace.js +0 -63
- package/dist/src/core/text-rendering/font-face-types/TrFontFace.js.map +0 -1
- package/dist/src/core/text-rendering/font-face-types/WebTrFontFace.d.ts +0 -14
- package/dist/src/core/text-rendering/font-face-types/WebTrFontFace.js +0 -66
- package/dist/src/core/text-rendering/font-face-types/WebTrFontFace.js.map +0 -1
- package/dist/src/core/text-rendering/font-face-types/utils.d.ts +0 -1
- package/dist/src/core/text-rendering/font-face-types/utils.js +0 -38
- package/dist/src/core/text-rendering/font-face-types/utils.js.map +0 -1
- package/dist/src/core/text-rendering/renderers/CanvasTextRenderer.d.ts +0 -59
- package/dist/src/core/text-rendering/renderers/CanvasTextRenderer.js +0 -397
- package/dist/src/core/text-rendering/renderers/CanvasTextRenderer.js.map +0 -1
- package/dist/src/core/text-rendering/renderers/LightningTextTextureRenderer.d.ts +0 -126
- package/dist/src/core/text-rendering/renderers/LightningTextTextureRenderer.js +0 -551
- package/dist/src/core/text-rendering/renderers/LightningTextTextureRenderer.js.map +0 -1
- package/dist/src/core/text-rendering/renderers/SdfTextRenderer/SdfTextRenderer.d.ts +0 -91
- package/dist/src/core/text-rendering/renderers/SdfTextRenderer/SdfTextRenderer.js +0 -611
- package/dist/src/core/text-rendering/renderers/SdfTextRenderer/SdfTextRenderer.js.map +0 -1
- package/dist/src/core/text-rendering/renderers/SdfTextRenderer/internal/PeekableGenerator.d.ts +0 -12
- package/dist/src/core/text-rendering/renderers/SdfTextRenderer/internal/PeekableGenerator.js +0 -61
- package/dist/src/core/text-rendering/renderers/SdfTextRenderer/internal/PeekableGenerator.js.map +0 -1
- package/dist/src/core/text-rendering/renderers/SdfTextRenderer/internal/SpecialCodepoints.d.ts +0 -33
- package/dist/src/core/text-rendering/renderers/SdfTextRenderer/internal/SpecialCodepoints.js +0 -52
- package/dist/src/core/text-rendering/renderers/SdfTextRenderer/internal/SpecialCodepoints.js.map +0 -1
- package/dist/src/core/text-rendering/renderers/SdfTextRenderer/internal/constants.d.ts +0 -13
- package/dist/src/core/text-rendering/renderers/SdfTextRenderer/internal/constants.js +0 -32
- package/dist/src/core/text-rendering/renderers/SdfTextRenderer/internal/constants.js.map +0 -1
- package/dist/src/core/text-rendering/renderers/SdfTextRenderer/internal/getStartConditions.d.ts +0 -23
- package/dist/src/core/text-rendering/renderers/SdfTextRenderer/internal/getStartConditions.js +0 -84
- package/dist/src/core/text-rendering/renderers/SdfTextRenderer/internal/getStartConditions.js.map +0 -1
- package/dist/src/core/text-rendering/renderers/SdfTextRenderer/internal/getUnicodeCodepoints.d.ts +0 -4
- package/dist/src/core/text-rendering/renderers/SdfTextRenderer/internal/getUnicodeCodepoints.js +0 -34
- package/dist/src/core/text-rendering/renderers/SdfTextRenderer/internal/getUnicodeCodepoints.js.map +0 -1
- package/dist/src/core/text-rendering/renderers/SdfTextRenderer/internal/layoutText.d.ts +0 -20
- package/dist/src/core/text-rendering/renderers/SdfTextRenderer/internal/layoutText.js +0 -308
- package/dist/src/core/text-rendering/renderers/SdfTextRenderer/internal/layoutText.js.map +0 -1
- package/dist/src/core/text-rendering/renderers/SdfTextRenderer/internal/measureText.d.ts +0 -10
- package/dist/src/core/text-rendering/renderers/SdfTextRenderer/internal/measureText.js +0 -40
- package/dist/src/core/text-rendering/renderers/SdfTextRenderer/internal/measureText.js.map +0 -1
- package/dist/src/core/text-rendering/renderers/SdfTextRenderer/internal/setRenderWindow.d.ts +0 -26
- package/dist/src/core/text-rendering/renderers/SdfTextRenderer/internal/setRenderWindow.js +0 -70
- package/dist/src/core/text-rendering/renderers/SdfTextRenderer/internal/setRenderWindow.js.map +0 -1
- package/dist/src/core/text-rendering/renderers/SdfTextRenderer/internal/util.d.ts +0 -16
- package/dist/src/core/text-rendering/renderers/SdfTextRenderer/internal/util.js +0 -39
- package/dist/src/core/text-rendering/renderers/SdfTextRenderer/internal/util.js.map +0 -1
- package/dist/src/core/text-rendering/renderers/TextRenderer.d.ts +0 -370
- package/dist/src/core/text-rendering/renderers/TextRenderer.js +0 -178
- package/dist/src/core/text-rendering/renderers/TextRenderer.js.map +0 -1
- package/scripts/please-use-pnpm.js +0 -13
- package/src/core/platform.ts +0 -64
- package/src/core/renderers/canvas/internal/C2DShaderUtils.ts +0 -220
- package/src/core/renderers/webgl/WebGlRenderOp.ts +0 -145
- package/src/core/shaders/templates/shaderUtils.ts +0 -47
- package/src/core/shaders/webgl/DefaultBatched.ts +0 -129
- package/src/core/text-rendering/TextRenderingUtils.ts +0 -36
- package/src/core/text-rendering/TextTextureRendererUtils.ts +0 -263
- package/src/core/text-rendering/TrFontManager.ts +0 -183
- package/src/core/text-rendering/font-face-types/SdfTrFontFace/SdfTrFontFace.ts +0 -176
- package/src/core/text-rendering/font-face-types/SdfTrFontFace/internal/FontShaper.ts +0 -139
- package/src/core/text-rendering/font-face-types/SdfTrFontFace/internal/SdfFontShaper.test.ts +0 -173
- package/src/core/text-rendering/font-face-types/SdfTrFontFace/internal/SdfFontShaper.ts +0 -171
- package/src/core/text-rendering/font-face-types/TrFontFace.ts +0 -187
- package/src/core/text-rendering/font-face-types/WebTrFontFace.ts +0 -94
- package/src/core/text-rendering/font-face-types/utils.ts +0 -39
- package/src/core/text-rendering/renderers/CanvasTextRenderer.ts +0 -509
- package/src/core/text-rendering/renderers/LightningTextTextureRenderer.ts +0 -815
- package/src/core/text-rendering/renderers/SdfTextRenderer/SdfTextRenderer.ts +0 -841
- package/src/core/text-rendering/renderers/SdfTextRenderer/internal/PeekableGenerator.test.ts +0 -48
- package/src/core/text-rendering/renderers/SdfTextRenderer/internal/PeekableGenerator.ts +0 -66
- package/src/core/text-rendering/renderers/SdfTextRenderer/internal/SpecialCodepoints.ts +0 -52
- package/src/core/text-rendering/renderers/SdfTextRenderer/internal/constants.ts +0 -32
- package/src/core/text-rendering/renderers/SdfTextRenderer/internal/getStartConditions.ts +0 -117
- package/src/core/text-rendering/renderers/SdfTextRenderer/internal/getUnicodeCodepoints.test.ts +0 -133
- package/src/core/text-rendering/renderers/SdfTextRenderer/internal/getUnicodeCodepoints.ts +0 -38
- package/src/core/text-rendering/renderers/SdfTextRenderer/internal/layoutText.ts +0 -408
- package/src/core/text-rendering/renderers/SdfTextRenderer/internal/measureText.test.ts +0 -49
- package/src/core/text-rendering/renderers/SdfTextRenderer/internal/measureText.ts +0 -52
- package/src/core/text-rendering/renderers/SdfTextRenderer/internal/setRenderWindow.test.ts +0 -205
- package/src/core/text-rendering/renderers/SdfTextRenderer/internal/setRenderWindow.ts +0 -93
- package/src/core/text-rendering/renderers/SdfTextRenderer/internal/util.ts +0 -40
- package/src/core/text-rendering/renderers/TextRenderer.ts +0 -550
- /package/dist/src/core/{renderers/canvas/internal/ColorUtils.d.ts → lib/colorParser.d.ts} +0 -0
package/src/core/Stage.ts
CHANGED
|
@@ -1,23 +1,10 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
* you may not use this file except in compliance with the License.
|
|
9
|
-
* You may obtain a copy of the License at
|
|
10
|
-
*
|
|
11
|
-
* http://www.apache.org/licenses/LICENSE-2.0
|
|
12
|
-
*
|
|
13
|
-
* Unless required by applicable law or agreed to in writing, software
|
|
14
|
-
* distributed under the License is distributed on an "AS IS" BASIS,
|
|
15
|
-
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
16
|
-
* See the License for the specific language governing permissions and
|
|
17
|
-
* limitations under the License.
|
|
18
|
-
*/
|
|
19
|
-
import { startLoop, getTimeStamp } from './platform.js';
|
|
20
|
-
import { assertTruthy, setPremultiplyMode } from '../utils.js';
|
|
1
|
+
import {
|
|
2
|
+
assertTruthy,
|
|
3
|
+
CALCULATE_FPS,
|
|
4
|
+
isProductionEnvironment,
|
|
5
|
+
setPremultiplyMode,
|
|
6
|
+
USE_RTT,
|
|
7
|
+
} from '../utils.js';
|
|
21
8
|
import { AnimationManager } from './animations/AnimationManager.js';
|
|
22
9
|
import {
|
|
23
10
|
UpdateType,
|
|
@@ -26,13 +13,14 @@ import {
|
|
|
26
13
|
type CoreNodeProps,
|
|
27
14
|
} from './CoreNode.js';
|
|
28
15
|
import { CoreTextureManager } from './CoreTextureManager.js';
|
|
29
|
-
import { TrFontManager } from './text-rendering/TrFontManager.js';
|
|
30
16
|
import { CoreShaderManager } from './CoreShaderManager.js';
|
|
31
17
|
import {
|
|
32
|
-
|
|
33
|
-
type
|
|
18
|
+
type FontHandler,
|
|
19
|
+
type FontLoadOptions,
|
|
20
|
+
type TextRenderer,
|
|
21
|
+
type TextRenderers,
|
|
34
22
|
type TrProps,
|
|
35
|
-
} from './text-rendering/
|
|
23
|
+
} from './text-rendering/TextRenderer.js';
|
|
36
24
|
|
|
37
25
|
import { EventEmitter } from '../common/EventEmitter.js';
|
|
38
26
|
import { ContextSpy } from './lib/ContextSpy.js';
|
|
@@ -46,39 +34,31 @@ import {
|
|
|
46
34
|
type TextureMemoryManagerSettings,
|
|
47
35
|
} from './TextureMemoryManager.js';
|
|
48
36
|
import { CoreRenderer } from './renderers/CoreRenderer.js';
|
|
49
|
-
import type { WebGlRenderer } from './renderers/webgl/WebGlRenderer.js';
|
|
50
|
-
import type { CanvasRenderer } from './renderers/canvas/CanvasRenderer.js';
|
|
51
37
|
import { CoreTextNode, type CoreTextNodeProps } from './CoreTextNode.js';
|
|
52
38
|
import { santizeCustomDataMap } from '../main-api/utils.js';
|
|
53
|
-
import
|
|
54
|
-
import type { CanvasTextRenderer } from './text-rendering/renderers/CanvasTextRenderer.js';
|
|
39
|
+
import { pointInBound } from './lib/utils.js';
|
|
55
40
|
import type { CoreShaderNode } from './renderers/CoreShaderNode.js';
|
|
41
|
+
import { Matrix3d } from './lib/Matrix3d.js';
|
|
56
42
|
import { createBound, createPreloadBounds, type Bound } from './lib/utils.js';
|
|
57
43
|
import type { Texture } from './textures/Texture.js';
|
|
58
44
|
import { ColorTexture } from './textures/ColorTexture.js';
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
45
|
+
import type { Platform } from './platforms/Platform.js';
|
|
46
|
+
import type { WebPlatform } from './platforms/web/WebPlatform.js';
|
|
47
|
+
import type { RendererMainSettings } from '../main-api/Renderer.js';
|
|
48
|
+
|
|
49
|
+
export type StageOptions = Omit<
|
|
50
|
+
RendererMainSettings,
|
|
51
|
+
'inspector' | 'platform' | 'maxRetryCount'
|
|
52
|
+
> & {
|
|
63
53
|
textureMemory: TextureMemoryManagerSettings;
|
|
64
|
-
boundsMargin: number | [number, number, number, number];
|
|
65
|
-
deviceLogicalPixelRatio: number;
|
|
66
|
-
devicePhysicalPixelRatio: number;
|
|
67
54
|
canvas: HTMLCanvasElement | OffscreenCanvas;
|
|
68
|
-
clearColor: number;
|
|
69
55
|
fpsUpdateInterval: number;
|
|
70
|
-
enableContextSpy: boolean;
|
|
71
|
-
forceWebGL2: boolean;
|
|
72
|
-
numImageWorkers: number;
|
|
73
|
-
renderEngine: typeof WebGlRenderer | typeof CanvasRenderer;
|
|
74
56
|
eventBus: EventEmitter;
|
|
75
|
-
|
|
76
|
-
fontEngines: (typeof CanvasTextRenderer | typeof SdfTextRenderer)[];
|
|
57
|
+
platform: Platform | WebPlatform;
|
|
77
58
|
inspector: boolean;
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
}
|
|
59
|
+
maxRetryCount: number;
|
|
60
|
+
enableClear: boolean;
|
|
61
|
+
};
|
|
82
62
|
|
|
83
63
|
export type StageFpsUpdateHandler = (
|
|
84
64
|
stage: Stage,
|
|
@@ -90,6 +70,11 @@ export type StageFrameTickHandler = (
|
|
|
90
70
|
frameTickData: FrameTickPayload,
|
|
91
71
|
) => void;
|
|
92
72
|
|
|
73
|
+
export interface Point {
|
|
74
|
+
x: number;
|
|
75
|
+
y: number;
|
|
76
|
+
}
|
|
77
|
+
|
|
93
78
|
const autoStart = true;
|
|
94
79
|
|
|
95
80
|
export class Stage {
|
|
@@ -97,19 +82,32 @@ export class Stage {
|
|
|
97
82
|
public readonly animationManager: AnimationManager;
|
|
98
83
|
public readonly txManager: CoreTextureManager;
|
|
99
84
|
public readonly txMemManager: TextureMemoryManager;
|
|
100
|
-
public readonly
|
|
101
|
-
public readonly
|
|
85
|
+
public readonly textRenderers: Record<string, TextRenderer> = {};
|
|
86
|
+
public readonly fontHandlers: Record<string, FontHandler> = {};
|
|
102
87
|
public readonly shManager: CoreShaderManager;
|
|
103
88
|
public readonly renderer: CoreRenderer;
|
|
104
89
|
public readonly root: CoreNode;
|
|
90
|
+
public readonly interactiveNodes: Set<CoreNode> = new Set();
|
|
105
91
|
public boundsMargin: [number, number, number, number];
|
|
106
92
|
public readonly defShaderNode: CoreShaderNode | null = null;
|
|
107
|
-
public
|
|
108
|
-
public
|
|
109
|
-
public readonly strictBounds: boolean;
|
|
93
|
+
public strictBound: Bound;
|
|
94
|
+
public preloadBound: Bound;
|
|
110
95
|
public readonly defaultTexture: Texture | null = null;
|
|
111
|
-
public
|
|
96
|
+
public pixelRatio: number;
|
|
112
97
|
public readonly bufferMemory: number = 2e6;
|
|
98
|
+
public readonly platform: Platform | WebPlatform;
|
|
99
|
+
public readonly calculateTextureCoord: boolean;
|
|
100
|
+
|
|
101
|
+
/**
|
|
102
|
+
* Target frame time in milliseconds (calculated from targetFPS)
|
|
103
|
+
*
|
|
104
|
+
* @remarks
|
|
105
|
+
* This is pre-calculated to avoid recalculating on every frame.
|
|
106
|
+
* - 0 means no throttling (use display refresh rate)
|
|
107
|
+
* - >0 means throttle to this frame time (1000 / targetFPS)
|
|
108
|
+
*/
|
|
109
|
+
public targetFrameTime: number = 0;
|
|
110
|
+
|
|
113
111
|
/**
|
|
114
112
|
* Renderer Event Bus for the Stage to emit events onto
|
|
115
113
|
*
|
|
@@ -121,25 +119,39 @@ export class Stage {
|
|
|
121
119
|
public readonly eventBus: EventEmitter;
|
|
122
120
|
|
|
123
121
|
/// State
|
|
122
|
+
startTime = 0;
|
|
124
123
|
deltaTime = 0;
|
|
125
124
|
lastFrameTime = 0;
|
|
126
125
|
currentFrameTime = 0;
|
|
126
|
+
elapsedTime = 0;
|
|
127
|
+
private timedNodes: CoreNode[] = [];
|
|
127
128
|
private clrColor = 0x00000000;
|
|
128
129
|
private fpsNumFrames = 0;
|
|
129
130
|
private fpsElapsedTime = 0;
|
|
130
131
|
private numQuadsRendered = 0;
|
|
131
132
|
private renderRequested = false;
|
|
133
|
+
private reprocessFrame = false;
|
|
134
|
+
private reprocessCallback: (() => void) | null = null;
|
|
132
135
|
private frameEventQueue: [name: string, payload: unknown][] = [];
|
|
133
|
-
private fontResolveMap: Record<string, CanvasTextRenderer | SdfTextRenderer> =
|
|
134
|
-
{};
|
|
135
136
|
|
|
136
|
-
|
|
137
|
+
// Flattened render list optimization
|
|
138
|
+
public renderList: CoreNode[] = [];
|
|
139
|
+
public renderListDirty: boolean = true;
|
|
140
|
+
|
|
141
|
+
// Font resolve optimisation flags
|
|
142
|
+
private hasOnlyOneFontEngine: boolean;
|
|
143
|
+
private hasOnlyCanvasFontEngine: boolean;
|
|
144
|
+
private hasCanvasEngine: boolean;
|
|
145
|
+
private singleFontEngine: TextRenderer | null = null;
|
|
146
|
+
private singleFontHandler: FontHandler | null = null;
|
|
147
|
+
|
|
148
|
+
// Debug data
|
|
137
149
|
contextSpy: ContextSpy | null = null;
|
|
138
150
|
|
|
139
151
|
/**
|
|
140
152
|
* Stage constructor
|
|
141
153
|
*/
|
|
142
|
-
constructor(
|
|
154
|
+
constructor(public options: StageOptions) {
|
|
143
155
|
const {
|
|
144
156
|
canvas,
|
|
145
157
|
clearColor,
|
|
@@ -153,12 +165,28 @@ export class Stage {
|
|
|
153
165
|
renderEngine,
|
|
154
166
|
fontEngines,
|
|
155
167
|
createImageBitmapSupport,
|
|
168
|
+
platform,
|
|
169
|
+
maxRetryCount,
|
|
156
170
|
} = options;
|
|
157
171
|
|
|
172
|
+
assertTruthy(
|
|
173
|
+
platform !== null,
|
|
174
|
+
'A CorePlatform is not provided in the options',
|
|
175
|
+
);
|
|
176
|
+
|
|
177
|
+
this.platform = platform;
|
|
178
|
+
|
|
179
|
+
this.startTime = platform.getTimeStamp();
|
|
180
|
+
|
|
158
181
|
this.eventBus = options.eventBus;
|
|
182
|
+
|
|
183
|
+
// Calculate target frame time from targetFPS option
|
|
184
|
+
this.targetFrameTime = options.targetFPS > 0 ? 1000 / options.targetFPS : 0;
|
|
185
|
+
|
|
159
186
|
this.txManager = new CoreTextureManager(this, {
|
|
160
187
|
numImageWorkers,
|
|
161
188
|
createImageBitmapSupport,
|
|
189
|
+
maxRetryCount,
|
|
162
190
|
});
|
|
163
191
|
|
|
164
192
|
// Wait for the Texture Manager to initialize
|
|
@@ -171,7 +199,6 @@ export class Stage {
|
|
|
171
199
|
|
|
172
200
|
this.animationManager = new AnimationManager();
|
|
173
201
|
this.contextSpy = enableContextSpy ? new ContextSpy() : null;
|
|
174
|
-
this.strictBounds = options.strictBounds;
|
|
175
202
|
|
|
176
203
|
let bm = [0, 0, 0, 0] as [number, number, number, number];
|
|
177
204
|
if (boundsMargin) {
|
|
@@ -200,6 +227,7 @@ export class Stage {
|
|
|
200
227
|
this.shManager = new CoreShaderManager(this);
|
|
201
228
|
|
|
202
229
|
this.defShaderNode = this.renderer.getDefaultShaderNode();
|
|
230
|
+
this.calculateTextureCoord = this.renderer.getTextureCoords !== undefined;
|
|
203
231
|
|
|
204
232
|
const renderMode = this.renderer.mode || 'webgl';
|
|
205
233
|
|
|
@@ -210,40 +238,92 @@ export class Stage {
|
|
|
210
238
|
this.txManager.renderer = this.renderer;
|
|
211
239
|
|
|
212
240
|
// Create text renderers
|
|
213
|
-
this.
|
|
214
|
-
|
|
215
|
-
|
|
216
|
-
|
|
241
|
+
this.hasOnlyOneFontEngine = fontEngines.length === 1;
|
|
242
|
+
this.hasOnlyCanvasFontEngine =
|
|
243
|
+
fontEngines.length === 1 && fontEngines[0]!.type === 'canvas';
|
|
244
|
+
this.hasCanvasEngine = false;
|
|
245
|
+
this.singleFontEngine = this.hasOnlyOneFontEngine
|
|
246
|
+
? (fontEngines[0] as TextRenderer)
|
|
247
|
+
: null;
|
|
248
|
+
this.singleFontHandler = this.hasOnlyOneFontEngine
|
|
249
|
+
? (fontEngines[0]?.font as FontHandler)
|
|
250
|
+
: null;
|
|
251
|
+
|
|
252
|
+
if (this.singleFontEngine === null) {
|
|
253
|
+
// Multiple font engines case
|
|
254
|
+
// Filter out incompatible engines first
|
|
255
|
+
const compatibleEngines = fontEngines.filter(
|
|
256
|
+
(fontEngine: TextRenderer) => {
|
|
257
|
+
const type = fontEngine.type;
|
|
258
|
+
|
|
259
|
+
if (type === 'sdf' && renderMode === 'canvas') {
|
|
260
|
+
console.warn(
|
|
261
|
+
'MsdfTextRenderer is not compatible with Canvas renderer. Skipping...',
|
|
262
|
+
);
|
|
263
|
+
return false;
|
|
264
|
+
}
|
|
265
|
+
|
|
266
|
+
if (type === 'canvas') {
|
|
267
|
+
this.hasCanvasEngine = true;
|
|
268
|
+
}
|
|
269
|
+
|
|
270
|
+
return true;
|
|
271
|
+
},
|
|
272
|
+
);
|
|
273
|
+
|
|
274
|
+
// Sort engines: SDF first, Canvas last, others in between
|
|
275
|
+
const sortedEngines = compatibleEngines.sort(
|
|
276
|
+
(a: TextRenderer, b: TextRenderer) => {
|
|
277
|
+
if (a.type === 'sdf') return -1;
|
|
278
|
+
if (b.type === 'sdf') return 1;
|
|
279
|
+
if (a.type === 'canvas') return 1;
|
|
280
|
+
if (b.type === 'canvas') return -1;
|
|
281
|
+
return 0;
|
|
282
|
+
},
|
|
283
|
+
);
|
|
284
|
+
|
|
285
|
+
// Initialize engines in sorted order
|
|
286
|
+
sortedEngines.forEach((fontEngine: TextRenderer) => {
|
|
287
|
+
const type = fontEngine.type;
|
|
217
288
|
|
|
218
|
-
|
|
289
|
+
// Add to map for type-based access
|
|
290
|
+
this.textRenderers[type] = fontEngine;
|
|
291
|
+
this.textRenderers[type].init(this);
|
|
292
|
+
|
|
293
|
+
this.fontHandlers[type] = fontEngine.font;
|
|
294
|
+
});
|
|
295
|
+
} else {
|
|
296
|
+
// Single font engine case - initialize it directly
|
|
297
|
+
const fontEngine = this.singleFontEngine;
|
|
298
|
+
const type = fontEngine.type;
|
|
299
|
+
|
|
300
|
+
// Check compatibility
|
|
301
|
+
if (type === 'sdf' && renderMode === 'canvas') {
|
|
219
302
|
console.warn(
|
|
220
|
-
'
|
|
303
|
+
'MsdfTextRenderer is not compatible with Canvas renderer. Skipping...',
|
|
221
304
|
);
|
|
222
|
-
|
|
223
|
-
|
|
224
|
-
|
|
225
|
-
if (fontEngineInstance instanceof TextRenderer) {
|
|
226
|
-
if (className === 'canvas') {
|
|
227
|
-
this.textRenderers['canvas'] =
|
|
228
|
-
fontEngineInstance as CanvasTextRenderer;
|
|
229
|
-
} else if (className === 'sdf') {
|
|
230
|
-
this.textRenderers['sdf'] = fontEngineInstance as SdfTextRenderer;
|
|
305
|
+
} else {
|
|
306
|
+
if (type === 'canvas') {
|
|
307
|
+
this.hasCanvasEngine = true;
|
|
231
308
|
}
|
|
309
|
+
|
|
310
|
+
// Add to map for type-based access
|
|
311
|
+
this.textRenderers[type] = fontEngine;
|
|
312
|
+
this.fontHandlers[type] = fontEngine.font;
|
|
313
|
+
this.textRenderers[type].init(this);
|
|
232
314
|
}
|
|
233
|
-
}
|
|
315
|
+
}
|
|
234
316
|
|
|
235
317
|
if (Object.keys(this.textRenderers).length === 0) {
|
|
236
318
|
console.warn('No text renderers available. Your text will not render.');
|
|
237
319
|
}
|
|
238
320
|
|
|
239
|
-
this.fontManager = new TrFontManager(this.textRenderers);
|
|
240
|
-
|
|
241
321
|
// create root node
|
|
242
322
|
const rootNode = new CoreNode(this, {
|
|
243
323
|
x: 0,
|
|
244
324
|
y: 0,
|
|
245
|
-
|
|
246
|
-
|
|
325
|
+
w: appWidth,
|
|
326
|
+
h: appHeight,
|
|
247
327
|
alpha: 1,
|
|
248
328
|
autosize: false,
|
|
249
329
|
boundsMargin: null,
|
|
@@ -258,7 +338,6 @@ export class Stage {
|
|
|
258
338
|
colorBl: 0x00000000,
|
|
259
339
|
colorBr: 0x00000000,
|
|
260
340
|
zIndex: 0,
|
|
261
|
-
zIndexLocked: 0,
|
|
262
341
|
scaleX: 1,
|
|
263
342
|
scaleY: 1,
|
|
264
343
|
mountX: 0,
|
|
@@ -275,15 +354,30 @@ export class Stage {
|
|
|
275
354
|
rtt: false,
|
|
276
355
|
src: null,
|
|
277
356
|
scale: 1,
|
|
278
|
-
preventCleanup: false,
|
|
279
|
-
strictBounds: this.strictBounds,
|
|
280
357
|
});
|
|
281
358
|
|
|
282
359
|
this.root = rootNode;
|
|
283
360
|
|
|
361
|
+
// Initialize root node properties
|
|
362
|
+
rootNode.updateLocalTransform();
|
|
363
|
+
rootNode.globalTransform = Matrix3d.copy(rootNode.localTransform!);
|
|
364
|
+
rootNode.sceneGlobalTransform = Matrix3d.copy(rootNode.localTransform!);
|
|
365
|
+
rootNode.calculateRenderCoords();
|
|
366
|
+
rootNode.updateBoundingRect();
|
|
367
|
+
rootNode.createRenderBounds();
|
|
368
|
+
rootNode.updateRenderState(CoreNodeRenderState.InViewport);
|
|
369
|
+
rootNode.updateIsRenderable();
|
|
370
|
+
|
|
371
|
+
// Initialize premultiplied colors (default is transparent 0x00000000)
|
|
372
|
+
rootNode.premultipliedColorTl =
|
|
373
|
+
rootNode.premultipliedColorTr =
|
|
374
|
+
rootNode.premultipliedColorBl =
|
|
375
|
+
rootNode.premultipliedColorBr =
|
|
376
|
+
0;
|
|
377
|
+
|
|
284
378
|
// execute platform start loop
|
|
285
|
-
if (autoStart) {
|
|
286
|
-
startLoop(this);
|
|
379
|
+
if (autoStart === true) {
|
|
380
|
+
this.platform.startLoop(this);
|
|
287
381
|
}
|
|
288
382
|
}
|
|
289
383
|
|
|
@@ -293,10 +387,25 @@ export class Stage {
|
|
|
293
387
|
this.renderRequested = true;
|
|
294
388
|
}
|
|
295
389
|
|
|
390
|
+
/**
|
|
391
|
+
* Update the target frame time based on the current targetFPS setting
|
|
392
|
+
*
|
|
393
|
+
* @remarks
|
|
394
|
+
* This should be called whenever the targetFPS option is changed
|
|
395
|
+
* to ensure targetFrameTime stays in sync.
|
|
396
|
+
* targetFPS of 0 means no throttling (targetFrameTime = 0)
|
|
397
|
+
* targetFPS > 0 means throttle to 1000/targetFPS milliseconds
|
|
398
|
+
*/
|
|
399
|
+
updateTargetFrameTime() {
|
|
400
|
+
this.targetFrameTime =
|
|
401
|
+
this.options.targetFPS > 0 ? 1000 / this.options.targetFPS : 0;
|
|
402
|
+
}
|
|
403
|
+
|
|
296
404
|
updateFrameTime() {
|
|
297
|
-
const newFrameTime = getTimeStamp();
|
|
405
|
+
const newFrameTime = this.platform.getTimeStamp();
|
|
298
406
|
this.lastFrameTime = this.currentFrameTime;
|
|
299
407
|
this.currentFrameTime = newFrameTime;
|
|
408
|
+
this.elapsedTime = newFrameTime - this.startTime;
|
|
300
409
|
this.deltaTime = !this.lastFrameTime
|
|
301
410
|
? 100 / 6
|
|
302
411
|
: newFrameTime - this.lastFrameTime;
|
|
@@ -315,7 +424,6 @@ export class Stage {
|
|
|
315
424
|
* Create default PixelTexture
|
|
316
425
|
*/
|
|
317
426
|
createDefaultTexture() {
|
|
318
|
-
console.log('Creating default texture');
|
|
319
427
|
(this.defaultTexture as ColorTexture) = this.txManager.createTexture(
|
|
320
428
|
'ColorTexture',
|
|
321
429
|
{
|
|
@@ -329,7 +437,7 @@ export class Stage {
|
|
|
329
437
|
// Mark the default texture as ALWAYS renderable
|
|
330
438
|
// This prevents it from ever being cleaned up.
|
|
331
439
|
// Fixes https://github.com/lightning-js/renderer/issues/262
|
|
332
|
-
this.defaultTexture.setRenderableOwner(
|
|
440
|
+
this.defaultTexture.setRenderableOwner('stage', true);
|
|
333
441
|
|
|
334
442
|
// When the default texture is loaded, request a render in case the
|
|
335
443
|
// RAF is paused. Fixes: https://github.com/lightning-js/renderer/issues/123
|
|
@@ -341,13 +449,14 @@ export class Stage {
|
|
|
341
449
|
/**
|
|
342
450
|
* Update animations
|
|
343
451
|
*/
|
|
344
|
-
updateAnimations() {
|
|
452
|
+
updateAnimations(): boolean {
|
|
345
453
|
const { animationManager } = this;
|
|
346
454
|
if (!this.root) {
|
|
347
|
-
return;
|
|
455
|
+
return false;
|
|
348
456
|
}
|
|
349
457
|
// step animation
|
|
350
458
|
animationManager.update(this.deltaTime);
|
|
459
|
+
return animationManager.activeAnimations.size > 0;
|
|
351
460
|
}
|
|
352
461
|
|
|
353
462
|
/**
|
|
@@ -364,50 +473,99 @@ export class Stage {
|
|
|
364
473
|
/**
|
|
365
474
|
* Start a new frame draw
|
|
366
475
|
*/
|
|
367
|
-
drawFrame() {
|
|
368
|
-
const { renderer, renderRequested } = this;
|
|
369
|
-
assertTruthy(renderer);
|
|
476
|
+
drawFrame(hasActiveAnimations: boolean = false) {
|
|
477
|
+
const { renderer, renderRequested, root } = this;
|
|
370
478
|
|
|
371
479
|
// Update tree if needed
|
|
372
|
-
|
|
373
|
-
|
|
374
|
-
|
|
480
|
+
do {
|
|
481
|
+
const forceUpdate = this.reprocessFrame;
|
|
482
|
+
this.reprocessFrame = false;
|
|
375
483
|
|
|
376
|
-
|
|
377
|
-
|
|
484
|
+
if (root.updateType !== 0 || forceUpdate) {
|
|
485
|
+
root.updateType = 0;
|
|
486
|
+
const childUpdateType = root.childUpdateType;
|
|
487
|
+
root.childUpdateType = 0;
|
|
378
488
|
|
|
379
|
-
|
|
380
|
-
|
|
489
|
+
for (let i = 0, length = root.children.length; i < length; i++) {
|
|
490
|
+
const child = root.children[i] as CoreNode;
|
|
381
491
|
|
|
382
|
-
|
|
383
|
-
|
|
384
|
-
|
|
492
|
+
if (childUpdateType !== 0) {
|
|
493
|
+
child.setUpdateType(childUpdateType);
|
|
494
|
+
}
|
|
385
495
|
|
|
386
|
-
|
|
387
|
-
|
|
388
|
-
|
|
496
|
+
if (child.updateType === 0) {
|
|
497
|
+
continue;
|
|
498
|
+
}
|
|
499
|
+
|
|
500
|
+
child.update(this.deltaTime, root.clippingRect);
|
|
501
|
+
}
|
|
389
502
|
}
|
|
503
|
+
|
|
504
|
+
if (this.reprocessCallback !== null) {
|
|
505
|
+
this.reprocessCallback();
|
|
506
|
+
this.reprocessCallback = null;
|
|
507
|
+
}
|
|
508
|
+
} while (this.reprocessFrame);
|
|
509
|
+
|
|
510
|
+
// Process some textures asynchronously but don't block the frame
|
|
511
|
+
// Use a background task to prevent frame drops
|
|
512
|
+
if (this.txManager.hasUpdates() === true) {
|
|
513
|
+
const timeLimit = hasActiveAnimations
|
|
514
|
+
? this.options.textureProcessingTimeLimit / 2
|
|
515
|
+
: this.options.textureProcessingTimeLimit;
|
|
516
|
+
|
|
517
|
+
this.txManager.processSome(timeLimit).catch((err) => {
|
|
518
|
+
console.error('Error processing textures:', err);
|
|
519
|
+
});
|
|
390
520
|
}
|
|
391
521
|
|
|
522
|
+
// Reset render operations and clear the canvas
|
|
523
|
+
renderer.reset();
|
|
524
|
+
|
|
392
525
|
// If we have RTT nodes draw them first
|
|
393
526
|
// So we can use them as textures in the main scene
|
|
394
|
-
if (renderer.rttNodes.length > 0) {
|
|
527
|
+
if (USE_RTT && renderer.rttNodes.length > 0) {
|
|
395
528
|
renderer.renderRTTNodes();
|
|
396
529
|
}
|
|
397
530
|
|
|
398
|
-
//
|
|
399
|
-
|
|
531
|
+
// Update render list if dirty
|
|
532
|
+
if (this.renderListDirty === true) {
|
|
533
|
+
this.renderList.length = 0;
|
|
534
|
+
this.buildRenderList(this.root);
|
|
535
|
+
this.renderListDirty = false;
|
|
536
|
+
} else {
|
|
537
|
+
// Fill quads buffer
|
|
538
|
+
const renderList = this.renderList;
|
|
539
|
+
for (let i = 0, len = renderList.length; i < len; i++) {
|
|
540
|
+
renderList[i]!.renderQuads(renderer);
|
|
541
|
+
}
|
|
542
|
+
}
|
|
400
543
|
|
|
401
544
|
// Perform render pass
|
|
402
|
-
renderer
|
|
545
|
+
renderer.render();
|
|
403
546
|
|
|
404
|
-
|
|
405
|
-
|
|
547
|
+
if (CALCULATE_FPS) {
|
|
548
|
+
this.calculateFps();
|
|
549
|
+
this.calculateQuads();
|
|
550
|
+
}
|
|
406
551
|
|
|
407
552
|
// Reset renderRequested flag if it was set
|
|
408
|
-
if (renderRequested) {
|
|
553
|
+
if (renderRequested === true) {
|
|
409
554
|
this.renderRequested = false;
|
|
410
555
|
}
|
|
556
|
+
|
|
557
|
+
if (this.timedNodes.length > 0) {
|
|
558
|
+
for (let key in this.timedNodes) {
|
|
559
|
+
if (this.timedNodes[key]!.isRenderable === true) {
|
|
560
|
+
this.requestRender();
|
|
561
|
+
break;
|
|
562
|
+
}
|
|
563
|
+
}
|
|
564
|
+
}
|
|
565
|
+
// Check if we need to cleanup textures
|
|
566
|
+
if (this.txMemManager.criticalCleanupRequested === true) {
|
|
567
|
+
this.txMemManager.cleanup();
|
|
568
|
+
}
|
|
411
569
|
}
|
|
412
570
|
|
|
413
571
|
/**
|
|
@@ -476,30 +634,38 @@ export class Stage {
|
|
|
476
634
|
}
|
|
477
635
|
}
|
|
478
636
|
|
|
479
|
-
|
|
480
|
-
|
|
637
|
+
requestRenderListUpdate() {
|
|
638
|
+
// Notify the renderer that the render list is structurally changing.
|
|
639
|
+
// For the WebGL renderer this resets per-node buffer slot assignments
|
|
640
|
+
// and schedules a full GPU buffer re-upload on the next frame.
|
|
641
|
+
if (this.renderer.invalidateQuadBuffer !== undefined) {
|
|
642
|
+
this.renderer.invalidateQuadBuffer();
|
|
643
|
+
}
|
|
644
|
+
this.renderListDirty = true;
|
|
645
|
+
this.requestRender();
|
|
646
|
+
}
|
|
481
647
|
|
|
482
|
-
|
|
648
|
+
buildRenderList(node: CoreNode) {
|
|
649
|
+
// If the node is renderable and has a loaded texture, add it
|
|
483
650
|
if (node.isRenderable === true) {
|
|
484
651
|
node.renderQuads(this.renderer);
|
|
652
|
+
this.renderList.push(node);
|
|
485
653
|
}
|
|
486
654
|
|
|
487
|
-
|
|
488
|
-
|
|
489
|
-
|
|
490
|
-
|
|
491
|
-
continue;
|
|
492
|
-
}
|
|
655
|
+
const children = node.children;
|
|
656
|
+
const len = children.length;
|
|
657
|
+
for (let i = 0; i < len; i++) {
|
|
658
|
+
const child = children[i] as CoreNode;
|
|
493
659
|
|
|
660
|
+
// Skip invisible subtrees
|
|
494
661
|
if (
|
|
495
662
|
child.worldAlpha === 0 ||
|
|
496
|
-
|
|
497
|
-
child.renderState === CoreNodeRenderState.OutOfBounds)
|
|
663
|
+
child.renderState === CoreNodeRenderState.OutOfBounds
|
|
498
664
|
) {
|
|
499
665
|
continue;
|
|
500
666
|
}
|
|
501
667
|
|
|
502
|
-
this.
|
|
668
|
+
this.buildRenderList(child);
|
|
503
669
|
}
|
|
504
670
|
}
|
|
505
671
|
|
|
@@ -510,6 +676,13 @@ export class Stage {
|
|
|
510
676
|
this.renderRequested = true;
|
|
511
677
|
}
|
|
512
678
|
|
|
679
|
+
reprocessUpdates(callback?: () => void) {
|
|
680
|
+
this.reprocessFrame = true;
|
|
681
|
+
if (callback) {
|
|
682
|
+
this.reprocessCallback = callback;
|
|
683
|
+
}
|
|
684
|
+
}
|
|
685
|
+
|
|
513
686
|
/**
|
|
514
687
|
* Given a font name, and possible renderer override, return the best compatible text renderer.
|
|
515
688
|
*
|
|
@@ -522,72 +695,52 @@ export class Stage {
|
|
|
522
695
|
*/
|
|
523
696
|
resolveTextRenderer(
|
|
524
697
|
trProps: TrProps,
|
|
525
|
-
textRendererOverride: keyof
|
|
698
|
+
textRendererOverride: keyof TextRenderers | null = null,
|
|
526
699
|
): TextRenderer | null {
|
|
527
|
-
|
|
528
|
-
|
|
529
|
-
|
|
700
|
+
// If we have an overide, return it
|
|
701
|
+
if (textRendererOverride !== null) {
|
|
702
|
+
const overrideKey = String(textRendererOverride);
|
|
703
|
+
if (this.textRenderers[overrideKey] === undefined) {
|
|
704
|
+
console.warn(`Text renderer override '${overrideKey}' not found.`);
|
|
705
|
+
return null;
|
|
706
|
+
}
|
|
530
707
|
|
|
531
|
-
|
|
532
|
-
if (this.fontResolveMap[fontCacheString] !== undefined) {
|
|
533
|
-
return this.fontResolveMap[fontCacheString] as unknown as TextRenderer;
|
|
708
|
+
return this.textRenderers[overrideKey];
|
|
534
709
|
}
|
|
535
710
|
|
|
536
|
-
//
|
|
537
|
-
|
|
538
|
-
|
|
539
|
-
|
|
540
|
-
|
|
541
|
-
if (rendererId) {
|
|
542
|
-
const possibleRenderer = this.textRenderers[rendererId];
|
|
543
|
-
if (!possibleRenderer) {
|
|
544
|
-
console.warn(`Text renderer override '${rendererId}' not found.`);
|
|
545
|
-
rendererId = null;
|
|
546
|
-
overrideFallback = true;
|
|
547
|
-
} else if (!possibleRenderer.canRenderFont(trProps)) {
|
|
548
|
-
console.warn(
|
|
549
|
-
`Cannot use override text renderer '${rendererId}' for font`,
|
|
550
|
-
trProps,
|
|
551
|
-
);
|
|
552
|
-
rendererId = null;
|
|
553
|
-
overrideFallback = true;
|
|
711
|
+
// If we have only one font engine early return it
|
|
712
|
+
if (this.singleFontEngine !== null) {
|
|
713
|
+
// If we have only one font engine and its the canvas engine, we can just return it
|
|
714
|
+
if (this.hasOnlyCanvasFontEngine === true) {
|
|
715
|
+
return this.singleFontEngine;
|
|
554
716
|
}
|
|
555
|
-
}
|
|
556
717
|
|
|
557
|
-
|
|
558
|
-
|
|
559
|
-
|
|
560
|
-
if (tr.canRenderFont(trProps)) {
|
|
561
|
-
rendererId = trId as keyof TextRendererMap;
|
|
562
|
-
break;
|
|
563
|
-
}
|
|
564
|
-
}
|
|
565
|
-
if (!rendererId && this.textRenderers.canvas !== undefined) {
|
|
566
|
-
// If no renderer can be found, use the canvas renderer
|
|
567
|
-
rendererId = 'canvas';
|
|
718
|
+
// If we have only one font engine and it can render the font, return it
|
|
719
|
+
if (this.singleFontHandler?.canRenderFont(trProps) === true) {
|
|
720
|
+
return this.singleFontEngine;
|
|
568
721
|
}
|
|
569
|
-
}
|
|
570
722
|
|
|
571
|
-
|
|
572
|
-
console.warn(`
|
|
573
|
-
}
|
|
723
|
+
// If we have only one font engine and it cannot render the font, return null
|
|
724
|
+
console.warn(`Text renderer cannot render font`, trProps);
|
|
574
725
|
|
|
575
|
-
if (!rendererId) {
|
|
576
|
-
// silently fail if no renderer can be found, the error is already created
|
|
577
|
-
// at the constructor level
|
|
578
726
|
return null;
|
|
579
727
|
}
|
|
580
728
|
|
|
581
|
-
//
|
|
582
|
-
const resolvedTextRenderer = this.textRenderers[rendererId];
|
|
583
|
-
assertTruthy(resolvedTextRenderer, 'resolvedTextRenderer undefined');
|
|
729
|
+
// Multi font handling - If we have multiple font engines, we need to resolve the best one
|
|
584
730
|
|
|
585
|
-
//
|
|
586
|
-
this.
|
|
731
|
+
// First check SDF
|
|
732
|
+
if (this.fontHandlers['sdf']?.canRenderFont(trProps) === true) {
|
|
733
|
+
return this.textRenderers.sdf || null;
|
|
734
|
+
}
|
|
735
|
+
|
|
736
|
+
// If we have a canvas engine, we can return it (it can render all fonts)
|
|
737
|
+
if (this.hasCanvasEngine === true) {
|
|
738
|
+
return this.textRenderers.canvas || null;
|
|
739
|
+
}
|
|
587
740
|
|
|
588
|
-
//
|
|
589
|
-
|
|
590
|
-
return
|
|
741
|
+
// If we have no font engines, return null
|
|
742
|
+
console.warn('No text renderers available. Your text will not render.');
|
|
743
|
+
return null;
|
|
591
744
|
}
|
|
592
745
|
|
|
593
746
|
createNode(props: Partial<CoreNodeProps>) {
|
|
@@ -596,34 +749,30 @@ export class Stage {
|
|
|
596
749
|
}
|
|
597
750
|
|
|
598
751
|
createTextNode(props: Partial<CoreTextNodeProps>) {
|
|
599
|
-
const fontSize = props.fontSize
|
|
600
|
-
const resolvedProps =
|
|
601
|
-
|
|
602
|
-
|
|
603
|
-
|
|
604
|
-
|
|
605
|
-
|
|
606
|
-
|
|
607
|
-
|
|
608
|
-
|
|
609
|
-
|
|
610
|
-
|
|
611
|
-
|
|
612
|
-
|
|
613
|
-
|
|
614
|
-
|
|
615
|
-
|
|
616
|
-
|
|
617
|
-
|
|
618
|
-
|
|
619
|
-
overflowSuffix: props.overflowSuffix ?? '...',
|
|
620
|
-
debug: props.debug ?? {},
|
|
621
|
-
shaderProps: null,
|
|
622
|
-
};
|
|
752
|
+
const fontSize = props.fontSize || 16;
|
|
753
|
+
const resolvedProps = this.resolveNodeDefaults(props) as CoreTextNodeProps;
|
|
754
|
+
|
|
755
|
+
resolvedProps.text = props.text ?? '';
|
|
756
|
+
resolvedProps.textRendererOverride = props.textRendererOverride ?? null;
|
|
757
|
+
resolvedProps.fontSize = fontSize;
|
|
758
|
+
resolvedProps.fontFamily = props.fontFamily || 'sans-serif';
|
|
759
|
+
resolvedProps.fontStyle = props.fontStyle || 'normal';
|
|
760
|
+
resolvedProps.textAlign = props.textAlign || 'left';
|
|
761
|
+
resolvedProps.offsetY = props.offsetY || 0;
|
|
762
|
+
resolvedProps.letterSpacing = props.letterSpacing || 0;
|
|
763
|
+
resolvedProps.lineHeight = props.lineHeight || 1.2;
|
|
764
|
+
resolvedProps.maxLines = props.maxLines || 0;
|
|
765
|
+
resolvedProps.verticalAlign = props.verticalAlign || 'top';
|
|
766
|
+
resolvedProps.overflowSuffix = props.overflowSuffix || '...';
|
|
767
|
+
resolvedProps.wordBreak = props.wordBreak || 'break-word';
|
|
768
|
+
resolvedProps.contain = props.contain || 'none';
|
|
769
|
+
resolvedProps.maxWidth = props.maxWidth || 0;
|
|
770
|
+
resolvedProps.maxHeight = props.maxHeight || 0;
|
|
771
|
+
resolvedProps.forceLoad = props.forceLoad || false;
|
|
623
772
|
|
|
624
773
|
const resolvedTextRenderer = this.resolveTextRenderer(
|
|
625
774
|
resolvedProps,
|
|
626
|
-
|
|
775
|
+
resolvedProps.textRendererOverride as keyof TextRenderers | null,
|
|
627
776
|
);
|
|
628
777
|
|
|
629
778
|
if (!resolvedTextRenderer) {
|
|
@@ -640,7 +789,84 @@ export class Stage {
|
|
|
640
789
|
? value
|
|
641
790
|
: [value, value, value, value];
|
|
642
791
|
|
|
643
|
-
this.
|
|
792
|
+
this.updateViewportBounds();
|
|
793
|
+
}
|
|
794
|
+
|
|
795
|
+
/**
|
|
796
|
+
* Update the viewport bounds
|
|
797
|
+
*/
|
|
798
|
+
updateViewportBounds() {
|
|
799
|
+
const { appWidth, appHeight } = this.options;
|
|
800
|
+
this.strictBound = createBound(0, 0, appWidth, appHeight);
|
|
801
|
+
this.preloadBound = createPreloadBounds(
|
|
802
|
+
this.strictBound,
|
|
803
|
+
this.boundsMargin,
|
|
804
|
+
);
|
|
805
|
+
this.root.setUpdateType(UpdateType.RenderBounds | UpdateType.Children);
|
|
806
|
+
this.root.childUpdateType |= UpdateType.RenderBounds;
|
|
807
|
+
}
|
|
808
|
+
|
|
809
|
+
/** Find all nodes at a given point
|
|
810
|
+
* @param data
|
|
811
|
+
*/
|
|
812
|
+
findNodesAtPoint(data: Point): CoreNode[] {
|
|
813
|
+
const x = data.x / this.options.deviceLogicalPixelRatio;
|
|
814
|
+
const y = data.y / this.options.deviceLogicalPixelRatio;
|
|
815
|
+
const nodes: CoreNode[] = [];
|
|
816
|
+
for (const node of this.interactiveNodes) {
|
|
817
|
+
if (node.isRenderable === false) {
|
|
818
|
+
continue;
|
|
819
|
+
}
|
|
820
|
+
if (pointInBound(x, y, node.renderBound!) === true) {
|
|
821
|
+
nodes.push(node);
|
|
822
|
+
}
|
|
823
|
+
}
|
|
824
|
+
return nodes;
|
|
825
|
+
}
|
|
826
|
+
|
|
827
|
+
/**
|
|
828
|
+
* Find the top node at a given point
|
|
829
|
+
* @param data
|
|
830
|
+
* @returns
|
|
831
|
+
*/
|
|
832
|
+
getNodeFromPosition(data: Point): CoreNode | null {
|
|
833
|
+
const nodes: CoreNode[] = this.findNodesAtPoint(data);
|
|
834
|
+
if (nodes.length === 0) {
|
|
835
|
+
return null;
|
|
836
|
+
}
|
|
837
|
+
|
|
838
|
+
//get last node in array (as top node)
|
|
839
|
+
let topNode = nodes[nodes.length - 1] as CoreNode;
|
|
840
|
+
for (let i = 0; i < nodes.length; i++) {
|
|
841
|
+
if (nodes[i]!.zIndex > topNode.zIndex) {
|
|
842
|
+
topNode = nodes[i]!;
|
|
843
|
+
}
|
|
844
|
+
}
|
|
845
|
+
return topNode || null;
|
|
846
|
+
}
|
|
847
|
+
|
|
848
|
+
/**
|
|
849
|
+
* add node to timeNodes arrays
|
|
850
|
+
* @param node
|
|
851
|
+
* @returns
|
|
852
|
+
*/
|
|
853
|
+
trackTimedNode(node: CoreNode) {
|
|
854
|
+
if (this.timedNodes[node.id] !== undefined) {
|
|
855
|
+
return;
|
|
856
|
+
}
|
|
857
|
+
this.timedNodes[node.id] = node;
|
|
858
|
+
}
|
|
859
|
+
|
|
860
|
+
/**
|
|
861
|
+
* remove node from timeNodes arrays
|
|
862
|
+
* @param node
|
|
863
|
+
* @returns
|
|
864
|
+
*/
|
|
865
|
+
untrackTimedNode(node: CoreNode) {
|
|
866
|
+
if (this.timedNodes[node.id] === undefined) {
|
|
867
|
+
return;
|
|
868
|
+
}
|
|
869
|
+
delete this.timedNodes[node.id];
|
|
644
870
|
}
|
|
645
871
|
|
|
646
872
|
/**
|
|
@@ -656,65 +882,96 @@ export class Stage {
|
|
|
656
882
|
*/
|
|
657
883
|
protected resolveNodeDefaults(props: Partial<CoreNodeProps>): CoreNodeProps {
|
|
658
884
|
const color = props.color ?? 0xffffffff;
|
|
659
|
-
|
|
660
|
-
|
|
661
|
-
|
|
662
|
-
|
|
663
|
-
|
|
664
|
-
|
|
665
|
-
|
|
666
|
-
|
|
667
|
-
|
|
668
|
-
if
|
|
669
|
-
|
|
885
|
+
let colorTop = color;
|
|
886
|
+
let colorBottom = color;
|
|
887
|
+
let colorLeft = color;
|
|
888
|
+
let colorRight = color;
|
|
889
|
+
let colorTl = color;
|
|
890
|
+
let colorTr = color;
|
|
891
|
+
let colorBl = color;
|
|
892
|
+
let colorBr = color;
|
|
893
|
+
|
|
894
|
+
// Fast-path: Check if any complex color props are present
|
|
895
|
+
// We check values directly to avoid destructuring
|
|
896
|
+
if (
|
|
897
|
+
props.colorTop !== undefined ||
|
|
898
|
+
props.colorBottom !== undefined ||
|
|
899
|
+
props.colorLeft !== undefined ||
|
|
900
|
+
props.colorRight !== undefined ||
|
|
901
|
+
props.colorTl !== undefined ||
|
|
902
|
+
props.colorTr !== undefined ||
|
|
903
|
+
props.colorBl !== undefined ||
|
|
904
|
+
props.colorBr !== undefined
|
|
905
|
+
) {
|
|
906
|
+
const {
|
|
907
|
+
colorTop: top,
|
|
908
|
+
colorBottom: bottom,
|
|
909
|
+
colorLeft: left,
|
|
910
|
+
colorRight: right,
|
|
911
|
+
} = props;
|
|
912
|
+
|
|
913
|
+
colorTop = top ?? color;
|
|
914
|
+
colorBottom = bottom ?? color;
|
|
915
|
+
colorLeft = left ?? color;
|
|
916
|
+
colorRight = right ?? color;
|
|
917
|
+
|
|
918
|
+
colorTl = props.colorTl ?? top ?? left ?? color;
|
|
919
|
+
colorTr = props.colorTr ?? top ?? right ?? color;
|
|
920
|
+
colorBl = props.colorBl ?? bottom ?? left ?? color;
|
|
921
|
+
colorBr = props.colorBr ?? bottom ?? right ?? color;
|
|
670
922
|
}
|
|
671
923
|
|
|
924
|
+
const scale = props.scale ?? null;
|
|
925
|
+
const mount = props.mount ?? 0;
|
|
926
|
+
const pivot = props.pivot ?? 0.5;
|
|
927
|
+
|
|
928
|
+
const data =
|
|
929
|
+
!isProductionEnvironment && this.options.inspector
|
|
930
|
+
? santizeCustomDataMap(props.data ?? {})
|
|
931
|
+
: {};
|
|
932
|
+
|
|
672
933
|
return {
|
|
673
934
|
x: props.x ?? 0,
|
|
674
935
|
y: props.y ?? 0,
|
|
675
|
-
|
|
676
|
-
|
|
936
|
+
w: props.w ?? 0,
|
|
937
|
+
h: props.h ?? 0,
|
|
677
938
|
alpha: props.alpha ?? 1,
|
|
678
939
|
autosize: props.autosize ?? false,
|
|
679
940
|
boundsMargin: props.boundsMargin ?? null,
|
|
680
941
|
clipping: props.clipping ?? false,
|
|
681
942
|
color,
|
|
682
|
-
colorTop
|
|
683
|
-
colorBottom
|
|
684
|
-
colorLeft
|
|
685
|
-
colorRight
|
|
686
|
-
colorBl,
|
|
687
|
-
colorBr,
|
|
943
|
+
colorTop,
|
|
944
|
+
colorBottom,
|
|
945
|
+
colorLeft,
|
|
946
|
+
colorRight,
|
|
688
947
|
colorTl,
|
|
689
948
|
colorTr,
|
|
949
|
+
colorBl,
|
|
950
|
+
colorBr,
|
|
690
951
|
zIndex: props.zIndex ?? 0,
|
|
691
|
-
zIndexLocked: props.zIndexLocked ?? 0,
|
|
692
952
|
parent: props.parent ?? null,
|
|
693
953
|
texture: props.texture ?? null,
|
|
694
954
|
textureOptions: props.textureOptions ?? {},
|
|
695
955
|
shader: props.shader ?? this.defShaderNode,
|
|
696
|
-
// Since setting the `src` will trigger a texture load, we need to set it after
|
|
697
|
-
// we set the texture. Otherwise, problems happen.
|
|
698
956
|
src: props.src ?? null,
|
|
699
957
|
srcHeight: props.srcHeight,
|
|
700
958
|
srcWidth: props.srcWidth,
|
|
701
959
|
srcX: props.srcX,
|
|
702
960
|
srcY: props.srcY,
|
|
703
|
-
scale
|
|
704
|
-
scaleX: props.scaleX ??
|
|
705
|
-
scaleY: props.scaleY ??
|
|
706
|
-
mount
|
|
707
|
-
mountX: props.mountX ??
|
|
708
|
-
mountY: props.mountY ??
|
|
709
|
-
pivot
|
|
710
|
-
pivotX: props.pivotX ??
|
|
711
|
-
pivotY: props.pivotY ??
|
|
961
|
+
scale,
|
|
962
|
+
scaleX: props.scaleX ?? scale ?? 1,
|
|
963
|
+
scaleY: props.scaleY ?? scale ?? 1,
|
|
964
|
+
mount,
|
|
965
|
+
mountX: props.mountX ?? mount,
|
|
966
|
+
mountY: props.mountY ?? mount,
|
|
967
|
+
pivot,
|
|
968
|
+
pivotX: props.pivotX ?? pivot,
|
|
969
|
+
pivotY: props.pivotY ?? pivot,
|
|
712
970
|
rotation: props.rotation ?? 0,
|
|
713
971
|
rtt: props.rtt ?? false,
|
|
714
|
-
data
|
|
715
|
-
preventCleanup: props.preventCleanup ?? false,
|
|
972
|
+
data,
|
|
716
973
|
imageType: props.imageType,
|
|
717
|
-
|
|
974
|
+
interactive: props.interactive ?? false,
|
|
718
975
|
};
|
|
719
976
|
}
|
|
720
977
|
|
|
@@ -724,8 +981,8 @@ export class Stage {
|
|
|
724
981
|
* @remarks
|
|
725
982
|
* This method is used to cleanup orphaned textures that are no longer in use.
|
|
726
983
|
*/
|
|
727
|
-
cleanup(
|
|
728
|
-
this.txMemManager.cleanup(
|
|
984
|
+
cleanup(full: boolean = false) {
|
|
985
|
+
this.txMemManager.cleanup(full);
|
|
729
986
|
}
|
|
730
987
|
|
|
731
988
|
set clearColor(value: number) {
|
|
@@ -737,4 +994,37 @@ export class Stage {
|
|
|
737
994
|
get clearColor() {
|
|
738
995
|
return this.clrColor;
|
|
739
996
|
}
|
|
997
|
+
|
|
998
|
+
/**
|
|
999
|
+
* Load a font using a specific text renderer type
|
|
1000
|
+
*
|
|
1001
|
+
* @remarks
|
|
1002
|
+
* This method allows consumers to explicitly load fonts for a specific
|
|
1003
|
+
* text renderer type (e.g., 'canvas', 'sdf'). Consumers must specify
|
|
1004
|
+
* the renderer type to ensure fonts are loaded with the correct pipeline.
|
|
1005
|
+
*
|
|
1006
|
+
* For Canvas fonts, provide fontUrl (e.g., .ttf, .woff, .woff2)
|
|
1007
|
+
* For SDF fonts, provide atlasUrl (image) and atlasDataUrl (JSON glyph data)
|
|
1008
|
+
*
|
|
1009
|
+
* @param rendererType - The type of text renderer ('canvas', 'sdf', etc.)
|
|
1010
|
+
* @param options - Font loading options specific to the renderer type
|
|
1011
|
+
* @returns Promise that resolves when the font is loaded
|
|
1012
|
+
*/
|
|
1013
|
+
async loadFont(
|
|
1014
|
+
rendererType: TextRenderers,
|
|
1015
|
+
options: FontLoadOptions,
|
|
1016
|
+
): Promise<void> {
|
|
1017
|
+
const rendererTypeKey = String(rendererType);
|
|
1018
|
+
const fontHandler = this.fontHandlers[rendererTypeKey];
|
|
1019
|
+
|
|
1020
|
+
if (!fontHandler) {
|
|
1021
|
+
throw new Error(
|
|
1022
|
+
`Font handler for renderer type '${rendererTypeKey}' not found. Available types: ${Object.keys(
|
|
1023
|
+
this.fontHandlers,
|
|
1024
|
+
).join(', ')}`,
|
|
1025
|
+
);
|
|
1026
|
+
}
|
|
1027
|
+
|
|
1028
|
+
return fontHandler.loadFont(this, options);
|
|
1029
|
+
}
|
|
740
1030
|
}
|