Skip to content

Commit 2bdb8b7

Browse files
authored
Support for Tree Shakable Canvas/WebGL renderer and Font Engines (#348)
* Expose Canvas and WebGL Core Renderers under `@lightningjs/renderer/webgl` and `@lightningjs/renderer/canvas` respectively * Allow RendererMain config to accept a `renderEngine` parameter where the core renderers can be provided * Expose SDF Text Renderer and CanvasTextRenderer under canvas/webgl exports. * Allow RendererMain config to accept an array of `fontEngines` where you can provide 1 or 2 Font Engines. * Fallback with Canvas still works IF Canvas Text Renderer is provided * Drop memize dependency to reduce overall bundle size, apply simple caching instead Todo: - [x] Check tests, see if text renderer override still works - [x] Run through some of the resolve code again to make sure we're not introducing new bottlenecks In my tests the simple benchmark app went down by `20 kb` by just using 1 font engine to `40 kb` when only using canvas and canvas rendering. Note: This is a breaking init change, handle with care.
2 parents 7c0a19b + fed55d9 commit 2bdb8b7

File tree

15 files changed

+318
-134
lines changed

15 files changed

+318
-134
lines changed

README.md

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -103,10 +103,18 @@ import {
103103
SdfTrFontFace,
104104
} from '@lightningjs/renderer';
105105

106+
import {
107+
WebGlCoreRenderer,
108+
SdfTextRenderer,
109+
} from '@lightningjs/renderer/webgl';
110+
import { CanvasTextRenderer } from '@lightningjs/renderer/canvas';
111+
106112
const renderer = new RendererMain(
107113
{
108114
appWidth: 1920,
109115
appHeight: 1080,
116+
renderEngine: WebGlCoreRenderer,
117+
fontEngines: [SdfTextRenderer, CanvasTextRenderer],
110118
// ...Other Renderer Config
111119
},
112120
'app', // id of div to insert Canvas.
@@ -128,3 +136,12 @@ renderer.stage.fontManager.addFontFace(
128136
),
129137
);
130138
```
139+
140+
Please note that the WebGL renderer supports both SDF Fonts and Web Fonts, however the
141+
Canvas renderer only supports Web Fonts:
142+
143+
| Font Type Renderer | SDF Font | Web Font |
144+
| ------------------ | -------- | -------- |
145+
| WebGL | Y | Y |
146+
| Canvas | N | Y |
147+
| | | |

examples/index.ts

Lines changed: 12 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,15 @@ import {
2323
type RendererMainSettings,
2424
type FpsUpdatePayload,
2525
} from '@lightningjs/renderer';
26+
import {
27+
WebGlCoreRenderer,
28+
SdfTextRenderer,
29+
} from '@lightningjs/renderer/webgl';
30+
import {
31+
CanvasCoreRenderer,
32+
CanvasTextRenderer,
33+
} from '@lightningjs/renderer/canvas';
34+
2635
import { assertTruthy } from '@lightningjs/renderer/utils';
2736
import * as mt19937 from '@stdlib/random-base-mt19937';
2837
import type {
@@ -225,7 +234,9 @@ async function initRenderer(
225234
fpsUpdateInterval: logFps ? 1000 : 0,
226235
enableContextSpy,
227236
enableInspector,
228-
renderMode: renderMode as 'webgl' | 'canvas',
237+
renderEngine:
238+
renderMode === 'webgl' ? WebGlCoreRenderer : CanvasCoreRenderer,
239+
fontEngines: [SdfTextRenderer, CanvasTextRenderer],
229240
...customSettings,
230241
},
231242
'app',

examples/tests/text-canvas.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -71,7 +71,7 @@ export default async function test(settings: ExampleSettings) {
7171
] || 0xff0000ff;
7272
};
7373

74-
const spawn = (amount = 100) => {
74+
const spawn = (amount = 1) => {
7575
for (let i = 0; i < amount; i++) {
7676
renderNode(i.toString());
7777
}

exports/canvas.ts

Lines changed: 37 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,37 @@
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+
* Canvas Text Renderer
21+
*
22+
* @remarks
23+
* This module exports the Canvas Text Renderer for the Lightning 3 Renderer.
24+
* The Canvas Text Renderer is used to render text using the Canvas API,
25+
* this is slightly less performant than the SDF Text Renderer. However
26+
* the Canvas Text Renderer is more widely supported on older devices.
27+
*
28+
* You can import the exports from this module like so:
29+
* ```ts
30+
* import { CanvasTextRenderer } from '@lightning/renderer';
31+
* ```
32+
*
33+
* @packageDocumentation
34+
*/
35+
36+
export { CanvasTextRenderer } from '../src/core/text-rendering/renderers/CanvasTextRenderer.js';
37+
export { CanvasCoreRenderer } from '../src/core/renderers/canvas/CanvasCoreRenderer.js';

exports/index.ts

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -76,9 +76,7 @@ export type { ShaderProgramSources } from '../src/core/renderers/webgl/internal/
7676
export * from '../src/core/textures/Texture.js';
7777

7878
// Text Rendering & Fonts
79-
export * from '../src/core/text-rendering/renderers/TextRenderer.js';
80-
export * from '../src/core/text-rendering/renderers/CanvasTextRenderer.js';
81-
export * from '../src/core/text-rendering/renderers/SdfTextRenderer/SdfTextRenderer.js';
79+
// export * from '../src/core/text-rendering/renderers/TextRenderer.js';
8280
export * from '../src/core/text-rendering/font-face-types/TrFontFace.js';
8381
export * from '../src/core/text-rendering/font-face-types/WebTrFontFace.js';
8482
export * from '../src/core/text-rendering/font-face-types/SdfTrFontFace/SdfTrFontFace.js';

exports/webgl.ts

Lines changed: 38 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,38 @@
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+
* SDF Font renderer
21+
*
22+
* @remarks
23+
* This module exports the SDF Font renderer for the Lightning 3 Renderer.
24+
* The SDF Font renderer is used to render text using Single-Channel Signed
25+
* Distance Field (SSDF) fonts or Multi-Channel Signed Distance Field (MSDF)
26+
* fonts. The SDF font renderer is used to render text in a way that is
27+
* optimized for GPU rendering.
28+
*
29+
* You can import the exports from this module like so:
30+
* ```ts
31+
* import { SdfTextRenderer } from '@lightning/renderer';
32+
* ```
33+
*
34+
* @packageDocumentation
35+
*/
36+
37+
export { SdfTextRenderer } from '../src/core/text-rendering/renderers/SdfTextRenderer/SdfTextRenderer.js';
38+
export { WebGlCoreRenderer } from '../src/core/renderers/webgl/WebGlCoreRenderer.js';

package.json

Lines changed: 3 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,9 @@
66
"main": "./dist/exports/index.js",
77
"exports": {
88
".": "./dist/exports/index.js",
9-
"./utils": "./dist/exports/utils.js"
9+
"./utils": "./dist/exports/utils.js",
10+
"./canvas": "./dist/exports/canvas.js",
11+
"./webgl": "./dist/exports/webgl.js"
1012
},
1113
"scripts": {
1214
"preinstall": "node scripts/please-use-pnpm.js",
@@ -63,10 +65,6 @@
6365
"vitest": "^1.6.0",
6466
"vitest-mock-extended": "^1.3.1"
6567
},
66-
"dependencies": {
67-
"@protobufjs/eventemitter": "^1.1.0",
68-
"memize": "^2.1.0"
69-
},
7068
"lint-staged": {
7169
"*.ts": [
7270
"prettier --write",

pnpm-lock.yaml

Lines changed: 0 additions & 15 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

0 commit comments

Comments
 (0)