@needle-tools/engine 4.4.0-ci.1 → 4.4.2

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 (147) hide show
  1. package/CHANGELOG.md +67 -0
  2. package/dist/assets/generateMeshBVH.worker-b7788939.js +25 -0
  3. package/dist/needle-engine.bundle.js +7043 -6766
  4. package/dist/needle-engine.bundle.light.js +7205 -6928
  5. package/dist/needle-engine.bundle.light.min.js +169 -139
  6. package/dist/needle-engine.bundle.light.umd.cjs +173 -143
  7. package/dist/needle-engine.bundle.min.js +169 -139
  8. package/dist/needle-engine.bundle.umd.cjs +172 -142
  9. package/dist/needle-engine.js +468 -467
  10. package/dist/needle-engine.light.js +468 -467
  11. package/dist/needle-engine.light.min.js +1 -1
  12. package/dist/needle-engine.light.umd.cjs +1 -1
  13. package/dist/needle-engine.min.js +1 -1
  14. package/dist/needle-engine.umd.cjs +1 -1
  15. package/dist/vendor.js +5108 -5122
  16. package/dist/vendor.light.js +5108 -5122
  17. package/dist/vendor.light.min.js +84 -84
  18. package/dist/vendor.light.umd.cjs +78 -78
  19. package/dist/vendor.min.js +84 -84
  20. package/dist/vendor.umd.cjs +78 -78
  21. package/lib/engine/codegen/register_types.js +2 -0
  22. package/lib/engine/codegen/register_types.js.map +1 -1
  23. package/lib/engine/engine_addressables.js.map +1 -1
  24. package/lib/engine/engine_components.js +3 -1
  25. package/lib/engine/engine_components.js.map +1 -1
  26. package/lib/engine/engine_context.d.ts +141 -14
  27. package/lib/engine/engine_context.js +164 -26
  28. package/lib/engine/engine_context.js.map +1 -1
  29. package/lib/engine/engine_element.js +12 -10
  30. package/lib/engine/engine_element.js.map +1 -1
  31. package/lib/engine/engine_gameobject.js +5 -0
  32. package/lib/engine/engine_gameobject.js.map +1 -1
  33. package/lib/engine/engine_license.d.ts +2 -0
  34. package/lib/engine/engine_license.js +103 -62
  35. package/lib/engine/engine_license.js.map +1 -1
  36. package/lib/engine/engine_networking_blob.js +40 -24
  37. package/lib/engine/engine_networking_blob.js.map +1 -1
  38. package/lib/engine/engine_physics_rapier.js +10 -9
  39. package/lib/engine/engine_physics_rapier.js.map +1 -1
  40. package/lib/engine/engine_serialization_core.js +6 -2
  41. package/lib/engine/engine_serialization_core.js.map +1 -1
  42. package/lib/engine/engine_utils_screenshot.js +1 -1
  43. package/lib/engine/engine_utils_screenshot.js.map +1 -1
  44. package/lib/engine/js-extensions/RGBAColor.d.ts +1 -0
  45. package/lib/engine/js-extensions/RGBAColor.js +56 -7
  46. package/lib/engine/js-extensions/RGBAColor.js.map +1 -1
  47. package/lib/engine/physics/workers/mesh-bvh/GenerateMeshBVHWorker.js +4 -3
  48. package/lib/engine/physics/workers/mesh-bvh/GenerateMeshBVHWorker.js.map +1 -1
  49. package/lib/engine/webcomponents/needle menu/needle-menu-spatial.js +6 -6
  50. package/lib/engine/webcomponents/needle menu/needle-menu-spatial.js.map +1 -1
  51. package/lib/engine/webcomponents/needle menu/needle-menu.d.ts +4 -0
  52. package/lib/engine/webcomponents/needle menu/needle-menu.js +13 -2
  53. package/lib/engine/webcomponents/needle menu/needle-menu.js.map +1 -1
  54. package/lib/engine/xr/NeedleXRController.js +2 -3
  55. package/lib/engine/xr/NeedleXRController.js.map +1 -1
  56. package/lib/engine/xr/NeedleXRSession.js +12 -12
  57. package/lib/engine/xr/NeedleXRSession.js.map +1 -1
  58. package/lib/engine-components/AudioSource.js +7 -0
  59. package/lib/engine-components/AudioSource.js.map +1 -1
  60. package/lib/engine-components/Camera.js +18 -12
  61. package/lib/engine-components/Camera.js.map +1 -1
  62. package/lib/engine-components/CameraUtils.js +8 -14
  63. package/lib/engine-components/CameraUtils.js.map +1 -1
  64. package/lib/engine-components/GroundProjection.js +1 -1
  65. package/lib/engine-components/GroundProjection.js.map +1 -1
  66. package/lib/engine-components/NeedleMenu.js +1 -1
  67. package/lib/engine-components/NeedleMenu.js.map +1 -1
  68. package/lib/engine-components/OrbitControls.js +3 -1
  69. package/lib/engine-components/OrbitControls.js.map +1 -1
  70. package/lib/engine-components/ReflectionProbe.d.ts +1 -0
  71. package/lib/engine-components/ReflectionProbe.js +16 -9
  72. package/lib/engine-components/ReflectionProbe.js.map +1 -1
  73. package/lib/engine-components/SceneSwitcher.js +28 -7
  74. package/lib/engine-components/SceneSwitcher.js.map +1 -1
  75. package/lib/engine-components/SyncedTransform.d.ts +6 -0
  76. package/lib/engine-components/SyncedTransform.js +10 -5
  77. package/lib/engine-components/SyncedTransform.js.map +1 -1
  78. package/lib/engine-components/codegen/components.d.ts +1 -0
  79. package/lib/engine-components/codegen/components.js +1 -0
  80. package/lib/engine-components/codegen/components.js.map +1 -1
  81. package/lib/engine-components/export/usdz/extensions/USDZUI.js +2 -1
  82. package/lib/engine-components/export/usdz/extensions/USDZUI.js.map +1 -1
  83. package/lib/engine-components/ui/BaseUIComponent.d.ts +0 -1
  84. package/lib/engine-components/ui/BaseUIComponent.js +1 -1
  85. package/lib/engine-components/ui/BaseUIComponent.js.map +1 -1
  86. package/lib/engine-components/ui/EventSystem.js +1 -1
  87. package/lib/engine-components/ui/EventSystem.js.map +1 -1
  88. package/lib/engine-components/ui/Graphic.js +1 -0
  89. package/lib/engine-components/ui/Graphic.js.map +1 -1
  90. package/lib/engine-components/ui/RaycastUtils.js +1 -1
  91. package/lib/engine-components/ui/RaycastUtils.js.map +1 -1
  92. package/lib/engine-components/ui/RectTransform.d.ts +2 -2
  93. package/lib/engine-components/ui/RectTransform.js +9 -6
  94. package/lib/engine-components/ui/RectTransform.js.map +1 -1
  95. package/lib/engine-components/ui/Symbols.d.ts +1 -0
  96. package/lib/engine-components/ui/Symbols.js +2 -0
  97. package/lib/engine-components/ui/Symbols.js.map +1 -0
  98. package/lib/engine-components/ui/Utils.js +1 -1
  99. package/lib/engine-components/ui/Utils.js.map +1 -1
  100. package/lib/engine-components/utils/EnvironmentScene.d.ts +1 -1
  101. package/lib/engine-components/utils/EnvironmentScene.js +1 -1
  102. package/lib/engine-components/utils/EnvironmentScene.js.map +1 -1
  103. package/package.json +3 -3
  104. package/plugins/common/license.js +115 -27
  105. package/plugins/types/userconfig.d.ts +8 -0
  106. package/plugins/vite/build-pipeline.js +1 -1
  107. package/plugins/vite/defines.js +3 -1
  108. package/plugins/vite/dependencies.js +23 -4
  109. package/plugins/vite/facebook-instant-games.js +7 -4
  110. package/plugins/vite/index.js +1 -1
  111. package/plugins/vite/license.js +2 -1
  112. package/src/engine/codegen/register_types.ts +2 -0
  113. package/src/engine/engine_addressables.ts +3 -2
  114. package/src/engine/engine_components.ts +2 -1
  115. package/src/engine/engine_context.ts +169 -33
  116. package/src/engine/engine_element.ts +10 -9
  117. package/src/engine/engine_gameobject.ts +7 -0
  118. package/src/engine/engine_license.ts +116 -67
  119. package/src/engine/engine_networking_blob.ts +47 -26
  120. package/src/engine/engine_physics_rapier.ts +10 -12
  121. package/src/engine/engine_serialization_core.ts +6 -1
  122. package/src/engine/engine_utils_screenshot.ts +1 -1
  123. package/src/engine/js-extensions/RGBAColor.ts +59 -8
  124. package/src/engine/physics/workers/mesh-bvh/GenerateMeshBVHWorker.js +6 -6
  125. package/src/engine/webcomponents/needle menu/needle-menu-spatial.ts +6 -6
  126. package/src/engine/webcomponents/needle menu/needle-menu.ts +13 -2
  127. package/src/engine/xr/NeedleXRController.ts +2 -3
  128. package/src/engine/xr/NeedleXRSession.ts +12 -12
  129. package/src/engine-components/AudioSource.ts +8 -3
  130. package/src/engine-components/Camera.ts +34 -22
  131. package/src/engine-components/CameraUtils.ts +8 -16
  132. package/src/engine-components/GroundProjection.ts +1 -1
  133. package/src/engine-components/NeedleMenu.ts +1 -1
  134. package/src/engine-components/OrbitControls.ts +2 -1
  135. package/src/engine-components/ReflectionProbe.ts +15 -8
  136. package/src/engine-components/SceneSwitcher.ts +28 -11
  137. package/src/engine-components/SyncedTransform.ts +11 -6
  138. package/src/engine-components/codegen/components.ts +1 -0
  139. package/src/engine-components/export/usdz/extensions/USDZUI.ts +2 -2
  140. package/src/engine-components/ui/BaseUIComponent.ts +1 -1
  141. package/src/engine-components/ui/EventSystem.ts +1 -1
  142. package/src/engine-components/ui/Graphic.ts +1 -1
  143. package/src/engine-components/ui/RaycastUtils.ts +1 -1
  144. package/src/engine-components/ui/RectTransform.ts +10 -7
  145. package/src/engine-components/ui/Symbols.ts +2 -0
  146. package/src/engine-components/ui/Utils.ts +2 -1
  147. package/src/engine-components/utils/EnvironmentScene.ts +1 -1
@@ -229,26 +229,43 @@ export class Context {
229
229
  return window.innerHeight;
230
230
  return this.domElement.clientHeight;
231
231
  }
232
- /** the X position of the Needle Engine element on the website */
232
+ /** the X position of the `<needle-engine>` element on the website */
233
233
  get domX() {
234
234
  this.calculateBoundingClientRect();
235
235
  return this._domX;
236
236
  }
237
- /** the Y position of the Needlee Engine element on the website */
237
+ /** the Y position of the `<needle-engine>` element on the website */
238
238
  get domY() {
239
239
  this.calculateBoundingClientRect();
240
240
  return this._domY;
241
241
  }
242
+ /**
243
+ * Is a XR session currently active and presenting?
244
+ * @returns true if the xr renderer is currently presenting
245
+ */
242
246
  get isInXR() { return this.renderer?.xr?.isPresenting || false; }
243
247
  /** shorthand for `NeedleXRSession.active`
244
248
  * Automatically set by NeedleXRSession when a XR session is active
245
249
  * @returns the active XR session or null if no session is active
246
250
  * */
247
251
  xr = null;
252
+ /**
253
+ * Shorthand for `this.xr?.mode`. AR or VR
254
+ * @returns the current XR session mode (immersive-vr or immersive-ar)
255
+ */
248
256
  get xrSessionMode() { return this.xr?.mode; }
257
+ /** Shorthand for `this.xrSessionMode === "immersive-vr"`
258
+ * @returns true if a webxr VR session is currently active.
259
+ */
249
260
  get isInVR() { return this.xrSessionMode === "immersive-vr"; }
261
+ /**
262
+ * Shorthand for `this.xrSessionMode === "immersive-ar"`
263
+ * @returns true if a webxr AR session is currently active.
264
+ */
250
265
  get isInAR() { return this.xrSessionMode === "immersive-ar"; }
251
- /** If a XR session is active and in pass through mode (immersive-ar on e.g. Quest) */
266
+ /** If a XR session is active and in pass through mode (immersive-ar on e.g. Quest)
267
+ * @returns true if the XR session is in pass through mode
268
+ */
252
269
  get isInPassThrough() { return this.xr ? this.xr.isPassThrough : false; }
253
270
  /** access the raw `XRSession` object (shorthand for `context.renderer.xr.getSession()`). For more control use `NeedleXRSession.active` */
254
271
  get xrSession() { return this.renderer?.xr?.getSession(); }
@@ -259,32 +276,77 @@ export class Context {
259
276
  /** @returns the current WebXR camera while the WebXRManager is active (shorthand for `context.renderer.xr.getCamera()`) */
260
277
  get xrCamera() { return this.renderer.xr.isPresenting ? this.renderer?.xr?.getCamera() : undefined; }
261
278
  _xrFrame = null;
279
+ /**
280
+ * The AR overlay element is used to display 2D HTML elements while a AR session is active.
281
+ */
262
282
  get arOverlayElement() {
263
283
  const el = this.domElement;
264
284
  if (typeof el.getAROverlayContainer === "function")
265
285
  return el.getAROverlayContainer();
266
286
  return this.domElement;
267
287
  }
268
- /** Current event of the update cycle */
288
+ /**
289
+ * Current event of the update cycle (e.g. `FrameEvent.EarlyUpdate` or `FrameEvent.OnBeforeRender`)
290
+ */
269
291
  get currentFrameEvent() {
270
292
  return this._currentFrameEvent;
271
293
  }
272
294
  _currentFrameEvent = FrameEvent.Undefined;
295
+ /**
296
+ * The scene contains all objects in the hierarchy and is automatically rendered by the context every frane.
297
+ */
273
298
  scene;
299
+ /**
300
+ * The renderer is used to render the scene. It is automatically created when the context is created.
301
+ */
274
302
  renderer;
303
+ /**
304
+ * The effect composer can be used to render postprocessing effects. If assigned then it will automatically render the scene every frame.
305
+ */
275
306
  composer = null;
276
- // all scripts
307
+ /**
308
+ * @internal All known components. Don't use directly
309
+ */
277
310
  scripts = [];
311
+ /**
312
+ * @internal All paused components. Don't use directly
313
+ */
278
314
  scripts_pausedChanged = [];
279
- // scripts with update event
315
+ /**
316
+ * @internal All components that have a early update event. Don't use directly
317
+ */
280
318
  scripts_earlyUpdate = [];
319
+ /**
320
+ * @internal All components that have a update event. Don't use directly
321
+ */
281
322
  scripts_update = [];
323
+ /**
324
+ * @internal All components that have a late update event. Don't use directly
325
+ */
282
326
  scripts_lateUpdate = [];
327
+ /**
328
+ * @internal All components that have a onBeforeRender event. Don't use directly
329
+ */
283
330
  scripts_onBeforeRender = [];
331
+ /**
332
+ * @internal All components that have a onAfterRender event. Don't use directly
333
+ */
284
334
  scripts_onAfterRender = [];
335
+ /**
336
+ * @internal All components that have coroutines. Don't use directly
337
+ */
285
338
  scripts_WithCorroutines = [];
339
+ /**
340
+ * @internal Components with immersive-vr event methods. Don't use directly
341
+ */
286
342
  scripts_immersive_vr = [];
343
+ /**
344
+ * @internal Components with immersive-ar event methods. Don't use directly
345
+ */
287
346
  scripts_immersive_ar = [];
347
+ /**
348
+ * @internal Coroutine data
349
+ */
288
350
  coroutines = {};
289
351
  /** callbacks called once after the context has been created */
290
352
  post_setup_callbacks = [];
@@ -296,14 +358,25 @@ export class Context {
296
358
  post_render_callbacks = [];
297
359
  /** called every frame befroe update (this list is emptied every frame) */
298
360
  pre_update_oneshot_callbacks = [];
361
+ /** @internal */
299
362
  new_scripts = [];
363
+ /** @internal */
300
364
  new_script_start = [];
365
+ /** @internal */
301
366
  new_scripts_pre_setup_callbacks = [];
367
+ /** @internal */
302
368
  new_scripts_post_setup_callbacks = [];
369
+ /** @internal */
303
370
  new_scripts_xr = [];
304
- /** The main camera component of the scene - this camera is used for rendering */
371
+ /**
372
+ * The **main camera component** of the scene - this camera is used for rendering.
373
+ * Use `setCurrentCamera` for updating the main camera.
374
+ */
305
375
  mainCameraComponent = undefined;
306
- /** The main camera of the scene - this camera is used for rendering */
376
+ /**
377
+ * The main camera of the scene - this camera is used for rendering
378
+ * Use `setCurrentCamera` for updating the main camera.
379
+ */
307
380
  get mainCamera() {
308
381
  if (this._mainCamera) {
309
382
  return this._mainCamera;
@@ -325,11 +398,13 @@ export class Context {
325
398
  }
326
399
  _mainCamera = null;
327
400
  _fallbackCamera = null;
401
+ /** access application state (e.g. if all audio should be muted) */
328
402
  application;
329
403
  /** access animation mixer used by components in the scene */
330
404
  animations;
331
405
  /** access timings (current frame number, deltaTime, timeScale, ...) */
332
406
  time;
407
+ /** access input data (e.g. click or touch events) */
333
408
  input;
334
409
  /** access physics related methods (e.g. raycasting). To access the phyiscs engine use `context.physics.engine` */
335
410
  physics;
@@ -339,6 +414,7 @@ export class Context {
339
414
  * @deprecated AssetDataBase is deprecated
340
415
  */
341
416
  assets;
417
+ /** The main light in the scene */
342
418
  mainLight = null;
343
419
  /** @deprecated Use sceneLighting */
344
420
  get rendererData() { return this.sceneLighting; }
@@ -347,9 +423,11 @@ export class Context {
347
423
  lightmaps;
348
424
  players;
349
425
  lodsManager;
426
+ /** Access the needle menu to add or remove buttons to the menu element */
350
427
  menu;
428
+ /** @returns true if the context is fully created and ready */
351
429
  get isCreated() { return this._isCreated; }
352
- _sizeChanged = false;
430
+ _needsUpdateSize = false;
353
431
  _isCreated = false;
354
432
  _isCreating = false;
355
433
  _isVisible = false;
@@ -385,10 +463,10 @@ export class Context {
385
463
  this.menu = new NeedleMenu(this);
386
464
  this.lodsManager = new LODsManager(this);
387
465
  this.animations = new AnimationsRegistry(this);
388
- const resizeCallback = () => this._sizeChanged = true;
466
+ const resizeCallback = () => this._needsUpdateSize = true;
389
467
  window.addEventListener('resize', resizeCallback);
390
468
  this._disposeCallbacks.push(() => window.removeEventListener('resize', resizeCallback));
391
- const resizeObserver = new ResizeObserver(_ => this._sizeChanged = true);
469
+ const resizeObserver = new ResizeObserver(_ => this._needsUpdateSize = true);
392
470
  resizeObserver.observe(this.domElement);
393
471
  this._disposeCallbacks.push(() => resizeObserver.disconnect());
394
472
  this._intersectionObserver = new IntersectionObserver(entries => {
@@ -397,7 +475,12 @@ export class Context {
397
475
  this._disposeCallbacks.push(() => this._intersectionObserver?.disconnect());
398
476
  ContextRegistry.register(this);
399
477
  }
400
- /** calling this function will dispose the current renderer and create a new one */
478
+ /**
479
+ * Calling this function will dispose the current renderer and create a new one which will then be assigned to the context. It can be used to create a new renderer with custom WebGLRendererParameters.
480
+ * **Note**: Instead you can also modify the static `Context.DefaultWebGlRendererParameters` before the context is created.
481
+ * **Note**: This method is recommended because it re-uses an potentially already existing canvas element. This is necessary to keep input event handlers from working (e.g. components like OrbitControls subscribe to input events on the canvas)
482
+ * @returns {WebGLRenderer} the newly created renderer
483
+ */
401
484
  createNewRenderer(params) {
402
485
  this.renderer?.dispose();
403
486
  params = { ...Context.DefaultWebGLRendererParameters, ...params };
@@ -435,6 +518,7 @@ export class Context {
435
518
  // this.renderer.toneMapping = AgXToneMapping;
436
519
  this.lodsManager.setRenderer(this.renderer);
437
520
  this.input.bindEvents();
521
+ return this.renderer;
438
522
  }
439
523
  _intersectionObserver = null;
440
524
  internalOnUpdateVisible() {
@@ -443,13 +527,29 @@ export class Context {
443
527
  }
444
528
  _disposeCallbacks = [];
445
529
  /** will request a renderer size update the next render call (will call updateSize the next update) */
446
- requestSizeUpdate() { this._sizeChanged = true; }
530
+ requestSizeUpdate() { this._needsUpdateSize = true; }
447
531
  /** Clamps the renderer max resolution. If undefined the max resolution is not clamped. Default is undefined */
448
532
  maxRenderResolution;
449
- /** update the renderer and canvas size */
533
+ /** Control the renderer devicePixelRatio.
534
+ * **Options**
535
+ * - `auto` - Needle Engine automatically sets the pixel ratio to the current window.devicePixelRatio.
536
+ * - `manual` - Needle Engine will not change the renderer pixel ratio. You can set it manually.
537
+ * - `number` - Needle Engine will set the pixel ratio to the given number. The change will be applied to the renderer and the composer (if used) at the end of the current frame.
538
+ */
539
+ get devicePixelRatio() { return this._devicePixelRatio; }
540
+ set devicePixelRatio(val) {
541
+ if (val !== this._devicePixelRatio) {
542
+ this._devicePixelRatio = val;
543
+ this._needsUpdateSize = true;
544
+ }
545
+ }
546
+ _devicePixelRatio = "auto";
547
+ /**
548
+ * Update the renderer and canvas size. This is also automatically called when a DOM size change is detected.
549
+ */
450
550
  updateSize(force = false) {
451
551
  if (force || (!this.isManagedExternally && this.renderer.xr?.isPresenting === false)) {
452
- this._sizeChanged = false;
552
+ this._needsUpdateSize = false;
453
553
  const scaleFactor = this.resolutionScaleFactor;
454
554
  let width = this.domWidth * scaleFactor;
455
555
  let height = this.domHeight * scaleFactor;
@@ -462,19 +562,29 @@ export class Context {
462
562
  const camera = this.mainCamera;
463
563
  this.updateAspect(camera);
464
564
  this.renderer.setSize(width, height, true);
465
- this.renderer.setPixelRatio(window.devicePixelRatio);
466
565
  // avoid setting pixel values here since this can cause pingpong updates
467
566
  // e.g. when system scale is set to 125%
468
567
  // https://github.com/needle-tools/needle-engine-support/issues/69
469
568
  this.renderer.domElement.style.width = "100%";
470
569
  this.renderer.domElement.style.height = "100%";
570
+ const devicePixelRatio = typeof this.devicePixelRatio === "number"
571
+ ? this.devicePixelRatio
572
+ : this.devicePixelRatio === "auto"
573
+ ? window.devicePixelRatio
574
+ : undefined;
575
+ if (devicePixelRatio !== undefined) {
576
+ this.renderer.setPixelRatio(devicePixelRatio);
577
+ }
471
578
  if (this.composer) {
472
579
  this.composer.setSize?.call(this.composer, width, height);
473
- if ("setPixelRatio" in this.composer && typeof this.composer.setPixelRatio === "function")
580
+ if (devicePixelRatio !== undefined && "setPixelRatio" in this.composer && typeof this.composer.setPixelRatio === "function")
474
581
  this.composer.setPixelRatio?.call(this.composer, window.devicePixelRatio);
475
582
  }
476
583
  }
477
584
  }
585
+ /**
586
+ * Update the camera aspect ratio or orthorgraphic camera size. This is automatically called when a DOM size change is detected.
587
+ */
478
588
  updateAspect(camera, width, height) {
479
589
  if (!camera)
480
590
  return;
@@ -520,6 +630,7 @@ export class Context {
520
630
  async onCreate(opts) {
521
631
  return this.create(opts);
522
632
  }
633
+ /** @internal */
523
634
  async create(opts) {
524
635
  try {
525
636
  this._isCreating = true;
@@ -542,7 +653,11 @@ export class Context {
542
653
  onError(error) {
543
654
  this.domElement.dispatchEvent(new CustomEvent("error", { detail: error }));
544
655
  }
545
- /** Will destroy all scenes and objects in the scene
656
+ /**
657
+ * Clears the context and destroys all scenes and objects in the scene.
658
+ * The ContextCleared event is called at the end.
659
+ * This is automatically called when e.g. the `src` attribute changes on `<needle-engine>`
660
+ * or when the web component is removed from the DOM
546
661
  */
547
662
  clear() {
548
663
  ContextRegistry.dispatchCallback(ContextEvent.ContextClearing, this);
@@ -566,6 +681,9 @@ export class Context {
566
681
  // if a user wants to see the background they can still call setClearAlpha(0) and clear manually
567
682
  ContextRegistry.dispatchCallback(ContextEvent.ContextCleared, this);
568
683
  }
684
+ /**
685
+ * Dispose all allocated resources and clears the scene. This is automatically called e.g. when the `<needle-engine>` component is removed from the DOM.
686
+ */
569
687
  dispose() {
570
688
  this.internalOnDestroy();
571
689
  }
@@ -611,6 +729,7 @@ export class Context {
611
729
  Context.Current = null;
612
730
  }
613
731
  }
732
+ /** @internal Automatically called by components when you call `startCoroutine`. Use `startCoroutine` instead */
614
733
  registerCoroutineUpdate(script, coroutine, evt) {
615
734
  if (typeof coroutine?.next !== "function") {
616
735
  console.error("Registered invalid coroutine function from " + script.name + "\nCoroutine functions must be generators: \"*myCoroutine() {...}\"\nStart a coroutine from a component by calling \"this.startCoroutine(myCoroutine())\"");
@@ -621,6 +740,7 @@ export class Context {
621
740
  this.coroutines[evt].push({ comp: script, main: coroutine });
622
741
  return coroutine;
623
742
  }
743
+ /** @internal Automatically called by components. */
624
744
  unregisterCoroutineUpdate(coroutine, evt) {
625
745
  if (!this.coroutines[evt])
626
746
  return;
@@ -628,6 +748,7 @@ export class Context {
628
748
  if (idx >= 0)
629
749
  this.coroutines[evt].splice(idx, 1);
630
750
  }
751
+ /** @internal Automatically called */
631
752
  stopAllCoroutinesFrom(script) {
632
753
  for (const evt in this.coroutines) {
633
754
  const rout = this.coroutines[evt];
@@ -640,6 +761,7 @@ export class Context {
640
761
  }
641
762
  }
642
763
  _cameraStack = [];
764
+ /** Change the main camera */
643
765
  setCurrentCamera(cam) {
644
766
  if (!cam)
645
767
  return;
@@ -659,6 +781,9 @@ export class Context {
659
781
  this.updateAspect(camera);
660
782
  this.mainCameraComponent?.applyClearFlagsIfIsActiveCamera();
661
783
  }
784
+ /**
785
+ * Remove the camera from the mainCamera stack (if it has been set before with `setCurrentCamera`)
786
+ */
662
787
  removeCamera(cam) {
663
788
  if (!cam)
664
789
  return;
@@ -675,7 +800,9 @@ export class Context {
675
800
  }
676
801
  _onBeforeRenderListeners = new Map();
677
802
  _onAfterRenderListeners = new Map();
678
- /** use this to subscribe to onBeforeRender events on threejs objects */
803
+ /** Use to subscribe to onBeforeRender events on threejs objects.
804
+ * @link https://threejs.org/docs/#api/en/core/Object3D.onBeforeRender
805
+ */
679
806
  addBeforeRenderListener(target, callback) {
680
807
  if (!this._onBeforeRenderListeners.has(target.uuid)) {
681
808
  this._onBeforeRenderListeners.set(target.uuid, []);
@@ -683,6 +810,9 @@ export class Context {
683
810
  }
684
811
  this._onBeforeRenderListeners.get(target.uuid).push(callback);
685
812
  }
813
+ /** Remove callback from three `onBeforeRender` event (if it has been added with `addBeforeRenderListener(...)`)
814
+ * @link https://threejs.org/docs/#api/en/core/Object3D.onBeforeRender
815
+ */
686
816
  removeBeforeRenderListener(target, callback) {
687
817
  if (this._onBeforeRenderListeners.has(target.uuid)) {
688
818
  const arr = this._onBeforeRenderListeners.get(target.uuid);
@@ -691,7 +821,10 @@ export class Context {
691
821
  arr.splice(idx, 1);
692
822
  }
693
823
  }
694
- /** use this to subscribe to onAfterRender events on threejs objects */
824
+ /**
825
+ * Subscribe to onAfterRender events on threejs objects
826
+ * @link https://threejs.org/docs/#api/en/core/Object3D.onAfterRender
827
+ */
695
828
  addAfterRenderListener(target, callback) {
696
829
  if (!this._onAfterRenderListeners.has(target.uuid)) {
697
830
  this._onAfterRenderListeners.set(target.uuid, []);
@@ -699,6 +832,10 @@ export class Context {
699
832
  }
700
833
  this._onAfterRenderListeners.get(target.uuid)?.push(callback);
701
834
  }
835
+ /**
836
+ * Remove from onAfterRender events on threejs objects
837
+ * @link https://threejs.org/docs/#api/en/core/Object3D.onAfterRender
838
+ */
702
839
  removeAfterRenderListener(target, callback) {
703
840
  if (this._onAfterRenderListeners.has(target.uuid)) {
704
841
  const arr = this._onAfterRenderListeners.get(target.uuid);
@@ -722,6 +859,7 @@ export class Context {
722
859
  _requireColorTexture = false;
723
860
  _renderTarget;
724
861
  _isRendering = false;
862
+ /** @returns true while the WebGL renderer is rendering (between onBeforeRender and onAfterRender events) */
725
863
  get isRendering() { return this._isRendering; }
726
864
  setRequireDepth(val) {
727
865
  this._requireDepthTexture = val;
@@ -735,7 +873,7 @@ export class Context {
735
873
  get opaqueColorTexture() {
736
874
  return this._renderTarget?.texture || null;
737
875
  }
738
- /** returns true if the dom element is visible on screen */
876
+ /** @returns true if the `<needle-engine>` DOM element is visible on screen (`context.domElement`) */
739
877
  get isVisibleToUser() {
740
878
  if (this.isInXR)
741
879
  return true;
@@ -907,7 +1045,7 @@ export class Context {
907
1045
  // this.composer.addPass(renderPass);
908
1046
  // this.composer.setSize(this.domWidth, this.domHeight);
909
1047
  }
910
- this._sizeChanged = true;
1048
+ this._needsUpdateSize = true;
911
1049
  if (this._stats) {
912
1050
  this._stats.showPanel(0);
913
1051
  this._stats.dom.style.position = "absolute"; // (default is fixed)
@@ -1074,11 +1212,11 @@ export class Context {
1074
1212
  frame = null;
1075
1213
  if (isDevEnvironment() || debug || looputils.hasNewScripts()) {
1076
1214
  try {
1077
- performance.mark('update.start');
1215
+ //performance.mark('update.start');
1078
1216
  this.internalStep(timestamp, frame);
1079
1217
  this._renderlooperrors = 0;
1080
- performance.mark('update.end');
1081
- performance.measure('NE Frame', 'update.start', 'update.end');
1218
+ //performance.mark('update.end');
1219
+ //performance.measure('NE Frame', 'update.start', 'update.end');
1082
1220
  }
1083
1221
  catch (err) {
1084
1222
  this._renderlooperrors += 1;
@@ -1230,7 +1368,7 @@ export class Context {
1230
1368
  }
1231
1369
  this.executeCoroutines(FrameEvent.OnBeforeRender);
1232
1370
  invokeLifecycleFunctions(this, FrameEvent.OnBeforeRender);
1233
- if (this._sizeChanged)
1371
+ if (this._needsUpdateSize)
1234
1372
  this.updateSize();
1235
1373
  if (this.pre_render_callbacks) {
1236
1374
  for (const i in this.pre_render_callbacks) {