@lightningjs/renderer 0.9.4 → 1.0.0-rc.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +0 -82
- package/dist/exports/index.d.ts +42 -3
- package/dist/exports/index.js +37 -3
- package/dist/exports/index.js.map +1 -1
- package/dist/src/core/CoreNode.d.ts +461 -46
- package/dist/src/core/CoreNode.js +170 -104
- package/dist/src/core/CoreNode.js.map +1 -1
- package/dist/src/core/CoreShaderManager.d.ts +16 -6
- package/dist/src/core/CoreShaderManager.js +20 -20
- package/dist/src/core/CoreShaderManager.js.map +1 -1
- package/dist/src/core/CoreTextNode.d.ts +30 -4
- package/dist/src/core/CoreTextNode.js +24 -1
- package/dist/src/core/CoreTextNode.js.map +1 -1
- package/dist/src/core/CoreTextureManager.d.ts +31 -82
- package/dist/src/core/CoreTextureManager.js +39 -126
- package/dist/src/core/CoreTextureManager.js.map +1 -1
- package/dist/src/core/Stage.d.ts +67 -9
- package/dist/src/core/Stage.js +174 -30
- package/dist/src/core/Stage.js.map +1 -1
- package/dist/src/core/TextureMemoryManager.d.ts +97 -8
- package/dist/src/core/TextureMemoryManager.js +142 -19
- package/dist/src/core/TextureMemoryManager.js.map +1 -1
- package/dist/src/core/animations/CoreAnimation.d.ts +14 -6
- package/dist/src/core/animations/CoreAnimation.js +137 -43
- package/dist/src/core/animations/CoreAnimation.js.map +1 -1
- package/dist/src/core/lib/ImageWorker.js +59 -52
- package/dist/src/core/lib/ImageWorker.js.map +1 -1
- package/dist/src/core/lib/utils.js.map +1 -1
- package/dist/src/core/platform.js +7 -1
- package/dist/src/core/platform.js.map +1 -1
- package/dist/src/core/renderers/CoreContextTexture.d.ts +3 -2
- package/dist/src/core/renderers/CoreContextTexture.js +7 -1
- package/dist/src/core/renderers/CoreContextTexture.js.map +1 -1
- package/dist/src/core/renderers/CoreRenderer.d.ts +5 -1
- package/dist/src/core/renderers/CoreRenderer.js +0 -1
- package/dist/src/core/renderers/CoreRenderer.js.map +1 -1
- package/dist/src/core/renderers/canvas/CanvasCoreRenderer.d.ts +3 -0
- package/dist/src/core/renderers/canvas/CanvasCoreRenderer.js +16 -1
- package/dist/src/core/renderers/canvas/CanvasCoreRenderer.js.map +1 -1
- package/dist/src/core/renderers/canvas/CanvasCoreTexture.d.ts +0 -1
- package/dist/src/core/renderers/canvas/CanvasCoreTexture.js +2 -5
- package/dist/src/core/renderers/canvas/CanvasCoreTexture.js.map +1 -1
- package/dist/src/core/renderers/webgl/WebGlCoreCtxRenderTexture.js +2 -2
- package/dist/src/core/renderers/webgl/WebGlCoreCtxRenderTexture.js.map +1 -1
- package/dist/src/core/renderers/webgl/WebGlCoreCtxTexture.d.ts +0 -1
- package/dist/src/core/renderers/webgl/WebGlCoreCtxTexture.js +7 -10
- package/dist/src/core/renderers/webgl/WebGlCoreCtxTexture.js.map +1 -1
- package/dist/src/core/renderers/webgl/WebGlCoreRenderer.d.ts +3 -0
- package/dist/src/core/renderers/webgl/WebGlCoreRenderer.js +47 -9
- package/dist/src/core/renderers/webgl/WebGlCoreRenderer.js.map +1 -1
- package/dist/src/core/renderers/webgl/shaders/DynamicShader.d.ts +2 -43
- package/dist/src/core/renderers/webgl/shaders/DynamicShader.js +70 -37
- package/dist/src/core/renderers/webgl/shaders/DynamicShader.js.map +1 -1
- package/dist/src/core/renderers/webgl/shaders/effects/BorderBottomEffect.js +2 -2
- package/dist/src/core/renderers/webgl/shaders/effects/BorderBottomEffect.js.map +1 -1
- package/dist/src/core/renderers/webgl/shaders/effects/BorderEffect.js +2 -2
- package/dist/src/core/renderers/webgl/shaders/effects/BorderEffect.js.map +1 -1
- package/dist/src/core/renderers/webgl/shaders/effects/BorderLeftEffect.js +2 -2
- package/dist/src/core/renderers/webgl/shaders/effects/BorderLeftEffect.js.map +1 -1
- package/dist/src/core/renderers/webgl/shaders/effects/BorderRightEffect.js +2 -2
- package/dist/src/core/renderers/webgl/shaders/effects/BorderRightEffect.js.map +1 -1
- package/dist/src/core/renderers/webgl/shaders/effects/BorderTopEffect.js +2 -2
- package/dist/src/core/renderers/webgl/shaders/effects/BorderTopEffect.js.map +1 -1
- package/dist/src/core/renderers/webgl/shaders/effects/EffectUtils.d.ts +8 -0
- package/dist/src/core/renderers/webgl/shaders/effects/EffectUtils.js +103 -0
- package/dist/src/core/renderers/webgl/shaders/effects/EffectUtils.js.map +1 -1
- package/dist/src/core/renderers/webgl/shaders/effects/FadeOutEffect.js +3 -18
- package/dist/src/core/renderers/webgl/shaders/effects/FadeOutEffect.js.map +1 -1
- package/dist/src/core/renderers/webgl/shaders/effects/GlitchEffect.js +5 -2
- package/dist/src/core/renderers/webgl/shaders/effects/GlitchEffect.js.map +1 -1
- package/dist/src/core/renderers/webgl/shaders/effects/HolePunchEffect.js +4 -36
- package/dist/src/core/renderers/webgl/shaders/effects/HolePunchEffect.js.map +1 -1
- package/dist/src/core/renderers/webgl/shaders/effects/LinearGradientEffect.js +3 -2
- package/dist/src/core/renderers/webgl/shaders/effects/LinearGradientEffect.js.map +1 -1
- package/dist/src/core/renderers/webgl/shaders/effects/RadialGradientEffect.js +4 -2
- package/dist/src/core/renderers/webgl/shaders/effects/RadialGradientEffect.js.map +1 -1
- package/dist/src/core/renderers/webgl/shaders/effects/RadialProgressEffect.js +2 -1
- package/dist/src/core/renderers/webgl/shaders/effects/RadialProgressEffect.js.map +1 -1
- package/dist/src/core/renderers/webgl/shaders/effects/RadiusEffect.js +4 -36
- package/dist/src/core/renderers/webgl/shaders/effects/RadiusEffect.js.map +1 -1
- package/dist/src/core/renderers/webgl/shaders/effects/ShaderEffect.d.ts +69 -0
- package/dist/src/core/renderers/webgl/shaders/effects/ShaderEffect.js.map +1 -1
- package/dist/src/core/text-rendering/font-face-types/SdfTrFontFace/SdfTrFontFace.js +5 -2
- package/dist/src/core/text-rendering/font-face-types/SdfTrFontFace/SdfTrFontFace.js.map +1 -1
- package/dist/src/core/text-rendering/font-face-types/TrFontFace.d.ts +0 -1
- package/dist/src/core/text-rendering/font-face-types/TrFontFace.js +0 -1
- package/dist/src/core/text-rendering/font-face-types/TrFontFace.js.map +1 -1
- package/dist/src/core/text-rendering/font-face-types/WebTrFontFace.js +0 -1
- package/dist/src/core/text-rendering/font-face-types/WebTrFontFace.js.map +1 -1
- package/dist/src/core/text-rendering/renderers/CanvasTextRenderer.d.ts +10 -26
- package/dist/src/core/text-rendering/renderers/CanvasTextRenderer.js +116 -365
- package/dist/src/core/text-rendering/renderers/CanvasTextRenderer.js.map +1 -1
- package/dist/src/core/text-rendering/renderers/LightningTextTextureRenderer.d.ts +0 -1
- package/dist/src/core/text-rendering/renderers/LightningTextTextureRenderer.js +0 -2
- package/dist/src/core/text-rendering/renderers/LightningTextTextureRenderer.js.map +1 -1
- package/dist/src/core/text-rendering/renderers/SdfTextRenderer/SdfTextRenderer.js +2 -2
- package/dist/src/core/text-rendering/renderers/SdfTextRenderer/SdfTextRenderer.js.map +1 -1
- package/dist/src/core/text-rendering/renderers/SdfTextRenderer/internal/layoutText.js +2 -0
- package/dist/src/core/text-rendering/renderers/SdfTextRenderer/internal/layoutText.js.map +1 -1
- package/dist/src/core/text-rendering/renderers/TextRenderer.d.ts +3 -2
- package/dist/src/core/text-rendering/renderers/TextRenderer.js.map +1 -1
- package/dist/src/core/textures/ColorTexture.d.ts +1 -1
- package/dist/src/core/textures/ColorTexture.js +1 -1
- package/dist/src/core/textures/ImageTexture.d.ts +1 -1
- package/dist/src/core/textures/NoiseTexture.d.ts +1 -1
- package/dist/src/core/textures/NoiseTexture.js +3 -0
- package/dist/src/core/textures/NoiseTexture.js.map +1 -1
- package/dist/src/core/textures/SubTexture.d.ts +2 -2
- package/dist/src/core/textures/SubTexture.js +5 -1
- package/dist/src/core/textures/SubTexture.js.map +1 -1
- package/dist/src/core/textures/Texture.d.ts +23 -2
- package/dist/src/core/textures/Texture.js +32 -3
- package/dist/src/core/textures/Texture.js.map +1 -1
- package/dist/src/core/utils.d.ts +7 -0
- package/dist/src/core/utils.js +12 -10
- package/dist/src/core/utils.js.map +1 -1
- package/dist/src/main-api/DynamicShaderController.d.ts +9 -14
- package/dist/src/main-api/DynamicShaderController.js +21 -17
- package/dist/src/main-api/DynamicShaderController.js.map +1 -1
- package/dist/src/main-api/INode.d.ts +43 -463
- package/dist/src/main-api/INode.js +1 -19
- package/dist/src/main-api/INode.js.map +1 -1
- package/dist/src/main-api/Inspector.d.ts +10 -10
- package/dist/src/main-api/Inspector.js +18 -15
- package/dist/src/main-api/Inspector.js.map +1 -1
- package/dist/src/main-api/Renderer.d.ts +71 -25
- package/dist/src/main-api/Renderer.js +80 -109
- package/dist/src/main-api/Renderer.js.map +1 -1
- package/dist/src/main-api/ShaderController.d.ts +3 -8
- package/dist/src/main-api/ShaderController.js +8 -3
- package/dist/src/main-api/ShaderController.js.map +1 -1
- package/dist/src/utils.d.ts +1 -0
- package/dist/src/utils.js +7 -0
- package/dist/src/utils.js.map +1 -1
- package/dist/tsconfig.dist.tsbuildinfo +1 -1
- package/exports/index.ts +62 -3
- package/package.json +8 -7
- package/src/core/CoreNode.test.ts +93 -0
- package/src/core/CoreNode.ts +675 -188
- package/src/core/CoreShaderManager.ts +56 -29
- package/src/core/CoreTextNode.ts +41 -9
- package/src/core/CoreTextureManager.ts +55 -175
- package/src/core/Stage.ts +199 -43
- package/src/core/TextureMemoryManager.ts +231 -22
- package/src/core/animations/CoreAnimation.ts +194 -67
- package/src/core/lib/ImageWorker.ts +79 -52
- package/src/core/lib/utils.ts +1 -0
- package/src/core/platform.ts +8 -1
- package/src/core/renderers/CoreContextTexture.ts +9 -2
- package/src/core/renderers/CoreRenderer.ts +5 -2
- package/src/core/renderers/canvas/CanvasCoreRenderer.ts +20 -1
- package/src/core/renderers/canvas/CanvasCoreTexture.ts +2 -6
- package/src/core/renderers/webgl/WebGlCoreCtxRenderTexture.ts +2 -2
- package/src/core/renderers/webgl/WebGlCoreCtxTexture.ts +7 -11
- package/src/core/renderers/webgl/WebGlCoreRenderer.ts +51 -9
- package/src/core/renderers/webgl/shaders/DynamicShader.ts +94 -92
- package/src/core/renderers/webgl/shaders/effects/BorderBottomEffect.ts +2 -2
- package/src/core/renderers/webgl/shaders/effects/BorderEffect.ts +2 -2
- package/src/core/renderers/webgl/shaders/effects/BorderLeftEffect.ts +2 -2
- package/src/core/renderers/webgl/shaders/effects/BorderRightEffect.ts +2 -2
- package/src/core/renderers/webgl/shaders/effects/BorderTopEffect.ts +2 -2
- package/src/core/renderers/webgl/shaders/effects/EffectUtils.ts +129 -3
- package/src/core/renderers/webgl/shaders/effects/FadeOutEffect.ts +7 -15
- package/src/core/renderers/webgl/shaders/effects/GlitchEffect.ts +5 -2
- package/src/core/renderers/webgl/shaders/effects/HolePunchEffect.ts +6 -15
- package/src/core/renderers/webgl/shaders/effects/LinearGradientEffect.ts +6 -2
- package/src/core/renderers/webgl/shaders/effects/RadialGradientEffect.ts +10 -2
- package/src/core/renderers/webgl/shaders/effects/RadialProgressEffect.ts +2 -1
- package/src/core/renderers/webgl/shaders/effects/RadiusEffect.ts +6 -15
- package/src/core/renderers/webgl/shaders/effects/ShaderEffect.ts +80 -0
- package/src/core/text-rendering/font-face-types/SdfTrFontFace/SdfTrFontFace.ts +14 -15
- package/src/core/text-rendering/font-face-types/TrFontFace.ts +0 -2
- package/src/core/text-rendering/font-face-types/WebTrFontFace.ts +0 -1
- package/src/core/text-rendering/renderers/CanvasTextRenderer.ts +139 -447
- package/src/core/text-rendering/renderers/LightningTextTextureRenderer.ts +0 -3
- package/src/core/text-rendering/renderers/SdfTextRenderer/SdfTextRenderer.ts +2 -2
- package/src/core/text-rendering/renderers/SdfTextRenderer/internal/layoutText.ts +4 -2
- package/src/core/text-rendering/renderers/TextRenderer.ts +3 -2
- package/src/core/textures/ColorTexture.ts +1 -1
- package/src/core/textures/ImageTexture.ts +1 -1
- package/src/core/textures/NoiseTexture.ts +4 -1
- package/src/core/textures/SubTexture.ts +7 -7
- package/src/core/textures/Texture.ts +46 -3
- package/src/core/utils.ts +12 -11
- package/src/main-api/DynamicShaderController.ts +104 -0
- package/src/main-api/INode.ts +57 -479
- package/src/main-api/Inspector.ts +37 -39
- package/src/main-api/Renderer.ts +586 -0
- package/src/main-api/ShaderController.ts +81 -0
- package/src/main-api/utils.ts +45 -0
- package/src/utils.ts +8 -0
- package/dist/exports/core-api.d.ts +0 -74
- package/dist/exports/core-api.js +0 -96
- package/dist/exports/core-api.js.map +0 -1
- package/dist/exports/main-api.d.ts +0 -30
- package/dist/exports/main-api.js +0 -45
- package/dist/exports/main-api.js.map +0 -1
- package/dist/src/core/CoreExtension.d.ts +0 -12
- package/dist/src/core/CoreExtension.js +0 -29
- package/dist/src/core/CoreExtension.js.map +0 -1
- package/dist/src/core/renderers/SpecificNode.d.ts +0 -1
- package/dist/src/core/renderers/SpecificNode.js +0 -19
- package/dist/src/core/renderers/SpecificNode.js.map +0 -1
- package/dist/src/core/renderers/webgl/newShader/effectsMock.d.ts +0 -13
- package/dist/src/core/renderers/webgl/newShader/effectsMock.js +0 -62
- package/dist/src/core/renderers/webgl/newShader/effectsMock.js.map +0 -1
- package/dist/src/main-api/ICoreDriver.d.ts +0 -24
- package/dist/src/main-api/ICoreDriver.js +0 -20
- package/dist/src/main-api/ICoreDriver.js.map +0 -1
- package/dist/src/main-api/RendererMain.d.ts +0 -378
- package/dist/src/main-api/RendererMain.js +0 -367
- package/dist/src/main-api/RendererMain.js.map +0 -1
- package/dist/src/main-api/texture-usage-trackers/FinalizationRegistryTextureUsageTracker.d.ts +0 -9
- package/dist/src/main-api/texture-usage-trackers/FinalizationRegistryTextureUsageTracker.js +0 -38
- package/dist/src/main-api/texture-usage-trackers/FinalizationRegistryTextureUsageTracker.js.map +0 -1
- package/dist/src/main-api/texture-usage-trackers/ManualCountTextureUsageTracker.d.ts +0 -56
- package/dist/src/main-api/texture-usage-trackers/ManualCountTextureUsageTracker.js +0 -101
- package/dist/src/main-api/texture-usage-trackers/ManualCountTextureUsageTracker.js.map +0 -1
- package/dist/src/main-api/texture-usage-trackers/TextureUsageTracker.d.ts +0 -32
- package/dist/src/main-api/texture-usage-trackers/TextureUsageTracker.js +0 -28
- package/dist/src/main-api/texture-usage-trackers/TextureUsageTracker.js.map +0 -1
- package/dist/src/render-drivers/main/MainCoreDriver.d.ts +0 -21
- package/dist/src/render-drivers/main/MainCoreDriver.js +0 -115
- package/dist/src/render-drivers/main/MainCoreDriver.js.map +0 -1
- package/dist/src/render-drivers/main/MainOnlyNode.d.ts +0 -101
- package/dist/src/render-drivers/main/MainOnlyNode.js +0 -425
- package/dist/src/render-drivers/main/MainOnlyNode.js.map +0 -1
- package/dist/src/render-drivers/main/MainOnlyTextNode.d.ts +0 -47
- package/dist/src/render-drivers/main/MainOnlyTextNode.js +0 -204
- package/dist/src/render-drivers/main/MainOnlyTextNode.js.map +0 -1
- package/dist/src/render-drivers/threadx/NodeStruct.d.ts +0 -93
- package/dist/src/render-drivers/threadx/NodeStruct.js +0 -290
- package/dist/src/render-drivers/threadx/NodeStruct.js.map +0 -1
- package/dist/src/render-drivers/threadx/SharedNode.d.ts +0 -40
- package/dist/src/render-drivers/threadx/SharedNode.js +0 -61
- package/dist/src/render-drivers/threadx/SharedNode.js.map +0 -1
- package/dist/src/render-drivers/threadx/TextNodeStruct.d.ts +0 -44
- package/dist/src/render-drivers/threadx/TextNodeStruct.js +0 -203
- package/dist/src/render-drivers/threadx/TextNodeStruct.js.map +0 -1
- package/dist/src/render-drivers/threadx/ThreadXCoreDriver.d.ts +0 -25
- package/dist/src/render-drivers/threadx/ThreadXCoreDriver.js +0 -232
- package/dist/src/render-drivers/threadx/ThreadXCoreDriver.js.map +0 -1
- package/dist/src/render-drivers/threadx/ThreadXMainAnimationController.d.ts +0 -24
- package/dist/src/render-drivers/threadx/ThreadXMainAnimationController.js +0 -113
- package/dist/src/render-drivers/threadx/ThreadXMainAnimationController.js.map +0 -1
- package/dist/src/render-drivers/threadx/ThreadXMainNode.d.ts +0 -46
- package/dist/src/render-drivers/threadx/ThreadXMainNode.js +0 -160
- package/dist/src/render-drivers/threadx/ThreadXMainNode.js.map +0 -1
- package/dist/src/render-drivers/threadx/ThreadXMainTextNode.d.ts +0 -28
- package/dist/src/render-drivers/threadx/ThreadXMainTextNode.js +0 -55
- package/dist/src/render-drivers/threadx/ThreadXMainTextNode.js.map +0 -1
- package/dist/src/render-drivers/threadx/ThreadXRendererMessage.d.ts +0 -70
- package/dist/src/render-drivers/threadx/ThreadXRendererMessage.js +0 -32
- package/dist/src/render-drivers/threadx/ThreadXRendererMessage.js.map +0 -1
- package/dist/src/render-drivers/threadx/worker/ThreadXRendererNode.d.ts +0 -19
- package/dist/src/render-drivers/threadx/worker/ThreadXRendererNode.js +0 -184
- package/dist/src/render-drivers/threadx/worker/ThreadXRendererNode.js.map +0 -1
- package/dist/src/render-drivers/threadx/worker/ThreadXRendererTextNode.d.ts +0 -27
- package/dist/src/render-drivers/threadx/worker/ThreadXRendererTextNode.js +0 -109
- package/dist/src/render-drivers/threadx/worker/ThreadXRendererTextNode.js.map +0 -1
- package/dist/src/render-drivers/threadx/worker/renderer.d.ts +0 -1
- package/dist/src/render-drivers/threadx/worker/renderer.js +0 -147
- package/dist/src/render-drivers/threadx/worker/renderer.js.map +0 -1
- package/dist/src/render-drivers/utils.d.ts +0 -12
- package/dist/src/render-drivers/utils.js +0 -74
- package/dist/src/render-drivers/utils.js.map +0 -1
- package/exports/core-api.ts +0 -102
- package/exports/main-api.ts +0 -62
- package/src/core/CoreExtension.ts +0 -32
- package/src/main-api/ICoreDriver.ts +0 -68
- package/src/main-api/RendererMain.ts +0 -685
- package/src/main-api/texture-usage-trackers/FinalizationRegistryTextureUsageTracker.ts +0 -45
- package/src/main-api/texture-usage-trackers/ManualCountTextureUsageTracker.ts +0 -154
- package/src/main-api/texture-usage-trackers/TextureUsageTracker.ts +0 -54
- package/src/render-drivers/main/MainCoreDriver.ts +0 -159
- package/src/render-drivers/main/MainOnlyNode.ts +0 -553
- package/src/render-drivers/main/MainOnlyTextNode.ts +0 -261
- package/src/render-drivers/threadx/NodeStruct.ts +0 -320
- package/src/render-drivers/threadx/SharedNode.ts +0 -101
- package/src/render-drivers/threadx/TextNodeStruct.ts +0 -213
- package/src/render-drivers/threadx/ThreadXCoreDriver.ts +0 -291
- package/src/render-drivers/threadx/ThreadXMainAnimationController.ts +0 -135
- package/src/render-drivers/threadx/ThreadXMainNode.ts +0 -201
- package/src/render-drivers/threadx/ThreadXMainTextNode.ts +0 -85
- package/src/render-drivers/threadx/ThreadXRendererMessage.ts +0 -112
- package/src/render-drivers/threadx/worker/ThreadXRendererNode.ts +0 -253
- package/src/render-drivers/threadx/worker/ThreadXRendererTextNode.ts +0 -151
- package/src/render-drivers/threadx/worker/renderer.ts +0 -156
- package/src/render-drivers/utils.ts +0 -102
|
@@ -16,7 +16,6 @@
|
|
|
16
16
|
* See the License for the specific language governing permissions and
|
|
17
17
|
* limitations under the License.
|
|
18
18
|
*/
|
|
19
|
-
import { assertTruthy } from '../utils.js';
|
|
20
19
|
import { ImageWorkerManager } from './lib/ImageWorker.js';
|
|
21
20
|
import { ColorTexture } from './textures/ColorTexture.js';
|
|
22
21
|
import { ImageTexture } from './textures/ImageTexture.js';
|
|
@@ -25,14 +24,17 @@ import { SubTexture } from './textures/SubTexture.js';
|
|
|
25
24
|
import { RenderTexture } from './textures/RenderTexture.js';
|
|
26
25
|
export class CoreTextureManager {
|
|
27
26
|
/**
|
|
28
|
-
*
|
|
27
|
+
* Map of textures by cache key
|
|
28
|
+
*/
|
|
29
|
+
keyCache = new Map();
|
|
30
|
+
/**
|
|
31
|
+
* Map of cache keys by texture
|
|
32
|
+
*/
|
|
33
|
+
inverseKeyCache = new WeakMap();
|
|
34
|
+
/**
|
|
35
|
+
* Map of texture constructors by their type name
|
|
29
36
|
*/
|
|
30
|
-
usedMemory = 0;
|
|
31
37
|
txConstructors = {};
|
|
32
|
-
textureKeyCache = new Map();
|
|
33
|
-
textureIdCache = new Map();
|
|
34
|
-
ctxTextureCache = new WeakMap();
|
|
35
|
-
textureRefCountMap = new WeakMap();
|
|
36
38
|
imageWorkerManager = null;
|
|
37
39
|
hasCreateImageBitmap = !!self.createImageBitmap;
|
|
38
40
|
hasWorker = !!self.Worker;
|
|
@@ -44,6 +46,16 @@ export class CoreTextureManager {
|
|
|
44
46
|
* will occur when using the texture manager.
|
|
45
47
|
*/
|
|
46
48
|
renderer;
|
|
49
|
+
/**
|
|
50
|
+
* The current frame time in milliseconds
|
|
51
|
+
*
|
|
52
|
+
* @remarks
|
|
53
|
+
* This is used to populate the `lastRenderableChangeTime` property of
|
|
54
|
+
* {@link Texture} instances when their renderable state changes.
|
|
55
|
+
*
|
|
56
|
+
* Set by stage via `updateFrameTime` method.
|
|
57
|
+
*/
|
|
58
|
+
frameTime = 0;
|
|
47
59
|
constructor(numImageWorkers) {
|
|
48
60
|
// Register default known texture types
|
|
49
61
|
if (this.hasCreateImageBitmap && this.hasWorker && numImageWorkers > 0) {
|
|
@@ -61,147 +73,48 @@ export class CoreTextureManager {
|
|
|
61
73
|
registerTextureType(textureType, textureClass) {
|
|
62
74
|
this.txConstructors[textureType] = textureClass;
|
|
63
75
|
}
|
|
64
|
-
loadTexture(textureType, props
|
|
76
|
+
loadTexture(textureType, props) {
|
|
77
|
+
let texture;
|
|
65
78
|
const TextureClass = this.txConstructors[textureType];
|
|
66
79
|
if (!TextureClass) {
|
|
67
80
|
throw new Error(`Texture type "${textureType}" is not registered`);
|
|
68
81
|
}
|
|
69
|
-
let texture;
|
|
70
|
-
// If an ID is specified, try to get the texture from the ID cache first
|
|
71
|
-
if (options?.id !== undefined && this.textureIdCache.has(options.id)) {
|
|
72
|
-
// console.log('Getting texture by texture desc ID', options.id);
|
|
73
|
-
// eslint-disable-next-line @typescript-eslint/no-non-null-assertion
|
|
74
|
-
texture = this.textureIdCache.get(options.id);
|
|
75
|
-
}
|
|
76
|
-
// If the texture is not found in the ID cache, try to get it from the key cache
|
|
77
82
|
if (!texture) {
|
|
78
|
-
const
|
|
79
|
-
|
|
80
|
-
if (cacheKey && this.textureKeyCache.has(cacheKey)) {
|
|
83
|
+
const cacheKey = TextureClass.makeCacheKey(props);
|
|
84
|
+
if (cacheKey && this.keyCache.has(cacheKey)) {
|
|
81
85
|
// console.log('Getting texture by cache key', cacheKey);
|
|
82
86
|
// eslint-disable-next-line @typescript-eslint/no-non-null-assertion
|
|
83
|
-
texture = this.
|
|
87
|
+
texture = this.keyCache.get(cacheKey);
|
|
84
88
|
}
|
|
85
89
|
else {
|
|
86
90
|
// eslint-disable-next-line @typescript-eslint/no-unsafe-argument, @typescript-eslint/no-explicit-any
|
|
87
91
|
texture = new TextureClass(this, props);
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
this.addTextureIdToCache(descId, cacheKey, texture);
|
|
91
|
-
}
|
|
92
|
-
}
|
|
93
|
-
if (options?.preload) {
|
|
94
|
-
const ctxTx = this.getCtxTexture(texture);
|
|
95
|
-
ctxTx.load();
|
|
96
|
-
}
|
|
97
|
-
return texture;
|
|
98
|
-
}
|
|
99
|
-
/**
|
|
100
|
-
* Add a `Texture` to the texture cache by its texture desc ID and cache key
|
|
101
|
-
*
|
|
102
|
-
* @remarks
|
|
103
|
-
* This is used internally by the `CoreTextureManager` to cache textures
|
|
104
|
-
* when they are created.
|
|
105
|
-
*
|
|
106
|
-
* It handles updating the texture ID cache, texture key cache, and texture
|
|
107
|
-
* reference count map.
|
|
108
|
-
*
|
|
109
|
-
* @param textureDescId
|
|
110
|
-
* @param cacheKey
|
|
111
|
-
* @param texture
|
|
112
|
-
*/
|
|
113
|
-
addTextureIdToCache(textureDescId, cacheKey, texture) {
|
|
114
|
-
const { textureIdCache, textureRefCountMap } = this;
|
|
115
|
-
textureIdCache.set(textureDescId, texture);
|
|
116
|
-
if (textureRefCountMap.has(texture)) {
|
|
117
|
-
// eslint-disable-next-line @typescript-eslint/no-non-null-assertion
|
|
118
|
-
textureRefCountMap.get(texture).count++;
|
|
119
|
-
}
|
|
120
|
-
else {
|
|
121
|
-
textureRefCountMap.set(texture, { cacheKey, count: 1 });
|
|
122
|
-
if (cacheKey) {
|
|
123
|
-
this.textureKeyCache.set(cacheKey, texture);
|
|
124
|
-
}
|
|
125
|
-
}
|
|
126
|
-
}
|
|
127
|
-
/**
|
|
128
|
-
* Remove a `Texture` from the texture cache by its texture desc ID
|
|
129
|
-
*
|
|
130
|
-
* @remarks
|
|
131
|
-
* This is called externally by when we know (at least reasonably well) that
|
|
132
|
-
* the `TextureRef` in the Main API space has been is no longer used. This
|
|
133
|
-
* allows us to remove the `Texture` from the Usage Cache so that it can be
|
|
134
|
-
* garbage collected as well.
|
|
135
|
-
*
|
|
136
|
-
* @param textureDescId
|
|
137
|
-
*/
|
|
138
|
-
removeTextureIdFromCache(textureDescId) {
|
|
139
|
-
const { textureIdCache, textureRefCountMap } = this;
|
|
140
|
-
const texture = textureIdCache.get(textureDescId);
|
|
141
|
-
if (!texture) {
|
|
142
|
-
// Sometimes a texture is removed from the cache before it ever gets
|
|
143
|
-
// added to the cache. This is fine and not an error.
|
|
144
|
-
return;
|
|
145
|
-
}
|
|
146
|
-
textureIdCache.delete(textureDescId);
|
|
147
|
-
if (textureRefCountMap.has(texture)) {
|
|
148
|
-
const refCountObj = textureRefCountMap.get(texture);
|
|
149
|
-
assertTruthy(refCountObj);
|
|
150
|
-
refCountObj.count--;
|
|
151
|
-
if (refCountObj.count === 0) {
|
|
152
|
-
textureRefCountMap.delete(texture);
|
|
153
|
-
// If the texture is not referenced anywhere else, remove it from the key cache
|
|
154
|
-
// as well.
|
|
155
|
-
// This should allow the `Texture` instance to be garbage collected.
|
|
156
|
-
if (refCountObj.cacheKey) {
|
|
157
|
-
this.textureKeyCache.delete(refCountObj.cacheKey);
|
|
92
|
+
if (cacheKey) {
|
|
93
|
+
this.initTextureToCache(texture, cacheKey);
|
|
158
94
|
}
|
|
159
95
|
}
|
|
160
96
|
}
|
|
161
|
-
|
|
162
|
-
this.ctxTextureCache.get(texture)?.free();
|
|
97
|
+
return texture;
|
|
163
98
|
}
|
|
164
|
-
|
|
165
|
-
|
|
166
|
-
|
|
167
|
-
|
|
168
|
-
*/
|
|
169
|
-
getDebugInfo() {
|
|
170
|
-
// const textureSet = new Set<Texture>();
|
|
171
|
-
// for (const texture of this.textureIdCache.values()) {
|
|
172
|
-
// textureSet.add(texture);
|
|
173
|
-
// }
|
|
174
|
-
// for (const texture of this.textureKeyCache.values()) {
|
|
175
|
-
// textureSet.add(texture);
|
|
176
|
-
// }
|
|
177
|
-
// TODO: Output number of bytes used by textures
|
|
178
|
-
return {
|
|
179
|
-
keyCacheSize: this.textureKeyCache.size,
|
|
180
|
-
idCacheSize: this.textureIdCache.size,
|
|
181
|
-
};
|
|
99
|
+
initTextureToCache(texture, cacheKey) {
|
|
100
|
+
const { keyCache, inverseKeyCache } = this;
|
|
101
|
+
keyCache.set(cacheKey, texture);
|
|
102
|
+
inverseKeyCache.set(texture, cacheKey);
|
|
182
103
|
}
|
|
183
104
|
/**
|
|
184
|
-
*
|
|
105
|
+
* Remove a texture from the cache
|
|
185
106
|
*
|
|
186
107
|
* @remarks
|
|
187
|
-
*
|
|
188
|
-
* returned from the cache. Otherwise, a new CoreContextTexture will be created
|
|
189
|
-
* and cached.
|
|
190
|
-
*
|
|
191
|
-
* ContextTextures are stored in a WeakMap, so they will be garbage collected
|
|
192
|
-
* when the Texture source is no longer referenced.
|
|
108
|
+
* Called by Texture Cleanup when a texture is freed.
|
|
193
109
|
*
|
|
194
|
-
* @param
|
|
195
|
-
* @returns
|
|
110
|
+
* @param texture
|
|
196
111
|
*/
|
|
197
|
-
|
|
198
|
-
|
|
199
|
-
|
|
200
|
-
|
|
112
|
+
removeTextureFromCache(texture) {
|
|
113
|
+
const { inverseKeyCache, keyCache } = this;
|
|
114
|
+
const cacheKey = inverseKeyCache.get(texture);
|
|
115
|
+
if (cacheKey) {
|
|
116
|
+
keyCache.delete(cacheKey);
|
|
201
117
|
}
|
|
202
|
-
const texture = this.renderer.createCtxTexture(textureSource);
|
|
203
|
-
this.ctxTextureCache.set(textureSource, texture);
|
|
204
|
-
return texture;
|
|
205
118
|
}
|
|
206
119
|
}
|
|
207
120
|
//# sourceMappingURL=CoreTextureManager.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"CoreTextureManager.js","sourceRoot":"","sources":["../../../src/core/CoreTextureManager.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;GAiBG;AAEH,OAAO,EAAE,
|
|
1
|
+
{"version":3,"file":"CoreTextureManager.js","sourceRoot":"","sources":["../../../src/core/CoreTextureManager.ts"],"names":[],"mappings":"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"}
|
package/dist/src/core/Stage.d.ts
CHANGED
|
@@ -1,19 +1,20 @@
|
|
|
1
1
|
import { AnimationManager } from './animations/AnimationManager.js';
|
|
2
|
-
import { CoreNode } from './CoreNode.js';
|
|
2
|
+
import { CoreNode, type CoreNodeProps } from './CoreNode.js';
|
|
3
3
|
import { CoreTextureManager } from './CoreTextureManager.js';
|
|
4
4
|
import { TrFontManager } from './text-rendering/TrFontManager.js';
|
|
5
|
-
import { CoreShaderManager } from './CoreShaderManager.js';
|
|
5
|
+
import { CoreShaderManager, type ShaderMap } from './CoreShaderManager.js';
|
|
6
6
|
import type { TextRenderer, TextRendererMap, TrProps } from './text-rendering/renderers/TextRenderer.js';
|
|
7
7
|
import { EventEmitter } from '../common/EventEmitter.js';
|
|
8
8
|
import { ContextSpy } from './lib/ContextSpy.js';
|
|
9
9
|
import type { FpsUpdatePayload, FrameTickPayload } from '../common/CommonTypes.js';
|
|
10
|
-
import { TextureMemoryManager } from './TextureMemoryManager.js';
|
|
10
|
+
import { TextureMemoryManager, type TextureMemoryManagerSettings } from './TextureMemoryManager.js';
|
|
11
11
|
import type { CoreRenderer } from './renderers/CoreRenderer.js';
|
|
12
|
+
import type { BaseShaderController } from '../main-api/ShaderController.js';
|
|
13
|
+
import { CoreTextNode, type CoreTextNodeProps } from './CoreTextNode.js';
|
|
12
14
|
export interface StageOptions {
|
|
13
|
-
rootId: number;
|
|
14
15
|
appWidth: number;
|
|
15
16
|
appHeight: number;
|
|
16
|
-
|
|
17
|
+
textureMemory: TextureMemoryManagerSettings;
|
|
17
18
|
boundsMargin: number | [number, number, number, number];
|
|
18
19
|
deviceLogicalPixelRatio: number;
|
|
19
20
|
devicePhysicalPixelRatio: number;
|
|
@@ -23,13 +24,11 @@ export interface StageOptions {
|
|
|
23
24
|
enableContextSpy: boolean;
|
|
24
25
|
numImageWorkers: number;
|
|
25
26
|
renderMode: 'webgl' | 'canvas';
|
|
26
|
-
|
|
27
|
-
monitorTextureCache?: boolean;
|
|
28
|
-
};
|
|
27
|
+
eventBus: EventEmitter;
|
|
29
28
|
}
|
|
30
29
|
export type StageFpsUpdateHandler = (stage: Stage, fpsData: FpsUpdatePayload) => void;
|
|
31
30
|
export type StageFrameTickHandler = (stage: Stage, frameTickData: FrameTickPayload) => void;
|
|
32
|
-
export declare class Stage
|
|
31
|
+
export declare class Stage {
|
|
33
32
|
readonly options: StageOptions;
|
|
34
33
|
readonly animationManager: AnimationManager;
|
|
35
34
|
readonly txManager: CoreTextureManager;
|
|
@@ -40,17 +39,29 @@ export declare class Stage extends EventEmitter {
|
|
|
40
39
|
readonly renderer: CoreRenderer;
|
|
41
40
|
readonly root: CoreNode;
|
|
42
41
|
readonly boundsMargin: [number, number, number, number];
|
|
42
|
+
readonly defShaderCtr: BaseShaderController;
|
|
43
|
+
/**
|
|
44
|
+
* Renderer Event Bus for the Stage to emit events onto
|
|
45
|
+
*
|
|
46
|
+
* @remarks
|
|
47
|
+
* In reality this is just the RendererMain instance, which is an EventEmitter.
|
|
48
|
+
* this allows us to directly emit events from the Stage to RendererMain
|
|
49
|
+
* without having to set up forwarding handlers.
|
|
50
|
+
*/
|
|
51
|
+
readonly eventBus: EventEmitter;
|
|
43
52
|
deltaTime: number;
|
|
44
53
|
lastFrameTime: number;
|
|
45
54
|
currentFrameTime: number;
|
|
46
55
|
private fpsNumFrames;
|
|
47
56
|
private fpsElapsedTime;
|
|
48
57
|
private renderRequested;
|
|
58
|
+
private frameEventQueue;
|
|
49
59
|
contextSpy: ContextSpy | null;
|
|
50
60
|
/**
|
|
51
61
|
* Stage constructor
|
|
52
62
|
*/
|
|
53
63
|
constructor(options: StageOptions);
|
|
64
|
+
updateFrameTime(): void;
|
|
54
65
|
/**
|
|
55
66
|
* Update animations
|
|
56
67
|
*/
|
|
@@ -63,6 +74,31 @@ export declare class Stage extends EventEmitter {
|
|
|
63
74
|
* Start a new frame draw
|
|
64
75
|
*/
|
|
65
76
|
drawFrame(): void;
|
|
77
|
+
/**
|
|
78
|
+
* Queue an event to be emitted after the current/next frame is rendered
|
|
79
|
+
*
|
|
80
|
+
* @remarks
|
|
81
|
+
* When we are operating in the context of the render loop, we may want to
|
|
82
|
+
* emit events that are related to the current frame. However, we generally do
|
|
83
|
+
* NOT want to emit events directly in the middle of the render loop, since
|
|
84
|
+
* this could enable event handlers to modify the scene graph and cause
|
|
85
|
+
* unexpected behavior. Instead, we queue up events to be emitted and then
|
|
86
|
+
* flush the queue after the frame has been rendered.
|
|
87
|
+
*
|
|
88
|
+
* @param name
|
|
89
|
+
* @param data
|
|
90
|
+
*/
|
|
91
|
+
queueFrameEvent(name: string, data: unknown): void;
|
|
92
|
+
/**
|
|
93
|
+
* Emit all queued frame events
|
|
94
|
+
*
|
|
95
|
+
* @remarks
|
|
96
|
+
* This method should be called after the frame has been rendered to emit
|
|
97
|
+
* all events that were queued during the frame.
|
|
98
|
+
*
|
|
99
|
+
* See {@link queueFrameEvent} for more information.
|
|
100
|
+
*/
|
|
101
|
+
flushFrameEvents(): void;
|
|
66
102
|
calculateFps(): void;
|
|
67
103
|
addQuads(node: CoreNode): void;
|
|
68
104
|
/**
|
|
@@ -80,4 +116,26 @@ export declare class Stage extends EventEmitter {
|
|
|
80
116
|
* @returns
|
|
81
117
|
*/
|
|
82
118
|
resolveTextRenderer(trProps: TrProps, textRendererOverride?: keyof TextRendererMap | null): TextRenderer;
|
|
119
|
+
/**
|
|
120
|
+
* Create a shader controller instance
|
|
121
|
+
*
|
|
122
|
+
* @param type
|
|
123
|
+
* @param props
|
|
124
|
+
* @returns
|
|
125
|
+
*/
|
|
126
|
+
createShaderCtr(type: keyof ShaderMap, props: Record<string, unknown>): BaseShaderController;
|
|
127
|
+
createNode(props: Partial<CoreNodeProps>): CoreNode;
|
|
128
|
+
createTextNode(props: Partial<CoreTextNodeProps>): CoreTextNode;
|
|
129
|
+
/**
|
|
130
|
+
* Resolves the default property values for a Node
|
|
131
|
+
*
|
|
132
|
+
* @remarks
|
|
133
|
+
* This method is used internally by the RendererMain to resolve the default
|
|
134
|
+
* property values for a Node. It is exposed publicly so that it can be used
|
|
135
|
+
* by Core Driver implementations.
|
|
136
|
+
*
|
|
137
|
+
* @param props
|
|
138
|
+
* @returns
|
|
139
|
+
*/
|
|
140
|
+
protected resolveNodeDefaults(props: Partial<CoreNodeProps>): CoreNodeProps;
|
|
83
141
|
}
|
package/dist/src/core/Stage.js
CHANGED
|
@@ -28,11 +28,13 @@ import { SdfTextRenderer } from './text-rendering/renderers/SdfTextRenderer/SdfT
|
|
|
28
28
|
import { CanvasTextRenderer } from './text-rendering/renderers/CanvasTextRenderer.js';
|
|
29
29
|
import { EventEmitter } from '../common/EventEmitter.js';
|
|
30
30
|
import { ContextSpy } from './lib/ContextSpy.js';
|
|
31
|
-
import { TextureMemoryManager } from './TextureMemoryManager.js';
|
|
31
|
+
import { TextureMemoryManager, } from './TextureMemoryManager.js';
|
|
32
32
|
import { CanvasCoreRenderer } from './renderers/canvas/CanvasCoreRenderer.js';
|
|
33
|
+
import { CoreTextNode } from './CoreTextNode.js';
|
|
34
|
+
import { santizeCustomDataMap } from '../main-api/utils.js';
|
|
33
35
|
const bufferMemory = 2e6;
|
|
34
36
|
const autoStart = true;
|
|
35
|
-
export class Stage
|
|
37
|
+
export class Stage {
|
|
36
38
|
options;
|
|
37
39
|
/// Module Instances
|
|
38
40
|
animationManager;
|
|
@@ -44,6 +46,16 @@ export class Stage extends EventEmitter {
|
|
|
44
46
|
renderer;
|
|
45
47
|
root;
|
|
46
48
|
boundsMargin;
|
|
49
|
+
defShaderCtr;
|
|
50
|
+
/**
|
|
51
|
+
* Renderer Event Bus for the Stage to emit events onto
|
|
52
|
+
*
|
|
53
|
+
* @remarks
|
|
54
|
+
* In reality this is just the RendererMain instance, which is an EventEmitter.
|
|
55
|
+
* this allows us to directly emit events from the Stage to RendererMain
|
|
56
|
+
* without having to set up forwarding handlers.
|
|
57
|
+
*/
|
|
58
|
+
eventBus;
|
|
47
59
|
/// State
|
|
48
60
|
deltaTime = 0;
|
|
49
61
|
lastFrameTime = 0;
|
|
@@ -51,17 +63,18 @@ export class Stage extends EventEmitter {
|
|
|
51
63
|
fpsNumFrames = 0;
|
|
52
64
|
fpsElapsedTime = 0;
|
|
53
65
|
renderRequested = false;
|
|
66
|
+
frameEventQueue = [];
|
|
54
67
|
/// Debug data
|
|
55
68
|
contextSpy = null;
|
|
56
69
|
/**
|
|
57
70
|
* Stage constructor
|
|
58
71
|
*/
|
|
59
72
|
constructor(options) {
|
|
60
|
-
super();
|
|
61
73
|
this.options = options;
|
|
62
|
-
const { canvas, clearColor,
|
|
74
|
+
const { canvas, clearColor, appWidth, appHeight, boundsMargin, enableContextSpy, numImageWorkers, textureMemory, renderMode, } = options;
|
|
75
|
+
this.eventBus = options.eventBus;
|
|
63
76
|
this.txManager = new CoreTextureManager(numImageWorkers);
|
|
64
|
-
this.txMemManager = new TextureMemoryManager(
|
|
77
|
+
this.txMemManager = new TextureMemoryManager(this, textureMemory);
|
|
65
78
|
this.shManager = new CoreShaderManager();
|
|
66
79
|
this.animationManager = new AnimationManager();
|
|
67
80
|
this.contextSpy = enableContextSpy ? new ContextSpy() : null;
|
|
@@ -72,14 +85,6 @@ export class Stage extends EventEmitter {
|
|
|
72
85
|
: [boundsMargin, boundsMargin, boundsMargin, boundsMargin];
|
|
73
86
|
}
|
|
74
87
|
this.boundsMargin = bm;
|
|
75
|
-
if (debug?.monitorTextureCache) {
|
|
76
|
-
setInterval(() => {
|
|
77
|
-
assertTruthy(this.txManager);
|
|
78
|
-
const debugInfo = this.txManager.getDebugInfo();
|
|
79
|
-
console.log('Texture ID Cache Size: ', debugInfo.idCacheSize);
|
|
80
|
-
console.log('Texture Key Cache Size: ', debugInfo.keyCacheSize);
|
|
81
|
-
}, 1000);
|
|
82
|
-
}
|
|
83
88
|
const rendererOptions = {
|
|
84
89
|
stage: this,
|
|
85
90
|
canvas,
|
|
@@ -97,6 +102,7 @@ export class Stage extends EventEmitter {
|
|
|
97
102
|
else {
|
|
98
103
|
this.renderer = new WebGlCoreRenderer(rendererOptions);
|
|
99
104
|
}
|
|
105
|
+
this.defShaderCtr = this.renderer.getDefShaderCtr();
|
|
100
106
|
setPremultiplyMode(renderMode);
|
|
101
107
|
// Must do this after renderer is created
|
|
102
108
|
this.txManager.renderer = this.renderer;
|
|
@@ -112,7 +118,6 @@ export class Stage extends EventEmitter {
|
|
|
112
118
|
this.fontManager = new TrFontManager(this.textRenderers);
|
|
113
119
|
// create root node
|
|
114
120
|
const rootNode = new CoreNode(this, {
|
|
115
|
-
id: rootId,
|
|
116
121
|
x: 0,
|
|
117
122
|
y: 0,
|
|
118
123
|
width: appWidth,
|
|
@@ -142,10 +147,11 @@ export class Stage extends EventEmitter {
|
|
|
142
147
|
rotation: 0,
|
|
143
148
|
parent: null,
|
|
144
149
|
texture: null,
|
|
145
|
-
textureOptions:
|
|
146
|
-
shader:
|
|
147
|
-
shaderProps: null,
|
|
150
|
+
textureOptions: {},
|
|
151
|
+
shader: this.defShaderCtr,
|
|
148
152
|
rtt: false,
|
|
153
|
+
src: null,
|
|
154
|
+
scale: 1,
|
|
149
155
|
});
|
|
150
156
|
this.root = rootNode;
|
|
151
157
|
// execute platform start loop
|
|
@@ -153,6 +159,22 @@ export class Stage extends EventEmitter {
|
|
|
153
159
|
startLoop(this);
|
|
154
160
|
}
|
|
155
161
|
}
|
|
162
|
+
updateFrameTime() {
|
|
163
|
+
const newFrameTime = getTimeStamp();
|
|
164
|
+
this.lastFrameTime = this.currentFrameTime;
|
|
165
|
+
this.currentFrameTime = newFrameTime;
|
|
166
|
+
this.deltaTime = !this.lastFrameTime
|
|
167
|
+
? 100 / 6
|
|
168
|
+
: newFrameTime - this.lastFrameTime;
|
|
169
|
+
this.txManager.frameTime = newFrameTime;
|
|
170
|
+
this.txMemManager.frameTime = newFrameTime;
|
|
171
|
+
// This event is emitted at the beginning of the frame (before any updates
|
|
172
|
+
// or rendering), so no need to to use `stage.queueFrameEvent` here.
|
|
173
|
+
this.eventBus.emit('frameTick', {
|
|
174
|
+
time: this.currentFrameTime,
|
|
175
|
+
delta: this.deltaTime,
|
|
176
|
+
});
|
|
177
|
+
}
|
|
156
178
|
/**
|
|
157
179
|
* Update animations
|
|
158
180
|
*/
|
|
@@ -161,15 +183,6 @@ export class Stage extends EventEmitter {
|
|
|
161
183
|
if (!this.root) {
|
|
162
184
|
return;
|
|
163
185
|
}
|
|
164
|
-
this.lastFrameTime = this.currentFrameTime;
|
|
165
|
-
this.currentFrameTime = getTimeStamp();
|
|
166
|
-
this.deltaTime = !this.lastFrameTime
|
|
167
|
-
? 100 / 6
|
|
168
|
-
: this.currentFrameTime - this.lastFrameTime;
|
|
169
|
-
this.emit('frameTick', {
|
|
170
|
-
time: this.currentFrameTime,
|
|
171
|
-
delta: this.deltaTime,
|
|
172
|
-
});
|
|
173
186
|
// step animation
|
|
174
187
|
animationManager.update(this.deltaTime);
|
|
175
188
|
}
|
|
@@ -191,9 +204,9 @@ export class Stage extends EventEmitter {
|
|
|
191
204
|
}
|
|
192
205
|
// Reset render operations and clear the canvas
|
|
193
206
|
renderer.reset();
|
|
194
|
-
// Check if we need to
|
|
195
|
-
if (
|
|
196
|
-
|
|
207
|
+
// Check if we need to cleanup textures
|
|
208
|
+
if (this.txMemManager.criticalCleanupRequested) {
|
|
209
|
+
this.txMemManager.cleanup();
|
|
197
210
|
}
|
|
198
211
|
// If we have RTT nodes draw them first
|
|
199
212
|
// So we can use them as textures in the main scene
|
|
@@ -210,6 +223,38 @@ export class Stage extends EventEmitter {
|
|
|
210
223
|
this.renderRequested = false;
|
|
211
224
|
}
|
|
212
225
|
}
|
|
226
|
+
/**
|
|
227
|
+
* Queue an event to be emitted after the current/next frame is rendered
|
|
228
|
+
*
|
|
229
|
+
* @remarks
|
|
230
|
+
* When we are operating in the context of the render loop, we may want to
|
|
231
|
+
* emit events that are related to the current frame. However, we generally do
|
|
232
|
+
* NOT want to emit events directly in the middle of the render loop, since
|
|
233
|
+
* this could enable event handlers to modify the scene graph and cause
|
|
234
|
+
* unexpected behavior. Instead, we queue up events to be emitted and then
|
|
235
|
+
* flush the queue after the frame has been rendered.
|
|
236
|
+
*
|
|
237
|
+
* @param name
|
|
238
|
+
* @param data
|
|
239
|
+
*/
|
|
240
|
+
queueFrameEvent(name, data) {
|
|
241
|
+
this.frameEventQueue.push([name, data]);
|
|
242
|
+
}
|
|
243
|
+
/**
|
|
244
|
+
* Emit all queued frame events
|
|
245
|
+
*
|
|
246
|
+
* @remarks
|
|
247
|
+
* This method should be called after the frame has been rendered to emit
|
|
248
|
+
* all events that were queued during the frame.
|
|
249
|
+
*
|
|
250
|
+
* See {@link queueFrameEvent} for more information.
|
|
251
|
+
*/
|
|
252
|
+
flushFrameEvents() {
|
|
253
|
+
for (const [name, data] of this.frameEventQueue) {
|
|
254
|
+
this.eventBus.emit(name, data);
|
|
255
|
+
}
|
|
256
|
+
this.frameEventQueue = [];
|
|
257
|
+
}
|
|
213
258
|
calculateFps() {
|
|
214
259
|
// If there's an FPS update interval, emit the FPS update event
|
|
215
260
|
// when the specified interval has elapsed.
|
|
@@ -221,7 +266,7 @@ export class Stage extends EventEmitter {
|
|
|
221
266
|
const fps = Math.round((this.fpsNumFrames * 1000) / this.fpsElapsedTime);
|
|
222
267
|
this.fpsNumFrames = 0;
|
|
223
268
|
this.fpsElapsedTime = 0;
|
|
224
|
-
this.
|
|
269
|
+
this.queueFrameEvent('fpsUpdate', {
|
|
225
270
|
fps,
|
|
226
271
|
contextSpyData: this.contextSpy?.getData() ?? null,
|
|
227
272
|
});
|
|
@@ -305,5 +350,104 @@ export class Stage extends EventEmitter {
|
|
|
305
350
|
// the covariant state argument in the setter method map
|
|
306
351
|
return resolvedTextRenderer;
|
|
307
352
|
}
|
|
353
|
+
/**
|
|
354
|
+
* Create a shader controller instance
|
|
355
|
+
*
|
|
356
|
+
* @param type
|
|
357
|
+
* @param props
|
|
358
|
+
* @returns
|
|
359
|
+
*/
|
|
360
|
+
createShaderCtr(type, props) {
|
|
361
|
+
return this.shManager.loadShader(type, props);
|
|
362
|
+
}
|
|
363
|
+
createNode(props) {
|
|
364
|
+
const resolvedProps = this.resolveNodeDefaults(props);
|
|
365
|
+
return new CoreNode(this, resolvedProps);
|
|
366
|
+
}
|
|
367
|
+
createTextNode(props) {
|
|
368
|
+
const fontSize = props.fontSize ?? 16;
|
|
369
|
+
const resolvedProps = {
|
|
370
|
+
...this.resolveNodeDefaults(props),
|
|
371
|
+
text: props.text ?? '',
|
|
372
|
+
textRendererOverride: props.textRendererOverride ?? null,
|
|
373
|
+
fontSize,
|
|
374
|
+
fontFamily: props.fontFamily ?? 'sans-serif',
|
|
375
|
+
fontStyle: props.fontStyle ?? 'normal',
|
|
376
|
+
fontWeight: props.fontWeight ?? 'normal',
|
|
377
|
+
fontStretch: props.fontStretch ?? 'normal',
|
|
378
|
+
textAlign: props.textAlign ?? 'left',
|
|
379
|
+
contain: props.contain ?? 'none',
|
|
380
|
+
scrollable: props.scrollable ?? false,
|
|
381
|
+
scrollY: props.scrollY ?? 0,
|
|
382
|
+
offsetY: props.offsetY ?? 0,
|
|
383
|
+
letterSpacing: props.letterSpacing ?? 0,
|
|
384
|
+
lineHeight: props.lineHeight,
|
|
385
|
+
maxLines: props.maxLines ?? 0,
|
|
386
|
+
textBaseline: props.textBaseline ?? 'alphabetic',
|
|
387
|
+
verticalAlign: props.verticalAlign ?? 'middle',
|
|
388
|
+
overflowSuffix: props.overflowSuffix ?? '...',
|
|
389
|
+
debug: props.debug ?? {},
|
|
390
|
+
shaderProps: null,
|
|
391
|
+
};
|
|
392
|
+
return new CoreTextNode(this, resolvedProps);
|
|
393
|
+
}
|
|
394
|
+
/**
|
|
395
|
+
* Resolves the default property values for a Node
|
|
396
|
+
*
|
|
397
|
+
* @remarks
|
|
398
|
+
* This method is used internally by the RendererMain to resolve the default
|
|
399
|
+
* property values for a Node. It is exposed publicly so that it can be used
|
|
400
|
+
* by Core Driver implementations.
|
|
401
|
+
*
|
|
402
|
+
* @param props
|
|
403
|
+
* @returns
|
|
404
|
+
*/
|
|
405
|
+
resolveNodeDefaults(props) {
|
|
406
|
+
const color = props.color ?? 0xffffffff;
|
|
407
|
+
const colorTl = props.colorTl ?? props.colorTop ?? props.colorLeft ?? color;
|
|
408
|
+
const colorTr = props.colorTr ?? props.colorTop ?? props.colorRight ?? color;
|
|
409
|
+
const colorBl = props.colorBl ?? props.colorBottom ?? props.colorLeft ?? color;
|
|
410
|
+
const colorBr = props.colorBr ?? props.colorBottom ?? props.colorRight ?? color;
|
|
411
|
+
const data = santizeCustomDataMap(props.data ?? {});
|
|
412
|
+
return {
|
|
413
|
+
x: props.x ?? 0,
|
|
414
|
+
y: props.y ?? 0,
|
|
415
|
+
width: props.width ?? 0,
|
|
416
|
+
height: props.height ?? 0,
|
|
417
|
+
alpha: props.alpha ?? 1,
|
|
418
|
+
autosize: props.autosize ?? false,
|
|
419
|
+
clipping: props.clipping ?? false,
|
|
420
|
+
color,
|
|
421
|
+
colorTop: props.colorTop ?? color,
|
|
422
|
+
colorBottom: props.colorBottom ?? color,
|
|
423
|
+
colorLeft: props.colorLeft ?? color,
|
|
424
|
+
colorRight: props.colorRight ?? color,
|
|
425
|
+
colorBl,
|
|
426
|
+
colorBr,
|
|
427
|
+
colorTl,
|
|
428
|
+
colorTr,
|
|
429
|
+
zIndex: props.zIndex ?? 0,
|
|
430
|
+
zIndexLocked: props.zIndexLocked ?? 0,
|
|
431
|
+
parent: props.parent ?? null,
|
|
432
|
+
texture: props.texture ?? null,
|
|
433
|
+
textureOptions: props.textureOptions ?? {},
|
|
434
|
+
shader: props.shader ?? this.defShaderCtr,
|
|
435
|
+
// Since setting the `src` will trigger a texture load, we need to set it after
|
|
436
|
+
// we set the texture. Otherwise, problems happen.
|
|
437
|
+
src: props.src ?? null,
|
|
438
|
+
scale: props.scale ?? null,
|
|
439
|
+
scaleX: props.scaleX ?? props.scale ?? 1,
|
|
440
|
+
scaleY: props.scaleY ?? props.scale ?? 1,
|
|
441
|
+
mount: props.mount ?? 0,
|
|
442
|
+
mountX: props.mountX ?? props.mount ?? 0,
|
|
443
|
+
mountY: props.mountY ?? props.mount ?? 0,
|
|
444
|
+
pivot: props.pivot ?? 0.5,
|
|
445
|
+
pivotX: props.pivotX ?? props.pivot ?? 0.5,
|
|
446
|
+
pivotY: props.pivotY ?? props.pivot ?? 0.5,
|
|
447
|
+
rotation: props.rotation ?? 0,
|
|
448
|
+
rtt: props.rtt ?? false,
|
|
449
|
+
data: data,
|
|
450
|
+
};
|
|
451
|
+
}
|
|
308
452
|
}
|
|
309
453
|
//# sourceMappingURL=Stage.js.map
|