@lightningjs/renderer 0.7.4 → 0.7.6

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 (228) hide show
  1. package/LICENSE +202 -202
  2. package/NOTICE +3 -3
  3. package/README.md +229 -221
  4. package/dist/src/common/CommonTypes.d.ts +6 -0
  5. package/dist/src/core/CoreNode.d.ts +25 -4
  6. package/dist/src/core/CoreNode.js +158 -25
  7. package/dist/src/core/CoreNode.js.map +1 -1
  8. package/dist/src/core/CoreTextNode.d.ts +1 -1
  9. package/dist/src/core/CoreTextNode.js +18 -10
  10. package/dist/src/core/CoreTextNode.js.map +1 -1
  11. package/dist/src/core/CoreTextureManager.d.ts +3 -1
  12. package/dist/src/core/CoreTextureManager.js +9 -2
  13. package/dist/src/core/CoreTextureManager.js.map +1 -1
  14. package/dist/src/core/Stage.d.ts +2 -0
  15. package/dist/src/core/Stage.js +9 -1
  16. package/dist/src/core/Stage.js.map +1 -1
  17. package/dist/src/core/lib/ImageWorker.d.ts +0 -1
  18. package/dist/src/core/lib/ImageWorker.js +55 -40
  19. package/dist/src/core/lib/ImageWorker.js.map +1 -1
  20. package/dist/src/core/lib/RenderCoords.d.ts +13 -0
  21. package/dist/src/core/lib/RenderCoords.js +63 -0
  22. package/dist/src/core/lib/RenderCoords.js.map +1 -0
  23. package/dist/src/core/lib/WebGlContext.d.ts +414 -0
  24. package/dist/src/core/lib/WebGlContext.js +640 -0
  25. package/dist/src/core/lib/WebGlContext.js.map +1 -0
  26. package/dist/src/core/lib/utils.d.ts +1 -0
  27. package/dist/src/core/lib/utils.js +6 -0
  28. package/dist/src/core/lib/utils.js.map +1 -1
  29. package/dist/src/core/renderers/webgl/WebGlCoreCtxTexture.js +4 -1
  30. package/dist/src/core/renderers/webgl/WebGlCoreCtxTexture.js.map +1 -1
  31. package/dist/src/core/renderers/webgl/internal/RendererUtils.d.ts +9 -0
  32. package/dist/src/core/renderers/webgl/internal/RendererUtils.js +14 -0
  33. package/dist/src/core/renderers/webgl/internal/RendererUtils.js.map +1 -1
  34. package/dist/src/core/renderers/webgl/shaders/DefaultShader.js +47 -47
  35. package/dist/src/core/renderers/webgl/shaders/DefaultShaderBatched.js +61 -61
  36. package/dist/src/core/renderers/webgl/shaders/DynamicShader.js +93 -93
  37. package/dist/src/core/renderers/webgl/shaders/RoundedRectangle.js +63 -63
  38. package/dist/src/core/renderers/webgl/shaders/SdfShader.js +49 -49
  39. package/dist/src/core/renderers/webgl/shaders/effects/BorderBottomEffect.js +15 -15
  40. package/dist/src/core/renderers/webgl/shaders/effects/BorderEffect.js +5 -5
  41. package/dist/src/core/renderers/webgl/shaders/effects/BorderLeftEffect.js +15 -15
  42. package/dist/src/core/renderers/webgl/shaders/effects/BorderRightEffect.js +15 -15
  43. package/dist/src/core/renderers/webgl/shaders/effects/BorderTopEffect.js +15 -15
  44. package/dist/src/core/renderers/webgl/shaders/effects/FadeOutEffect.js +42 -42
  45. package/dist/src/core/renderers/webgl/shaders/effects/GlitchEffect.js +44 -44
  46. package/dist/src/core/renderers/webgl/shaders/effects/GrayscaleEffect.js +3 -3
  47. package/dist/src/core/renderers/webgl/shaders/effects/LinearGradientEffect.js +31 -31
  48. package/dist/src/core/renderers/webgl/shaders/effects/RadialGradientEffect.js +13 -13
  49. package/dist/src/core/renderers/webgl/shaders/effects/RadialProgressEffect.js +37 -37
  50. package/dist/src/core/renderers/webgl/shaders/effects/RadiusEffect.js +19 -19
  51. package/dist/src/core/scene/Scene.d.ts +59 -0
  52. package/dist/src/core/scene/Scene.js +106 -0
  53. package/dist/src/core/scene/Scene.js.map +1 -0
  54. package/dist/src/core/text-rendering/TrFontManager.js +76 -27
  55. package/dist/src/core/text-rendering/TrFontManager.js.map +1 -1
  56. package/dist/src/core/text-rendering/renderers/CanvasTextRenderer.js +8 -2
  57. package/dist/src/core/text-rendering/renderers/CanvasTextRenderer.js.map +1 -1
  58. package/dist/src/core/text-rendering/renderers/SdfTextRenderer/SdfTextRenderer.d.ts +1 -0
  59. package/dist/src/core/text-rendering/renderers/SdfTextRenderer/SdfTextRenderer.js +13 -3
  60. package/dist/src/core/text-rendering/renderers/SdfTextRenderer/SdfTextRenderer.js.map +1 -1
  61. package/dist/src/core/text-rendering/renderers/SdfTextRenderer/internal/findNearestMultiple.d.ts +8 -0
  62. package/dist/src/core/text-rendering/renderers/SdfTextRenderer/internal/findNearestMultiple.js +29 -0
  63. package/dist/src/core/text-rendering/renderers/SdfTextRenderer/internal/findNearestMultiple.js.map +1 -0
  64. package/dist/src/core/text-rendering/renderers/SdfTextRenderer/internal/layoutText2/SdfBufferHelper.d.ts +19 -0
  65. package/dist/src/core/text-rendering/renderers/SdfTextRenderer/internal/layoutText2/SdfBufferHelper.js +84 -0
  66. package/dist/src/core/text-rendering/renderers/SdfTextRenderer/internal/layoutText2/SdfBufferHelper.js.map +1 -0
  67. package/dist/src/core/text-rendering/renderers/SdfTextRenderer/internal/layoutText2/layoutLine.d.ts +8 -0
  68. package/dist/src/core/text-rendering/renderers/SdfTextRenderer/internal/layoutText2/layoutLine.js +40 -0
  69. package/dist/src/core/text-rendering/renderers/SdfTextRenderer/internal/layoutText2/layoutLine.js.map +1 -0
  70. package/dist/src/core/text-rendering/renderers/SdfTextRenderer/internal/layoutText2/layoutText2.d.ts +2 -0
  71. package/dist/src/core/text-rendering/renderers/SdfTextRenderer/internal/layoutText2/layoutText2.js +41 -0
  72. package/dist/src/core/text-rendering/renderers/SdfTextRenderer/internal/layoutText2/layoutText2.js.map +1 -0
  73. package/dist/src/core/text-rendering/renderers/SdfTextRenderer/internal/layoutText2/utils.d.ts +1 -0
  74. package/dist/src/core/text-rendering/renderers/SdfTextRenderer/internal/layoutText2/utils.js +4 -0
  75. package/dist/src/core/text-rendering/renderers/SdfTextRenderer/internal/layoutText2/utils.js.map +1 -0
  76. package/dist/src/core/text-rendering/renderers/SdfTextRenderer/internal/layoutText2.d.ts +1 -0
  77. package/dist/src/core/text-rendering/renderers/SdfTextRenderer/internal/layoutText2.js +2 -0
  78. package/dist/src/core/text-rendering/renderers/SdfTextRenderer/internal/layoutText2.js.map +1 -0
  79. package/dist/src/core/text-rendering/renderers/SdfTextRenderer/internal/makeRenderWindow.d.ts +20 -0
  80. package/dist/src/core/text-rendering/renderers/SdfTextRenderer/internal/makeRenderWindow.js +55 -0
  81. package/dist/src/core/text-rendering/renderers/SdfTextRenderer/internal/makeRenderWindow.js.map +1 -0
  82. package/dist/src/core/text-rendering/renderers/SdfTextRenderer/internal/roundUpToMultiple.d.ts +9 -0
  83. package/dist/src/core/text-rendering/renderers/SdfTextRenderer/internal/roundUpToMultiple.js +32 -0
  84. package/dist/src/core/text-rendering/renderers/SdfTextRenderer/internal/roundUpToMultiple.js.map +1 -0
  85. package/dist/src/core/text-rendering/renderers/TextRenderer.d.ts +12 -0
  86. package/dist/src/core/text-rendering/renderers/TextRenderer.js.map +1 -1
  87. package/dist/src/core/textures/ImageTexture.js +16 -2
  88. package/dist/src/core/textures/ImageTexture.js.map +1 -1
  89. package/dist/src/core/textures/Texture.d.ts +1 -1
  90. package/dist/src/core/textures/Texture.js.map +1 -1
  91. package/dist/src/core/utils.d.ts +1 -1
  92. package/dist/src/main-api/INode.d.ts +27 -0
  93. package/dist/src/main-api/Inspector.js +20 -15
  94. package/dist/src/main-api/Inspector.js.map +1 -1
  95. package/dist/src/main-api/RendererMain.d.ts +6 -0
  96. package/dist/src/main-api/RendererMain.js +4 -0
  97. package/dist/src/main-api/RendererMain.js.map +1 -1
  98. package/dist/src/render-drivers/main/MainCoreDriver.js +1 -0
  99. package/dist/src/render-drivers/main/MainCoreDriver.js.map +1 -1
  100. package/dist/src/render-drivers/main/MainOnlyNode.d.ts +8 -1
  101. package/dist/src/render-drivers/main/MainOnlyNode.js +32 -0
  102. package/dist/src/render-drivers/main/MainOnlyNode.js.map +1 -1
  103. package/dist/src/render-drivers/threadx/ThreadXCoreDriver.js +1 -0
  104. package/dist/src/render-drivers/threadx/ThreadXCoreDriver.js.map +1 -1
  105. package/dist/src/render-drivers/threadx/ThreadXMainNode.d.ts +4 -1
  106. package/dist/src/render-drivers/threadx/ThreadXMainNode.js +8 -0
  107. package/dist/src/render-drivers/threadx/ThreadXMainNode.js.map +1 -1
  108. package/dist/src/render-drivers/threadx/ThreadXRendererMessage.d.ts +1 -0
  109. package/dist/src/render-drivers/threadx/ThreadXRendererMessage.js.map +1 -1
  110. package/dist/src/render-drivers/threadx/worker/renderer.js +1 -0
  111. package/dist/src/render-drivers/threadx/worker/renderer.js.map +1 -1
  112. package/dist/src/render-drivers/utils.d.ts +2 -0
  113. package/dist/src/render-drivers/utils.js +28 -0
  114. package/dist/src/render-drivers/utils.js.map +1 -1
  115. package/dist/tsconfig.dist.tsbuildinfo +1 -1
  116. package/exports/core-api.ts +102 -102
  117. package/exports/main-api.ts +60 -60
  118. package/exports/utils.ts +41 -41
  119. package/package.json +1 -1
  120. package/scripts/please-use-pnpm.js +13 -13
  121. package/src/common/CommonTypes.ts +125 -113
  122. package/src/common/EventEmitter.ts +77 -77
  123. package/src/common/IAnimationController.ts +29 -29
  124. package/src/core/CoreExtension.ts +32 -32
  125. package/src/core/CoreNode.ts +1114 -926
  126. package/src/core/CoreShaderManager.ts +243 -243
  127. package/src/core/CoreTextNode.ts +399 -391
  128. package/src/core/CoreTextureManager.ts +337 -326
  129. package/src/core/Stage.ts +365 -354
  130. package/src/core/animations/AnimationManager.ts +38 -38
  131. package/src/core/animations/CoreAnimation.ts +181 -181
  132. package/src/core/animations/CoreAnimationController.ts +148 -148
  133. package/src/core/lib/ContextSpy.ts +41 -41
  134. package/src/core/lib/ImageWorker.ts +149 -135
  135. package/src/core/lib/Matrix3d.ts +290 -290
  136. package/src/core/lib/RenderCoords.ts +86 -0
  137. package/src/core/lib/WebGlContextWrapper.ts +992 -992
  138. package/src/core/lib/textureCompression.ts +152 -152
  139. package/src/core/lib/utils.ts +250 -241
  140. package/src/core/platform.ts +46 -46
  141. package/src/core/renderers/CoreContextTexture.ts +30 -30
  142. package/src/core/renderers/CoreRenderOp.ts +22 -22
  143. package/src/core/renderers/CoreRenderer.ts +63 -63
  144. package/src/core/renderers/CoreShader.ts +41 -41
  145. package/src/core/renderers/webgl/WebGlCoreCtxSubTexture.ts +37 -37
  146. package/src/core/renderers/webgl/WebGlCoreCtxTexture.ts +233 -230
  147. package/src/core/renderers/webgl/WebGlCoreRenderOp.ts +107 -107
  148. package/src/core/renderers/webgl/WebGlCoreRenderer.ts +520 -520
  149. package/src/core/renderers/webgl/WebGlCoreShader.ts +337 -337
  150. package/src/core/renderers/webgl/internal/BufferCollection.ts +54 -54
  151. package/src/core/renderers/webgl/internal/RendererUtils.ts +148 -131
  152. package/src/core/renderers/webgl/internal/ShaderUtils.ts +136 -136
  153. package/src/core/renderers/webgl/internal/WebGlUtils.ts +35 -35
  154. package/src/core/renderers/webgl/shaders/DefaultShader.ts +95 -95
  155. package/src/core/renderers/webgl/shaders/DefaultShaderBatched.ts +132 -132
  156. package/src/core/renderers/webgl/shaders/DynamicShader.ts +474 -474
  157. package/src/core/renderers/webgl/shaders/RoundedRectangle.ts +161 -161
  158. package/src/core/renderers/webgl/shaders/SdfShader.ts +174 -174
  159. package/src/core/renderers/webgl/shaders/effects/BorderBottomEffect.ts +101 -101
  160. package/src/core/renderers/webgl/shaders/effects/BorderEffect.ts +86 -86
  161. package/src/core/renderers/webgl/shaders/effects/BorderLeftEffect.ts +101 -101
  162. package/src/core/renderers/webgl/shaders/effects/BorderRightEffect.ts +101 -101
  163. package/src/core/renderers/webgl/shaders/effects/BorderTopEffect.ts +101 -101
  164. package/src/core/renderers/webgl/shaders/effects/EffectUtils.ts +33 -33
  165. package/src/core/renderers/webgl/shaders/effects/FadeOutEffect.ts +135 -135
  166. package/src/core/renderers/webgl/shaders/effects/GlitchEffect.ts +145 -145
  167. package/src/core/renderers/webgl/shaders/effects/GrayscaleEffect.ts +67 -67
  168. package/src/core/renderers/webgl/shaders/effects/LinearGradientEffect.ts +176 -176
  169. package/src/core/renderers/webgl/shaders/effects/RadialGradientEffect.ts +159 -159
  170. package/src/core/renderers/webgl/shaders/effects/RadialProgressEffect.ts +186 -186
  171. package/src/core/renderers/webgl/shaders/effects/RadiusEffect.ts +121 -121
  172. package/src/core/renderers/webgl/shaders/effects/ShaderEffect.ts +114 -114
  173. package/src/core/text-rendering/TextTextureRendererUtils.ts +189 -189
  174. package/src/core/text-rendering/TrFontManager.ts +170 -96
  175. package/src/core/text-rendering/font-face-types/SdfTrFontFace/SdfTrFontFace.ts +141 -141
  176. package/src/core/text-rendering/font-face-types/SdfTrFontFace/internal/FontShaper.ts +139 -139
  177. package/src/core/text-rendering/font-face-types/SdfTrFontFace/internal/SdfFontShaper.test.ts +173 -173
  178. package/src/core/text-rendering/font-face-types/SdfTrFontFace/internal/SdfFontShaper.ts +169 -169
  179. package/src/core/text-rendering/font-face-types/TrFontFace.ts +105 -105
  180. package/src/core/text-rendering/font-face-types/WebTrFontFace.ts +77 -77
  181. package/src/core/text-rendering/renderers/CanvasTextRenderer.ts +757 -751
  182. package/src/core/text-rendering/renderers/LightningTextTextureRenderer.ts +741 -741
  183. package/src/core/text-rendering/renderers/SdfTextRenderer/SdfTextRenderer.ts +784 -775
  184. package/src/core/text-rendering/renderers/SdfTextRenderer/internal/PeekableGenerator.test.ts +48 -48
  185. package/src/core/text-rendering/renderers/SdfTextRenderer/internal/PeekableGenerator.ts +66 -66
  186. package/src/core/text-rendering/renderers/SdfTextRenderer/internal/SpecialCodepoints.ts +52 -52
  187. package/src/core/text-rendering/renderers/SdfTextRenderer/internal/constants.ts +32 -32
  188. package/src/core/text-rendering/renderers/SdfTextRenderer/internal/getStartConditions.ts +84 -84
  189. package/src/core/text-rendering/renderers/SdfTextRenderer/internal/getUnicodeCodepoints.test.ts +133 -133
  190. package/src/core/text-rendering/renderers/SdfTextRenderer/internal/getUnicodeCodepoints.ts +38 -38
  191. package/src/core/text-rendering/renderers/SdfTextRenderer/internal/layoutText.ts +393 -393
  192. package/src/core/text-rendering/renderers/SdfTextRenderer/internal/measureText.test.ts +49 -49
  193. package/src/core/text-rendering/renderers/SdfTextRenderer/internal/measureText.ts +51 -51
  194. package/src/core/text-rendering/renderers/SdfTextRenderer/internal/setRenderWindow.test.ts +205 -205
  195. package/src/core/text-rendering/renderers/SdfTextRenderer/internal/setRenderWindow.ts +93 -93
  196. package/src/core/text-rendering/renderers/SdfTextRenderer/internal/util.ts +40 -40
  197. package/src/core/text-rendering/renderers/TextRenderer.ts +516 -504
  198. package/src/core/textures/ColorTexture.ts +86 -86
  199. package/src/core/textures/ImageTexture.ts +154 -140
  200. package/src/core/textures/NoiseTexture.ts +96 -96
  201. package/src/core/textures/SubTexture.ts +143 -143
  202. package/src/core/textures/Texture.ts +224 -218
  203. package/src/core/utils.ts +224 -224
  204. package/src/env.d.ts +7 -7
  205. package/src/main-api/ICoreDriver.ts +66 -66
  206. package/src/main-api/INode.ts +499 -470
  207. package/src/main-api/Inspector.ts +439 -432
  208. package/src/main-api/RendererMain.ts +659 -649
  209. package/src/main-api/texture-usage-trackers/FinalizationRegistryTextureUsageTracker.ts +45 -45
  210. package/src/main-api/texture-usage-trackers/ManualCountTextureUsageTracker.ts +154 -154
  211. package/src/main-api/texture-usage-trackers/TextureUsageTracker.ts +54 -54
  212. package/src/render-drivers/main/MainCoreDriver.ts +149 -148
  213. package/src/render-drivers/main/MainOnlyNode.ts +494 -453
  214. package/src/render-drivers/main/MainOnlyTextNode.ts +261 -261
  215. package/src/render-drivers/threadx/NodeStruct.ts +300 -300
  216. package/src/render-drivers/threadx/SharedNode.ts +97 -97
  217. package/src/render-drivers/threadx/TextNodeStruct.ts +211 -211
  218. package/src/render-drivers/threadx/ThreadXCoreDriver.ts +286 -285
  219. package/src/render-drivers/threadx/ThreadXMainAnimationController.ts +99 -99
  220. package/src/render-drivers/threadx/ThreadXMainNode.ts +192 -178
  221. package/src/render-drivers/threadx/ThreadXMainTextNode.ts +85 -85
  222. package/src/render-drivers/threadx/ThreadXRendererMessage.ts +111 -110
  223. package/src/render-drivers/threadx/worker/ThreadXRendererNode.ts +238 -238
  224. package/src/render-drivers/threadx/worker/ThreadXRendererTextNode.ts +149 -149
  225. package/src/render-drivers/threadx/worker/renderer.ts +152 -151
  226. package/src/render-drivers/utils.ts +97 -57
  227. package/src/utils.ts +207 -207
  228. package/COPYING +0 -1
package/README.md CHANGED
@@ -1,221 +1,229 @@
1
- # Lightning 3 Renderer (Beta)
2
-
3
- **Warning: This is beta software and all of the exposed APIs are subject to
4
- breaking changes**
5
-
6
- A powerful 2D scene renderer designed for rendering highly performant user
7
- interfaces on web browsers running on embedded devices using WebGL.
8
-
9
- The Renderer is not designed for direct application development but instead
10
- to provide a lightweight API for front-end application frameworks like Bolt and
11
- Solid.
12
-
13
- ## Setup & Commands
14
-
15
- ```
16
- # Install renderer + example dependencies
17
- pnpm install
18
-
19
- # Build Renderer
20
- pnpm build
21
-
22
- # Build Renderer (watch mode)
23
- pnpm watch
24
-
25
- # Run unit tests
26
- pnpm test
27
-
28
- # Run Visual Regression Tests
29
- pnpm test:visual
30
-
31
- # Build API Documentation (builds into ./typedocs folder)
32
- pnpm typedoc
33
-
34
- # Launch Example Tests in dev mode (includes Build Renderer (watch mode))
35
- pnpm start
36
-
37
- # Launch Example Tests in production mode
38
- # IMPORTANT: To run test examples on embedded devices that use older browser versions
39
- # you MUST run the examples in this mode.
40
- pnpm start:prod
41
- ```
42
-
43
- ## Example Tests
44
-
45
- The Example Tests sub-project define a set of tests for various Renderer
46
- features. This is NOT an automated test. The command below will launch a
47
- web server which can be accessed by a web browser for manual testing. However,
48
- many of the Example Tests define Snapshots for the Visual Regression Test Runner
49
- (see below).
50
-
51
- The Example Tests can be launched with:
52
-
53
- ```
54
- pnpm start
55
- ```
56
-
57
- See [examples/README.md](./examples/README.md) for more info.
58
-
59
- ## Visual Regression Tests
60
-
61
- In order to prevent bugs on existing Renderer features when new features or bug
62
- fixes are added, the Renderer includes a Visual Regression Test Runner along
63
- with a set of certified snapshot files that are checked into the repository.
64
-
65
- These tests can be launched with:
66
-
67
- ```
68
- pnpm test:visual
69
- ```
70
-
71
- The captured Snapshots of these tests are optionally defined in the individual
72
- Example Tests.
73
-
74
- See [visual-regression/README.md](./visual-regression/README.md) for more info.
75
-
76
- ## Release Procedure
77
-
78
- See [RELEASE.md](./RELEASE.md)
79
-
80
- ## Main Space vs Core Space
81
-
82
- The Lightning 3 Renderer runs code in two logically seperate environments:
83
- the **Main Space** and the **Core Space**.
84
-
85
- Users of the Renderer will write most of their code for the Main Space using
86
- the **Main API**. This is code that will always run on the browser's main thread
87
- and includes initializing the Renderer, creating/modifying/destroying nodes,
88
- controlling animations, etc.
89
-
90
- The Core Space is where the actual rendering of each UI frame happens and is
91
- mostly meant to be transparent to users of the Renderer. However, the Core Space
92
- is where all of the code that must be tightly coupled to the rendering process
93
- must be loaded and run. The Core Space is extendible by users by writing
94
- **Core Extensions** via the **Core API**. This allows for users to develop their
95
- own shaders, textures, text renderers, dynamic shader effects, and more. Fonts
96
- used in an application must be loaded in this way too. The Core Space exists
97
- seperately from the Main Space because it is allowed to execute on the page's
98
- main thread OR a Web Worker thread. A **Core Driver** (see below) is used to
99
- bridge the Main Space with the Core Space.
100
-
101
- ## Core Drivers
102
-
103
- The Lightning 3 Renderer is designed to be able to use a single thread or
104
- multiple web worker threads based on the configuration of a **Core Driver**.
105
-
106
- A Core Driver essentially acts as a bridge between the Main and Core spaces
107
- defined above.
108
-
109
- The Renderer comes with two Core Drivers: the Main Core Driver for single
110
- threaded rendering and the ThreadX Core Driver for multi-threaded rendering.
111
-
112
- NOTE: The ThreadX Core Driver is experimental and even when the Renderer
113
- graduates from beta may still not be ready for production use.
114
-
115
- ### Main Core Driver
116
-
117
- The Main Core Driver renders your application on the web page's main thread.
118
-
119
- It can be configured into the Renderer like so:
120
-
121
- ```ts
122
- import { MainCoreDriver, RendererMain } from '@lightningjs/renderer';
123
-
124
- const renderer = new RendererMain(
125
- {
126
- // App Config
127
- },
128
- 'app', // App div ID
129
- new MainCoreDriver(), // Main Render driver
130
- );
131
-
132
- // ...
133
- ```
134
-
135
- ### ThreadX Core Driver
136
-
137
- The ThreadX Core Driver renders your application on a seperately spawned
138
- Web Worker thread.
139
-
140
- It can be configured into the Renderer like so:
141
-
142
- ```ts
143
- import {
144
- ThreadXCoreDriver,
145
- RendererMain,
146
- } from '@lightningjs/renderer';
147
-
148
- // The `@lightningjs/vite-plugin-import-chunk-url` Vite plugin is required for this:
149
- import coreWorkerUrl from './common/CoreWorker.js?importChunkUrl';
150
-
151
- const renderer = new RendererMain(
152
- {
153
- // App Config
154
- },
155
- 'app', // App div ID
156
- new ThreadXCoreDriver({
157
- coreWorkerUrl,
158
- });
159
- );
160
- ```
161
-
162
- ## Core Extensions
163
-
164
- To load fonts, and/or other custom code into the Core Space, you must write a
165
- Core Extension and pass it via dynamically importable URL to the initialization
166
- of the Renderer.
167
-
168
- Just like with loading the ThreadX Core Web Worker for the ThreadX, you import
169
- your core extension using the `@lightningjs/vite-plugin-import-chunk-url` plugin so that
170
- it's code is bundled and loaded seperately from your main app's bundle.
171
-
172
- You can write a Core Extension by extending the CoreExtension class from the
173
- Core API like so:
174
-
175
- ```ts
176
- import {
177
- CoreExtension,
178
- WebTrFontFace,
179
- SdfTrFontFace,
180
- type Stage,
181
- } from '@lightning/renderer/core';
182
-
183
- export default class MyCoreExtension extends CoreExtension {
184
- async run(stage: Stage) {
185
- // Load fonts into core
186
- stage.fontManager.addFontFace(
187
- new WebTrFontFace('Ubuntu', {}, '/fonts/Ubuntu-Regular.ttf'),
188
- );
189
-
190
- stage.fontManager.addFontFace(
191
- new SdfTrFontFace(
192
- 'Ubuntu',
193
- {},
194
- 'msdf',
195
- stage,
196
- '/fonts/Ubuntu-Regular.msdf.png',
197
- '/fonts/Ubuntu-Regular.msdf.json',
198
- ),
199
- );
200
- }
201
- }
202
- ```
203
-
204
- And then in your application's main entry point you can import it using
205
- `@lightningjs/vite-plugin-import-chunk-url`:
206
-
207
- ```ts
208
- import coreExtensionModuleUrl from './MyCoreExtension.js?importChunkUrl';
209
-
210
- // Set up driver, etc.
211
-
212
- // Initialize the Renderer
213
- const renderer = new RendererMain(
214
- {
215
- // Other Renderer Config...
216
- coreExtensionModule: coreExtensionModuleUrl,
217
- },
218
- 'app',
219
- driver,
220
- );
221
- ```
1
+ # Lightning 3 Renderer (Beta)
2
+
3
+ **Warning: This is beta software and all of the exposed APIs are subject to
4
+ breaking changes**
5
+
6
+ A powerful 2D scene renderer designed for rendering highly performant user
7
+ interfaces on web browsers running on embedded devices using WebGL.
8
+
9
+ The Renderer is not designed for direct application development but instead
10
+ to provide a lightweight API for front-end application frameworks like Bolt and
11
+ Solid.
12
+
13
+ ## Setup & Commands
14
+
15
+ ```
16
+ # Install renderer + example dependencies
17
+ pnpm install
18
+
19
+ # Build Renderer
20
+ pnpm build
21
+
22
+ # Build Renderer (watch mode)
23
+ pnpm watch
24
+
25
+ # Run unit tests
26
+ pnpm test
27
+
28
+ # Run Visual Regression Tests
29
+ pnpm test:visual
30
+
31
+ # Build API Documentation (builds into ./typedocs folder)
32
+ pnpm typedoc
33
+
34
+ # Launch Example Tests in dev mode (includes Build Renderer (watch mode))
35
+ pnpm start
36
+
37
+ # Launch Example Tests in production mode
38
+ # IMPORTANT: To run test examples on embedded devices that use older browser versions
39
+ # you MUST run the examples in this mode.
40
+ pnpm start:prod
41
+ ```
42
+
43
+ ## Browser Targets
44
+
45
+ The Lightning 3 Renderer's goal is to work with the following browser versions and above:
46
+
47
+ - Chrome v38 (Released October 7, 2014)
48
+
49
+ 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.
50
+
51
+ ## Example Tests
52
+
53
+ The Example Tests sub-project define a set of tests for various Renderer
54
+ features. This is NOT an automated test. The command below will launch a
55
+ web server which can be accessed by a web browser for manual testing. However,
56
+ many of the Example Tests define Snapshots for the Visual Regression Test Runner
57
+ (see below).
58
+
59
+ The Example Tests can be launched with:
60
+
61
+ ```
62
+ pnpm start
63
+ ```
64
+
65
+ See [examples/README.md](./examples/README.md) for more info.
66
+
67
+ ## Visual Regression Tests
68
+
69
+ In order to prevent bugs on existing Renderer features when new features or bug
70
+ fixes are added, the Renderer includes a Visual Regression Test Runner along
71
+ with a set of certified snapshot files that are checked into the repository.
72
+
73
+ These tests can be launched with:
74
+
75
+ ```
76
+ pnpm test:visual
77
+ ```
78
+
79
+ The captured Snapshots of these tests are optionally defined in the individual
80
+ Example Tests.
81
+
82
+ See [visual-regression/README.md](./visual-regression/README.md) for more info.
83
+
84
+ ## Release Procedure
85
+
86
+ See [RELEASE.md](./RELEASE.md)
87
+
88
+ ## Main Space vs Core Space
89
+
90
+ The Lightning 3 Renderer runs code in two logically seperate environments:
91
+ the **Main Space** and the **Core Space**.
92
+
93
+ Users of the Renderer will write most of their code for the Main Space using
94
+ the **Main API**. This is code that will always run on the browser's main thread
95
+ and includes initializing the Renderer, creating/modifying/destroying nodes,
96
+ controlling animations, etc.
97
+
98
+ The Core Space is where the actual rendering of each UI frame happens and is
99
+ mostly meant to be transparent to users of the Renderer. However, the Core Space
100
+ is where all of the code that must be tightly coupled to the rendering process
101
+ must be loaded and run. The Core Space is extendible by users by writing
102
+ **Core Extensions** via the **Core API**. This allows for users to develop their
103
+ own shaders, textures, text renderers, dynamic shader effects, and more. Fonts
104
+ used in an application must be loaded in this way too. The Core Space exists
105
+ seperately from the Main Space because it is allowed to execute on the page's
106
+ main thread OR a Web Worker thread. A **Core Driver** (see below) is used to
107
+ bridge the Main Space with the Core Space.
108
+
109
+ ## Core Drivers
110
+
111
+ The Lightning 3 Renderer is designed to be able to use a single thread or
112
+ multiple web worker threads based on the configuration of a **Core Driver**.
113
+
114
+ A Core Driver essentially acts as a bridge between the Main and Core spaces
115
+ defined above.
116
+
117
+ The Renderer comes with two Core Drivers: the Main Core Driver for single
118
+ threaded rendering and the ThreadX Core Driver for multi-threaded rendering.
119
+
120
+ NOTE: The ThreadX Core Driver is experimental and even when the Renderer
121
+ graduates from beta may still not be ready for production use.
122
+
123
+ ### Main Core Driver
124
+
125
+ The Main Core Driver renders your application on the web page's main thread.
126
+
127
+ It can be configured into the Renderer like so:
128
+
129
+ ```ts
130
+ import { MainCoreDriver, RendererMain } from '@lightningjs/renderer';
131
+
132
+ const renderer = new RendererMain(
133
+ {
134
+ // App Config
135
+ },
136
+ 'app', // App div ID
137
+ new MainCoreDriver(), // Main Render driver
138
+ );
139
+
140
+ // ...
141
+ ```
142
+
143
+ ### ThreadX Core Driver
144
+
145
+ The ThreadX Core Driver renders your application on a seperately spawned
146
+ Web Worker thread.
147
+
148
+ It can be configured into the Renderer like so:
149
+
150
+ ```ts
151
+ import {
152
+ ThreadXCoreDriver,
153
+ RendererMain,
154
+ } from '@lightningjs/renderer';
155
+
156
+ // The `@lightningjs/vite-plugin-import-chunk-url` Vite plugin is required for this:
157
+ import coreWorkerUrl from './common/CoreWorker.js?importChunkUrl';
158
+
159
+ const renderer = new RendererMain(
160
+ {
161
+ // App Config
162
+ },
163
+ 'app', // App div ID
164
+ new ThreadXCoreDriver({
165
+ coreWorkerUrl,
166
+ });
167
+ );
168
+ ```
169
+
170
+ ## Core Extensions
171
+
172
+ To load fonts, and/or other custom code into the Core Space, you must write a
173
+ Core Extension and pass it via dynamically importable URL to the initialization
174
+ of the Renderer.
175
+
176
+ Just like with loading the ThreadX Core Web Worker for the ThreadX, you import
177
+ your core extension using the `@lightningjs/vite-plugin-import-chunk-url` plugin so that
178
+ it's code is bundled and loaded seperately from your main app's bundle.
179
+
180
+ You can write a Core Extension by extending the CoreExtension class from the
181
+ Core API like so:
182
+
183
+ ```ts
184
+ import {
185
+ CoreExtension,
186
+ WebTrFontFace,
187
+ SdfTrFontFace,
188
+ type Stage,
189
+ } from '@lightning/renderer/core';
190
+
191
+ export default class MyCoreExtension extends CoreExtension {
192
+ async run(stage: Stage) {
193
+ // Load fonts into core
194
+ stage.fontManager.addFontFace(
195
+ new WebTrFontFace('Ubuntu', {}, '/fonts/Ubuntu-Regular.ttf'),
196
+ );
197
+
198
+ stage.fontManager.addFontFace(
199
+ new SdfTrFontFace(
200
+ 'Ubuntu',
201
+ {},
202
+ 'msdf',
203
+ stage,
204
+ '/fonts/Ubuntu-Regular.msdf.png',
205
+ '/fonts/Ubuntu-Regular.msdf.json',
206
+ ),
207
+ );
208
+ }
209
+ }
210
+ ```
211
+
212
+ And then in your application's main entry point you can import it using
213
+ `@lightningjs/vite-plugin-import-chunk-url`:
214
+
215
+ ```ts
216
+ import coreExtensionModuleUrl from './MyCoreExtension.js?importChunkUrl';
217
+
218
+ // Set up driver, etc.
219
+
220
+ // Initialize the Renderer
221
+ const renderer = new RendererMain(
222
+ {
223
+ // Other Renderer Config...
224
+ coreExtensionModule: coreExtensionModuleUrl,
225
+ },
226
+ 'app',
227
+ driver,
228
+ );
229
+ ```
@@ -1,3 +1,4 @@
1
+ import type { CoreNodeRenderState } from '../core/CoreNode.js';
1
2
  /**
2
3
  * Types shared between Main Space and Core Space
3
4
  *
@@ -56,6 +57,11 @@ export type NodeLoadedEventHandler = (target: any, payload: NodeLoadedPayload) =
56
57
  * Event handler for when the texture/text of a node has failed to load
57
58
  */
58
59
  export type NodeFailedEventHandler = (target: any, payload: NodeFailedPayload) => void;
60
+ export type NodeRenderStatePayload = {
61
+ type: 'renderState';
62
+ payload: CoreNodeRenderState;
63
+ };
64
+ export type NodeRenderStateEventHandler = (target: any, payload: NodeRenderStatePayload) => void;
59
65
  /**
60
66
  * Event payload for when an FpsUpdate event is emitted by either the Stage or
61
67
  * MainRenderer
@@ -5,8 +5,15 @@ import type { CoreShader } from './renderers/CoreShader.js';
5
5
  import type { Stage } from './Stage.js';
6
6
  import type { Texture } from './textures/Texture.js';
7
7
  import { EventEmitter } from '../common/EventEmitter.js';
8
- import { type RectWithValid } from './lib/utils.js';
8
+ import { type Bound, type RectWithValid } from './lib/utils.js';
9
9
  import { Matrix3d } from './lib/Matrix3d.js';
10
+ import { RenderCoords } from './lib/RenderCoords.js';
11
+ export declare enum CoreNodeRenderState {
12
+ Init = 0,
13
+ OutOfBounds = 2,
14
+ InBounds = 4,
15
+ InViewport = 8
16
+ }
10
17
  export interface CoreNodeProps {
11
18
  id: number;
12
19
  x: number;
@@ -42,7 +49,7 @@ export interface CoreNodeProps {
42
49
  rotation: number;
43
50
  }
44
51
  type ICoreNode = Omit<CoreNodeProps, 'texture' | 'textureOptions' | 'shader' | 'shaderProps'>;
45
- declare enum UpdateType {
52
+ export declare enum UpdateType {
46
53
  /**
47
54
  * Child updates
48
55
  */
@@ -99,15 +106,19 @@ export declare class CoreNode extends EventEmitter implements ICoreNode {
99
106
  globalTransform?: Matrix3d;
100
107
  scaleRotateTransform?: Matrix3d;
101
108
  localTransform?: Matrix3d;
109
+ renderCoords?: RenderCoords;
110
+ renderBound?: Bound;
111
+ strictBound?: Bound;
112
+ preloadBound?: Bound;
102
113
  clippingRect: RectWithValid;
103
114
  isRenderable: boolean;
115
+ renderState: CoreNodeRenderState;
104
116
  worldAlpha: number;
105
117
  premultipliedColorTl: number;
106
118
  premultipliedColorTr: number;
107
119
  premultipliedColorBl: number;
108
120
  premultipliedColorBr: number;
109
121
  calcZIndex: number;
110
- private isComplex;
111
122
  constructor(stage: Stage, props: CoreNodeProps);
112
123
  loadTexture<Type extends keyof TextureMap>(textureType: Type, props: ExtractProps<TextureMap[Type]>, options?: TextureOptions | null): void;
113
124
  unloadTexture(): void;
@@ -131,7 +142,13 @@ export declare class CoreNode extends EventEmitter implements ICoreNode {
131
142
  * @param delta
132
143
  */
133
144
  update(delta: number, parentClippingRect: RectWithValid): void;
134
- checkIsRenderable(): boolean;
145
+ checkRenderProps(): boolean;
146
+ checkRenderBounds(): CoreNodeRenderState;
147
+ updateRenderState(): void;
148
+ setRenderState(state: CoreNodeRenderState): void;
149
+ updateIsRenderable(): false | undefined;
150
+ calculateRenderCoords(): void;
151
+ updateBoundingRect(): void;
135
152
  /**
136
153
  * This function calculates the clipping rectangle for a node.
137
154
  *
@@ -142,6 +159,10 @@ export declare class CoreNode extends EventEmitter implements ICoreNode {
142
159
  */
143
160
  calculateClippingRect(parentClippingRect: RectWithValid): void;
144
161
  calculateZIndex(): void;
162
+ /**
163
+ * Destroy the node and cleanup all resources
164
+ */
165
+ destroy(): void;
145
166
  renderQuads(renderer: CoreRenderer): void;
146
167
  get id(): number;
147
168
  get x(): number;