@lightningjs/renderer 2.0.0 → 2.1.1

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 (115) hide show
  1. package/dist/exports/canvas.d.ts +2 -0
  2. package/dist/exports/canvas.js +2 -0
  3. package/dist/exports/canvas.js.map +1 -1
  4. package/dist/exports/index.d.ts +1 -1
  5. package/dist/exports/index.js +1 -1
  6. package/dist/exports/inspector.d.ts +3 -0
  7. package/dist/exports/inspector.js +3 -0
  8. package/dist/exports/inspector.js.map +1 -1
  9. package/dist/exports/utils.d.ts +2 -0
  10. package/dist/exports/utils.js +2 -0
  11. package/dist/exports/utils.js.map +1 -1
  12. package/dist/src/core/CoreNode.d.ts +10 -3
  13. package/dist/src/core/CoreNode.js +113 -50
  14. package/dist/src/core/CoreNode.js.map +1 -1
  15. package/dist/src/core/Stage.js +4 -4
  16. package/dist/src/core/Stage.js.map +1 -1
  17. package/dist/src/core/lib/utils.d.ts +1 -0
  18. package/dist/src/core/lib/utils.js +6 -0
  19. package/dist/src/core/lib/utils.js.map +1 -1
  20. package/dist/src/core/renderers/canvas/CanvasCoreTexture.js +2 -1
  21. package/dist/src/core/renderers/canvas/CanvasCoreTexture.js.map +1 -1
  22. package/dist/src/core/renderers/webgl/WebGlCoreCtxTexture.js +2 -1
  23. package/dist/src/core/renderers/webgl/WebGlCoreCtxTexture.js.map +1 -1
  24. package/dist/src/core/renderers/webgl/WebGlCoreRenderer.js +10 -6
  25. package/dist/src/core/renderers/webgl/WebGlCoreRenderer.js.map +1 -1
  26. package/dist/src/core/renderers/webgl/shaders/DynamicShader.js +2 -1
  27. package/dist/src/core/renderers/webgl/shaders/DynamicShader.js.map +1 -1
  28. package/dist/src/core/utils.d.ts +1 -1
  29. package/dist/src/main-api/Renderer.d.ts +1 -1
  30. package/dist/src/main-api/Renderer.js +1 -1
  31. package/dist/src/main-api/Renderer.js.map +1 -1
  32. package/dist/tsconfig.dist.tsbuildinfo +1 -1
  33. package/exports/canvas.ts +2 -0
  34. package/exports/index.ts +1 -1
  35. package/exports/inspector.ts +4 -0
  36. package/exports/utils.ts +2 -0
  37. package/package.json +1 -1
  38. package/src/core/CoreNode.ts +167 -71
  39. package/src/core/Stage.ts +4 -4
  40. package/src/core/lib/utils.ts +9 -0
  41. package/src/core/renderers/canvas/CanvasCoreTexture.ts +4 -1
  42. package/src/core/renderers/webgl/WebGlCoreCtxTexture.ts +2 -1
  43. package/src/core/renderers/webgl/WebGlCoreRenderer.ts +11 -6
  44. package/src/core/renderers/webgl/shaders/DynamicShader.ts +1 -0
  45. package/src/main-api/Renderer.ts +2 -2
  46. package/dist/exports/core-api.d.ts +0 -74
  47. package/dist/exports/core-api.js +0 -96
  48. package/dist/exports/core-api.js.map +0 -1
  49. package/dist/exports/main-api.d.ts +0 -30
  50. package/dist/exports/main-api.js +0 -45
  51. package/dist/exports/main-api.js.map +0 -1
  52. package/dist/src/core/CoreExtension.d.ts +0 -12
  53. package/dist/src/core/CoreExtension.js +0 -29
  54. package/dist/src/core/CoreExtension.js.map +0 -1
  55. package/dist/src/main-api/ICoreDriver.d.ts +0 -24
  56. package/dist/src/main-api/ICoreDriver.js +0 -20
  57. package/dist/src/main-api/ICoreDriver.js.map +0 -1
  58. package/dist/src/main-api/RendererMain.d.ts +0 -378
  59. package/dist/src/main-api/RendererMain.js +0 -367
  60. package/dist/src/main-api/RendererMain.js.map +0 -1
  61. package/dist/src/main-api/texture-usage-trackers/FinalizationRegistryTextureUsageTracker.d.ts +0 -9
  62. package/dist/src/main-api/texture-usage-trackers/FinalizationRegistryTextureUsageTracker.js +0 -38
  63. package/dist/src/main-api/texture-usage-trackers/FinalizationRegistryTextureUsageTracker.js.map +0 -1
  64. package/dist/src/main-api/texture-usage-trackers/ManualCountTextureUsageTracker.d.ts +0 -56
  65. package/dist/src/main-api/texture-usage-trackers/ManualCountTextureUsageTracker.js +0 -101
  66. package/dist/src/main-api/texture-usage-trackers/ManualCountTextureUsageTracker.js.map +0 -1
  67. package/dist/src/main-api/texture-usage-trackers/TextureUsageTracker.d.ts +0 -32
  68. package/dist/src/main-api/texture-usage-trackers/TextureUsageTracker.js +0 -28
  69. package/dist/src/main-api/texture-usage-trackers/TextureUsageTracker.js.map +0 -1
  70. package/dist/src/render-drivers/main/MainCoreDriver.d.ts +0 -21
  71. package/dist/src/render-drivers/main/MainCoreDriver.js +0 -115
  72. package/dist/src/render-drivers/main/MainCoreDriver.js.map +0 -1
  73. package/dist/src/render-drivers/main/MainOnlyNode.d.ts +0 -101
  74. package/dist/src/render-drivers/main/MainOnlyNode.js +0 -425
  75. package/dist/src/render-drivers/main/MainOnlyNode.js.map +0 -1
  76. package/dist/src/render-drivers/main/MainOnlyTextNode.d.ts +0 -47
  77. package/dist/src/render-drivers/main/MainOnlyTextNode.js +0 -204
  78. package/dist/src/render-drivers/main/MainOnlyTextNode.js.map +0 -1
  79. package/dist/src/render-drivers/threadx/NodeStruct.d.ts +0 -93
  80. package/dist/src/render-drivers/threadx/NodeStruct.js +0 -290
  81. package/dist/src/render-drivers/threadx/NodeStruct.js.map +0 -1
  82. package/dist/src/render-drivers/threadx/SharedNode.d.ts +0 -40
  83. package/dist/src/render-drivers/threadx/SharedNode.js +0 -61
  84. package/dist/src/render-drivers/threadx/SharedNode.js.map +0 -1
  85. package/dist/src/render-drivers/threadx/TextNodeStruct.d.ts +0 -44
  86. package/dist/src/render-drivers/threadx/TextNodeStruct.js +0 -203
  87. package/dist/src/render-drivers/threadx/TextNodeStruct.js.map +0 -1
  88. package/dist/src/render-drivers/threadx/ThreadXCoreDriver.d.ts +0 -25
  89. package/dist/src/render-drivers/threadx/ThreadXCoreDriver.js +0 -232
  90. package/dist/src/render-drivers/threadx/ThreadXCoreDriver.js.map +0 -1
  91. package/dist/src/render-drivers/threadx/ThreadXMainAnimationController.d.ts +0 -24
  92. package/dist/src/render-drivers/threadx/ThreadXMainAnimationController.js +0 -113
  93. package/dist/src/render-drivers/threadx/ThreadXMainAnimationController.js.map +0 -1
  94. package/dist/src/render-drivers/threadx/ThreadXMainNode.d.ts +0 -46
  95. package/dist/src/render-drivers/threadx/ThreadXMainNode.js +0 -160
  96. package/dist/src/render-drivers/threadx/ThreadXMainNode.js.map +0 -1
  97. package/dist/src/render-drivers/threadx/ThreadXMainTextNode.d.ts +0 -28
  98. package/dist/src/render-drivers/threadx/ThreadXMainTextNode.js +0 -55
  99. package/dist/src/render-drivers/threadx/ThreadXMainTextNode.js.map +0 -1
  100. package/dist/src/render-drivers/threadx/ThreadXRendererMessage.d.ts +0 -70
  101. package/dist/src/render-drivers/threadx/ThreadXRendererMessage.js +0 -32
  102. package/dist/src/render-drivers/threadx/ThreadXRendererMessage.js.map +0 -1
  103. package/dist/src/render-drivers/threadx/worker/ThreadXRendererNode.d.ts +0 -19
  104. package/dist/src/render-drivers/threadx/worker/ThreadXRendererNode.js +0 -184
  105. package/dist/src/render-drivers/threadx/worker/ThreadXRendererNode.js.map +0 -1
  106. package/dist/src/render-drivers/threadx/worker/ThreadXRendererTextNode.d.ts +0 -27
  107. package/dist/src/render-drivers/threadx/worker/ThreadXRendererTextNode.js +0 -109
  108. package/dist/src/render-drivers/threadx/worker/ThreadXRendererTextNode.js.map +0 -1
  109. package/dist/src/render-drivers/threadx/worker/renderer.d.ts +0 -1
  110. package/dist/src/render-drivers/threadx/worker/renderer.js +0 -147
  111. package/dist/src/render-drivers/threadx/worker/renderer.js.map +0 -1
  112. package/dist/src/render-drivers/utils.d.ts +0 -12
  113. package/dist/src/render-drivers/utils.js +0 -74
  114. package/dist/src/render-drivers/utils.js.map +0 -1
  115. package/dist/tsconfig.tsbuildinfo +0 -1
@@ -45,6 +45,7 @@ import {
45
45
  type RectWithValid,
46
46
  createBound,
47
47
  boundInsideBound,
48
+ boundLargeThanBound,
48
49
  } from './lib/utils.js';
49
50
  import { Matrix3d } from './lib/Matrix3d.js';
50
51
  import { RenderCoords } from './lib/RenderCoords.js';
@@ -178,6 +179,11 @@ export enum UpdateType {
178
179
  */
179
180
  ParentRenderTexture = 4096,
180
181
 
182
+ /**
183
+ * Render Bounds update
184
+ */
185
+ RenderBounds = 8192,
186
+
181
187
  /**
182
188
  * None
183
189
  */
@@ -693,6 +699,7 @@ export class CoreNode extends EventEmitter {
693
699
  readonly props: CoreNodeProps;
694
700
 
695
701
  public updateType = UpdateType.All;
702
+ public childUpdateType = UpdateType.None;
696
703
 
697
704
  public globalTransform?: Matrix3d;
698
705
  public scaleRotateTransform?: Matrix3d;
@@ -738,6 +745,10 @@ export class CoreNode extends EventEmitter {
738
745
  this.rtt = props.rtt;
739
746
 
740
747
  this.updateScaleRotateTransform();
748
+
749
+ this.setUpdateType(
750
+ UpdateType.Local | UpdateType.RenderBounds | UpdateType.RenderState,
751
+ );
741
752
  }
742
753
 
743
754
  //#region Textures
@@ -838,7 +849,7 @@ export class CoreNode extends EventEmitter {
838
849
  // If we're updating this node at all, we need to inform the parent
839
850
  // (and all ancestors) that their children need updating as well
840
851
  const parent = this.props.parent;
841
- if (parent && !(parent.updateType & UpdateType.Children)) {
852
+ if (parent !== null && !(parent.updateType & UpdateType.Children)) {
842
853
  parent.setUpdateType(UpdateType.Children);
843
854
  }
844
855
  // If node is part of RTT texture
@@ -948,7 +959,6 @@ export class CoreNode extends EventEmitter {
948
959
  }
949
960
 
950
961
  const parent = this.props.parent;
951
- let childUpdateType = UpdateType.None;
952
962
 
953
963
  if (this.updateType & UpdateType.ParentRenderTexture) {
954
964
  let p = this.parent;
@@ -988,16 +998,41 @@ export class CoreNode extends EventEmitter {
988
998
 
989
999
  this.calculateRenderCoords();
990
1000
  this.updateBoundingRect();
991
- this.setUpdateType(
992
- UpdateType.Clipping | UpdateType.RenderState | UpdateType.Children,
993
- );
994
- childUpdateType |= UpdateType.Global;
1001
+
1002
+ this.setUpdateType(UpdateType.RenderState | UpdateType.Children);
1003
+
1004
+ if (this.clipping === true) {
1005
+ this.setUpdateType(UpdateType.Clipping);
1006
+ }
1007
+
1008
+ this.childUpdateType |= UpdateType.Global;
1009
+ }
1010
+
1011
+ if (this.updateType & UpdateType.RenderBounds) {
1012
+ this.createRenderBounds();
1013
+ this.setUpdateType(UpdateType.RenderState);
1014
+ this.setUpdateType(UpdateType.Children);
1015
+ }
1016
+
1017
+ if (this.updateType & UpdateType.RenderState) {
1018
+ this.updateRenderState();
1019
+ this.setUpdateType(UpdateType.IsRenderable);
1020
+ }
1021
+
1022
+ if (this.updateType & UpdateType.IsRenderable) {
1023
+ this.updateIsRenderable();
1024
+ }
1025
+
1026
+ if (this.renderState === CoreNodeRenderState.OutOfBounds) {
1027
+ return;
995
1028
  }
996
1029
 
997
1030
  if (this.updateType & UpdateType.Clipping) {
998
1031
  this.calculateClippingRect(parentClippingRect);
999
1032
  this.setUpdateType(UpdateType.Children);
1000
- childUpdateType |= UpdateType.Clipping;
1033
+
1034
+ this.childUpdateType |= UpdateType.Clipping;
1035
+ this.childUpdateType |= UpdateType.RenderBounds;
1001
1036
  }
1002
1037
 
1003
1038
  if (this.updateType & UpdateType.WorldAlpha) {
@@ -1011,7 +1046,7 @@ export class CoreNode extends EventEmitter {
1011
1046
  UpdateType.PremultipliedColors |
1012
1047
  UpdateType.IsRenderable,
1013
1048
  );
1014
- childUpdateType |= UpdateType.WorldAlpha;
1049
+ this.childUpdateType |= UpdateType.WorldAlpha;
1015
1050
  }
1016
1051
 
1017
1052
  if (this.updateType & UpdateType.PremultipliedColors) {
@@ -1050,17 +1085,8 @@ export class CoreNode extends EventEmitter {
1050
1085
  }
1051
1086
  }
1052
1087
 
1053
- if (this.updateType & UpdateType.RenderState) {
1054
- this.updateRenderState(parentClippingRect);
1055
- this.setUpdateType(UpdateType.IsRenderable);
1056
- }
1057
-
1058
- if (this.updateType & UpdateType.IsRenderable) {
1059
- this.updateIsRenderable();
1060
- }
1061
-
1062
1088
  // No need to update zIndex if there is no parent
1063
- if (parent && this.updateType & UpdateType.CalculatedZIndex) {
1089
+ if (parent !== null && this.updateType & UpdateType.CalculatedZIndex) {
1064
1090
  this.calculateZIndex();
1065
1091
  // Tell parent to re-sort children
1066
1092
  parent.setUpdateType(UpdateType.ZIndexSortedChildren);
@@ -1068,18 +1094,23 @@ export class CoreNode extends EventEmitter {
1068
1094
 
1069
1095
  if (
1070
1096
  this.updateType & UpdateType.Children &&
1071
- this.children.length &&
1072
- !this.rtt
1097
+ this.children.length > 0 &&
1098
+ this.rtt === false
1073
1099
  ) {
1074
- this.children.forEach((child) => {
1075
- // Trigger the depenedent update types on the child
1076
- child.setUpdateType(childUpdateType);
1077
- // If child has no updates, skip
1100
+ for (let i = 0; i < this.children.length; i++) {
1101
+ const child = this.children[i];
1102
+ if (child === undefined) {
1103
+ continue;
1104
+ }
1105
+
1106
+ child.setUpdateType(this.childUpdateType);
1107
+
1078
1108
  if (child.updateType === 0) {
1079
- return;
1109
+ continue;
1080
1110
  }
1111
+
1081
1112
  child.update(delta, this.clippingRect);
1082
- });
1113
+ }
1083
1114
  }
1084
1115
 
1085
1116
  // Sorting children MUST happen after children have been updated so
@@ -1091,6 +1122,7 @@ export class CoreNode extends EventEmitter {
1091
1122
 
1092
1123
  // reset update type
1093
1124
  this.updateType = 0;
1125
+ this.childUpdateType = 0;
1094
1126
  }
1095
1127
 
1096
1128
  //check if CoreNode is renderable based on props
@@ -1151,39 +1183,112 @@ export class CoreNode extends EventEmitter {
1151
1183
  return false;
1152
1184
  }
1153
1185
 
1154
- checkRenderBounds(parentClippingRect: RectWithValid): CoreNodeRenderState {
1186
+ checkRenderBounds(): CoreNodeRenderState {
1155
1187
  assertTruthy(this.renderBound);
1156
- const rectW = parentClippingRect.width || this.stage.root.width;
1157
- const rectH = parentClippingRect.height || this.stage.root.height;
1158
- this.strictBound = createBound(
1159
- parentClippingRect.x,
1160
- parentClippingRect.y,
1161
- parentClippingRect.x + rectW,
1162
- parentClippingRect.y + rectH,
1163
- this.strictBound,
1164
- );
1188
+ assertTruthy(this.strictBound);
1189
+ assertTruthy(this.preloadBound);
1165
1190
 
1166
1191
  if (boundInsideBound(this.renderBound, this.strictBound)) {
1167
1192
  return CoreNodeRenderState.InViewport;
1168
1193
  }
1169
1194
 
1195
+ if (boundInsideBound(this.renderBound, this.preloadBound)) {
1196
+ return CoreNodeRenderState.InBounds;
1197
+ }
1198
+
1199
+ // check if we're larger then our parent, we're definitely in the viewport
1200
+ if (boundLargeThanBound(this.renderBound, this.strictBound)) {
1201
+ return CoreNodeRenderState.InViewport;
1202
+ }
1203
+
1204
+ // check if we dont have dimensions, take our parent's render state
1205
+ if (
1206
+ this.parent !== null &&
1207
+ (this.props.width === 0 || this.props.height === 0)
1208
+ ) {
1209
+ return this.parent.renderState;
1210
+ }
1211
+
1212
+ return CoreNodeRenderState.OutOfBounds;
1213
+ }
1214
+
1215
+ createPreloadBounds(strictBound: Bound): Bound {
1170
1216
  const renderM = this.stage.boundsMargin;
1171
- this.preloadBound = createBound(
1172
- this.strictBound.x1 - renderM[3],
1173
- this.strictBound.y1 - renderM[0],
1174
- this.strictBound.x2 + renderM[1],
1175
- this.strictBound.y2 + renderM[2],
1217
+ return createBound(
1218
+ strictBound.x1 - renderM[3],
1219
+ strictBound.y1 - renderM[0],
1220
+ strictBound.x2 + renderM[1],
1221
+ strictBound.y2 + renderM[2],
1176
1222
  this.preloadBound,
1177
1223
  );
1224
+ }
1178
1225
 
1179
- if (boundInsideBound(this.renderBound, this.preloadBound)) {
1180
- return CoreNodeRenderState.InBounds;
1226
+ updateBoundingRect() {
1227
+ const { renderCoords, globalTransform: transform } = this;
1228
+ assertTruthy(transform);
1229
+ assertTruthy(renderCoords);
1230
+
1231
+ const { tb, tc } = transform;
1232
+ const { x1, y1, x3, y3 } = renderCoords;
1233
+ if (tb === 0 || tc === 0) {
1234
+ this.renderBound = createBound(x1, y1, x3, y3, this.renderBound);
1235
+ } else {
1236
+ const { x2, x4, y2, y4 } = renderCoords;
1237
+ this.renderBound = createBound(
1238
+ Math.min(x1, x2, x3, x4),
1239
+ Math.min(y1, y2, y3, y4),
1240
+ Math.max(x1, x2, x3, x4),
1241
+ Math.max(y1, y2, y3, y4),
1242
+ this.renderBound,
1243
+ );
1181
1244
  }
1182
- return CoreNodeRenderState.OutOfBounds;
1183
1245
  }
1184
1246
 
1185
- updateRenderState(parentClippingRect: RectWithValid) {
1186
- const renderState = this.checkRenderBounds(parentClippingRect);
1247
+ createRenderBounds(): void {
1248
+ assertTruthy(this.stage);
1249
+
1250
+ // no clipping, use parent's bounds
1251
+ if (this.clipping === false) {
1252
+ if (this.parent !== null) {
1253
+ this.strictBound =
1254
+ this.parent.strictBound ??
1255
+ createBound(0, 0, this.stage.root.width, this.stage.root.height);
1256
+
1257
+ this.preloadBound =
1258
+ this.parent.preloadBound ??
1259
+ this.createPreloadBounds(this.strictBound);
1260
+ return;
1261
+ } else {
1262
+ this.strictBound = createBound(
1263
+ 0,
1264
+ 0,
1265
+ this.stage.root.width,
1266
+ this.stage.root.height,
1267
+ );
1268
+
1269
+ this.preloadBound = this.createPreloadBounds(this.strictBound);
1270
+ return;
1271
+ }
1272
+ }
1273
+
1274
+ // clipping is enabled create our own bounds
1275
+ const { x, y, width, height } = this.props;
1276
+ const { tx, ty } = this.globalTransform || {};
1277
+ const _x = tx ?? x;
1278
+ const _y = ty ?? y;
1279
+ this.strictBound = createBound(
1280
+ _x,
1281
+ _y,
1282
+ _x + width,
1283
+ _y + height,
1284
+ this.strictBound,
1285
+ );
1286
+
1287
+ this.preloadBound = this.createPreloadBounds(this.strictBound);
1288
+ }
1289
+
1290
+ updateRenderState() {
1291
+ const renderState = this.checkRenderBounds();
1187
1292
 
1188
1293
  if (renderState === this.renderState) {
1189
1294
  return;
@@ -1265,26 +1370,6 @@ export class CoreNode extends EventEmitter {
1265
1370
  }
1266
1371
  }
1267
1372
 
1268
- updateBoundingRect() {
1269
- const { renderCoords, globalTransform: transform } = this;
1270
- assertTruthy(transform);
1271
- assertTruthy(renderCoords);
1272
-
1273
- const { tb, tc } = transform;
1274
- const { x1, y1, x3, y3 } = renderCoords;
1275
- if (tb === 0 || tc === 0) {
1276
- this.renderBound = createBound(x1, y1, x3, y3, this.renderBound);
1277
- } else {
1278
- const { x2, x4, y2, y4 } = renderCoords;
1279
- this.renderBound = createBound(
1280
- Math.min(x1, x2, x3, x4),
1281
- Math.min(y1, y2, y3, y4),
1282
- Math.max(x1, x2, x3, x4),
1283
- Math.max(y1, y2, y3, y4),
1284
- this.renderBound,
1285
- );
1286
- }
1287
- }
1288
1373
  /**
1289
1374
  * This function calculates the clipping rectangle for a node.
1290
1375
  *
@@ -1300,7 +1385,7 @@ export class CoreNode extends EventEmitter {
1300
1385
 
1301
1386
  const isRotated = gt.tb !== 0 || gt.tc !== 0;
1302
1387
 
1303
- if (clipping && !isRotated) {
1388
+ if (clipping === true && isRotated === false) {
1304
1389
  clippingRect.x = gt.tx;
1305
1390
  clippingRect.y = gt.ty;
1306
1391
  clippingRect.width = this.width * gt.ta;
@@ -1310,10 +1395,10 @@ export class CoreNode extends EventEmitter {
1310
1395
  clippingRect.valid = false;
1311
1396
  }
1312
1397
 
1313
- if (parentClippingRect.valid && clippingRect.valid) {
1398
+ if (parentClippingRect.valid === true && clippingRect.valid === true) {
1314
1399
  // Intersect parent clipping rect with node clipping rect
1315
1400
  intersectRect(parentClippingRect, clippingRect, clippingRect);
1316
- } else if (parentClippingRect.valid) {
1401
+ } else if (parentClippingRect.valid === true) {
1317
1402
  // Copy parent clipping rect
1318
1403
  copyRect(parentClippingRect, clippingRect);
1319
1404
  clippingRect.valid = true;
@@ -1642,7 +1727,12 @@ export class CoreNode extends EventEmitter {
1642
1727
 
1643
1728
  set alpha(value: number) {
1644
1729
  this.props.alpha = value;
1645
- this.setUpdateType(UpdateType.PremultipliedColors | UpdateType.WorldAlpha);
1730
+ this.setUpdateType(
1731
+ UpdateType.PremultipliedColors |
1732
+ UpdateType.WorldAlpha |
1733
+ UpdateType.Children,
1734
+ );
1735
+ this.childUpdateType |= UpdateType.Global;
1646
1736
  }
1647
1737
 
1648
1738
  get autosize(): boolean {
@@ -1659,7 +1749,10 @@ export class CoreNode extends EventEmitter {
1659
1749
 
1660
1750
  set clipping(value: boolean) {
1661
1751
  this.props.clipping = value;
1662
- this.setUpdateType(UpdateType.Clipping);
1752
+ this.setUpdateType(
1753
+ UpdateType.Clipping | UpdateType.RenderBounds | UpdateType.Children,
1754
+ );
1755
+ this.childUpdateType |= UpdateType.Global | UpdateType.Clipping;
1663
1756
  }
1664
1757
 
1665
1758
  get color(): number {
@@ -1825,6 +1918,9 @@ export class CoreNode extends EventEmitter {
1825
1918
  }
1826
1919
  }
1827
1920
  this.updateScaleRotateTransform();
1921
+
1922
+ // fetch render bounds from parent
1923
+ this.setUpdateType(UpdateType.RenderBounds | UpdateType.Children);
1828
1924
  }
1829
1925
 
1830
1926
  get preventCleanup(): boolean {
package/src/core/Stage.ts CHANGED
@@ -381,20 +381,20 @@ export class Stage {
381
381
  }
382
382
 
383
383
  addQuads(node: CoreNode) {
384
- assertTruthy(this.renderer && node.globalTransform);
384
+ assertTruthy(this.renderer);
385
385
 
386
- if (node.isRenderable) {
386
+ if (node.isRenderable === true) {
387
387
  node.renderQuads(this.renderer);
388
388
  }
389
389
 
390
390
  for (let i = 0; i < node.children.length; i++) {
391
391
  const child = node.children[i];
392
392
 
393
- if (!child) {
393
+ if (child === undefined) {
394
394
  continue;
395
395
  }
396
396
 
397
- if (child?.worldAlpha === 0) {
397
+ if (child.worldAlpha === 0) {
398
398
  continue;
399
399
  }
400
400
 
@@ -244,6 +244,15 @@ export function boundInsideBound(bound1: Bound, bound2: Bound) {
244
244
  );
245
245
  }
246
246
 
247
+ export function boundLargeThanBound(bound1: Bound, bound2: Bound) {
248
+ return (
249
+ bound1.x1 < bound2.x1 &&
250
+ bound1.x2 > bound2.x2 &&
251
+ bound1.y1 < bound2.y1 &&
252
+ bound1.y2 > bound2.y2
253
+ );
254
+ }
255
+
247
256
  export function isBoundPositive(bound: Bound): boolean {
248
257
  return bound.x1 < bound.x2 && bound.y1 < bound.y2;
249
258
  }
@@ -131,7 +131,10 @@ export class CanvasCoreTexture extends CoreContextTexture {
131
131
  if (ctx) ctx.putImageData(data, 0, 0);
132
132
  this.image = canvas;
133
133
  return { width: data.width, height: data.height };
134
- } else if (data instanceof ImageBitmap) {
134
+ } else if (
135
+ typeof ImageBitmap !== 'undefined' &&
136
+ data instanceof ImageBitmap
137
+ ) {
135
138
  this.image = data;
136
139
  return { width: data.width, height: data.height };
137
140
  }
@@ -134,7 +134,8 @@ export class WebGlCoreCtxTexture extends CoreContextTexture {
134
134
  // If textureData is null, the texture is empty (0, 0) and we don't need to
135
135
  // upload any data to the GPU.
136
136
  if (
137
- textureData.data instanceof ImageBitmap ||
137
+ (typeof ImageBitmap !== 'undefined' &&
138
+ textureData.data instanceof ImageBitmap) ||
138
139
  textureData.data instanceof ImageData ||
139
140
  // not using typeof HTMLImageElement due to web worker
140
141
  isHTMLImageElement(textureData.data)
@@ -254,13 +254,18 @@ export class WebGlCoreRenderer extends CoreRenderer {
254
254
 
255
255
  /**
256
256
  * If the shader props contain any automatic properties, update it with the
257
- * current dimensions that will be used to render the quad.
257
+ * current dimensions and or alpha that will be used to render the quad.
258
258
  */
259
- if (shaderProps && hasOwn(shaderProps, '$dimensions')) {
260
- const dimensions = shaderProps.$dimensions as Dimensions;
261
- // eslint-disable-next-line @typescript-eslint/no-unsafe-assignment
262
- dimensions.width = width;
263
- dimensions.height = height;
259
+ if (shaderProps !== null) {
260
+ if (hasOwn(shaderProps, '$dimensions')) {
261
+ const dimensions = shaderProps.$dimensions as Dimensions;
262
+ dimensions.width = width;
263
+ dimensions.height = height;
264
+ }
265
+
266
+ if (hasOwn(shaderProps, '$alpha')) {
267
+ shaderProps.$alpha = alpha;
268
+ }
264
269
  }
265
270
 
266
271
  texture = texture ?? this.defaultTexture;
@@ -172,6 +172,7 @@ export class DynamicShader extends WebGlCoreShader {
172
172
  propsB: Required<DynamicShaderProps>,
173
173
  ): boolean {
174
174
  if (
175
+ propsA.$alpha !== propsB.$alpha ||
175
176
  propsA.$dimensions.width !== propsB.$dimensions.width ||
176
177
  propsA.$dimensions.height !== propsB.$dimensions.height ||
177
178
  propsA.effects.length !== propsB.effects.length
@@ -192,7 +192,7 @@ export interface RendererMainSettings {
192
192
  * in the renderer and allow inspection of the state of the nodes.
193
193
  *
194
194
  */
195
- inspector: typeof Inspector | undefined;
195
+ inspector?: typeof Inspector | false;
196
196
 
197
197
  /**
198
198
  * Renderer Engine
@@ -330,7 +330,7 @@ export class RendererMain extends EventEmitter {
330
330
  numImageWorkers:
331
331
  settings.numImageWorkers !== undefined ? settings.numImageWorkers : 2,
332
332
  enableContextSpy: settings.enableContextSpy ?? false,
333
- inspector: settings.inspector,
333
+ inspector: settings.inspector ?? false,
334
334
  renderEngine: settings.renderEngine,
335
335
  quadBufferSize: settings.quadBufferSize ?? 4 * 1024 * 1024,
336
336
  fontEngines: settings.fontEngines,
@@ -1,74 +0,0 @@
1
- /**
2
- * Lightning 3 Renderer Core API
3
- *
4
- * @remarks
5
- * ```
6
- * import * from '@lightning/renderer/core';
7
- * ```
8
- *
9
- * The Core API is used by developers to extend the capabilities of the Renderer
10
- * by writing custom Shaders, Dynamic Shader Effects, Textures, Text Renderers,
11
- * etc.
12
- *
13
- * Custom capabilities as well as fonts can be loaded via Core Extensions.
14
- *
15
- * A core extension module is structured like so:
16
- * ```ts
17
- * import {
18
- * CoreExtension,
19
- * WebTrFontFace,
20
- * SdfTrFontFace,
21
- * type Stage
22
- * } from '@lightning/renderer/core';
23
- *
24
- * export default class MyCoreExtension extends CoreExtension {
25
- * async run(stage: Stage) {
26
- * stage.fontManager.addFontFace(
27
- * new WebTrFontFace('Ubuntu', {}, '/fonts/Ubuntu-Regular.ttf'),
28
- * );
29
- *
30
- * stage.fontManager.addFontFace(
31
- * new SdfTrFontFace(
32
- * 'Ubuntu',
33
- * {},
34
- * 'msdf',
35
- * stage,
36
- * '/fonts/Ubuntu-Regular.msdf.png',
37
- * '/fonts/Ubuntu-Regular.msdf.json',
38
- * ),
39
- * );
40
- * }
41
- * }
42
- * ```
43
- *
44
- * And then imported and registered in the application's entry point
45
- * using the `@lightningjs/vite-plugin-import-chunk-url` plugin:
46
- * ```ts
47
- * import coreExtensionModuleUrl from './MyCoreExtension.js?importChunkUrl';
48
- *
49
- * // Set up driver, etc.
50
- *
51
- * // Initialize the Renderer
52
- * const renderer = new RendererMain(
53
- * {
54
- * // Other Renderer Config...
55
- * coreExtensionModule: coreExtensionModuleUrl,
56
- * },
57
- * 'app',
58
- * driver,
59
- * );
60
- * ```
61
- *
62
- * @module
63
- */
64
- export * from '../src/core/renderers/webgl/WebGlCoreShader.js';
65
- export * from '../src/core/renderers/webgl/shaders/effects/ShaderEffect.js';
66
- export * from '../src/core/textures/Texture.js';
67
- export * from '../src/core/text-rendering/renderers/TextRenderer.js';
68
- export * from '../src/core/text-rendering/renderers/CanvasTextRenderer.js';
69
- export * from '../src/core/text-rendering/renderers/SdfTextRenderer/SdfTextRenderer.js';
70
- export * from '../src/core/text-rendering/font-face-types/TrFontFace.js';
71
- export * from '../src/core/text-rendering/font-face-types/WebTrFontFace.js';
72
- export * from '../src/core/text-rendering/font-face-types/SdfTrFontFace/SdfTrFontFace.js';
73
- export * from '../src/core/CoreExtension.js';
74
- export type * from '../src/core/Stage.js';
@@ -1,96 +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
- * Lightning 3 Renderer Core API
21
- *
22
- * @remarks
23
- * ```
24
- * import * from '@lightning/renderer/core';
25
- * ```
26
- *
27
- * The Core API is used by developers to extend the capabilities of the Renderer
28
- * by writing custom Shaders, Dynamic Shader Effects, Textures, Text Renderers,
29
- * etc.
30
- *
31
- * Custom capabilities as well as fonts can be loaded via Core Extensions.
32
- *
33
- * A core extension module is structured like so:
34
- * ```ts
35
- * import {
36
- * CoreExtension,
37
- * WebTrFontFace,
38
- * SdfTrFontFace,
39
- * type Stage
40
- * } from '@lightning/renderer/core';
41
- *
42
- * export default class MyCoreExtension extends CoreExtension {
43
- * async run(stage: Stage) {
44
- * stage.fontManager.addFontFace(
45
- * new WebTrFontFace('Ubuntu', {}, '/fonts/Ubuntu-Regular.ttf'),
46
- * );
47
- *
48
- * stage.fontManager.addFontFace(
49
- * new SdfTrFontFace(
50
- * 'Ubuntu',
51
- * {},
52
- * 'msdf',
53
- * stage,
54
- * '/fonts/Ubuntu-Regular.msdf.png',
55
- * '/fonts/Ubuntu-Regular.msdf.json',
56
- * ),
57
- * );
58
- * }
59
- * }
60
- * ```
61
- *
62
- * And then imported and registered in the application's entry point
63
- * using the `@lightningjs/vite-plugin-import-chunk-url` plugin:
64
- * ```ts
65
- * import coreExtensionModuleUrl from './MyCoreExtension.js?importChunkUrl';
66
- *
67
- * // Set up driver, etc.
68
- *
69
- * // Initialize the Renderer
70
- * const renderer = new RendererMain(
71
- * {
72
- * // Other Renderer Config...
73
- * coreExtensionModule: coreExtensionModuleUrl,
74
- * },
75
- * 'app',
76
- * driver,
77
- * );
78
- * ```
79
- *
80
- * @module
81
- */
82
- // Shaders
83
- export * from '../src/core/renderers/webgl/WebGlCoreShader.js';
84
- export * from '../src/core/renderers/webgl/shaders/effects/ShaderEffect.js';
85
- // Textures
86
- export * from '../src/core/textures/Texture.js';
87
- // Text Rendering & Fonts
88
- export * from '../src/core/text-rendering/renderers/TextRenderer.js';
89
- export * from '../src/core/text-rendering/renderers/CanvasTextRenderer.js';
90
- export * from '../src/core/text-rendering/renderers/SdfTextRenderer/SdfTextRenderer.js';
91
- export * from '../src/core/text-rendering/font-face-types/TrFontFace.js';
92
- export * from '../src/core/text-rendering/font-face-types/WebTrFontFace.js';
93
- export * from '../src/core/text-rendering/font-face-types/SdfTrFontFace/SdfTrFontFace.js';
94
- // Core Extensions
95
- export * from '../src/core/CoreExtension.js';
96
- //# sourceMappingURL=core-api.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"core-api.js","sourceRoot":"","sources":["../../exports/core-api.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;GAiBG;AACH;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA8DG;AAEH,UAAU;AACV,cAAc,gDAAgD,CAAC;AAC/D,cAAc,6DAA6D,CAAC;AAE5E,WAAW;AACX,cAAc,iCAAiC,CAAC;AAEhD,yBAAyB;AACzB,cAAc,sDAAsD,CAAC;AACrE,cAAc,4DAA4D,CAAC;AAC3E,cAAc,yEAAyE,CAAC;AACxF,cAAc,0DAA0D,CAAC;AACzE,cAAc,6DAA6D,CAAC;AAC5E,cAAc,2EAA2E,CAAC;AAE1F,kBAAkB;AAClB,cAAc,8BAA8B,CAAC"}