@needle-tools/engine 3.27.4-beta → 3.28.0-beta

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 (61) hide show
  1. package/CHANGELOG.md +11 -0
  2. package/dist/needle-engine.js +7402 -7411
  3. package/dist/needle-engine.light.js +7117 -7126
  4. package/dist/needle-engine.light.min.js +254 -247
  5. package/dist/needle-engine.light.umd.cjs +336 -329
  6. package/dist/needle-engine.min.js +255 -248
  7. package/dist/needle-engine.umd.cjs +298 -291
  8. package/lib/engine/engine_context.js.map +1 -1
  9. package/lib/engine/engine_setup.js.map +1 -1
  10. package/lib/engine/engine_shims.d.ts +3 -0
  11. package/lib/engine/engine_shims.js +23 -0
  12. package/lib/engine/engine_shims.js.map +1 -0
  13. package/lib/engine-components/Renderer.js +12 -0
  14. package/lib/engine-components/Renderer.js.map +1 -1
  15. package/lib/engine-components/export/usdz/ThreeUSDZExporter.d.ts +16 -8
  16. package/lib/engine-components/export/usdz/ThreeUSDZExporter.js +27 -15
  17. package/lib/engine-components/export/usdz/ThreeUSDZExporter.js.map +1 -1
  18. package/lib/engine-components/export/usdz/extensions/behavior/BehaviourComponents.d.ts +1 -0
  19. package/lib/engine-components/export/usdz/extensions/behavior/BehaviourComponents.js +14 -6
  20. package/lib/engine-components/export/usdz/extensions/behavior/BehaviourComponents.js.map +1 -1
  21. package/lib/engine-components/ui/EventSystem.js +7 -1
  22. package/lib/engine-components/ui/EventSystem.js.map +1 -1
  23. package/package.json +1 -1
  24. package/src/engine/engine.ts +1 -2
  25. package/src/engine/engine_context.ts +3 -2
  26. package/src/engine/engine_setup.ts +1 -1
  27. package/src/engine/engine_shims.ts +29 -0
  28. package/src/engine-components/Renderer.ts +13 -0
  29. package/src/engine-components/export/usdz/ThreeUSDZExporter.ts +39 -31
  30. package/src/engine-components/export/usdz/extensions/behavior/BehaviourComponents.ts +21 -7
  31. package/src/engine-components/ui/EventSystem.ts +9 -1
  32. package/src/engine/dist/api.js +0 -73
  33. package/src/engine/dist/api.js.meta +0 -7
  34. package/src/engine/dist/engine_networking_streams.js +0 -474
  35. package/src/engine/dist/engine_networking_streams.js.meta +0 -7
  36. package/src/engine-components/dist/AudioSource.js +0 -513
  37. package/src/engine-components/dist/AudioSource.js.meta +0 -7
  38. package/src/engine-components/dist/ScreenCapture.js +0 -490
  39. package/src/engine-components/dist/ScreenCapture.js.meta +0 -7
  40. package/src/engine-components/dist/VideoPlayer.js +0 -888
  41. package/src/engine-components/dist/VideoPlayer.js.meta +0 -7
  42. package/src/engine-components/dist/Voip2.js +0 -46
  43. package/src/engine-components/dist/Voip2.js.meta +0 -7
  44. package/src/engine-schemes/dist/api.js +0 -17
  45. package/src/engine-schemes/dist/api.js.meta +0 -7
  46. package/src/engine-schemes/dist/schemes.js +0 -25
  47. package/src/engine-schemes/dist/schemes.js.meta +0 -7
  48. package/src/engine-schemes/dist/synced-camera-model.js +0 -74
  49. package/src/engine-schemes/dist/synced-camera-model.js.meta +0 -7
  50. package/src/engine-schemes/dist/synced-transform-model.js +0 -73
  51. package/src/engine-schemes/dist/synced-transform-model.js.meta +0 -7
  52. package/src/engine-schemes/dist/transform.js +0 -46
  53. package/src/engine-schemes/dist/transform.js.meta +0 -7
  54. package/src/engine-schemes/dist/vec2.js +0 -32
  55. package/src/engine-schemes/dist/vec2.js.meta +0 -7
  56. package/src/engine-schemes/dist/vec3.js +0 -36
  57. package/src/engine-schemes/dist/vec3.js.meta +0 -7
  58. package/src/engine-schemes/dist/vec4.js +0 -40
  59. package/src/engine-schemes/dist/vec4.js.meta +0 -7
  60. package/src/engine-schemes/dist/vr-user-state-buffer.js +0 -110
  61. package/src/engine-schemes/dist/vr-user-state-buffer.js.meta +0 -7
@@ -1,5 +1,7 @@
1
1
  import { Renderer } from '../../Renderer.js';
2
2
  import { GameObject } from '../../Component.js';
3
+ import type { OffscreenCanvasExt } from '../../../engine/engine_shims.js';
4
+ import '../../../engine/engine_shims.js';
3
5
  import {
4
6
  PlaneGeometry,
5
7
  Texture,
@@ -24,7 +26,8 @@ import {
24
26
  SRGBColorSpace,
25
27
  AnimationClip,
26
28
  OrthographicCamera,
27
- BufferAttribute
29
+ BufferAttribute,
30
+ Vector4
28
31
  } from 'three';
29
32
  import * as fflate from 'three/examples/jsm/libs/fflate.module.js';
30
33
 
@@ -77,12 +80,6 @@ function findStructuralNodesInBoneHierarchy(bones: Array<Object3D>) {
77
80
  return structuralNodes;
78
81
  }
79
82
 
80
- // TODO: remove once we update to TypeScript 5 that has proper types for OffscreenCanvas
81
- declare type OffsetCanvasExt = OffscreenCanvas & {
82
- convertToBlob: (options?: any) => Promise<Blob>;
83
-
84
- }
85
-
86
83
  class USDObject {
87
84
 
88
85
  static USDObject_export_id = 0;
@@ -432,13 +429,15 @@ class USDWriter {
432
429
 
433
430
  }
434
431
 
432
+ declare type TextureMap = {[name: string]: {texture: Texture, scale?: Vector4}};
433
+
435
434
  class USDZExporterContext {
436
435
  root: any;
437
436
  exporter: any;
438
437
  extensions: any;
439
- materials: {};
440
- textures: {};
441
- files: {};
438
+ materials: Map<string, Material>;
439
+ textures: TextureMap;
440
+ files: { [path: string]: Uint8Array | [Uint8Array, fflate.ZipOptions] | null | any }
442
441
  document: USDDocument;
443
442
  output: string;
444
443
  animations: AnimationClip[];
@@ -451,7 +450,7 @@ class USDZExporterContext {
451
450
  if ( extensions )
452
451
  this.extensions = extensions;
453
452
 
454
- this.materials = {};
453
+ this.materials = new Map();
455
454
  this.textures = {};
456
455
  this.files = {};
457
456
  this.document = new USDDocument();
@@ -582,18 +581,19 @@ class USDZExporter {
582
581
 
583
582
  for ( const id in textures ) {
584
583
 
585
- let texture = textures[ id ];
584
+ const textureData = textures[ id ];
585
+ let texture = textureData.texture;
586
586
 
587
587
  const isRGBA = formatsWithAlphaChannel.includes( texture.format );
588
588
 
589
+ //@ts-ignore
589
590
  if ( texture.isCompressedTexture || texture.isRenderTargetTexture ) {
590
591
 
591
592
  texture = decompressGpuTexture( texture, options.maxTextureSize, decompressionRenderer );
592
593
 
593
594
  }
594
595
 
595
- // TODO add readback options for textures that don't have texture.image
596
- const canvas = await imageToCanvas( texture.image ).catch( err => {
596
+ const canvas = await imageToCanvas( texture.image, textureData.scale, false, options.maxTextureSize ).catch( err => {
597
597
  console.error("Error converting texture to canvas", texture, err);
598
598
  });
599
599
 
@@ -873,6 +873,7 @@ function decompressGpuTexture( texture, maxTextureSize = Infinity, renderer: Web
873
873
  #else
874
874
  gl_FragColor = texture2D( blitTexture, vUv);
875
875
  #endif
876
+ gl_FragColor.rgb *= gl_FragColor.a;
876
877
  }`
877
878
  } );
878
879
 
@@ -930,7 +931,7 @@ function isImageBitmap( image ) {
930
931
 
931
932
  }
932
933
 
933
- async function imageToCanvas( image, color: string | undefined = undefined, flipY = false, maxTextureSize = 4096 ) {
934
+ async function imageToCanvas( image, color: Vector4 | undefined = undefined, flipY = false, maxTextureSize = 4096 ) {
934
935
 
935
936
  if ( isImageBitmap( image ) ) {
936
937
 
@@ -951,14 +952,13 @@ async function imageToCanvas( image, color: string | undefined = undefined, flip
951
952
 
952
953
  context.drawImage( image, 0, 0, canvas.width, canvas.height );
953
954
 
954
- // TODO remove, not used anymore
955
+ // Currently only used to apply opacity scale since QuickLook and usdview don't support that yet
955
956
  if ( color !== undefined ) {
956
957
 
957
- const hex = parseInt( color, 16 );
958
-
959
- const r = ( hex >> 16 & 255 ) / 255;
960
- const g = ( hex >> 8 & 255 ) / 255;
961
- const b = ( hex & 255 ) / 255;
958
+ const r = color.x;
959
+ const g = color.y;
960
+ const b = color.z;
961
+ const a = color.w;
962
962
 
963
963
  const imagedata = context.getImageData( 0, 0, canvas.width, canvas.height );
964
964
  const data = imagedata.data;
@@ -968,6 +968,7 @@ async function imageToCanvas( image, color: string | undefined = undefined, flip
968
968
  data[ i + 0 ] = data[ i + 0 ] * r;
969
969
  data[ i + 1 ] = data[ i + 1 ] * g;
970
970
  data[ i + 2 ] = data[ i + 2 ] * b;
971
+ data[ i + 3 ] = data[ i + 3 ] * a;
971
972
 
972
973
  }
973
974
 
@@ -975,7 +976,7 @@ async function imageToCanvas( image, color: string | undefined = undefined, flip
975
976
 
976
977
  }
977
978
 
978
- return canvas as OffsetCanvasExt;
979
+ return canvas as OffscreenCanvasExt;
979
980
 
980
981
  } else {
981
982
 
@@ -1375,7 +1376,7 @@ function buildVector2Array( attribute, count ) {
1375
1376
 
1376
1377
  // Materials
1377
1378
 
1378
- function buildMaterials( materials, textures, quickLookCompatible = false ) {
1379
+ function buildMaterials( materials: Map<string, Material>, textures: TextureMap, quickLookCompatible = false ) {
1379
1380
 
1380
1381
  const array: Array<string> = [];
1381
1382
 
@@ -1396,7 +1397,7 @@ ${array.join( '' )}
1396
1397
 
1397
1398
  }
1398
1399
 
1399
- function buildMaterial( material: MeshBasicMaterial, textures, quickLookCompatible = false ) {
1400
+ function buildMaterial( material: MeshBasicMaterial, textures: TextureMap, quickLookCompatible = false ) {
1400
1401
 
1401
1402
  // https://graphics.pixar.com/usd/docs/UsdPreviewSurface-Proposal.html
1402
1403
 
@@ -1408,7 +1409,11 @@ function buildMaterial( material: MeshBasicMaterial, textures, quickLookCompatib
1408
1409
 
1409
1410
  const id = texture.id + ( color ? '_' + color.getHexString() : '' ) + ( opacity !== undefined ? '_' + opacity : '' );
1410
1411
 
1411
- textures[ id ] = texture;
1412
+ // Seems neither QuickLook nor usdview support scale/bias on .a values, so we need to bake opacity multipliers into
1413
+ // the texture. This is not ideal.
1414
+ const opacityIsAppliedToTextureAndNotAsScale = quickLookCompatible && opacity !== undefined;
1415
+ const scaleToApply = opacityIsAppliedToTextureAndNotAsScale ? new Vector4(1, 1, 1, opacity) : undefined;
1416
+ textures[ id ] = { texture, scale: scaleToApply };
1412
1417
 
1413
1418
  const uv = texture.channel > 0 ? 'st' + texture.channel : 'st';
1414
1419
 
@@ -1485,7 +1490,7 @@ function buildMaterial( material: MeshBasicMaterial, textures, quickLookCompatib
1485
1490
  token inputs:sourceColorSpace = "${ texture.colorSpace === 'srgb' ? 'sRGB' : 'raw' }"
1486
1491
  float2 inputs:st.connect = ${needsTextureTransform ? textureTransformOutput : textureTransformInput}
1487
1492
  ${needsTextureScale ? `
1488
- float4 inputs:scale = (${color ? color.r + ', ' + color.g + ', ' + color.b : '1, 1, 1'}, ${opacity !== undefined ? opacity : '1'})
1493
+ float4 inputs:scale = (${color ? color.r + ', ' + color.g + ', ' + color.b : '1, 1, 1'}, ${(opacity !== undefined && !opacityIsAppliedToTextureAndNotAsScale) ? opacity : '1'})
1489
1494
  ` : `` }
1490
1495
  ${needsNormalScaleAndBias ? `
1491
1496
  float4 inputs:scale = (${normalScaleValueString}, ${normalScaleValueString}, ${normalScaleValueString}, 1)
@@ -1503,7 +1508,7 @@ function buildMaterial( material: MeshBasicMaterial, textures, quickLookCompatib
1503
1508
  }
1504
1509
 
1505
1510
  let effectiveOpacity = ( material.transparent || material.alphaTest ) ? material.opacity : 1;
1506
-
1511
+
1507
1512
  if ( material instanceof MeshPhysicalMaterial && material.transmission !== undefined) {
1508
1513
 
1509
1514
  // TODO does not help when a roughnessMap is used
@@ -1553,7 +1558,7 @@ function buildMaterial( material: MeshBasicMaterial, textures, quickLookCompatib
1553
1558
  inputs.push( `${pad}float inputs:opacity.connect = ${materialRoot}/Material_${material.id}/Texture_${material.alphaMap.id}_opacity.outputs:r>` );
1554
1559
  inputs.push( `${pad}float inputs:opacityThreshold = 0.0001` );
1555
1560
 
1556
- samplers.push( buildTexture( material.alphaMap, 'opacity' ) );
1561
+ samplers.push( buildTexture( material.alphaMap, 'opacity', new Color( 1, 1, 1 ), effectiveOpacity ) );
1557
1562
 
1558
1563
  } else {
1559
1564
 
@@ -1572,12 +1577,15 @@ function buildMaterial( material: MeshBasicMaterial, textures, quickLookCompatib
1572
1577
  if ( material.emissiveMap ) {
1573
1578
 
1574
1579
  inputs.push( `${pad}color3f inputs:emissiveColor.connect = ${materialRoot}/Material_${material.id}/Texture_${material.emissiveMap.id}_emissive.outputs:rgb>` );
1575
-
1576
- samplers.push( buildTexture( material.emissiveMap, 'emissive' ) );
1580
+ const color = material.emissive.clone();
1581
+ color.multiplyScalar( material.emissiveIntensity );
1582
+ samplers.push( buildTexture( material.emissiveMap, 'emissive', color ) );
1577
1583
 
1578
1584
  } else if ( material.emissive?.getHex() > 0 ) {
1579
1585
 
1580
- inputs.push( `${pad}color3f inputs:emissiveColor = ${buildColor( material.emissive )}` );
1586
+ const color = material.emissive.clone();
1587
+ color.multiplyScalar( material.emissiveIntensity );
1588
+ inputs.push( `${pad}color3f inputs:emissiveColor = ${buildColor( color )}` );
1581
1589
 
1582
1590
  } else {
1583
1591
 
@@ -477,11 +477,7 @@ export class PlayAudioOnClick extends Behaviour implements IPointerClickHandler,
477
477
  ensureRaycaster(this.gameObject);
478
478
  }
479
479
 
480
- onPointerClick(args: PointerEventData) {
481
- args.use();
482
-
483
- if (!this.clip) return;
484
-
480
+ ensureAudioSource() {
485
481
  if (!this.target) {
486
482
  const newAudioSource = this.gameObject.addNewComponent(AudioSource);
487
483
  if (newAudioSource) {
@@ -491,6 +487,14 @@ export class PlayAudioOnClick extends Behaviour implements IPointerClickHandler,
491
487
  newAudioSource.loop = false;
492
488
  }
493
489
  }
490
+ }
491
+
492
+ onPointerClick(args: PointerEventData) {
493
+ args.use();
494
+
495
+ if (!this.clip) return;
496
+
497
+ this.ensureAudioSource();
494
498
 
495
499
  if (this.target) {
496
500
 
@@ -519,11 +523,21 @@ export class PlayAudioOnClick extends Behaviour implements IPointerClickHandler,
519
523
  const clipName = clipUrl.split("/").pop();
520
524
  const volume = this.target ? this.target.volume : 1;
521
525
  const auralMode = this.target && this.target.spatialBlend == 0 ? AuralMode.NonSpatial : AuralMode.Spatial;
522
- const playClip = new BehaviorModel("playAudio " + this.name,
526
+
527
+ const playClipOnTap = new BehaviorModel("playAudio " + this.name,
523
528
  TriggerBuilder.tapTrigger(this.gameObject),
524
529
  ActionBuilder.playAudioAction(playbackTarget, "audio/" + clipName, PlayAction.Play, volume, auralMode),
525
530
  );
526
- ext.addBehavior(playClip);
531
+ ext.addBehavior(playClipOnTap);
532
+
533
+ // automatically play audio on start too if the referenced AudioSource has playOnAwake enabled
534
+ if (this.target && this.target.playOnAwake && this.target.enabled) {
535
+ const playClipOnStart = new BehaviorModel("playAudioOnStart " + this.name,
536
+ TriggerBuilder.sceneStartTrigger(),
537
+ ActionBuilder.playAudioAction(playbackTarget, "audio/" + clipName, PlayAction.Play, volume, auralMode),
538
+ );
539
+ ext.addBehavior(playClipOnStart);
540
+ }
527
541
  }
528
542
  }
529
543
 
@@ -7,7 +7,7 @@ import { Context } from "../../engine/engine_setup.js";
7
7
  import { type IPointerEventHandler, PointerEventData, hasPointerEventComponent } from "./PointerEvents.js";
8
8
  import { ObjectRaycaster, Raycaster } from "./Raycaster.js";
9
9
  import { InputEvents, NEPointerEvent, PointerType } from "../../engine/engine_input.js";
10
- import { Object3D } from "three";
10
+ import { Mesh, Object3D } from "three";
11
11
  import type { ICanvasGroup } from "./Interfaces.js";
12
12
  import { getParam } from "../../engine/engine_utils.js";
13
13
  import { UIRaycastUtils } from "./RaycastUtils.js";
@@ -295,6 +295,14 @@ export class EventSystem extends Behaviour {
295
295
  * */
296
296
  private shouldRaycastObject = (obj: Object3D): RaycastTestObjectReturnType => {
297
297
 
298
+ if (!(obj instanceof Mesh))
299
+ return "continue in children";
300
+
301
+ // Layer 2 is IgnoreRaycast
302
+ if (obj.layers.isEnabled(2)) {
303
+ return "continue in children"
304
+ }
305
+
298
306
  // check if this object is actually a UI shadow hierarchy object
299
307
  let shadowComponent: Object3D | null = null;
300
308
  const isUI = isUIObject(obj);
@@ -1,73 +0,0 @@
1
- "use strict";
2
- var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
- if (k2 === undefined) k2 = k;
4
- Object.defineProperty(o, k2, { enumerable: true, get: function() { return m[k]; } });
5
- }) : (function(o, m, k, k2) {
6
- if (k2 === undefined) k2 = k;
7
- o[k2] = m[k];
8
- }));
9
- var __exportStar = (this && this.__exportStar) || function(m, exports) {
10
- for (var p in m) if (p !== "default" && !exports.hasOwnProperty(p)) __createBinding(exports, m, p);
11
- };
12
- exports.__esModule = true;
13
- __exportStar(require("./extensions/index.js"), exports);
14
- __exportStar(require("./engine_addressables.js"), exports);
15
- __exportStar(require("./engine_application.js"), exports);
16
- __exportStar(require("./engine_assetdatabase.js"), exports);
17
- __exportStar(require("./engine_create_objects.js"), exports);
18
- __exportStar(require("./engine_components_internal.js"), exports);
19
- __exportStar(require("./engine_components.js"), exports);
20
- __exportStar(require("./engine_components_internal.js"), exports);
21
- __exportStar(require("./engine_context_registry.js"), exports);
22
- __exportStar(require("./engine_context.js"), exports);
23
- __exportStar(require("./engine_coroutine.js"), exports);
24
- __exportStar(require("./engine_constants.js"), exports);
25
- __exportStar(require("./debug/index.js"), exports);
26
- __exportStar(require("./engine_element.js"), exports);
27
- __exportStar(require("./engine_element_loading.js"), exports);
28
- __exportStar(require("./engine_element_attributes.js"), exports);
29
- var engine_gizmos_js_1 = require("./engine_gizmos.js");
30
- __createBinding(exports, engine_gizmos_js_1, "Gizmos");
31
- __exportStar(require("./engine_gltf.js"), exports);
32
- __exportStar(require("./engine_hot_reload.js"), exports);
33
- __exportStar(require("./engine_gameobject.js"), exports);
34
- __exportStar(require("./engine_networking.js"), exports);
35
- __exportStar(require("./engine_networking_types.js"), exports);
36
- var engine_networking_auto_js_1 = require("./engine_networking_auto.js");
37
- __createBinding(exports, engine_networking_auto_js_1, "syncField");
38
- __exportStar(require("./engine_networking_files.js"), exports);
39
- __exportStar(require("./engine_networking_instantiate.js"), exports);
40
- __exportStar(require("./engine_networking_streams.js"), exports);
41
- __exportStar(require("./engine_networking_utils.js"), exports);
42
- __exportStar(require("./engine_networking_peer.js"), exports);
43
- __exportStar(require("./engine_patcher.js"), exports);
44
- __exportStar(require("./engine_playerview.js"), exports);
45
- __exportStar(require("./engine_physics.js"), exports);
46
- __exportStar(require("./engine_physics.types.js"), exports);
47
- __exportStar(require("./engine_physics_rapier.js"), exports);
48
- __exportStar(require("./engine_scenelighting.js"), exports);
49
- __exportStar(require("./engine_input.js"), exports);
50
- __exportStar(require("./engine_math.js"), exports);
51
- __exportStar(require("./js-extensions/index.js"), exports);
52
- __exportStar(require("./engine_scenetools.js"), exports);
53
- __exportStar(require("./engine_serialization.js"), exports);
54
- var engine_serialization_core_js_1 = require("./engine_serialization_core.js");
55
- __createBinding(exports, engine_serialization_core_js_1, "type");
56
- __exportStar(require("./engine_texture.js"), exports);
57
- __exportStar(require("./engine_three_utils.js"), exports);
58
- __exportStar(require("./engine_time.js"), exports);
59
- __exportStar(require("./engine_types.js"), exports);
60
- __exportStar(require("./engine_utils_screenshot.js"), exports);
61
- __exportStar(require("./engine_web_api.js"), exports);
62
- __exportStar(require("./engine_utils.js"), exports);
63
- var engine_typestore_js_1 = require("./engine_typestore.js");
64
- __createBinding(exports, engine_typestore_js_1, "TypeStore");
65
- __createBinding(exports, engine_typestore_js_1, "registerType");
66
- var engine_instancing_js_1 = require("./engine_instancing.js");
67
- __createBinding(exports, engine_instancing_js_1, "InstancingUtil");
68
- var engine_util_decorator_js_1 = require("./engine_util_decorator.js");
69
- __createBinding(exports, engine_util_decorator_js_1, "validate");
70
- __createBinding(exports, engine_util_decorator_js_1, "prefix");
71
- var engine_license_js_1 = require("./engine_license.js");
72
- __createBinding(exports, engine_license_js_1, "hasProLicense");
73
- __createBinding(exports, engine_license_js_1, "hasIndieLicense");
@@ -1,7 +0,0 @@
1
- fileFormatVersion: 2
2
- guid: f0e01709ea200b648a0c053c2c79f225
3
- DefaultImporter:
4
- externalObjects: {}
5
- userData:
6
- assetBundleName:
7
- assetBundleVariant: