@lightningjs/renderer 3.0.0-beta20 → 3.0.0-beta22
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/dist/exports/index.d.ts +1 -0
- package/dist/exports/index.js +1 -0
- package/dist/exports/index.js.map +1 -1
- package/dist/src/common/CommonTypes.d.ts +2 -1
- package/dist/src/core/CoreNode.d.ts +53 -7
- package/dist/src/core/CoreNode.js +175 -65
- package/dist/src/core/CoreNode.js.map +1 -1
- package/dist/src/core/CoreTextNode.d.ts +1 -1
- package/dist/src/core/CoreTextNode.js +3 -5
- package/dist/src/core/CoreTextNode.js.map +1 -1
- package/dist/src/core/CoreTextureManager.js +1 -1
- package/dist/src/core/CoreTextureManager.js.map +1 -1
- package/dist/src/core/Stage.d.ts +2 -1
- package/dist/src/core/Stage.js +9 -7
- package/dist/src/core/Stage.js.map +1 -1
- package/dist/src/core/TextureMemoryManager.d.ts +1 -1
- package/dist/src/core/TextureMemoryManager.js +3 -3
- package/dist/src/core/TextureMemoryManager.js.map +1 -1
- package/dist/src/core/lib/ImageWorker.d.ts +2 -2
- package/dist/src/core/lib/ImageWorker.js +30 -11
- package/dist/src/core/lib/ImageWorker.js.map +1 -1
- package/dist/src/core/lib/WebGlContextWrapper.js +1 -1
- package/dist/src/core/lib/WebGlContextWrapper.js.map +1 -1
- package/dist/src/core/lib/utils.d.ts +6 -2
- package/dist/src/core/lib/utils.js +21 -21
- package/dist/src/core/lib/utils.js.map +1 -1
- package/dist/src/core/renderers/CoreRenderer.d.ts +1 -31
- package/dist/src/core/renderers/CoreRenderer.js.map +1 -1
- package/dist/src/core/renderers/CoreShaderNode.d.ts +4 -0
- package/dist/src/core/renderers/CoreShaderNode.js +15 -0
- package/dist/src/core/renderers/CoreShaderNode.js.map +1 -1
- package/dist/src/core/renderers/canvas/CanvasRenderer.d.ts +3 -3
- package/dist/src/core/renderers/canvas/CanvasRenderer.js +38 -33
- package/dist/src/core/renderers/canvas/CanvasRenderer.js.map +1 -1
- package/dist/src/core/renderers/canvas/CanvasShaderNode.d.ts +1 -2
- package/dist/src/core/renderers/canvas/CanvasShaderNode.js.map +1 -1
- package/dist/src/core/renderers/webgl/SdfRenderOp.d.ts +33 -0
- package/dist/src/core/renderers/webgl/SdfRenderOp.js +97 -0
- package/dist/src/core/renderers/webgl/SdfRenderOp.js.map +1 -0
- package/dist/src/core/renderers/webgl/WebGlCoreCtxTexture.js +1 -1
- package/dist/src/core/renderers/webgl/WebGlCoreCtxTexture.js.map +1 -1
- package/dist/src/core/renderers/webgl/WebGlCtxTexture.js +12 -8
- package/dist/src/core/renderers/webgl/WebGlCtxTexture.js.map +1 -1
- package/dist/src/core/renderers/webgl/WebGlRenderer.d.ts +6 -18
- package/dist/src/core/renderers/webgl/WebGlRenderer.js +48 -61
- package/dist/src/core/renderers/webgl/WebGlRenderer.js.map +1 -1
- package/dist/src/core/renderers/webgl/WebGlShaderNode.d.ts +2 -4
- package/dist/src/core/renderers/webgl/WebGlShaderNode.js.map +1 -1
- package/dist/src/core/renderers/webgl/WebGlShaderProgram.d.ts +3 -4
- package/dist/src/core/renderers/webgl/WebGlShaderProgram.js +40 -29
- package/dist/src/core/renderers/webgl/WebGlShaderProgram.js.map +1 -1
- package/dist/src/core/renderers/webgl/shaders/effects/LinearGradientEffect.js +8 -24
- package/dist/src/core/renderers/webgl/shaders/effects/LinearGradientEffect.js.map +1 -1
- package/dist/src/core/renderers/webgl/shaders/effects/RadialGradientEffect.js +8 -25
- package/dist/src/core/renderers/webgl/shaders/effects/RadialGradientEffect.js.map +1 -1
- package/dist/src/core/shaders/canvas/Border.d.ts +8 -2
- package/dist/src/core/shaders/canvas/Border.js +62 -23
- package/dist/src/core/shaders/canvas/Border.js.map +1 -1
- package/dist/src/core/shaders/canvas/HolePunch.js +2 -1
- package/dist/src/core/shaders/canvas/HolePunch.js.map +1 -1
- package/dist/src/core/shaders/canvas/LinearGradient.js +5 -3
- package/dist/src/core/shaders/canvas/LinearGradient.js.map +1 -1
- package/dist/src/core/shaders/canvas/RadialGradient.js +7 -5
- package/dist/src/core/shaders/canvas/RadialGradient.js.map +1 -1
- package/dist/src/core/shaders/canvas/Rounded.js +2 -2
- package/dist/src/core/shaders/canvas/Rounded.js.map +1 -1
- package/dist/src/core/shaders/canvas/RoundedWithBorder.d.ts +6 -3
- package/dist/src/core/shaders/canvas/RoundedWithBorder.js +39 -9
- package/dist/src/core/shaders/canvas/RoundedWithBorder.js.map +1 -1
- package/dist/src/core/shaders/canvas/RoundedWithBorderAndShadow.d.ts +2 -3
- package/dist/src/core/shaders/canvas/RoundedWithBorderAndShadow.js +44 -7
- package/dist/src/core/shaders/canvas/RoundedWithBorderAndShadow.js.map +1 -1
- package/dist/src/core/shaders/canvas/RoundedWithShadow.js +5 -4
- package/dist/src/core/shaders/canvas/RoundedWithShadow.js.map +1 -1
- package/dist/src/core/shaders/canvas/Shadow.js +4 -2
- package/dist/src/core/shaders/canvas/Shadow.js.map +1 -1
- package/dist/src/core/shaders/canvas/utils/render.d.ts +1 -1
- package/dist/src/core/shaders/canvas/utils/render.js +31 -18
- package/dist/src/core/shaders/canvas/utils/render.js.map +1 -1
- package/dist/src/core/shaders/templates/BorderTemplate.d.ts +10 -0
- package/dist/src/core/shaders/templates/BorderTemplate.js +20 -0
- package/dist/src/core/shaders/templates/BorderTemplate.js.map +1 -1
- package/dist/src/core/shaders/webgl/Border.js +66 -14
- package/dist/src/core/shaders/webgl/Border.js.map +1 -1
- package/dist/src/core/shaders/webgl/RoundedWithBorder.js +90 -31
- package/dist/src/core/shaders/webgl/RoundedWithBorder.js.map +1 -1
- package/dist/src/core/shaders/webgl/RoundedWithBorderAndShadow.js +98 -38
- package/dist/src/core/shaders/webgl/RoundedWithBorderAndShadow.js.map +1 -1
- package/dist/src/core/shaders/webgl/RoundedWithShadow.js +5 -4
- package/dist/src/core/shaders/webgl/RoundedWithShadow.js.map +1 -1
- package/dist/src/core/shaders/webgl/Shadow.js +12 -6
- package/dist/src/core/shaders/webgl/Shadow.js.map +1 -1
- package/dist/src/core/text-rendering/CanvasFont.d.ts +14 -0
- package/dist/src/core/text-rendering/CanvasFont.js +115 -0
- package/dist/src/core/text-rendering/CanvasFont.js.map +1 -0
- package/dist/src/core/text-rendering/CoreFont.d.ts +33 -0
- package/dist/src/core/text-rendering/CoreFont.js +48 -0
- package/dist/src/core/text-rendering/CoreFont.js.map +1 -0
- package/dist/src/core/text-rendering/FontManager.d.ts +11 -0
- package/dist/src/core/text-rendering/FontManager.js +41 -0
- package/dist/src/core/text-rendering/FontManager.js.map +1 -0
- package/dist/src/core/text-rendering/SdfFont.d.ts +29 -0
- package/dist/src/core/text-rendering/SdfFont.js +142 -0
- package/dist/src/core/text-rendering/SdfFont.js.map +1 -0
- package/dist/src/core/text-rendering/SdfTextRenderer.js +12 -20
- package/dist/src/core/text-rendering/SdfTextRenderer.js.map +1 -1
- package/dist/src/core/textures/Texture.d.ts +4 -3
- package/dist/src/core/textures/Texture.js.map +1 -1
- package/dist/src/main-api/Inspector.d.ts +5 -1
- package/dist/src/main-api/Inspector.js +164 -1
- package/dist/src/main-api/Inspector.js.map +1 -1
- package/dist/src/main-api/Renderer.d.ts +10 -0
- package/dist/src/main-api/Renderer.js +2 -0
- package/dist/src/main-api/Renderer.js.map +1 -1
- package/dist/tsconfig.dist.tsbuildinfo +1 -1
- package/exports/index.ts +5 -0
- package/package.json +1 -1
- package/src/common/CommonTypes.ts +2 -1
- package/src/core/Autosizer.ts +224 -0
- package/src/core/CoreNode.test.ts +116 -2
- package/src/core/CoreNode.ts +247 -78
- package/src/core/CoreTextNode.ts +3 -5
- package/src/core/CoreTextureManager.ts +1 -1
- package/src/core/Stage.ts +10 -7
- package/src/core/TextureMemoryManager.ts +3 -3
- package/src/core/lib/ImageWorker.ts +36 -11
- package/src/core/lib/WebGlContextWrapper.ts +1 -1
- package/src/core/lib/utils.ts +28 -25
- package/src/core/renderers/CoreRenderer.ts +1 -32
- package/src/core/renderers/CoreShaderNode.ts +20 -0
- package/src/core/renderers/canvas/CanvasRenderer.ts +43 -51
- package/src/core/renderers/canvas/CanvasShaderNode.ts +1 -2
- package/src/core/renderers/webgl/SdfRenderOp.ts +105 -0
- package/src/core/renderers/webgl/WebGlCtxTexture.ts +16 -9
- package/src/core/renderers/webgl/WebGlRenderer.ts +56 -78
- package/src/core/renderers/webgl/WebGlShaderNode.ts +2 -7
- package/src/core/renderers/webgl/WebGlShaderProgram.ts +48 -38
- package/src/core/shaders/canvas/Border.ts +86 -29
- package/src/core/shaders/canvas/HolePunch.ts +2 -1
- package/src/core/shaders/canvas/LinearGradient.ts +8 -6
- package/src/core/shaders/canvas/RadialGradient.ts +7 -10
- package/src/core/shaders/canvas/Rounded.ts +5 -5
- package/src/core/shaders/canvas/RoundedWithBorder.ts +68 -18
- package/src/core/shaders/canvas/RoundedWithBorderAndShadow.ts +71 -23
- package/src/core/shaders/canvas/RoundedWithShadow.ts +6 -5
- package/src/core/shaders/canvas/Shadow.ts +7 -5
- package/src/core/shaders/canvas/utils/render.ts +45 -36
- package/src/core/shaders/templates/BorderTemplate.ts +30 -0
- package/src/core/shaders/webgl/Border.ts +66 -15
- package/src/core/shaders/webgl/RoundedWithBorder.ts +90 -31
- package/src/core/shaders/webgl/RoundedWithBorderAndShadow.ts +98 -38
- package/src/core/shaders/webgl/RoundedWithShadow.ts +5 -4
- package/src/core/shaders/webgl/Shadow.ts +12 -6
- package/src/core/text-rendering/SdfTextRenderer.ts +18 -21
- package/src/core/textures/Texture.ts +10 -6
- package/src/main-api/Inspector.ts +221 -3
- package/src/main-api/Renderer.ts +13 -0
- package/dist/tsconfig.tsbuildinfo +0 -1
- package/src/core/renderers/webgl/WebGlRenderOp.ts +0 -170
|
@@ -11,6 +11,8 @@ import type {
|
|
|
11
11
|
} from '../common/IAnimationController.js';
|
|
12
12
|
import { isProductionEnvironment } from '../utils.js';
|
|
13
13
|
import { CoreTextNode, type CoreTextNodeProps } from '../core/CoreTextNode.js';
|
|
14
|
+
import type { Texture } from '../core/textures/Texture.js';
|
|
15
|
+
import { TextureType } from '../core/textures/Texture.js';
|
|
14
16
|
|
|
15
17
|
/**
|
|
16
18
|
* Inspector Options
|
|
@@ -204,6 +206,22 @@ const gradientColorPropertyMap = [
|
|
|
204
206
|
'colorBr',
|
|
205
207
|
];
|
|
206
208
|
|
|
209
|
+
const textureTypeNames: Record<number, string> = {
|
|
210
|
+
[TextureType.generic]: 'generic',
|
|
211
|
+
[TextureType.color]: 'color',
|
|
212
|
+
[TextureType.image]: 'image',
|
|
213
|
+
[TextureType.noise]: 'noise',
|
|
214
|
+
[TextureType.renderToTexture]: 'renderToTexture',
|
|
215
|
+
[TextureType.subTexture]: 'subTexture',
|
|
216
|
+
};
|
|
217
|
+
|
|
218
|
+
interface TextureMetrics {
|
|
219
|
+
previousState: string;
|
|
220
|
+
loadedCount: number;
|
|
221
|
+
failedCount: number;
|
|
222
|
+
freedCount: number;
|
|
223
|
+
}
|
|
224
|
+
|
|
207
225
|
const knownProperties = new Set<string>([
|
|
208
226
|
...Object.keys(stylePropertyMap),
|
|
209
227
|
...Object.keys(domPropertyMap),
|
|
@@ -223,6 +241,7 @@ export class Inspector {
|
|
|
223
241
|
private width = 1920;
|
|
224
242
|
private scaleX = 1;
|
|
225
243
|
private scaleY = 1;
|
|
244
|
+
private textureMetrics = new Map<Texture, TextureMetrics>();
|
|
226
245
|
|
|
227
246
|
// Performance monitoring for frequent setter calls
|
|
228
247
|
private static setterCallCount = new Map<
|
|
@@ -773,10 +792,13 @@ export class Inspector {
|
|
|
773
792
|
return this.createProxy(node, div);
|
|
774
793
|
}
|
|
775
794
|
|
|
776
|
-
createTextNode(node:
|
|
777
|
-
|
|
795
|
+
createTextNode(node: CoreTextNode): CoreTextNode {
|
|
796
|
+
// eslint-disable-next-line
|
|
797
|
+
// @ts-ignore - textProps is a private property and keeping it that way
|
|
798
|
+
// but we need it from the inspector to set the initial properties on the div element
|
|
799
|
+
const div = this.createDiv(node.id, node.textProps);
|
|
778
800
|
(div as HTMLElement & { node: CoreNode }).node = node;
|
|
779
|
-
(node as
|
|
801
|
+
(node as CoreTextNode & { div: HTMLElement }).div = div;
|
|
780
802
|
|
|
781
803
|
return this.createProxy(node, div) as CoreTextNode;
|
|
782
804
|
}
|
|
@@ -785,6 +807,94 @@ export class Inspector {
|
|
|
785
807
|
node: CoreNode | CoreTextNode,
|
|
786
808
|
div: HTMLElement,
|
|
787
809
|
): CoreNode | CoreTextNode {
|
|
810
|
+
// Store texture event listeners for cleanup
|
|
811
|
+
const textureListeners = new Map<
|
|
812
|
+
Texture,
|
|
813
|
+
{
|
|
814
|
+
onLoaded: () => void;
|
|
815
|
+
onFailed: () => void;
|
|
816
|
+
onFreed: () => void;
|
|
817
|
+
}
|
|
818
|
+
>();
|
|
819
|
+
|
|
820
|
+
const coreNodeListeners = new Map<
|
|
821
|
+
CoreNode,
|
|
822
|
+
{
|
|
823
|
+
onLoaded: () => void;
|
|
824
|
+
}
|
|
825
|
+
>();
|
|
826
|
+
|
|
827
|
+
const setupCoreNodeListeners = (coreNode: CoreNode) => {
|
|
828
|
+
const onLoaded = () => {
|
|
829
|
+
this.updateTextNodeDimensions(div, coreNode as CoreTextNode);
|
|
830
|
+
};
|
|
831
|
+
coreNode.on('loaded', onLoaded);
|
|
832
|
+
coreNodeListeners.set(coreNode, { onLoaded });
|
|
833
|
+
};
|
|
834
|
+
|
|
835
|
+
// Helper function to setup texture event listeners
|
|
836
|
+
const setupTextureListeners = (texture: Texture | null) => {
|
|
837
|
+
// Clean up existing listeners first
|
|
838
|
+
textureListeners.forEach((listeners, oldTexture) => {
|
|
839
|
+
oldTexture.off('loaded', listeners.onLoaded);
|
|
840
|
+
oldTexture.off('failed', listeners.onFailed);
|
|
841
|
+
oldTexture.off('freed', listeners.onFreed);
|
|
842
|
+
});
|
|
843
|
+
textureListeners.clear();
|
|
844
|
+
|
|
845
|
+
// Setup new listeners if texture exists
|
|
846
|
+
if (texture) {
|
|
847
|
+
// Initialize metrics if not exists
|
|
848
|
+
if (!this.textureMetrics.has(texture)) {
|
|
849
|
+
this.textureMetrics.set(texture, {
|
|
850
|
+
previousState: texture.state,
|
|
851
|
+
loadedCount: 0,
|
|
852
|
+
failedCount: 0,
|
|
853
|
+
freedCount: 0,
|
|
854
|
+
});
|
|
855
|
+
}
|
|
856
|
+
|
|
857
|
+
const onLoaded = () => {
|
|
858
|
+
const metrics = this.textureMetrics.get(texture);
|
|
859
|
+
if (metrics) {
|
|
860
|
+
metrics.previousState =
|
|
861
|
+
metrics.previousState !== texture.state
|
|
862
|
+
? metrics.previousState
|
|
863
|
+
: 'loading';
|
|
864
|
+
metrics.loadedCount++;
|
|
865
|
+
}
|
|
866
|
+
this.updateTextureAttributes(div, texture);
|
|
867
|
+
};
|
|
868
|
+
const onFailed = () => {
|
|
869
|
+
const metrics = this.textureMetrics.get(texture);
|
|
870
|
+
if (metrics) {
|
|
871
|
+
metrics.previousState =
|
|
872
|
+
metrics.previousState !== texture.state
|
|
873
|
+
? metrics.previousState
|
|
874
|
+
: 'loading';
|
|
875
|
+
metrics.failedCount++;
|
|
876
|
+
}
|
|
877
|
+
this.updateTextureAttributes(div, texture);
|
|
878
|
+
};
|
|
879
|
+
const onFreed = () => {
|
|
880
|
+
const metrics = this.textureMetrics.get(texture);
|
|
881
|
+
if (metrics) {
|
|
882
|
+
metrics.previousState =
|
|
883
|
+
metrics.previousState !== texture.state
|
|
884
|
+
? metrics.previousState
|
|
885
|
+
: texture.state;
|
|
886
|
+
metrics.freedCount++;
|
|
887
|
+
}
|
|
888
|
+
this.updateTextureAttributes(div, texture);
|
|
889
|
+
};
|
|
890
|
+
|
|
891
|
+
texture.on('loaded', onLoaded);
|
|
892
|
+
texture.on('failed', onFailed);
|
|
893
|
+
texture.on('freed', onFreed);
|
|
894
|
+
|
|
895
|
+
textureListeners.set(texture, { onLoaded, onFailed, onFreed });
|
|
896
|
+
}
|
|
897
|
+
};
|
|
788
898
|
// Define traps for each property in knownProperties
|
|
789
899
|
knownProperties.forEach((property) => {
|
|
790
900
|
let originalProp = Object.getOwnPropertyDescriptor(node, property);
|
|
@@ -799,6 +909,10 @@ export class Inspector {
|
|
|
799
909
|
return;
|
|
800
910
|
}
|
|
801
911
|
|
|
912
|
+
if (property === 'text') {
|
|
913
|
+
setupCoreNodeListeners(node);
|
|
914
|
+
}
|
|
915
|
+
|
|
802
916
|
Object.defineProperty(node, property, {
|
|
803
917
|
get() {
|
|
804
918
|
// eslint-disable-next-line @typescript-eslint/no-unsafe-return
|
|
@@ -815,6 +929,15 @@ export class Inspector {
|
|
|
815
929
|
value,
|
|
816
930
|
node.props,
|
|
817
931
|
);
|
|
932
|
+
|
|
933
|
+
// Setup texture event listeners if this is a texture property
|
|
934
|
+
if (property === 'texture') {
|
|
935
|
+
const textureValue =
|
|
936
|
+
value && typeof value === 'object' && 'state' in value
|
|
937
|
+
? (value as Texture)
|
|
938
|
+
: null;
|
|
939
|
+
setupTextureListeners(textureValue);
|
|
940
|
+
}
|
|
818
941
|
},
|
|
819
942
|
configurable: true,
|
|
820
943
|
enumerable: true,
|
|
@@ -824,6 +947,21 @@ export class Inspector {
|
|
|
824
947
|
const originalDestroy = node.destroy;
|
|
825
948
|
Object.defineProperty(node, 'destroy', {
|
|
826
949
|
value: () => {
|
|
950
|
+
// Clean up texture event listeners and metrics
|
|
951
|
+
textureListeners.forEach((listeners, texture) => {
|
|
952
|
+
texture.off('loaded', listeners.onLoaded);
|
|
953
|
+
texture.off('failed', listeners.onFailed);
|
|
954
|
+
texture.off('freed', listeners.onFreed);
|
|
955
|
+
// Clean up metrics for this texture
|
|
956
|
+
this.textureMetrics.delete(texture);
|
|
957
|
+
});
|
|
958
|
+
textureListeners.clear();
|
|
959
|
+
|
|
960
|
+
coreNodeListeners.forEach((listeners, coreNode) => {
|
|
961
|
+
coreNode.off('loaded', listeners.onLoaded);
|
|
962
|
+
});
|
|
963
|
+
coreNodeListeners.clear();
|
|
964
|
+
|
|
827
965
|
this.destroyNode(node.id);
|
|
828
966
|
originalDestroy.call(node);
|
|
829
967
|
},
|
|
@@ -853,6 +991,86 @@ export class Inspector {
|
|
|
853
991
|
return node;
|
|
854
992
|
}
|
|
855
993
|
|
|
994
|
+
updateTextNodeDimensions(div: HTMLElement, node: CoreTextNode) {
|
|
995
|
+
const textMetrics = node.renderInfo;
|
|
996
|
+
if (textMetrics) {
|
|
997
|
+
div.style.width = `${textMetrics.width}px`;
|
|
998
|
+
div.style.height = `${textMetrics.height}px`;
|
|
999
|
+
} else {
|
|
1000
|
+
div.style.removeProperty('width');
|
|
1001
|
+
div.style.removeProperty('height');
|
|
1002
|
+
}
|
|
1003
|
+
}
|
|
1004
|
+
|
|
1005
|
+
updateTextureAttributes(div: HTMLElement, texture: Texture) {
|
|
1006
|
+
// Update texture state
|
|
1007
|
+
div.setAttribute('data-texture-state', texture.state);
|
|
1008
|
+
|
|
1009
|
+
// Update texture type
|
|
1010
|
+
div.setAttribute(
|
|
1011
|
+
'data-texture-type',
|
|
1012
|
+
textureTypeNames[texture.type] || 'unknown',
|
|
1013
|
+
);
|
|
1014
|
+
|
|
1015
|
+
// Update texture dimensions if available
|
|
1016
|
+
if (texture.dimensions) {
|
|
1017
|
+
div.setAttribute('data-texture-width', String(texture.dimensions.w));
|
|
1018
|
+
div.setAttribute('data-texture-height', String(texture.dimensions.h));
|
|
1019
|
+
} else {
|
|
1020
|
+
div.removeAttribute('data-texture-width');
|
|
1021
|
+
div.removeAttribute('data-texture-height');
|
|
1022
|
+
}
|
|
1023
|
+
|
|
1024
|
+
// Update renderable owners count
|
|
1025
|
+
div.setAttribute(
|
|
1026
|
+
'data-texture-owners',
|
|
1027
|
+
String(texture.renderableOwners.length),
|
|
1028
|
+
);
|
|
1029
|
+
|
|
1030
|
+
// Update retry count
|
|
1031
|
+
div.setAttribute('data-texture-retry-count', String(texture.retryCount));
|
|
1032
|
+
|
|
1033
|
+
// Update max retry count if available
|
|
1034
|
+
if (texture.maxRetryCount !== null) {
|
|
1035
|
+
div.setAttribute(
|
|
1036
|
+
'data-texture-max-retry-count',
|
|
1037
|
+
String(texture.maxRetryCount),
|
|
1038
|
+
);
|
|
1039
|
+
} else {
|
|
1040
|
+
div.removeAttribute('data-texture-max-retry-count');
|
|
1041
|
+
}
|
|
1042
|
+
|
|
1043
|
+
// Update metrics if available
|
|
1044
|
+
const metrics = this.textureMetrics.get(texture);
|
|
1045
|
+
if (metrics) {
|
|
1046
|
+
div.setAttribute('data-texture-previous-state', metrics.previousState);
|
|
1047
|
+
div.setAttribute(
|
|
1048
|
+
'data-texture-loaded-count',
|
|
1049
|
+
String(metrics.loadedCount),
|
|
1050
|
+
);
|
|
1051
|
+
div.setAttribute(
|
|
1052
|
+
'data-texture-failed-count',
|
|
1053
|
+
String(metrics.failedCount),
|
|
1054
|
+
);
|
|
1055
|
+
div.setAttribute('data-texture-freed-count', String(metrics.freedCount));
|
|
1056
|
+
} else {
|
|
1057
|
+
div.removeAttribute('data-texture-previous-state');
|
|
1058
|
+
div.removeAttribute('data-texture-loaded-count');
|
|
1059
|
+
div.removeAttribute('data-texture-failed-count');
|
|
1060
|
+
div.removeAttribute('data-texture-freed-count');
|
|
1061
|
+
}
|
|
1062
|
+
|
|
1063
|
+
// Update error information if present
|
|
1064
|
+
if (texture.error) {
|
|
1065
|
+
div.setAttribute(
|
|
1066
|
+
'data-texture-error',
|
|
1067
|
+
texture.error.code || texture.error.message,
|
|
1068
|
+
);
|
|
1069
|
+
} else {
|
|
1070
|
+
div.removeAttribute('data-texture-error');
|
|
1071
|
+
}
|
|
1072
|
+
}
|
|
1073
|
+
|
|
856
1074
|
public destroy() {
|
|
857
1075
|
// Stop animation stats timer
|
|
858
1076
|
this.stopAnimationStatsTimer();
|
package/src/main-api/Renderer.ts
CHANGED
|
@@ -238,6 +238,17 @@ export interface RendererRuntimeSettings {
|
|
|
238
238
|
*/
|
|
239
239
|
fpsUpdateInterval: number;
|
|
240
240
|
|
|
241
|
+
/**
|
|
242
|
+
* Clears the render buffer on reset
|
|
243
|
+
*
|
|
244
|
+
* @remarks
|
|
245
|
+
* If false, the renderer will not clear the buffer before rendering a new frame.
|
|
246
|
+
* This is useful if you want to preserve the previous frame.
|
|
247
|
+
*
|
|
248
|
+
* @defaultValue `true`
|
|
249
|
+
*/
|
|
250
|
+
enableClear: boolean;
|
|
251
|
+
|
|
241
252
|
/**
|
|
242
253
|
* DOM Inspector
|
|
243
254
|
*
|
|
@@ -525,6 +536,7 @@ export class RendererMain extends EventEmitter {
|
|
|
525
536
|
settings.devicePhysicalPixelRatio || window.devicePixelRatio || 1,
|
|
526
537
|
clearColor: settings.clearColor ?? 0x00000000,
|
|
527
538
|
fpsUpdateInterval: settings.fpsUpdateInterval || 0,
|
|
539
|
+
enableClear: settings.enableClear ?? true,
|
|
528
540
|
targetFPS: settings.targetFPS || 0,
|
|
529
541
|
numImageWorkers:
|
|
530
542
|
settings.numImageWorkers !== undefined ? settings.numImageWorkers : 2,
|
|
@@ -586,6 +598,7 @@ export class RendererMain extends EventEmitter {
|
|
|
586
598
|
enableContextSpy: settings.enableContextSpy!,
|
|
587
599
|
forceWebGL2: settings.forceWebGL2!,
|
|
588
600
|
fpsUpdateInterval: settings.fpsUpdateInterval!,
|
|
601
|
+
enableClear: settings.enableClear!,
|
|
589
602
|
numImageWorkers: settings.numImageWorkers!,
|
|
590
603
|
renderEngine: settings.renderEngine!,
|
|
591
604
|
textureMemory: resolvedTxSettings,
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"fileNames":[],"fileInfos":[],"root":[],"options":{"allowJs":true,"allowSyntheticDefaultImports":true,"composite":true,"declaration":true,"experimentalDecorators":true,"module":100,"noImplicitAny":false,"noImplicitOverride":true,"noUncheckedIndexedAccess":true,"outDir":"./","rootDir":"..","sourceMap":true,"strict":true,"target":9,"verbatimModuleSyntax":true},"version":"5.9.2"}
|
|
@@ -1,170 +0,0 @@
|
|
|
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 { CoreRenderOp } from '../CoreRenderOp.js';
|
|
21
|
-
import type { WebGlCtxTexture } from './WebGlCtxTexture.js';
|
|
22
|
-
import type { WebGlRenderer } from './WebGlRenderer.js';
|
|
23
|
-
import type { BufferCollection } from './internal/BufferCollection.js';
|
|
24
|
-
import type { WebGlShaderNode } from './WebGlShaderNode.js';
|
|
25
|
-
import type { QuadOptions } from '../CoreRenderer.js';
|
|
26
|
-
import type { CoreTextNode } from '../../CoreTextNode.js';
|
|
27
|
-
import type { RectWithValid } from '../../lib/utils.js';
|
|
28
|
-
import type { Dimensions } from '../../../common/CommonTypes.js';
|
|
29
|
-
|
|
30
|
-
type ReqQuad =
|
|
31
|
-
| 'alpha'
|
|
32
|
-
| 'shader'
|
|
33
|
-
| 'parentHasRenderTexture'
|
|
34
|
-
| 'rtt'
|
|
35
|
-
| 'clippingRect'
|
|
36
|
-
| 'height'
|
|
37
|
-
| 'width'
|
|
38
|
-
| 'time';
|
|
39
|
-
type RenderOpQuadOptions = Pick<QuadOptions, ReqQuad> &
|
|
40
|
-
Partial<Omit<QuadOptions, ReqQuad>> & {
|
|
41
|
-
sdfShaderProps?: Record<string, unknown>;
|
|
42
|
-
sdfBuffers?: BufferCollection;
|
|
43
|
-
};
|
|
44
|
-
|
|
45
|
-
/**
|
|
46
|
-
* Can render multiple quads with multiple textures (up to vertex shader texture limit)
|
|
47
|
-
*
|
|
48
|
-
*/
|
|
49
|
-
export class WebGlRenderOp extends CoreRenderOp {
|
|
50
|
-
numQuads = 0;
|
|
51
|
-
textures: WebGlCtxTexture[] = [];
|
|
52
|
-
|
|
53
|
-
/**
|
|
54
|
-
* need to improve this when TextRenderers are refactored
|
|
55
|
-
*/
|
|
56
|
-
readonly sdfShaderProps: Record<string, unknown> | undefined;
|
|
57
|
-
readonly sdfNode: CoreTextNode | undefined;
|
|
58
|
-
readonly maxTextures: number;
|
|
59
|
-
readonly buffers: BufferCollection;
|
|
60
|
-
readonly shader: WebGlShaderNode;
|
|
61
|
-
readonly width: number;
|
|
62
|
-
readonly height: number;
|
|
63
|
-
readonly clippingRect: RectWithValid;
|
|
64
|
-
readonly rtt: boolean;
|
|
65
|
-
readonly parentHasRenderTexture: boolean;
|
|
66
|
-
readonly framebufferDimensions: Dimensions | null;
|
|
67
|
-
readonly alpha: number;
|
|
68
|
-
readonly pixelRatio: number;
|
|
69
|
-
readonly time?: number | null;
|
|
70
|
-
|
|
71
|
-
constructor(
|
|
72
|
-
readonly renderer: WebGlRenderer,
|
|
73
|
-
quad: RenderOpQuadOptions,
|
|
74
|
-
readonly bufferIdx: number,
|
|
75
|
-
) {
|
|
76
|
-
super();
|
|
77
|
-
this.buffers = quad.sdfBuffers || renderer.quadBufferCollection;
|
|
78
|
-
this.shader = quad.shader as WebGlShaderNode;
|
|
79
|
-
this.width = quad.width;
|
|
80
|
-
this.height = quad.height;
|
|
81
|
-
this.clippingRect = quad.clippingRect;
|
|
82
|
-
this.parentHasRenderTexture = quad.parentHasRenderTexture;
|
|
83
|
-
this.framebufferDimensions = quad.framebufferDimensions || null;
|
|
84
|
-
this.rtt = quad.rtt;
|
|
85
|
-
this.alpha = quad.alpha;
|
|
86
|
-
this.pixelRatio =
|
|
87
|
-
this.parentHasRenderTexture === true ? 1 : renderer.stage.pixelRatio;
|
|
88
|
-
this.time = quad.time;
|
|
89
|
-
|
|
90
|
-
/**
|
|
91
|
-
* related to line 51
|
|
92
|
-
*/
|
|
93
|
-
this.sdfShaderProps = quad.sdfShaderProps;
|
|
94
|
-
|
|
95
|
-
this.maxTextures = this.shader.program.supportsIndexedTextures
|
|
96
|
-
? (renderer.glw.getParameter(
|
|
97
|
-
renderer.glw.MAX_VERTEX_TEXTURE_IMAGE_UNITS,
|
|
98
|
-
) as number)
|
|
99
|
-
: 1;
|
|
100
|
-
}
|
|
101
|
-
|
|
102
|
-
addTexture(texture: WebGlCtxTexture): number {
|
|
103
|
-
const { textures, maxTextures } = this;
|
|
104
|
-
let existingIdx = -1;
|
|
105
|
-
const texturesLength = textures.length;
|
|
106
|
-
for (let i = 0; i < texturesLength; i++) {
|
|
107
|
-
const t = textures[i];
|
|
108
|
-
if (t === texture) {
|
|
109
|
-
existingIdx = i;
|
|
110
|
-
break;
|
|
111
|
-
}
|
|
112
|
-
}
|
|
113
|
-
|
|
114
|
-
if (existingIdx !== -1) {
|
|
115
|
-
return existingIdx;
|
|
116
|
-
}
|
|
117
|
-
|
|
118
|
-
if (texturesLength >= maxTextures) {
|
|
119
|
-
return 0xffffffff;
|
|
120
|
-
}
|
|
121
|
-
this.textures.push(texture);
|
|
122
|
-
return texturesLength;
|
|
123
|
-
}
|
|
124
|
-
|
|
125
|
-
draw() {
|
|
126
|
-
const { glw, options, stage } = this.renderer;
|
|
127
|
-
|
|
128
|
-
stage.shManager.useShader(this.shader.program);
|
|
129
|
-
this.shader.program.bindRenderOp(this);
|
|
130
|
-
|
|
131
|
-
// Clipping
|
|
132
|
-
if (this.clippingRect.valid === true) {
|
|
133
|
-
const clipX = Math.round(this.clippingRect.x * this.pixelRatio);
|
|
134
|
-
const clipWidth = Math.round(this.clippingRect.width * this.pixelRatio);
|
|
135
|
-
const clipHeight = Math.round(this.clippingRect.height * this.pixelRatio);
|
|
136
|
-
let clipY = Math.round(
|
|
137
|
-
options.canvas.height -
|
|
138
|
-
clipHeight -
|
|
139
|
-
this.clippingRect.y * this.pixelRatio,
|
|
140
|
-
);
|
|
141
|
-
// if parent has render texture, we need to adjust the scissor rect
|
|
142
|
-
// to be relative to the parent's framebuffer
|
|
143
|
-
if (this.parentHasRenderTexture) {
|
|
144
|
-
clipY = this.framebufferDimensions
|
|
145
|
-
? this.framebufferDimensions.h - this.height
|
|
146
|
-
: 0;
|
|
147
|
-
}
|
|
148
|
-
|
|
149
|
-
glw.setScissorTest(true);
|
|
150
|
-
glw.scissor(clipX, clipY, clipWidth, clipHeight);
|
|
151
|
-
} else {
|
|
152
|
-
glw.setScissorTest(false);
|
|
153
|
-
}
|
|
154
|
-
|
|
155
|
-
// Check if this is SDF rendering (has sdfBuffers)
|
|
156
|
-
if (this.sdfShaderProps !== undefined) {
|
|
157
|
-
// SDF rendering uses drawArrays with explicit triangle vertices (6 vertices per quad)
|
|
158
|
-
glw.drawArrays(glw.TRIANGLES, 0, 6 * this.numQuads);
|
|
159
|
-
} else {
|
|
160
|
-
// Regular rendering uses drawElements with index buffer (4 vertices per quad)
|
|
161
|
-
const quadIdx = (this.bufferIdx / 32) * 6 * 2;
|
|
162
|
-
glw.drawElements(
|
|
163
|
-
glw.TRIANGLES,
|
|
164
|
-
6 * this.numQuads,
|
|
165
|
-
glw.UNSIGNED_SHORT,
|
|
166
|
-
quadIdx,
|
|
167
|
-
);
|
|
168
|
-
}
|
|
169
|
-
}
|
|
170
|
-
}
|