Skip to content

Commit 71b04d4

Browse files
authored
Added method to set clearColor during runtime (#451)
Provide a way to change the clearColor during runtime
2 parents e7d9a8c + 0c6054a commit 71b04d4

File tree

10 files changed

+134
-5
lines changed

10 files changed

+134
-5
lines changed
Lines changed: 70 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,70 @@
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+
import type { INode, RendererMain } from '@lightningjs/renderer';
21+
import type { ExampleSettings } from '../common/ExampleSettings.js';
22+
import { PageContainer } from '../common/PageContainer.js';
23+
24+
export async function automation(settings: ExampleSettings) {
25+
// Snapshot all the pages
26+
await (await test(settings)).snapshotPages();
27+
}
28+
29+
export default async function test(settings: ExampleSettings) {
30+
const { renderer } = settings;
31+
const pageContainer = new PageContainer(settings, {
32+
width: renderer.settings.appWidth,
33+
height: renderer.settings.appHeight,
34+
title: 'Dynamic Settings clearColor Tests',
35+
});
36+
37+
pageContainer.pushPage(createTestCase(renderer, 'red', 0xff0000ff));
38+
pageContainer.pushPage(createTestCase(renderer, 'green', 0x00ff00ff));
39+
pageContainer.pushPage(createTestCase(renderer, 'transparent', 0x00000000));
40+
41+
await delay(200);
42+
pageContainer.finalizePages();
43+
return pageContainer;
44+
}
45+
46+
function createTestCase(
47+
renderer: RendererMain,
48+
colorName: 'red' | 'green' | 'transparent',
49+
color: number,
50+
) {
51+
return async function (page: INode) {
52+
renderer.createTextNode({
53+
mount: 0.5,
54+
width: 400,
55+
height: 400,
56+
text: `Test passes if the background appears as ${colorName}`,
57+
fontFamily: 'Ubuntu',
58+
fontSize: 50,
59+
x: renderer.settings.appWidth / 2,
60+
y: renderer.settings.appHeight / 2,
61+
parent: page,
62+
});
63+
64+
renderer.setClearColor(color);
65+
};
66+
}
67+
68+
function delay(ms: number) {
69+
return new Promise((resolve) => setTimeout(resolve, ms));
70+
}

src/core/Stage.ts

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -266,6 +266,11 @@ export class Stage {
266266
}
267267
}
268268

269+
setClearColor(color: number) {
270+
this.renderer.updateClearColor(color);
271+
this.renderRequested = true;
272+
}
273+
269274
updateFrameTime() {
270275
const newFrameTime = getTimeStamp();
271276
this.lastFrameTime = this.currentFrameTime;

src/core/renderers/CoreRenderer.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -110,4 +110,5 @@ export abstract class CoreRenderer {
110110
abstract renderToTexture(node: CoreNode): void;
111111
abstract getBufferInfo(): BufferInfo | null;
112112
abstract getDefShaderCtr(): BaseShaderController;
113+
abstract updateClearColor(color: number): void;
113114
}

src/core/renderers/canvas/CanvasCoreRenderer.ts

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -331,4 +331,13 @@ export class CanvasCoreRenderer extends CoreRenderer {
331331
getBufferInfo(): null {
332332
return null;
333333
}
334+
335+
/**
336+
* Updates the clear color of the canvas renderer.
337+
*
338+
* @param color - The color to set as the clear color.
339+
*/
340+
updateClearColor(color: number) {
341+
this.clearColor = color ? getRgbaComponents(color) : undefined;
342+
}
334343
}

src/core/renderers/webgl/WebGlCoreRenderer.ts

Lines changed: 35 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -32,6 +32,7 @@ import {
3232
type CoreWebGlExtensions,
3333
getWebGlParameters,
3434
getWebGlExtensions,
35+
type WebGlColor,
3536
} from './internal/RendererUtils.js';
3637
import { WebGlCoreCtxTexture } from './WebGlCoreCtxTexture.js';
3738
import { Texture, TextureType } from '../../textures/Texture.js';
@@ -86,6 +87,11 @@ export class WebGlCoreRenderer extends CoreRenderer {
8687
defaultShader: WebGlCoreShader;
8788
quadBufferCollection: BufferCollection;
8889

90+
clearColor: WebGlColor = {
91+
raw: 0x00000000,
92+
normalized: [0, 0, 0, 0],
93+
};
94+
8995
/**
9096
* White pixel texture used by default when no texture is specified.
9197
*/
@@ -127,10 +133,10 @@ export class WebGlCoreRenderer extends CoreRenderer {
127133
options.contextSpy,
128134
);
129135
const glw = (this.glw = new WebGlContextWrapper(gl));
130-
131-
const color = getNormalizedRgbaComponents(clearColor);
132136
glw.viewport(0, 0, canvas.width, canvas.height);
133-
glw.clearColor(color[0]!, color[1]!, color[2]!, color[3]!);
137+
138+
this.updateClearColor(clearColor);
139+
134140
glw.setBlend(true);
135141
glw.blendFunc(glw.ONE, glw.ONE_MINUS_SRC_ALPHA);
136142

@@ -754,9 +760,9 @@ export class WebGlCoreRenderer extends CoreRenderer {
754760
node.hasRTTupdates = false;
755761
}
756762

757-
const color = getNormalizedRgbaComponents(this.stage.options.clearColor);
763+
const clearColor = this.clearColor.normalized;
758764
// Restore the default clear color
759-
glw.clearColor(color[0]!, color[1]!, color[2]!, color[3]!);
765+
glw.clearColor(clearColor[0], clearColor[1], clearColor[2], clearColor[3]);
760766

761767
// Bind the default framebuffer
762768
glw.bindFramebuffer(null);
@@ -784,4 +790,28 @@ export class WebGlCoreRenderer extends CoreRenderer {
784790
override getDefShaderCtr(): BaseShaderController {
785791
return this.defShaderCtrl;
786792
}
793+
794+
/**
795+
* Updates the WebGL context's clear color and clears the color buffer.
796+
*
797+
* @param color - The color to set as the clear color, represented as a 32-bit integer.
798+
*/
799+
updateClearColor(color: number) {
800+
if (this.clearColor.raw === color) {
801+
return;
802+
}
803+
const glw = this.glw;
804+
const normalizedColor = getNormalizedRgbaComponents(color);
805+
glw.clearColor(
806+
normalizedColor[0],
807+
normalizedColor[1],
808+
normalizedColor[2],
809+
normalizedColor[3],
810+
);
811+
this.clearColor = {
812+
raw: color,
813+
normalized: normalizedColor,
814+
};
815+
glw.clear();
816+
}
787817
}

src/core/renderers/webgl/internal/RendererUtils.ts

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -146,3 +146,8 @@ export function isHTMLImageElement(obj: unknown): obj is HTMLImageElement {
146146
obj.constructor.name === 'HTMLImageElement'
147147
);
148148
}
149+
150+
export interface WebGlColor {
151+
raw: number;
152+
normalized: [number, number, number, number];
153+
}

src/main-api/Renderer.ts

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -658,4 +658,13 @@ export class RendererMain extends EventEmitter {
658658
rerender() {
659659
throw new Error('Not implemented');
660660
}
661+
662+
/**
663+
* Sets the clear color for the stage.
664+
*
665+
* @param color - The color to set as the clear color.
666+
*/
667+
setClearColor(color: number) {
668+
this.stage.setClearColor(color);
669+
}
661670
}
22.5 KB
Loading
25.4 KB
Loading
29.8 KB
Loading

0 commit comments

Comments
 (0)