@lightningjs/renderer 2.9.0-beta2 → 2.9.0-beta4

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.
Files changed (193) hide show
  1. package/COPYING +1 -0
  2. package/LICENSE +202 -202
  3. package/NOTICE +3 -3
  4. package/README.md +147 -147
  5. package/dist/src/core/CoreNode.d.ts +29 -6
  6. package/dist/src/core/CoreNode.js +118 -79
  7. package/dist/src/core/CoreNode.js.map +1 -1
  8. package/dist/src/core/CoreTextNode.d.ts +2 -2
  9. package/dist/src/core/CoreTextNode.js +7 -4
  10. package/dist/src/core/CoreTextNode.js.map +1 -1
  11. package/dist/src/core/CoreTextureManager.d.ts +61 -15
  12. package/dist/src/core/CoreTextureManager.js +179 -104
  13. package/dist/src/core/CoreTextureManager.js.map +1 -1
  14. package/dist/src/core/Stage.d.ts +7 -0
  15. package/dist/src/core/Stage.js +34 -1
  16. package/dist/src/core/Stage.js.map +1 -1
  17. package/dist/src/core/TextureMemoryManager.js +2 -5
  18. package/dist/src/core/TextureMemoryManager.js.map +1 -1
  19. package/dist/src/core/lib/ImageWorker.js +31 -28
  20. package/dist/src/core/lib/ImageWorker.js.map +1 -1
  21. package/dist/src/core/lib/WebGlContextWrapper.d.ts +1 -0
  22. package/dist/src/core/lib/WebGlContextWrapper.js +2 -0
  23. package/dist/src/core/lib/WebGlContextWrapper.js.map +1 -1
  24. package/dist/src/core/renderers/CoreContextTexture.d.ts +1 -0
  25. package/dist/src/core/renderers/CoreContextTexture.js +1 -0
  26. package/dist/src/core/renderers/CoreContextTexture.js.map +1 -1
  27. package/dist/src/core/renderers/canvas/CanvasCoreRenderer.d.ts +1 -1
  28. package/dist/src/core/renderers/canvas/CanvasCoreRenderer.js +13 -5
  29. package/dist/src/core/renderers/canvas/CanvasCoreRenderer.js.map +1 -1
  30. package/dist/src/core/renderers/canvas/CanvasCoreTexture.js +6 -8
  31. package/dist/src/core/renderers/canvas/CanvasCoreTexture.js.map +1 -1
  32. package/dist/src/core/renderers/webgl/WebGlCoreCtxSubTexture.js +3 -1
  33. package/dist/src/core/renderers/webgl/WebGlCoreCtxSubTexture.js.map +1 -1
  34. package/dist/src/core/renderers/webgl/WebGlCoreCtxTexture.d.ts +1 -2
  35. package/dist/src/core/renderers/webgl/WebGlCoreCtxTexture.js +26 -24
  36. package/dist/src/core/renderers/webgl/WebGlCoreCtxTexture.js.map +1 -1
  37. package/dist/src/core/renderers/webgl/WebGlCoreRenderer.d.ts +0 -1
  38. package/dist/src/core/renderers/webgl/WebGlCoreRenderer.js +7 -17
  39. package/dist/src/core/renderers/webgl/WebGlCoreRenderer.js.map +1 -1
  40. package/dist/src/core/renderers/webgl/shaders/DefaultShader.js +45 -45
  41. package/dist/src/core/renderers/webgl/shaders/DefaultShaderBatched.js +61 -61
  42. package/dist/src/core/renderers/webgl/shaders/DynamicShader.js +93 -93
  43. package/dist/src/core/renderers/webgl/shaders/RoundedRectangle.js +63 -63
  44. package/dist/src/core/renderers/webgl/shaders/SdfShader.js +62 -62
  45. package/dist/src/core/renderers/webgl/shaders/effects/BorderBottomEffect.js +15 -15
  46. package/dist/src/core/renderers/webgl/shaders/effects/BorderEffect.js +6 -6
  47. package/dist/src/core/renderers/webgl/shaders/effects/BorderLeftEffect.js +15 -15
  48. package/dist/src/core/renderers/webgl/shaders/effects/BorderRightEffect.js +15 -15
  49. package/dist/src/core/renderers/webgl/shaders/effects/BorderTopEffect.js +15 -15
  50. package/dist/src/core/renderers/webgl/shaders/effects/FadeOutEffect.js +42 -42
  51. package/dist/src/core/renderers/webgl/shaders/effects/GlitchEffect.js +44 -44
  52. package/dist/src/core/renderers/webgl/shaders/effects/GrayscaleEffect.js +3 -3
  53. package/dist/src/core/renderers/webgl/shaders/effects/HolePunchEffect.js +22 -22
  54. package/dist/src/core/renderers/webgl/shaders/effects/LinearGradientEffect.js +28 -28
  55. package/dist/src/core/renderers/webgl/shaders/effects/RadialGradientEffect.js +12 -12
  56. package/dist/src/core/renderers/webgl/shaders/effects/RadialProgressEffect.js +37 -37
  57. package/dist/src/core/renderers/webgl/shaders/effects/RadiusEffect.js +19 -19
  58. package/dist/src/core/text-rendering/font-face-types/SdfTrFontFace/SdfTrFontFace.js +9 -5
  59. package/dist/src/core/text-rendering/font-face-types/SdfTrFontFace/SdfTrFontFace.js.map +1 -1
  60. package/dist/src/core/text-rendering/renderers/CanvasTextRenderer.js +2 -1
  61. package/dist/src/core/text-rendering/renderers/CanvasTextRenderer.js.map +1 -1
  62. package/dist/src/core/textures/ColorTexture.d.ts +1 -1
  63. package/dist/src/core/textures/ColorTexture.js +2 -1
  64. package/dist/src/core/textures/ColorTexture.js.map +1 -1
  65. package/dist/src/core/textures/ImageTexture.d.ts +8 -1
  66. package/dist/src/core/textures/ImageTexture.js +39 -1
  67. package/dist/src/core/textures/ImageTexture.js.map +1 -1
  68. package/dist/src/core/textures/NoiseTexture.d.ts +1 -1
  69. package/dist/src/core/textures/NoiseTexture.js +2 -1
  70. package/dist/src/core/textures/NoiseTexture.js.map +1 -1
  71. package/dist/src/core/textures/RenderTexture.d.ts +1 -1
  72. package/dist/src/core/textures/RenderTexture.js +2 -1
  73. package/dist/src/core/textures/RenderTexture.js.map +1 -1
  74. package/dist/src/core/textures/SubTexture.d.ts +1 -1
  75. package/dist/src/core/textures/SubTexture.js +21 -4
  76. package/dist/src/core/textures/SubTexture.js.map +1 -1
  77. package/dist/src/core/textures/Texture.d.ts +44 -22
  78. package/dist/src/core/textures/Texture.js +116 -36
  79. package/dist/src/core/textures/Texture.js.map +1 -1
  80. package/dist/src/main-api/Renderer.d.ts +18 -0
  81. package/dist/src/main-api/Renderer.js +6 -4
  82. package/dist/src/main-api/Renderer.js.map +1 -1
  83. package/dist/tsconfig.dist.tsbuildinfo +1 -1
  84. package/exports/canvas.ts +39 -39
  85. package/exports/index.ts +89 -89
  86. package/exports/inspector.ts +24 -24
  87. package/exports/utils.ts +44 -44
  88. package/exports/webgl.ts +38 -38
  89. package/package.json +1 -1
  90. package/scripts/please-use-pnpm.js +13 -13
  91. package/src/common/CommonTypes.ts +139 -139
  92. package/src/common/EventEmitter.ts +77 -77
  93. package/src/common/IAnimationController.ts +92 -92
  94. package/src/common/IEventEmitter.ts +28 -28
  95. package/src/core/CoreNode.test.ts +199 -95
  96. package/src/core/CoreNode.ts +2313 -2258
  97. package/src/core/CoreShaderManager.ts +292 -292
  98. package/src/core/CoreTextNode.ts +455 -450
  99. package/src/core/CoreTextureManager.ts +522 -432
  100. package/src/core/Stage.ts +700 -652
  101. package/src/core/TextureMemoryManager.ts +277 -279
  102. package/src/core/animations/AnimationManager.ts +38 -38
  103. package/src/core/animations/CoreAnimation.ts +340 -340
  104. package/src/core/animations/CoreAnimationController.ts +157 -157
  105. package/src/core/lib/ContextSpy.ts +41 -41
  106. package/src/core/lib/ImageWorker.ts +270 -267
  107. package/src/core/lib/Matrix3d.ts +244 -244
  108. package/src/core/lib/RenderCoords.ts +86 -86
  109. package/src/core/lib/WebGlContextWrapper.ts +1322 -1320
  110. package/src/core/lib/textureCompression.ts +152 -152
  111. package/src/core/lib/textureSvg.ts +78 -78
  112. package/src/core/lib/utils.ts +306 -306
  113. package/src/core/platform.ts +61 -61
  114. package/src/core/renderers/CoreContextTexture.ts +43 -42
  115. package/src/core/renderers/CoreRenderOp.ts +22 -22
  116. package/src/core/renderers/CoreRenderer.ts +114 -114
  117. package/src/core/renderers/CoreShader.ts +41 -41
  118. package/src/core/renderers/canvas/CanvasCoreRenderer.ts +364 -353
  119. package/src/core/renderers/canvas/CanvasCoreTexture.ts +150 -149
  120. package/src/core/renderers/canvas/internal/C2DShaderUtils.ts +231 -231
  121. package/src/core/renderers/canvas/internal/ColorUtils.ts +69 -69
  122. package/src/core/renderers/canvas/shaders/UnsupportedShader.ts +48 -48
  123. package/src/core/renderers/webgl/WebGlCoreCtxRenderTexture.ts +79 -79
  124. package/src/core/renderers/webgl/WebGlCoreCtxSubTexture.ts +50 -48
  125. package/src/core/renderers/webgl/WebGlCoreCtxTexture.ts +298 -290
  126. package/src/core/renderers/webgl/WebGlCoreRenderOp.ts +125 -125
  127. package/src/core/renderers/webgl/WebGlCoreRenderer.ts +805 -817
  128. package/src/core/renderers/webgl/WebGlCoreShader.ts +362 -362
  129. package/src/core/renderers/webgl/internal/BufferCollection.ts +54 -54
  130. package/src/core/renderers/webgl/internal/RendererUtils.ts +155 -155
  131. package/src/core/renderers/webgl/internal/ShaderUtils.ts +143 -143
  132. package/src/core/renderers/webgl/internal/WebGlUtils.ts +35 -35
  133. package/src/core/renderers/webgl/shaders/DefaultShader.ts +93 -93
  134. package/src/core/renderers/webgl/shaders/DefaultShaderBatched.ts +132 -132
  135. package/src/core/renderers/webgl/shaders/DynamicShader.ts +580 -580
  136. package/src/core/renderers/webgl/shaders/RoundedRectangle.ts +167 -167
  137. package/src/core/renderers/webgl/shaders/SdfShader.ts +204 -204
  138. package/src/core/renderers/webgl/shaders/effects/BorderBottomEffect.ts +101 -101
  139. package/src/core/renderers/webgl/shaders/effects/BorderEffect.ts +87 -87
  140. package/src/core/renderers/webgl/shaders/effects/BorderLeftEffect.ts +101 -101
  141. package/src/core/renderers/webgl/shaders/effects/BorderRightEffect.ts +101 -101
  142. package/src/core/renderers/webgl/shaders/effects/BorderTopEffect.ts +101 -101
  143. package/src/core/renderers/webgl/shaders/effects/EffectUtils.ts +159 -159
  144. package/src/core/renderers/webgl/shaders/effects/FadeOutEffect.ts +127 -127
  145. package/src/core/renderers/webgl/shaders/effects/GlitchEffect.ts +148 -148
  146. package/src/core/renderers/webgl/shaders/effects/GrayscaleEffect.ts +67 -67
  147. package/src/core/renderers/webgl/shaders/effects/HolePunchEffect.ts +157 -157
  148. package/src/core/renderers/webgl/shaders/effects/LinearGradientEffect.ts +171 -171
  149. package/src/core/renderers/webgl/shaders/effects/RadialGradientEffect.ts +168 -168
  150. package/src/core/renderers/webgl/shaders/effects/RadialProgressEffect.ts +187 -187
  151. package/src/core/renderers/webgl/shaders/effects/RadiusEffect.ts +110 -110
  152. package/src/core/renderers/webgl/shaders/effects/ShaderEffect.ts +196 -196
  153. package/src/core/text-rendering/TextRenderingUtils.ts +36 -36
  154. package/src/core/text-rendering/TextTextureRendererUtils.ts +263 -263
  155. package/src/core/text-rendering/TrFontManager.ts +183 -183
  156. package/src/core/text-rendering/font-face-types/SdfTrFontFace/SdfTrFontFace.ts +176 -171
  157. package/src/core/text-rendering/font-face-types/SdfTrFontFace/internal/FontShaper.ts +139 -139
  158. package/src/core/text-rendering/font-face-types/SdfTrFontFace/internal/SdfFontShaper.test.ts +173 -173
  159. package/src/core/text-rendering/font-face-types/SdfTrFontFace/internal/SdfFontShaper.ts +171 -171
  160. package/src/core/text-rendering/font-face-types/TrFontFace.ts +187 -187
  161. package/src/core/text-rendering/font-face-types/WebTrFontFace.ts +89 -89
  162. package/src/core/text-rendering/renderers/CanvasTextRenderer.ts +509 -507
  163. package/src/core/text-rendering/renderers/LightningTextTextureRenderer.ts +798 -798
  164. package/src/core/text-rendering/renderers/SdfTextRenderer/SdfTextRenderer.ts +853 -853
  165. package/src/core/text-rendering/renderers/SdfTextRenderer/internal/PeekableGenerator.test.ts +48 -48
  166. package/src/core/text-rendering/renderers/SdfTextRenderer/internal/PeekableGenerator.ts +66 -66
  167. package/src/core/text-rendering/renderers/SdfTextRenderer/internal/SpecialCodepoints.ts +52 -52
  168. package/src/core/text-rendering/renderers/SdfTextRenderer/internal/constants.ts +32 -32
  169. package/src/core/text-rendering/renderers/SdfTextRenderer/internal/getStartConditions.ts +117 -117
  170. package/src/core/text-rendering/renderers/SdfTextRenderer/internal/getUnicodeCodepoints.test.ts +133 -133
  171. package/src/core/text-rendering/renderers/SdfTextRenderer/internal/getUnicodeCodepoints.ts +38 -38
  172. package/src/core/text-rendering/renderers/SdfTextRenderer/internal/layoutText.ts +403 -403
  173. package/src/core/text-rendering/renderers/SdfTextRenderer/internal/measureText.test.ts +49 -49
  174. package/src/core/text-rendering/renderers/SdfTextRenderer/internal/measureText.ts +52 -52
  175. package/src/core/text-rendering/renderers/SdfTextRenderer/internal/setRenderWindow.test.ts +205 -205
  176. package/src/core/text-rendering/renderers/SdfTextRenderer/internal/setRenderWindow.ts +93 -93
  177. package/src/core/text-rendering/renderers/SdfTextRenderer/internal/util.ts +40 -40
  178. package/src/core/text-rendering/renderers/TextRenderer.ts +557 -557
  179. package/src/core/textures/ColorTexture.ts +102 -100
  180. package/src/core/textures/ImageTexture.ts +378 -337
  181. package/src/core/textures/NoiseTexture.ts +104 -101
  182. package/src/core/textures/RenderTexture.ts +85 -83
  183. package/src/core/textures/SubTexture.ts +171 -146
  184. package/src/core/textures/Texture.ts +423 -318
  185. package/src/core/utils.ts +227 -227
  186. package/src/env.d.ts +7 -7
  187. package/src/main-api/DynamicShaderController.ts +104 -104
  188. package/src/main-api/INode.ts +101 -101
  189. package/src/main-api/Inspector.ts +505 -505
  190. package/src/main-api/Renderer.ts +693 -670
  191. package/src/main-api/ShaderController.ts +80 -80
  192. package/src/main-api/utils.ts +45 -45
  193. package/src/utils.ts +248 -248
package/README.md CHANGED
@@ -1,147 +1,147 @@
1
- # Lightning 3 Renderer
2
-
3
- A powerful 2D scene renderer designed for rendering highly performant user
4
- interfaces on web browsers running on embedded devices using WebGL.
5
-
6
- The Renderer is part of the [LightningJS](https://lightningjs.io) project. While it is possible to use the renderer directly, it is not recommended. Instead, Lightning 3 works best when combined with [Blits](https://lightningjs.io/v3-docs/blits/getting_started/intro.html).
7
-
8
- ## Setup & Commands
9
-
10
- ```
11
- # Install renderer + example dependencies
12
- pnpm install
13
-
14
- # Build Renderer
15
- pnpm build
16
-
17
- # Build Renderer (watch mode)
18
- pnpm watch
19
-
20
- # Run unit tests
21
- pnpm test
22
-
23
- # Run Visual Regression Tests
24
- pnpm test:visual
25
-
26
- # Build API Documentation (builds into ./typedocs folder)
27
- pnpm typedoc
28
-
29
- # Launch Example Tests in dev mode (includes Build Renderer (watch mode))
30
- pnpm start
31
-
32
- # Launch Example Tests in production mode
33
- # IMPORTANT: To run test examples on embedded devices that use older browser versions
34
- # you MUST run the examples in this mode.
35
- pnpm start:prod
36
- ```
37
-
38
- ## Browser Targets
39
-
40
- The Lightning 3 Renderer's goal is to work with the following browser versions and above:
41
-
42
- - Chrome v38 (Released October 7, 2014)
43
-
44
- Any JavaScript language features or browser APIs that cannot be automatically transpiled or polyfilled by industry standard transpilers (such as Babel) to target these versions must be carefully considered before use.
45
-
46
- For a more detailed and comprehensive list of browsers and their features please see [browsers](./BROWSERS.md).
47
-
48
- ## Example Tests
49
-
50
- The Example Tests sub-project define a set of tests for various Renderer
51
- features. This is NOT an automated test. The command below will launch a
52
- web server which can be accessed by a web browser for manual testing. However,
53
- many of the Example Tests define Snapshots for the Visual Regression Test Runner
54
- (see below).
55
-
56
- The Example Tests can be launched with:
57
-
58
- ```
59
- pnpm start
60
- ```
61
-
62
- A hosted version can be found [here](https://lightning-js.github.io/renderer/).
63
-
64
- This supports modern browsers as well as Chrome 38 and above through a legacy build.
65
-
66
- See [examples/README.md](./examples/README.md) for more info.
67
-
68
- ## Visual Regression Tests
69
-
70
- In order to prevent bugs on existing Renderer features when new features or bug
71
- fixes are added, the Renderer includes a Visual Regression Test Runner along
72
- with a set of certified snapshot files that are checked into the repository.
73
-
74
- These tests can be launched with:
75
-
76
- ```
77
- pnpm test:visual
78
- ```
79
-
80
- The captured Snapshots of these tests are optionally defined in the individual
81
- Example Tests.
82
-
83
- See [visual-regression/README.md](./visual-regression/README.md) for more info.
84
-
85
- ## Manual Regression Tests
86
-
87
- See [docs/ManualRegressionTests.md].
88
-
89
- ## Release Procedure
90
-
91
- See [RELEASE.md](./RELEASE.md)
92
-
93
- ## Installing Fonts
94
-
95
- Fonts can be installed into the Font Manager exposed by the Renderer's Stage.
96
- There are two types of fonts that you can install, Web/Canvas2D fonts (WebTrFontFace)
97
- and SDF fonts (SdfTrFontFace). Install that fonts that your applications needs
98
- at start up so they are ready when your application is rendered.
99
-
100
- ```ts
101
- import {
102
- RendererMain,
103
- WebTrFontFace,
104
- SdfTrFontFace,
105
- } from '@lightningjs/renderer';
106
-
107
- import {
108
- WebGlCoreRenderer,
109
- SdfTextRenderer,
110
- } from '@lightningjs/renderer/webgl';
111
- import { CanvasTextRenderer } from '@lightningjs/renderer/canvas';
112
-
113
- const renderer = new RendererMain(
114
- {
115
- appWidth: 1920,
116
- appHeight: 1080,
117
- renderEngine: WebGlCoreRenderer,
118
- fontEngines: [SdfTextRenderer, CanvasTextRenderer],
119
- // ...Other Renderer Config
120
- },
121
- 'app', // id of div to insert Canvas.
122
- );
123
-
124
- // Load fonts into renderer
125
- renderer.stage.fontManager.addFontFace(
126
- new WebTrFontFace('Ubuntu', {}, '/fonts/Ubuntu-Regular.ttf'),
127
- );
128
-
129
- renderer.stage.fontManager.addFontFace(
130
- new SdfTrFontFace(
131
- 'Ubuntu',
132
- {},
133
- 'msdf',
134
- stage,
135
- '/fonts/Ubuntu-Regular.msdf.png',
136
- '/fonts/Ubuntu-Regular.msdf.json',
137
- ),
138
- );
139
- ```
140
-
141
- Please note that the WebGL renderer supports both SDF Fonts and Web Fonts, however the
142
- Canvas renderer only supports Web Fonts:
143
-
144
- | Font Type Renderer | SDF Font | Web Font |
145
- | ------------------ | -------- | -------- |
146
- | WebGL | Y | Y |
147
- | Canvas | N | Y |
1
+ # Lightning 3 Renderer
2
+
3
+ A powerful 2D scene renderer designed for rendering highly performant user
4
+ interfaces on web browsers running on embedded devices using WebGL.
5
+
6
+ The Renderer is part of the [LightningJS](https://lightningjs.io) project. While it is possible to use the renderer directly, it is not recommended. Instead, Lightning 3 works best when combined with [Blits](https://lightningjs.io/v3-docs/blits/getting_started/intro.html).
7
+
8
+ ## Setup & Commands
9
+
10
+ ```
11
+ # Install renderer + example dependencies
12
+ pnpm install
13
+
14
+ # Build Renderer
15
+ pnpm build
16
+
17
+ # Build Renderer (watch mode)
18
+ pnpm watch
19
+
20
+ # Run unit tests
21
+ pnpm test
22
+
23
+ # Run Visual Regression Tests
24
+ pnpm test:visual
25
+
26
+ # Build API Documentation (builds into ./typedocs folder)
27
+ pnpm typedoc
28
+
29
+ # Launch Example Tests in dev mode (includes Build Renderer (watch mode))
30
+ pnpm start
31
+
32
+ # Launch Example Tests in production mode
33
+ # IMPORTANT: To run test examples on embedded devices that use older browser versions
34
+ # you MUST run the examples in this mode.
35
+ pnpm start:prod
36
+ ```
37
+
38
+ ## Browser Targets
39
+
40
+ The Lightning 3 Renderer's goal is to work with the following browser versions and above:
41
+
42
+ - Chrome v38 (Released October 7, 2014)
43
+
44
+ Any JavaScript language features or browser APIs that cannot be automatically transpiled or polyfilled by industry standard transpilers (such as Babel) to target these versions must be carefully considered before use.
45
+
46
+ For a more detailed and comprehensive list of browsers and their features please see [browsers](./BROWSERS.md).
47
+
48
+ ## Example Tests
49
+
50
+ The Example Tests sub-project define a set of tests for various Renderer
51
+ features. This is NOT an automated test. The command below will launch a
52
+ web server which can be accessed by a web browser for manual testing. However,
53
+ many of the Example Tests define Snapshots for the Visual Regression Test Runner
54
+ (see below).
55
+
56
+ The Example Tests can be launched with:
57
+
58
+ ```
59
+ pnpm start
60
+ ```
61
+
62
+ A hosted version can be found [here](https://lightning-js.github.io/renderer/).
63
+
64
+ This supports modern browsers as well as Chrome 38 and above through a legacy build.
65
+
66
+ See [examples/README.md](./examples/README.md) for more info.
67
+
68
+ ## Visual Regression Tests
69
+
70
+ In order to prevent bugs on existing Renderer features when new features or bug
71
+ fixes are added, the Renderer includes a Visual Regression Test Runner along
72
+ with a set of certified snapshot files that are checked into the repository.
73
+
74
+ These tests can be launched with:
75
+
76
+ ```
77
+ pnpm test:visual
78
+ ```
79
+
80
+ The captured Snapshots of these tests are optionally defined in the individual
81
+ Example Tests.
82
+
83
+ See [visual-regression/README.md](./visual-regression/README.md) for more info.
84
+
85
+ ## Manual Regression Tests
86
+
87
+ See [docs/ManualRegressionTests.md].
88
+
89
+ ## Release Procedure
90
+
91
+ See [RELEASE.md](./RELEASE.md)
92
+
93
+ ## Installing Fonts
94
+
95
+ Fonts can be installed into the Font Manager exposed by the Renderer's Stage.
96
+ There are two types of fonts that you can install, Web/Canvas2D fonts (WebTrFontFace)
97
+ and SDF fonts (SdfTrFontFace). Install that fonts that your applications needs
98
+ at start up so they are ready when your application is rendered.
99
+
100
+ ```ts
101
+ import {
102
+ RendererMain,
103
+ WebTrFontFace,
104
+ SdfTrFontFace,
105
+ } from '@lightningjs/renderer';
106
+
107
+ import {
108
+ WebGlCoreRenderer,
109
+ SdfTextRenderer,
110
+ } from '@lightningjs/renderer/webgl';
111
+ import { CanvasTextRenderer } from '@lightningjs/renderer/canvas';
112
+
113
+ const renderer = new RendererMain(
114
+ {
115
+ appWidth: 1920,
116
+ appHeight: 1080,
117
+ renderEngine: WebGlCoreRenderer,
118
+ fontEngines: [SdfTextRenderer, CanvasTextRenderer],
119
+ // ...Other Renderer Config
120
+ },
121
+ 'app', // id of div to insert Canvas.
122
+ );
123
+
124
+ // Load fonts into renderer
125
+ renderer.stage.fontManager.addFontFace(
126
+ new WebTrFontFace('Ubuntu', {}, '/fonts/Ubuntu-Regular.ttf'),
127
+ );
128
+
129
+ renderer.stage.fontManager.addFontFace(
130
+ new SdfTrFontFace(
131
+ 'Ubuntu',
132
+ {},
133
+ 'msdf',
134
+ stage,
135
+ '/fonts/Ubuntu-Regular.msdf.png',
136
+ '/fonts/Ubuntu-Regular.msdf.json',
137
+ ),
138
+ );
139
+ ```
140
+
141
+ Please note that the WebGL renderer supports both SDF Fonts and Web Fonts, however the
142
+ Canvas renderer only supports Web Fonts:
143
+
144
+ | Font Type Renderer | SDF Font | Web Font |
145
+ | ------------------ | -------- | -------- |
146
+ | WebGL | Y | Y |
147
+ | Canvas | N | Y |
@@ -1,7 +1,7 @@
1
1
  import type { TextureOptions } from './CoreTextureManager.js';
2
2
  import type { CoreRenderer } from './renderers/CoreRenderer.js';
3
3
  import type { Stage } from './Stage.js';
4
- import type { Texture } from './textures/Texture.js';
4
+ import { type Texture } from './textures/Texture.js';
5
5
  import type { Dimensions } from '../common/CommonTypes.js';
6
6
  import { EventEmitter } from '../common/EventEmitter.js';
7
7
  import { type Bound, type RectWithValid } from './lib/utils.js';
@@ -681,18 +681,40 @@ export declare class CoreNode extends EventEmitter {
681
681
  update(delta: number, parentClippingRect: RectWithValid): void;
682
682
  private findParentRTTNode;
683
683
  private notifyParentRTTOfUpdate;
684
- hasRenderableProperties(): boolean;
685
684
  checkRenderBounds(): CoreNodeRenderState;
686
685
  updateBoundingRect(): void;
687
686
  createRenderBounds(): void;
688
687
  updateRenderState(renderState: CoreNodeRenderState): void;
689
688
  /**
690
- * This function updates the `isRenderable` property based on certain conditions.
691
- *
692
- * @returns
689
+ * Updates the `isRenderable` property based on various conditions.
693
690
  */
694
691
  updateIsRenderable(): void;
695
- onChangeIsRenderable(isRenderable: boolean): void;
692
+ /**
693
+ * Checks if the node is renderable based on world alpha, dimensions and out of bounds status.
694
+ */
695
+ checkBasicRenderability(): boolean;
696
+ /**
697
+ * Sets the renderable state and triggers changes if necessary.
698
+ * @param isRenderable - The new renderable state
699
+ */
700
+ setRenderable(isRenderable: boolean): void;
701
+ /**
702
+ * Changes the renderable state of the node.
703
+ */
704
+ updateTextureOwnership(isRenderable: boolean): void;
705
+ /**
706
+ * Checks if the node is out of the viewport bounds.
707
+ */
708
+ isOutOfBounds(): boolean;
709
+ /**
710
+ * Checks if the node has dimensions (width/height)
711
+ */
712
+ hasDimensions(): boolean;
713
+ /**
714
+ * Checks if the node has any color properties set.
715
+ */
716
+ hasColorProperties(): boolean;
717
+ hasShader(): boolean;
696
718
  calculateRenderCoords(): void;
697
719
  /**
698
720
  * This function calculates the clipping rectangle for a node.
@@ -777,6 +799,7 @@ export declare class CoreNode extends EventEmitter {
777
799
  get rtt(): boolean;
778
800
  set rtt(value: boolean);
779
801
  private initRenderTexture;
802
+ private loadRenderTexture;
780
803
  private cleanupRenderTexture;
781
804
  private markChildrenWithRTT;
782
805
  private applyRTTInheritance;
@@ -17,6 +17,7 @@
17
17
  * limitations under the License.
18
18
  */
19
19
  import { assertTruthy, getNewId, mergeColorAlphaPremultiplied, } from '../utils.js';
20
+ import {} from './textures/Texture.js';
20
21
  import { EventEmitter } from '../common/EventEmitter.js';
21
22
  import { copyRect, intersectRect, createBound, boundInsideBound, boundLargeThanBound, createPreloadBounds, } from './lib/utils.js';
22
23
  import { Matrix3d } from './lib/Matrix3d.js';
@@ -206,6 +207,14 @@ export class CoreNode extends EventEmitter {
206
207
  UpdateType.Local |
207
208
  UpdateType.RenderBounds |
208
209
  UpdateType.RenderState);
210
+ // if the default texture isn't loaded yet, wait for it to load
211
+ // this only happens when the node is created before the stage is ready
212
+ if (this.stage.defaultTexture &&
213
+ this.stage.defaultTexture.state !== 'loaded') {
214
+ this.stage.defaultTexture.once('loaded', () => {
215
+ this.setUpdateType(UpdateType.IsRenderable);
216
+ });
217
+ }
209
218
  }
210
219
  //#region Textures
211
220
  loadTexture() {
@@ -217,10 +226,6 @@ export class CoreNode extends EventEmitter {
217
226
  // synchronous task after calling loadTexture()
218
227
  queueMicrotask(() => {
219
228
  texture.preventCleanup = this.props.preventCleanup;
220
- // Preload texture if required
221
- if (this.textureOptions.preload) {
222
- texture.ctxTexture.load();
223
- }
224
229
  texture.on('loaded', this.onTextureLoaded);
225
230
  texture.on('failed', this.onTextureFailed);
226
231
  texture.on('freed', this.onTextureFreed);
@@ -262,6 +267,7 @@ export class CoreNode extends EventEmitter {
262
267
  }
263
268
  onTextureLoaded = (_, dimensions) => {
264
269
  this.autosizeNode(dimensions);
270
+ this.setUpdateType(UpdateType.IsRenderable);
265
271
  // Texture was loaded. In case the RAF loop has already stopped, we request
266
272
  // a render to ensure the texture is rendered.
267
273
  this.stage.requestRender();
@@ -269,16 +275,20 @@ export class CoreNode extends EventEmitter {
269
275
  if (this.parentHasRenderTexture) {
270
276
  this.notifyParentRTTOfUpdate();
271
277
  }
272
- this.emit('loaded', {
273
- type: 'texture',
274
- dimensions,
275
- });
278
+ // ignore 1x1 pixel textures
279
+ if (dimensions.width > 1 && dimensions.height > 1) {
280
+ this.emit('loaded', {
281
+ type: 'texture',
282
+ dimensions,
283
+ });
284
+ }
276
285
  // Trigger a local update if the texture is loaded and the resizeMode is 'contain'
277
286
  if (this.props.textureOptions?.resizeMode?.type === 'contain') {
278
287
  this.setUpdateType(UpdateType.Local);
279
288
  }
280
289
  };
281
290
  onTextureFailed = (_, error) => {
291
+ this.setUpdateType(UpdateType.IsRenderable);
282
292
  // If parent has a render texture, flag that we need to update
283
293
  if (this.parentHasRenderTexture) {
284
294
  this.notifyParentRTTOfUpdate();
@@ -289,6 +299,7 @@ export class CoreNode extends EventEmitter {
289
299
  });
290
300
  };
291
301
  onTextureFreed = () => {
302
+ this.setUpdateType(UpdateType.IsRenderable);
292
303
  // If parent has a render texture, flag that we need to update
293
304
  if (this.parentHasRenderTexture) {
294
305
  this.notifyParentRTTOfUpdate();
@@ -398,7 +409,7 @@ export class CoreNode extends EventEmitter {
398
409
  if (this.updateType & UpdateType.RenderTexture && this.rtt) {
399
410
  // Only the RTT node itself triggers `renderToTexture`
400
411
  this.hasRTTupdates = true;
401
- this.stage.renderer?.renderToTexture(this);
412
+ this.loadRenderTexture();
402
413
  }
403
414
  if (this.updateType & UpdateType.Global) {
404
415
  assertTruthy(this.localTransform);
@@ -547,51 +558,6 @@ export class CoreNode extends EventEmitter {
547
558
  rttNode.notifyParentRTTOfUpdate();
548
559
  }
549
560
  }
550
- //check if CoreNode is renderable based on props
551
- hasRenderableProperties() {
552
- if (this.props.texture) {
553
- return true;
554
- }
555
- if (!this.props.width || !this.props.height) {
556
- return false;
557
- }
558
- if (this.props.shader !== this.stage.defShaderCtr) {
559
- return true;
560
- }
561
- if (this.props.clipping) {
562
- return true;
563
- }
564
- if (this.props.color !== 0) {
565
- return true;
566
- }
567
- // Consider removing these checks and just using the color property check above.
568
- // Maybe add a forceRender prop for nodes that should always render.
569
- if (this.props.colorTop !== 0) {
570
- return true;
571
- }
572
- if (this.props.colorBottom !== 0) {
573
- return true;
574
- }
575
- if (this.props.colorLeft !== 0) {
576
- return true;
577
- }
578
- if (this.props.colorRight !== 0) {
579
- return true;
580
- }
581
- if (this.props.colorTl !== 0) {
582
- return true;
583
- }
584
- if (this.props.colorTr !== 0) {
585
- return true;
586
- }
587
- if (this.props.colorBl !== 0) {
588
- return true;
589
- }
590
- if (this.props.colorBr !== 0) {
591
- return true;
592
- }
593
- return false;
594
- }
595
561
  checkRenderBounds() {
596
562
  assertTruthy(this.renderBound);
597
563
  assertTruthy(this.strictBound);
@@ -679,26 +645,86 @@ export class CoreNode extends EventEmitter {
679
645
  });
680
646
  }
681
647
  /**
682
- * This function updates the `isRenderable` property based on certain conditions.
683
- *
684
- * @returns
648
+ * Updates the `isRenderable` property based on various conditions.
685
649
  */
686
650
  updateIsRenderable() {
687
- let newIsRenderable;
688
- if (this.worldAlpha === 0 || !this.hasRenderableProperties()) {
689
- newIsRenderable = false;
651
+ let newIsRenderable = false;
652
+ let needsTextureOwnership = false;
653
+ // If the node is out of bounds or has an alpha of 0, it is not renderable
654
+ if (this.checkBasicRenderability() === false) {
655
+ this.updateTextureOwnership(false);
656
+ this.setRenderable(false);
657
+ return;
690
658
  }
691
- else {
692
- newIsRenderable = this.renderState > CoreNodeRenderState.OutOfBounds;
659
+ if (this.texture !== null) {
660
+ needsTextureOwnership = true;
661
+ // we're only renderable if the texture state is loaded
662
+ newIsRenderable = this.texture.state === 'loaded';
663
+ }
664
+ else if ((this.hasShader() || this.hasColorProperties() === true) &&
665
+ this.hasDimensions() === true) {
666
+ // This mean we have dimensions and a color set, so we can render a ColorTexture
667
+ if (this.stage.defaultTexture &&
668
+ this.stage.defaultTexture.state === 'loaded') {
669
+ newIsRenderable = true;
670
+ }
671
+ }
672
+ this.updateTextureOwnership(needsTextureOwnership);
673
+ this.setRenderable(newIsRenderable);
674
+ }
675
+ /**
676
+ * Checks if the node is renderable based on world alpha, dimensions and out of bounds status.
677
+ */
678
+ checkBasicRenderability() {
679
+ if (this.worldAlpha === 0 || this.isOutOfBounds() === true) {
680
+ return false;
693
681
  }
694
- if (this.isRenderable !== newIsRenderable) {
695
- this.isRenderable = newIsRenderable;
696
- this.onChangeIsRenderable(newIsRenderable);
682
+ else {
683
+ return true;
697
684
  }
698
685
  }
699
- onChangeIsRenderable(isRenderable) {
686
+ /**
687
+ * Sets the renderable state and triggers changes if necessary.
688
+ * @param isRenderable - The new renderable state
689
+ */
690
+ setRenderable(isRenderable) {
691
+ this.isRenderable = isRenderable;
692
+ }
693
+ /**
694
+ * Changes the renderable state of the node.
695
+ */
696
+ updateTextureOwnership(isRenderable) {
700
697
  this.texture?.setRenderableOwner(this, isRenderable);
701
698
  }
699
+ /**
700
+ * Checks if the node is out of the viewport bounds.
701
+ */
702
+ isOutOfBounds() {
703
+ return this.renderState <= CoreNodeRenderState.OutOfBounds;
704
+ }
705
+ /**
706
+ * Checks if the node has dimensions (width/height)
707
+ */
708
+ hasDimensions() {
709
+ return this.props.width !== 0 && this.props.height !== 0;
710
+ }
711
+ /**
712
+ * Checks if the node has any color properties set.
713
+ */
714
+ hasColorProperties() {
715
+ return (this.props.color !== 0 ||
716
+ this.props.colorTop !== 0 ||
717
+ this.props.colorBottom !== 0 ||
718
+ this.props.colorLeft !== 0 ||
719
+ this.props.colorRight !== 0 ||
720
+ this.props.colorTl !== 0 ||
721
+ this.props.colorTr !== 0 ||
722
+ this.props.colorBl !== 0 ||
723
+ this.props.colorBr !== 0);
724
+ }
725
+ hasShader() {
726
+ return this.props.shader !== null;
727
+ }
702
728
  calculateRenderCoords() {
703
729
  const { width, height, globalTransform: transform } = this;
704
730
  assertTruthy(transform);
@@ -821,7 +847,9 @@ export class CoreNode extends EventEmitter {
821
847
  colorTr: this.premultipliedColorTr,
822
848
  colorBl: this.premultipliedColorBl,
823
849
  colorBr: this.premultipliedColorBr,
824
- texture: this.texture,
850
+ // if we do not have a texture, use the default texture
851
+ // this assumes any renderable node is either a distinct texture or a ColorTexture
852
+ texture: this.texture || this.stage.defaultTexture,
825
853
  textureOptions: this.textureOptions,
826
854
  zIndex: this.zIndex,
827
855
  shader: this.shader.shader,
@@ -886,11 +914,10 @@ export class CoreNode extends EventEmitter {
886
914
  this.props.width = value;
887
915
  this.setUpdateType(UpdateType.Local);
888
916
  if (this.props.rtt) {
889
- this.texture = this.stage.txManager.loadTexture('RenderTexture', {
917
+ this.texture = this.stage.txManager.createTexture('RenderTexture', {
890
918
  width: this.width,
891
919
  height: this.height,
892
920
  });
893
- this.textureOptions.preload = true;
894
921
  this.setUpdateType(UpdateType.RenderTexture);
895
922
  }
896
923
  }
@@ -903,11 +930,10 @@ export class CoreNode extends EventEmitter {
903
930
  this.props.height = value;
904
931
  this.setUpdateType(UpdateType.Local);
905
932
  if (this.props.rtt) {
906
- this.texture = this.stage.txManager.loadTexture('RenderTexture', {
933
+ this.texture = this.stage.txManager.createTexture('RenderTexture', {
907
934
  width: this.width,
908
935
  height: this.height,
909
936
  });
910
- this.textureOptions.preload = true;
911
937
  this.setUpdateType(UpdateType.RenderTexture);
912
938
  }
913
939
  }
@@ -1195,12 +1221,27 @@ export class CoreNode extends EventEmitter {
1195
1221
  }
1196
1222
  }
1197
1223
  initRenderTexture() {
1198
- this.texture = this.stage.txManager.loadTexture('RenderTexture', {
1224
+ this.texture = this.stage.txManager.createTexture('RenderTexture', {
1199
1225
  width: this.width,
1200
1226
  height: this.height,
1201
1227
  });
1202
- this.textureOptions.preload = true;
1203
- this.stage.renderer?.renderToTexture(this); // Only this RTT node
1228
+ this.loadRenderTexture();
1229
+ }
1230
+ loadRenderTexture() {
1231
+ if (this.texture === null) {
1232
+ return;
1233
+ }
1234
+ // If the texture is already loaded, render to it immediately
1235
+ if (this.texture.state === 'loaded') {
1236
+ this.stage.renderer?.renderToTexture(this);
1237
+ return;
1238
+ }
1239
+ // call load immediately to ensure the texture is created
1240
+ this.stage.txManager.loadTexture(this.texture, true);
1241
+ this.texture.once('loaded', () => {
1242
+ this.stage.renderer?.renderToTexture(this); // Only this RTT node
1243
+ this.setUpdateType(UpdateType.IsRenderable);
1244
+ });
1204
1245
  }
1205
1246
  cleanupRenderTexture() {
1206
1247
  this.unloadTexture();
@@ -1263,7 +1304,7 @@ export class CoreNode extends EventEmitter {
1263
1304
  this.texture = null;
1264
1305
  return;
1265
1306
  }
1266
- this.texture = this.stage.txManager.loadTexture('ImageTexture', {
1307
+ this.texture = this.stage.txManager.createTexture('ImageTexture', {
1267
1308
  src: imageUrl,
1268
1309
  width: this.props.width,
1269
1310
  height: this.props.height,
@@ -1345,8 +1386,8 @@ export class CoreNode extends EventEmitter {
1345
1386
  this.unloadTexture();
1346
1387
  }
1347
1388
  this.props.texture = value;
1348
- if (value) {
1349
- value.setRenderableOwner(this, this.isRenderable);
1389
+ if (value !== null) {
1390
+ value.setRenderableOwner(this, this.isRenderable); // WVB TODO: check if this is correct
1350
1391
  this.loadTexture();
1351
1392
  }
1352
1393
  this.setUpdateType(UpdateType.IsRenderable);
@@ -1370,9 +1411,7 @@ export class CoreNode extends EventEmitter {
1370
1411
  }
1371
1412
  animate(props, settings) {
1372
1413
  const animation = new CoreAnimation(this, props, settings);
1373
- // eslint-disable-next-line @typescript-eslint/no-unsafe-assignment, @typescript-eslint/no-unsafe-call
1374
1414
  const controller = new CoreAnimationController(this.stage.animationManager, animation);
1375
- // eslint-disable-next-line @typescript-eslint/no-unsafe-return
1376
1415
  return controller;
1377
1416
  }
1378
1417
  flush() {