@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.
- package/CHANGELOG.md +67 -0
- package/dist/assets/generateMeshBVH.worker-b7788939.js +25 -0
- package/dist/needle-engine.bundle.js +7043 -6766
- package/dist/needle-engine.bundle.light.js +7205 -6928
- package/dist/needle-engine.bundle.light.min.js +169 -139
- package/dist/needle-engine.bundle.light.umd.cjs +173 -143
- package/dist/needle-engine.bundle.min.js +169 -139
- package/dist/needle-engine.bundle.umd.cjs +172 -142
- package/dist/needle-engine.js +468 -467
- package/dist/needle-engine.light.js +468 -467
- package/dist/needle-engine.light.min.js +1 -1
- package/dist/needle-engine.light.umd.cjs +1 -1
- package/dist/needle-engine.min.js +1 -1
- package/dist/needle-engine.umd.cjs +1 -1
- package/dist/vendor.js +5108 -5122
- package/dist/vendor.light.js +5108 -5122
- package/dist/vendor.light.min.js +84 -84
- package/dist/vendor.light.umd.cjs +78 -78
- package/dist/vendor.min.js +84 -84
- package/dist/vendor.umd.cjs +78 -78
- package/lib/engine/codegen/register_types.js +2 -0
- package/lib/engine/codegen/register_types.js.map +1 -1
- package/lib/engine/engine_addressables.js.map +1 -1
- package/lib/engine/engine_components.js +3 -1
- package/lib/engine/engine_components.js.map +1 -1
- package/lib/engine/engine_context.d.ts +141 -14
- package/lib/engine/engine_context.js +164 -26
- package/lib/engine/engine_context.js.map +1 -1
- package/lib/engine/engine_element.js +12 -10
- package/lib/engine/engine_element.js.map +1 -1
- package/lib/engine/engine_gameobject.js +5 -0
- package/lib/engine/engine_gameobject.js.map +1 -1
- package/lib/engine/engine_license.d.ts +2 -0
- package/lib/engine/engine_license.js +103 -62
- package/lib/engine/engine_license.js.map +1 -1
- package/lib/engine/engine_networking_blob.js +40 -24
- package/lib/engine/engine_networking_blob.js.map +1 -1
- package/lib/engine/engine_physics_rapier.js +10 -9
- package/lib/engine/engine_physics_rapier.js.map +1 -1
- package/lib/engine/engine_serialization_core.js +6 -2
- package/lib/engine/engine_serialization_core.js.map +1 -1
- package/lib/engine/engine_utils_screenshot.js +1 -1
- package/lib/engine/engine_utils_screenshot.js.map +1 -1
- package/lib/engine/js-extensions/RGBAColor.d.ts +1 -0
- package/lib/engine/js-extensions/RGBAColor.js +56 -7
- package/lib/engine/js-extensions/RGBAColor.js.map +1 -1
- package/lib/engine/physics/workers/mesh-bvh/GenerateMeshBVHWorker.js +4 -3
- package/lib/engine/physics/workers/mesh-bvh/GenerateMeshBVHWorker.js.map +1 -1
- package/lib/engine/webcomponents/needle menu/needle-menu-spatial.js +6 -6
- package/lib/engine/webcomponents/needle menu/needle-menu-spatial.js.map +1 -1
- package/lib/engine/webcomponents/needle menu/needle-menu.d.ts +4 -0
- package/lib/engine/webcomponents/needle menu/needle-menu.js +13 -2
- package/lib/engine/webcomponents/needle menu/needle-menu.js.map +1 -1
- package/lib/engine/xr/NeedleXRController.js +2 -3
- package/lib/engine/xr/NeedleXRController.js.map +1 -1
- package/lib/engine/xr/NeedleXRSession.js +12 -12
- package/lib/engine/xr/NeedleXRSession.js.map +1 -1
- package/lib/engine-components/AudioSource.js +7 -0
- package/lib/engine-components/AudioSource.js.map +1 -1
- package/lib/engine-components/Camera.js +18 -12
- package/lib/engine-components/Camera.js.map +1 -1
- package/lib/engine-components/CameraUtils.js +8 -14
- package/lib/engine-components/CameraUtils.js.map +1 -1
- package/lib/engine-components/GroundProjection.js +1 -1
- package/lib/engine-components/GroundProjection.js.map +1 -1
- package/lib/engine-components/NeedleMenu.js +1 -1
- package/lib/engine-components/NeedleMenu.js.map +1 -1
- package/lib/engine-components/OrbitControls.js +3 -1
- package/lib/engine-components/OrbitControls.js.map +1 -1
- package/lib/engine-components/ReflectionProbe.d.ts +1 -0
- package/lib/engine-components/ReflectionProbe.js +16 -9
- package/lib/engine-components/ReflectionProbe.js.map +1 -1
- package/lib/engine-components/SceneSwitcher.js +28 -7
- package/lib/engine-components/SceneSwitcher.js.map +1 -1
- package/lib/engine-components/SyncedTransform.d.ts +6 -0
- package/lib/engine-components/SyncedTransform.js +10 -5
- package/lib/engine-components/SyncedTransform.js.map +1 -1
- package/lib/engine-components/codegen/components.d.ts +1 -0
- package/lib/engine-components/codegen/components.js +1 -0
- package/lib/engine-components/codegen/components.js.map +1 -1
- package/lib/engine-components/export/usdz/extensions/USDZUI.js +2 -1
- package/lib/engine-components/export/usdz/extensions/USDZUI.js.map +1 -1
- package/lib/engine-components/ui/BaseUIComponent.d.ts +0 -1
- package/lib/engine-components/ui/BaseUIComponent.js +1 -1
- package/lib/engine-components/ui/BaseUIComponent.js.map +1 -1
- package/lib/engine-components/ui/EventSystem.js +1 -1
- package/lib/engine-components/ui/EventSystem.js.map +1 -1
- package/lib/engine-components/ui/Graphic.js +1 -0
- package/lib/engine-components/ui/Graphic.js.map +1 -1
- package/lib/engine-components/ui/RaycastUtils.js +1 -1
- package/lib/engine-components/ui/RaycastUtils.js.map +1 -1
- package/lib/engine-components/ui/RectTransform.d.ts +2 -2
- package/lib/engine-components/ui/RectTransform.js +9 -6
- package/lib/engine-components/ui/RectTransform.js.map +1 -1
- package/lib/engine-components/ui/Symbols.d.ts +1 -0
- package/lib/engine-components/ui/Symbols.js +2 -0
- package/lib/engine-components/ui/Symbols.js.map +1 -0
- package/lib/engine-components/ui/Utils.js +1 -1
- package/lib/engine-components/ui/Utils.js.map +1 -1
- package/lib/engine-components/utils/EnvironmentScene.d.ts +1 -1
- package/lib/engine-components/utils/EnvironmentScene.js +1 -1
- package/lib/engine-components/utils/EnvironmentScene.js.map +1 -1
- package/package.json +3 -3
- package/plugins/common/license.js +115 -27
- package/plugins/types/userconfig.d.ts +8 -0
- package/plugins/vite/build-pipeline.js +1 -1
- package/plugins/vite/defines.js +3 -1
- package/plugins/vite/dependencies.js +23 -4
- package/plugins/vite/facebook-instant-games.js +7 -4
- package/plugins/vite/index.js +1 -1
- package/plugins/vite/license.js +2 -1
- package/src/engine/codegen/register_types.ts +2 -0
- package/src/engine/engine_addressables.ts +3 -2
- package/src/engine/engine_components.ts +2 -1
- package/src/engine/engine_context.ts +169 -33
- package/src/engine/engine_element.ts +10 -9
- package/src/engine/engine_gameobject.ts +7 -0
- package/src/engine/engine_license.ts +116 -67
- package/src/engine/engine_networking_blob.ts +47 -26
- package/src/engine/engine_physics_rapier.ts +10 -12
- package/src/engine/engine_serialization_core.ts +6 -1
- package/src/engine/engine_utils_screenshot.ts +1 -1
- package/src/engine/js-extensions/RGBAColor.ts +59 -8
- package/src/engine/physics/workers/mesh-bvh/GenerateMeshBVHWorker.js +6 -6
- package/src/engine/webcomponents/needle menu/needle-menu-spatial.ts +6 -6
- package/src/engine/webcomponents/needle menu/needle-menu.ts +13 -2
- package/src/engine/xr/NeedleXRController.ts +2 -3
- package/src/engine/xr/NeedleXRSession.ts +12 -12
- package/src/engine-components/AudioSource.ts +8 -3
- package/src/engine-components/Camera.ts +34 -22
- package/src/engine-components/CameraUtils.ts +8 -16
- package/src/engine-components/GroundProjection.ts +1 -1
- package/src/engine-components/NeedleMenu.ts +1 -1
- package/src/engine-components/OrbitControls.ts +2 -1
- package/src/engine-components/ReflectionProbe.ts +15 -8
- package/src/engine-components/SceneSwitcher.ts +28 -11
- package/src/engine-components/SyncedTransform.ts +11 -6
- package/src/engine-components/codegen/components.ts +1 -0
- package/src/engine-components/export/usdz/extensions/USDZUI.ts +2 -2
- package/src/engine-components/ui/BaseUIComponent.ts +1 -1
- package/src/engine-components/ui/EventSystem.ts +1 -1
- package/src/engine-components/ui/Graphic.ts +1 -1
- package/src/engine-components/ui/RaycastUtils.ts +1 -1
- package/src/engine-components/ui/RectTransform.ts +10 -7
- package/src/engine-components/ui/Symbols.ts +2 -0
- package/src/engine-components/ui/Utils.ts +2 -1
- 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
|
|
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
|
|
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
|
-
/**
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
/**
|
|
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
|
-
/**
|
|
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
|
-
|
|
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.
|
|
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.
|
|
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
|
-
/**
|
|
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.
|
|
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
|
-
/**
|
|
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.
|
|
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
|
-
/**
|
|
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
|
-
/**
|
|
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
|
-
/**
|
|
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
|
|
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.
|
|
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.
|
|
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) {
|