@lightningjs/renderer 0.9.4 → 1.0.0-rc.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +0 -82
- package/dist/exports/index.d.ts +40 -3
- package/dist/exports/index.js +35 -3
- package/dist/exports/index.js.map +1 -1
- package/dist/src/core/CoreNode.d.ts +462 -46
- package/dist/src/core/CoreNode.js +171 -103
- 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 +136 -44
- 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 +24 -8
- 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 +11 -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 +3 -9
- package/dist/src/main-api/DynamicShaderController.js +18 -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 +27 -21
- package/dist/src/main-api/Renderer.js +38 -107
- 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 +60 -3
- package/package.json +8 -7
- package/src/core/CoreNode.test.ts +93 -0
- package/src/core/CoreNode.ts +675 -187
- 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 +193 -68
- 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 +114 -55
- 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 +20 -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 +97 -0
- package/src/main-api/INode.ts +56 -479
- package/src/main-api/Inspector.ts +37 -39
- package/src/main-api/Renderer.ts +543 -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
|
@@ -1,15 +1,13 @@
|
|
|
1
|
-
import
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
} from './INode.js';
|
|
8
|
-
import type { ICoreDriver } from './ICoreDriver.js';
|
|
9
|
-
import { type RendererMainSettings } from './RendererMain.js';
|
|
1
|
+
import {
|
|
2
|
+
CoreNode,
|
|
3
|
+
type CoreNodeAnimateProps,
|
|
4
|
+
type CoreNodeProps,
|
|
5
|
+
} from '../core/CoreNode.js';
|
|
6
|
+
import { type RendererMainSettings } from './Renderer.js';
|
|
10
7
|
import type { AnimationSettings } from '../core/animations/CoreAnimation.js';
|
|
11
8
|
import type { IAnimationController } from '../common/IAnimationController.js';
|
|
12
9
|
import { isProductionEnvironment } from '../utils.js';
|
|
10
|
+
import type { CoreTextNode, CoreTextNodeProps } from '../core/CoreTextNode.js';
|
|
13
11
|
|
|
14
12
|
/**
|
|
15
13
|
* Inspector
|
|
@@ -219,31 +217,28 @@ export class Inspector {
|
|
|
219
217
|
}
|
|
220
218
|
|
|
221
219
|
createDiv(
|
|
222
|
-
|
|
223
|
-
properties:
|
|
220
|
+
id: number,
|
|
221
|
+
properties: CoreNodeProps | CoreTextNodeProps,
|
|
224
222
|
): HTMLElement {
|
|
225
223
|
const div = document.createElement('div');
|
|
226
224
|
div.style.position = 'absolute';
|
|
227
|
-
div.id =
|
|
225
|
+
div.id = id.toString();
|
|
228
226
|
|
|
229
227
|
// set initial properties
|
|
230
228
|
for (const key in properties) {
|
|
231
229
|
this.updateNodeProperty(
|
|
232
230
|
div,
|
|
233
231
|
// really typescript? really?
|
|
234
|
-
key as keyof
|
|
235
|
-
|
|
236
|
-
key as keyof (INodeWritableProps & ITextNodeWritableProps)
|
|
237
|
-
],
|
|
232
|
+
key as keyof CoreNodeProps,
|
|
233
|
+
properties[key as keyof CoreNodeProps],
|
|
238
234
|
);
|
|
239
235
|
}
|
|
240
236
|
|
|
241
237
|
return div;
|
|
242
238
|
}
|
|
243
239
|
|
|
244
|
-
createNode(
|
|
245
|
-
const
|
|
246
|
-
const div = this.createDiv(node, properties);
|
|
240
|
+
createNode(node: CoreNode): CoreNode {
|
|
241
|
+
const div = this.createDiv(node.id, node.props);
|
|
247
242
|
|
|
248
243
|
// eslint-disable-next-line @typescript-eslint/no-unsafe-member-access, @typescript-eslint/no-explicit-any
|
|
249
244
|
(div as any).node = node;
|
|
@@ -254,40 +249,39 @@ export class Inspector {
|
|
|
254
249
|
return this.createProxy(node, div);
|
|
255
250
|
}
|
|
256
251
|
|
|
257
|
-
createTextNode(
|
|
258
|
-
|
|
259
|
-
properties: ITextNodeWritableProps,
|
|
260
|
-
): ITextNode {
|
|
261
|
-
const node = driver.createTextNode(properties);
|
|
262
|
-
const div = this.createDiv(node, properties);
|
|
252
|
+
createTextNode(node: CoreNode): CoreTextNode {
|
|
253
|
+
const div = this.createDiv(node.id, node.props);
|
|
263
254
|
// eslint-disable-next-line @typescript-eslint/no-unsafe-member-access, @typescript-eslint/no-explicit-any
|
|
264
255
|
(div as any).node = node;
|
|
265
256
|
|
|
266
257
|
// eslint-disable-next-line @typescript-eslint/no-unsafe-member-access, @typescript-eslint/no-explicit-any
|
|
267
258
|
(node as any).div = div;
|
|
268
|
-
return this.createProxy(node, div) as
|
|
259
|
+
return this.createProxy(node, div) as CoreTextNode;
|
|
269
260
|
}
|
|
270
261
|
|
|
271
|
-
createProxy(
|
|
262
|
+
createProxy(
|
|
263
|
+
node: CoreNode | CoreTextNode,
|
|
264
|
+
div: HTMLElement,
|
|
265
|
+
): CoreNode | CoreTextNode {
|
|
272
266
|
return new Proxy(node, {
|
|
273
|
-
set: (target, property: keyof
|
|
267
|
+
set: (target, property: keyof CoreNodeProps, value) => {
|
|
274
268
|
this.updateNodeProperty(div, property, value);
|
|
275
269
|
return Reflect.set(target, property, value);
|
|
276
270
|
},
|
|
277
|
-
get: (target, property: keyof
|
|
271
|
+
get: (target, property: keyof CoreNode, receiver: any): any => {
|
|
278
272
|
if (property === 'destroy') {
|
|
279
|
-
this.destroyNode(target);
|
|
273
|
+
this.destroyNode(target.id);
|
|
280
274
|
}
|
|
281
275
|
|
|
282
276
|
if (property === 'animate') {
|
|
283
|
-
return (props:
|
|
277
|
+
return (props: CoreNodeAnimateProps, settings: AnimationSettings) => {
|
|
284
278
|
const anim = target.animate(props, settings);
|
|
285
279
|
|
|
286
280
|
// Trap the animate start function so we can update the inspector accordingly
|
|
287
281
|
return new Proxy(anim, {
|
|
288
282
|
get: (target, property: keyof IAnimationController, receiver) => {
|
|
289
283
|
if (property === 'start') {
|
|
290
|
-
this.animateNode(div,
|
|
284
|
+
this.animateNode(div, props, settings);
|
|
291
285
|
}
|
|
292
286
|
|
|
293
287
|
return Reflect.get(target, property, receiver);
|
|
@@ -301,14 +295,14 @@ export class Inspector {
|
|
|
301
295
|
});
|
|
302
296
|
}
|
|
303
297
|
|
|
304
|
-
destroyNode(
|
|
305
|
-
const div = document.getElementById(
|
|
298
|
+
destroyNode(id: number) {
|
|
299
|
+
const div = document.getElementById(id.toString());
|
|
306
300
|
div?.remove();
|
|
307
301
|
}
|
|
308
302
|
|
|
309
303
|
updateNodeProperty(
|
|
310
304
|
div: HTMLElement,
|
|
311
|
-
property: keyof
|
|
305
|
+
property: keyof CoreNodeProps | keyof CoreTextNodeProps,
|
|
312
306
|
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
313
307
|
value: any,
|
|
314
308
|
) {
|
|
@@ -320,7 +314,7 @@ export class Inspector {
|
|
|
320
314
|
* Special case for parent property
|
|
321
315
|
*/
|
|
322
316
|
if (property === 'parent') {
|
|
323
|
-
const parentId: number =
|
|
317
|
+
const parentId: number = value.id;
|
|
324
318
|
|
|
325
319
|
// only way to detect if the parent is the root node
|
|
326
320
|
// if you are reading this and have a better way, please let me know
|
|
@@ -385,7 +379,12 @@ export class Inspector {
|
|
|
385
379
|
|
|
386
380
|
// DOM properties
|
|
387
381
|
if (domPropertyMap[property]) {
|
|
388
|
-
|
|
382
|
+
const domProperty = domPropertyMap[property];
|
|
383
|
+
if (!domProperty) {
|
|
384
|
+
return;
|
|
385
|
+
}
|
|
386
|
+
|
|
387
|
+
div.setAttribute(String(domProperty), String(value));
|
|
389
388
|
return;
|
|
390
389
|
}
|
|
391
390
|
|
|
@@ -407,8 +406,7 @@ export class Inspector {
|
|
|
407
406
|
// simple animation handler
|
|
408
407
|
animateNode(
|
|
409
408
|
div: HTMLElement,
|
|
410
|
-
|
|
411
|
-
props: INodeAnimatableProps,
|
|
409
|
+
props: CoreNodeAnimateProps,
|
|
412
410
|
settings: AnimationSettings,
|
|
413
411
|
) {
|
|
414
412
|
const {
|
|
@@ -0,0 +1,543 @@
|
|
|
1
|
+
/*
|
|
2
|
+
* If not stated otherwise in this file or this component's LICENSE file the
|
|
3
|
+
* following copyright and licenses apply:
|
|
4
|
+
*
|
|
5
|
+
* Copyright 2023 Comcast Cable Communications Management, LLC.
|
|
6
|
+
*
|
|
7
|
+
* Licensed under the Apache License, Version 2.0 (the License);
|
|
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
|
+
|
|
20
|
+
/* eslint-disable @typescript-eslint/no-unused-vars */
|
|
21
|
+
import type { EffectMap, ShaderMap } from '../core/CoreShaderManager.js';
|
|
22
|
+
import type {
|
|
23
|
+
ExtractProps,
|
|
24
|
+
TextureTypeMap,
|
|
25
|
+
TextureMap,
|
|
26
|
+
} from '../core/CoreTextureManager.js';
|
|
27
|
+
import { EventEmitter } from '../common/EventEmitter.js';
|
|
28
|
+
import { Inspector } from './Inspector.js';
|
|
29
|
+
import { assertTruthy, isProductionEnvironment } from '../utils.js';
|
|
30
|
+
import { Stage } from '../core/Stage.js';
|
|
31
|
+
import { CoreNode, type CoreNodeProps } from '../core/CoreNode.js';
|
|
32
|
+
import { CoreTextNode, type CoreTextNodeProps } from '../core/CoreTextNode.js';
|
|
33
|
+
import type {
|
|
34
|
+
BaseShaderController,
|
|
35
|
+
ShaderController,
|
|
36
|
+
} from './ShaderController.js';
|
|
37
|
+
import type { INode, INodeProps, ITextNode, ITextNodeProps } from './INode.js';
|
|
38
|
+
import type {
|
|
39
|
+
DynamicEffects,
|
|
40
|
+
DynamicShaderController,
|
|
41
|
+
} from './DynamicShaderController.js';
|
|
42
|
+
import type {
|
|
43
|
+
EffectDesc,
|
|
44
|
+
EffectDescUnion,
|
|
45
|
+
} from '../core/renderers/webgl/shaders/DynamicShader.js';
|
|
46
|
+
import type { TextureMemoryManagerSettings } from '../core/TextureMemoryManager.js';
|
|
47
|
+
|
|
48
|
+
/**
|
|
49
|
+
* An immutable reference to a specific Shader type
|
|
50
|
+
*
|
|
51
|
+
* @remarks
|
|
52
|
+
* See {@link ShaderRef} for more details.
|
|
53
|
+
*/
|
|
54
|
+
export interface SpecificShaderRef<ShType extends keyof ShaderMap> {
|
|
55
|
+
readonly descType: 'shader';
|
|
56
|
+
readonly shType: ShType;
|
|
57
|
+
readonly props: ExtractProps<ShaderMap[ShType]>;
|
|
58
|
+
}
|
|
59
|
+
|
|
60
|
+
type MapShaderRefs<ShType extends keyof ShaderMap> =
|
|
61
|
+
ShType extends keyof ShaderMap ? SpecificShaderRef<ShType> : never;
|
|
62
|
+
|
|
63
|
+
/**
|
|
64
|
+
* An immutable reference to a Shader
|
|
65
|
+
*
|
|
66
|
+
* @remarks
|
|
67
|
+
* This structure should only be created by the RendererMain's `createShader`
|
|
68
|
+
* method. The structure is immutable and should not be modified once created.
|
|
69
|
+
*
|
|
70
|
+
* A `ShaderRef` exists in the Main API Space and is used to point to an actual
|
|
71
|
+
* `Shader` instance in the Core API Space. The `ShaderRef` is used to
|
|
72
|
+
* communicate with the Core API Space to create, load, and destroy the
|
|
73
|
+
* `Shader` instance.
|
|
74
|
+
*
|
|
75
|
+
* This type is technically a discriminated union of all possible shader types.
|
|
76
|
+
* If you'd like to represent a specific shader type, you can use the
|
|
77
|
+
* `SpecificShaderRef` generic type.
|
|
78
|
+
*/
|
|
79
|
+
export type ShaderRef = MapShaderRefs<keyof ShaderMap>;
|
|
80
|
+
|
|
81
|
+
/**
|
|
82
|
+
* Configuration settings for {@link RendererMain}
|
|
83
|
+
*/
|
|
84
|
+
export interface RendererMainSettings {
|
|
85
|
+
/**
|
|
86
|
+
* Authored logical pixel width of the application
|
|
87
|
+
*
|
|
88
|
+
* @defaultValue `1920`
|
|
89
|
+
*/
|
|
90
|
+
appWidth?: number;
|
|
91
|
+
|
|
92
|
+
/**
|
|
93
|
+
* Authored logical pixel height of the application
|
|
94
|
+
*
|
|
95
|
+
* @defaultValue `1080`
|
|
96
|
+
*/
|
|
97
|
+
appHeight?: number;
|
|
98
|
+
|
|
99
|
+
/**
|
|
100
|
+
* Texture Memory Manager Settings
|
|
101
|
+
*/
|
|
102
|
+
textureMemory?: Partial<TextureMemoryManagerSettings>;
|
|
103
|
+
|
|
104
|
+
/**
|
|
105
|
+
* Bounds margin to extend the boundary in which a Node is added as Quad.
|
|
106
|
+
*/
|
|
107
|
+
boundsMargin?: number | [number, number, number, number];
|
|
108
|
+
|
|
109
|
+
/**
|
|
110
|
+
* Factor to convert app-authored logical coorindates to device logical coordinates
|
|
111
|
+
*
|
|
112
|
+
* @remarks
|
|
113
|
+
* This value allows auto-scaling to support larger/small resolutions than the
|
|
114
|
+
* app was authored for.
|
|
115
|
+
*
|
|
116
|
+
* If the app was authored for 1920x1080 and this value is 2, the app's canvas
|
|
117
|
+
* will be rendered at 3840x2160 logical pixels.
|
|
118
|
+
*
|
|
119
|
+
* Likewise, if the app was authored for 1920x1080 and this value is 0.66667,
|
|
120
|
+
* the app's canvas will be rendered at 1280x720 logical pixels.
|
|
121
|
+
*
|
|
122
|
+
* @defaultValue `1`
|
|
123
|
+
*/
|
|
124
|
+
deviceLogicalPixelRatio?: number;
|
|
125
|
+
|
|
126
|
+
/**
|
|
127
|
+
* Factor to convert device logical coordinates to device physical coordinates
|
|
128
|
+
*
|
|
129
|
+
* @remarks
|
|
130
|
+
* This value allows auto-scaling to support devices with different pixel densities.
|
|
131
|
+
*
|
|
132
|
+
* This controls the number of physical pixels that are used to render each logical
|
|
133
|
+
* pixel. For example, if the device has a pixel density of 2, each logical pixel
|
|
134
|
+
* will be rendered using 2x2 physical pixels.
|
|
135
|
+
*
|
|
136
|
+
* By default, it will be set to `window.devicePixelRatio` which is the pixel
|
|
137
|
+
* density of the device the app is running on reported by the browser.
|
|
138
|
+
*
|
|
139
|
+
* @defaultValue `window.devicePixelRatio`
|
|
140
|
+
*/
|
|
141
|
+
devicePhysicalPixelRatio?: number;
|
|
142
|
+
|
|
143
|
+
/**
|
|
144
|
+
* RGBA encoded number of the background to use
|
|
145
|
+
*
|
|
146
|
+
* @defaultValue `0x00000000`
|
|
147
|
+
*/
|
|
148
|
+
clearColor?: number;
|
|
149
|
+
|
|
150
|
+
/**
|
|
151
|
+
* Interval in milliseconds to receive FPS updates
|
|
152
|
+
*
|
|
153
|
+
* @remarks
|
|
154
|
+
* If set to `0`, FPS updates will be disabled.
|
|
155
|
+
*
|
|
156
|
+
* @defaultValue `0` (disabled)
|
|
157
|
+
*/
|
|
158
|
+
fpsUpdateInterval?: number;
|
|
159
|
+
|
|
160
|
+
/**
|
|
161
|
+
* Include context call (i.e. WebGL) information in FPS updates
|
|
162
|
+
*
|
|
163
|
+
* @remarks
|
|
164
|
+
* When enabled the number of calls to each context method over the
|
|
165
|
+
* `fpsUpdateInterval` will be included in the FPS update payload's
|
|
166
|
+
* `contextSpyData` property.
|
|
167
|
+
*
|
|
168
|
+
* Enabling the context spy has a serious impact on performance so only use it
|
|
169
|
+
* when you need to extract context call information.
|
|
170
|
+
*
|
|
171
|
+
* @defaultValue `false` (disabled)
|
|
172
|
+
*/
|
|
173
|
+
enableContextSpy?: boolean;
|
|
174
|
+
|
|
175
|
+
/**
|
|
176
|
+
* Number or Image Workers to use
|
|
177
|
+
*
|
|
178
|
+
* @remarks
|
|
179
|
+
* On devices with multiple cores, this can be used to improve image loading
|
|
180
|
+
* as well as reduce the impact of image loading on the main thread.
|
|
181
|
+
* Set to 0 to disable image workers.
|
|
182
|
+
*
|
|
183
|
+
* @defaultValue `2`
|
|
184
|
+
*/
|
|
185
|
+
numImageWorkers?: number;
|
|
186
|
+
|
|
187
|
+
/**
|
|
188
|
+
* Enable inspector
|
|
189
|
+
*
|
|
190
|
+
* @remarks
|
|
191
|
+
* When enabled the renderer will spawn a inspector. The inspector will
|
|
192
|
+
* replicate the state of the Nodes created in the renderer and allow
|
|
193
|
+
* inspection of the state of the nodes.
|
|
194
|
+
*
|
|
195
|
+
* @defaultValue `false` (disabled)
|
|
196
|
+
*/
|
|
197
|
+
enableInspector?: boolean;
|
|
198
|
+
|
|
199
|
+
/**
|
|
200
|
+
* Renderer mode
|
|
201
|
+
*/
|
|
202
|
+
renderMode?: 'webgl' | 'canvas';
|
|
203
|
+
}
|
|
204
|
+
|
|
205
|
+
/**
|
|
206
|
+
* The Renderer Main API
|
|
207
|
+
*
|
|
208
|
+
* @remarks
|
|
209
|
+
* This is the primary class used to configure and operate the Renderer.
|
|
210
|
+
*
|
|
211
|
+
* It is used to create and destroy Nodes, as well as Texture and Shader
|
|
212
|
+
* references.
|
|
213
|
+
*
|
|
214
|
+
* Example:
|
|
215
|
+
* ```ts
|
|
216
|
+
* import { RendererMain, MainCoreDriver } from '@lightningjs/renderer';
|
|
217
|
+
*
|
|
218
|
+
* // Initialize the Renderer
|
|
219
|
+
* const renderer = new RendererMain(
|
|
220
|
+
* {
|
|
221
|
+
* appWidth: 1920,
|
|
222
|
+
* appHeight: 1080
|
|
223
|
+
* },
|
|
224
|
+
* 'app',
|
|
225
|
+
* new MainCoreDriver(),
|
|
226
|
+
* );
|
|
227
|
+
* ```
|
|
228
|
+
*
|
|
229
|
+
* ## Events
|
|
230
|
+
* - `fpsUpdate`
|
|
231
|
+
* - Emitted every `fpsUpdateInterval` milliseconds with the current FPS
|
|
232
|
+
* - `frameTick`
|
|
233
|
+
* - Emitted every frame tick
|
|
234
|
+
* - `idle`
|
|
235
|
+
* - Emitted when the renderer is idle (no changes to the scene
|
|
236
|
+
* graph/animations running)
|
|
237
|
+
* - `criticalCleanup`
|
|
238
|
+
* - Emitted when the Texture Memory Manager Cleanup process is triggered
|
|
239
|
+
* - Payload: { memUsed: number, criticalThreshold: number }
|
|
240
|
+
* - `memUsed` - The amount of memory (in bytes) used by textures before the
|
|
241
|
+
* cleanup process
|
|
242
|
+
* - `criticalThreshold` - The critical threshold (in bytes)
|
|
243
|
+
* - `criticalCleanupFailed`
|
|
244
|
+
* - Emitted when the Texture Memory Manager Cleanup process is unable to free
|
|
245
|
+
* up enough texture memory to reach below the critical threshold.
|
|
246
|
+
* This can happen when there is not enough non-renderable textures to
|
|
247
|
+
* free up.
|
|
248
|
+
* - Payload (object with keys):
|
|
249
|
+
* - `memUsed` - The amount of memory (in bytes) used by textures after
|
|
250
|
+
* the cleanup process
|
|
251
|
+
* - `criticalThreshold` - The critical threshold (in bytes)
|
|
252
|
+
*/
|
|
253
|
+
export class RendererMain extends EventEmitter {
|
|
254
|
+
readonly root: INode<ShaderController<'DefaultShader'>>;
|
|
255
|
+
readonly canvas: HTMLCanvasElement;
|
|
256
|
+
readonly settings: Readonly<Required<RendererMainSettings>>;
|
|
257
|
+
readonly stage: Stage;
|
|
258
|
+
private inspector: Inspector | null = null;
|
|
259
|
+
|
|
260
|
+
/**
|
|
261
|
+
* Constructs a new Renderer instance
|
|
262
|
+
*
|
|
263
|
+
* @param settings Renderer settings
|
|
264
|
+
* @param target Element ID or HTMLElement to insert the canvas into
|
|
265
|
+
* @param driver Core Driver to use
|
|
266
|
+
*/
|
|
267
|
+
constructor(settings: RendererMainSettings, target: string | HTMLElement) {
|
|
268
|
+
super();
|
|
269
|
+
const resolvedTxSettings: TextureMemoryManagerSettings = {
|
|
270
|
+
criticalThreshold: settings.textureMemory?.criticalThreshold || 124e6,
|
|
271
|
+
targetThresholdLevel: settings.textureMemory?.targetThresholdLevel || 0.5,
|
|
272
|
+
cleanupInterval: settings.textureMemory?.cleanupInterval || 30000,
|
|
273
|
+
debugLogging: settings.textureMemory?.debugLogging || false,
|
|
274
|
+
};
|
|
275
|
+
const resolvedSettings: Required<RendererMainSettings> = {
|
|
276
|
+
appWidth: settings.appWidth || 1920,
|
|
277
|
+
appHeight: settings.appHeight || 1080,
|
|
278
|
+
textureMemory: resolvedTxSettings,
|
|
279
|
+
boundsMargin: settings.boundsMargin || 0,
|
|
280
|
+
deviceLogicalPixelRatio: settings.deviceLogicalPixelRatio || 1,
|
|
281
|
+
devicePhysicalPixelRatio:
|
|
282
|
+
settings.devicePhysicalPixelRatio || window.devicePixelRatio,
|
|
283
|
+
clearColor: settings.clearColor ?? 0x00000000,
|
|
284
|
+
fpsUpdateInterval: settings.fpsUpdateInterval || 0,
|
|
285
|
+
numImageWorkers:
|
|
286
|
+
settings.numImageWorkers !== undefined ? settings.numImageWorkers : 2,
|
|
287
|
+
enableContextSpy: settings.enableContextSpy ?? false,
|
|
288
|
+
enableInspector: settings.enableInspector ?? false,
|
|
289
|
+
renderMode: settings.renderMode ?? 'webgl',
|
|
290
|
+
};
|
|
291
|
+
this.settings = resolvedSettings;
|
|
292
|
+
|
|
293
|
+
const {
|
|
294
|
+
appWidth,
|
|
295
|
+
appHeight,
|
|
296
|
+
deviceLogicalPixelRatio,
|
|
297
|
+
devicePhysicalPixelRatio,
|
|
298
|
+
enableInspector,
|
|
299
|
+
} = resolvedSettings;
|
|
300
|
+
|
|
301
|
+
const deviceLogicalWidth = appWidth * deviceLogicalPixelRatio;
|
|
302
|
+
const deviceLogicalHeight = appHeight * deviceLogicalPixelRatio;
|
|
303
|
+
|
|
304
|
+
const canvas = document.createElement('canvas');
|
|
305
|
+
this.canvas = canvas;
|
|
306
|
+
canvas.width = deviceLogicalWidth * devicePhysicalPixelRatio;
|
|
307
|
+
canvas.height = deviceLogicalHeight * devicePhysicalPixelRatio;
|
|
308
|
+
|
|
309
|
+
canvas.style.width = `${deviceLogicalWidth}px`;
|
|
310
|
+
canvas.style.height = `${deviceLogicalHeight}px`;
|
|
311
|
+
|
|
312
|
+
// Initialize the stage
|
|
313
|
+
this.stage = new Stage({
|
|
314
|
+
appWidth: this.settings.appWidth,
|
|
315
|
+
appHeight: this.settings.appHeight,
|
|
316
|
+
boundsMargin: this.settings.boundsMargin,
|
|
317
|
+
clearColor: this.settings.clearColor,
|
|
318
|
+
canvas: this.canvas,
|
|
319
|
+
deviceLogicalPixelRatio: this.settings.deviceLogicalPixelRatio,
|
|
320
|
+
devicePhysicalPixelRatio: this.settings.devicePhysicalPixelRatio,
|
|
321
|
+
enableContextSpy: this.settings.enableContextSpy,
|
|
322
|
+
fpsUpdateInterval: this.settings.fpsUpdateInterval,
|
|
323
|
+
numImageWorkers: this.settings.numImageWorkers,
|
|
324
|
+
renderMode: this.settings.renderMode,
|
|
325
|
+
textureMemory: resolvedTxSettings,
|
|
326
|
+
eventBus: this,
|
|
327
|
+
});
|
|
328
|
+
|
|
329
|
+
// Extract the root node
|
|
330
|
+
this.root = this.stage.root as unknown as INode<
|
|
331
|
+
ShaderController<'DefaultShader'>
|
|
332
|
+
>;
|
|
333
|
+
|
|
334
|
+
// Get the target element and attach the canvas to it
|
|
335
|
+
let targetEl: HTMLElement | null;
|
|
336
|
+
if (typeof target === 'string') {
|
|
337
|
+
targetEl = document.getElementById(target);
|
|
338
|
+
} else {
|
|
339
|
+
targetEl = target;
|
|
340
|
+
}
|
|
341
|
+
|
|
342
|
+
if (!targetEl) {
|
|
343
|
+
throw new Error('Could not find target element');
|
|
344
|
+
}
|
|
345
|
+
|
|
346
|
+
targetEl.appendChild(canvas);
|
|
347
|
+
|
|
348
|
+
// Initialize inspector (if enabled)
|
|
349
|
+
if (enableInspector && !isProductionEnvironment()) {
|
|
350
|
+
this.inspector = new Inspector(canvas, resolvedSettings);
|
|
351
|
+
}
|
|
352
|
+
}
|
|
353
|
+
|
|
354
|
+
/**
|
|
355
|
+
* Create a new scene graph node
|
|
356
|
+
*
|
|
357
|
+
* @remarks
|
|
358
|
+
* A node is the main graphical building block of the Renderer scene graph. It
|
|
359
|
+
* can be a container for other nodes, or it can be a leaf node that renders a
|
|
360
|
+
* solid color, gradient, image, or specific texture, using a specific shader.
|
|
361
|
+
*
|
|
362
|
+
* To create a text node, see {@link createTextNode}.
|
|
363
|
+
*
|
|
364
|
+
* See {@link CoreNode} for more details.
|
|
365
|
+
*
|
|
366
|
+
* @param props
|
|
367
|
+
* @returns
|
|
368
|
+
*/
|
|
369
|
+
createNode<
|
|
370
|
+
ShCtr extends BaseShaderController = ShaderController<'DefaultShader'>,
|
|
371
|
+
>(props: Partial<INodeProps<ShCtr>>): INode<ShCtr> {
|
|
372
|
+
assertTruthy(this.stage, 'Stage is not initialized');
|
|
373
|
+
|
|
374
|
+
const node = this.stage.createNode(props as Partial<CoreNodeProps>);
|
|
375
|
+
|
|
376
|
+
if (this.inspector) {
|
|
377
|
+
return this.inspector.createNode(node) as unknown as INode<ShCtr>;
|
|
378
|
+
}
|
|
379
|
+
|
|
380
|
+
// FIXME onDestroy event? node.once('beforeDestroy'
|
|
381
|
+
// FIXME onCreate event?
|
|
382
|
+
return node as unknown as INode<ShCtr>;
|
|
383
|
+
}
|
|
384
|
+
|
|
385
|
+
/**
|
|
386
|
+
* Create a new scene graph text node
|
|
387
|
+
*
|
|
388
|
+
* @remarks
|
|
389
|
+
* A text node is the second graphical building block of the Renderer scene
|
|
390
|
+
* graph. It renders text using a specific text renderer that is automatically
|
|
391
|
+
* chosen based on the font requested and what type of fonts are installed
|
|
392
|
+
* into an app.
|
|
393
|
+
*
|
|
394
|
+
* See {@link ITextNode} for more details.
|
|
395
|
+
*
|
|
396
|
+
* @param props
|
|
397
|
+
* @returns
|
|
398
|
+
*/
|
|
399
|
+
createTextNode(props: Partial<ITextNodeProps>): ITextNode {
|
|
400
|
+
const textNode = this.stage.createTextNode(props as CoreTextNodeProps);
|
|
401
|
+
|
|
402
|
+
if (this.inspector) {
|
|
403
|
+
return this.inspector.createTextNode(textNode);
|
|
404
|
+
}
|
|
405
|
+
|
|
406
|
+
return textNode as unknown as ITextNode;
|
|
407
|
+
}
|
|
408
|
+
|
|
409
|
+
/**
|
|
410
|
+
* Destroy a node
|
|
411
|
+
*
|
|
412
|
+
* @remarks
|
|
413
|
+
* This method destroys a node
|
|
414
|
+
*
|
|
415
|
+
* @param node
|
|
416
|
+
* @returns
|
|
417
|
+
*/
|
|
418
|
+
destroyNode(node: INode) {
|
|
419
|
+
if (this.inspector) {
|
|
420
|
+
this.inspector.destroyNode(node.id);
|
|
421
|
+
}
|
|
422
|
+
|
|
423
|
+
return node.destroy();
|
|
424
|
+
}
|
|
425
|
+
|
|
426
|
+
/**
|
|
427
|
+
* Create a new texture reference
|
|
428
|
+
*
|
|
429
|
+
* @remarks
|
|
430
|
+
* This method creates a new reference to a texture. The texture is not
|
|
431
|
+
* loaded until it is used on a node.
|
|
432
|
+
*
|
|
433
|
+
* It can be assigned to a node's `texture` property, or it can be used
|
|
434
|
+
* when creating a SubTexture.
|
|
435
|
+
*
|
|
436
|
+
* @param textureType
|
|
437
|
+
* @param props
|
|
438
|
+
* @param options
|
|
439
|
+
* @returns
|
|
440
|
+
*/
|
|
441
|
+
createTexture<TxType extends keyof TextureTypeMap>(
|
|
442
|
+
textureType: TxType,
|
|
443
|
+
props: ExtractProps<TextureTypeMap[TxType]>,
|
|
444
|
+
): TextureMap[TxType] {
|
|
445
|
+
return this.stage.txManager.loadTexture(
|
|
446
|
+
textureType,
|
|
447
|
+
props,
|
|
448
|
+
) as TextureMap[TxType];
|
|
449
|
+
}
|
|
450
|
+
|
|
451
|
+
/**
|
|
452
|
+
* Create a new shader controller for a shader type
|
|
453
|
+
*
|
|
454
|
+
* @remarks
|
|
455
|
+
* This method creates a new Shader Controller for a specific shader type.
|
|
456
|
+
*
|
|
457
|
+
* If the shader has not been loaded yet, it will be loaded. Otherwise, the
|
|
458
|
+
* existing shader will be reused.
|
|
459
|
+
*
|
|
460
|
+
* It can be assigned to a Node's `shader` property.
|
|
461
|
+
*
|
|
462
|
+
* @param shaderType
|
|
463
|
+
* @param props
|
|
464
|
+
* @returns
|
|
465
|
+
*/
|
|
466
|
+
createShader<ShType extends keyof ShaderMap>(
|
|
467
|
+
shaderType: ShType,
|
|
468
|
+
props?: ExtractProps<ShaderMap[ShType]>,
|
|
469
|
+
): ShaderController<ShType> {
|
|
470
|
+
return this.stage.shManager.loadShader(shaderType, props);
|
|
471
|
+
}
|
|
472
|
+
|
|
473
|
+
createDynamicShader<
|
|
474
|
+
T extends DynamicEffects<[...{ name: string; type: keyof EffectMap }[]]>,
|
|
475
|
+
>(effects: [...T]): DynamicShaderController<T> {
|
|
476
|
+
return this.stage.shManager.loadDynamicShader({
|
|
477
|
+
effects: effects as EffectDescUnion[],
|
|
478
|
+
});
|
|
479
|
+
}
|
|
480
|
+
|
|
481
|
+
createEffect<Name extends string, Type extends keyof EffectMap>(
|
|
482
|
+
name: Name,
|
|
483
|
+
type: Type,
|
|
484
|
+
props: EffectDesc<{ name: Name; type: Type }>['props'],
|
|
485
|
+
): EffectDesc<{ name: Name; type: Type }> {
|
|
486
|
+
return {
|
|
487
|
+
name,
|
|
488
|
+
type,
|
|
489
|
+
props,
|
|
490
|
+
};
|
|
491
|
+
}
|
|
492
|
+
|
|
493
|
+
/**
|
|
494
|
+
* Get a Node by its ID
|
|
495
|
+
*
|
|
496
|
+
* @param id
|
|
497
|
+
* @returns
|
|
498
|
+
*/
|
|
499
|
+
getNodeById(id: number): CoreNode | null {
|
|
500
|
+
const root = this.stage?.root;
|
|
501
|
+
if (!root) {
|
|
502
|
+
return null;
|
|
503
|
+
}
|
|
504
|
+
|
|
505
|
+
const findNode = (node: CoreNode): CoreNode | null => {
|
|
506
|
+
if (node.id === id) {
|
|
507
|
+
return node;
|
|
508
|
+
}
|
|
509
|
+
|
|
510
|
+
for (const child of node.children) {
|
|
511
|
+
const found = findNode(child);
|
|
512
|
+
if (found) {
|
|
513
|
+
return found;
|
|
514
|
+
}
|
|
515
|
+
}
|
|
516
|
+
|
|
517
|
+
return null;
|
|
518
|
+
};
|
|
519
|
+
|
|
520
|
+
return findNode(root);
|
|
521
|
+
}
|
|
522
|
+
|
|
523
|
+
toggleFreeze() {
|
|
524
|
+
throw new Error('Not implemented');
|
|
525
|
+
}
|
|
526
|
+
|
|
527
|
+
advanceFrame() {
|
|
528
|
+
throw new Error('Not implemented');
|
|
529
|
+
}
|
|
530
|
+
|
|
531
|
+
/**
|
|
532
|
+
* Re-render the current frame without advancing any running animations.
|
|
533
|
+
*
|
|
534
|
+
* @remarks
|
|
535
|
+
* Any state changes will be reflected in the re-rendered frame. Useful for
|
|
536
|
+
* debugging.
|
|
537
|
+
*
|
|
538
|
+
* May not do anything if the render loop is running on a separate worker.
|
|
539
|
+
*/
|
|
540
|
+
rerender() {
|
|
541
|
+
throw new Error('Not implemented');
|
|
542
|
+
}
|
|
543
|
+
}
|