@needle-tools/engine 4.4.0-beta → 4.4.0-beta.10

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 (155) hide show
  1. package/CHANGELOG.md +65 -2
  2. package/dist/assets/generateMeshBVH.worker-b7788939.js +25 -0
  3. package/dist/needle-engine.bundle.js +6808 -6645
  4. package/dist/needle-engine.bundle.light.js +7071 -6908
  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.d.ts +0 -9
  10. package/dist/needle-engine.js +468 -467
  11. package/dist/needle-engine.light.d.ts +0 -9
  12. package/dist/needle-engine.light.js +468 -467
  13. package/dist/needle-engine.light.min.js +1 -1
  14. package/dist/needle-engine.light.umd.cjs +1 -1
  15. package/dist/needle-engine.min.js +1 -1
  16. package/dist/needle-engine.umd.cjs +1 -1
  17. package/dist/postprocessing.js +1673 -1527
  18. package/dist/postprocessing.light.js +1673 -1527
  19. package/dist/postprocessing.light.min.js +80 -66
  20. package/dist/postprocessing.light.umd.cjs +83 -69
  21. package/dist/postprocessing.min.js +80 -66
  22. package/dist/postprocessing.umd.cjs +83 -69
  23. package/dist/vendor.js +5109 -5123
  24. package/dist/vendor.light.js +5109 -5123
  25. package/dist/vendor.light.min.js +84 -84
  26. package/dist/vendor.light.umd.cjs +78 -78
  27. package/dist/vendor.min.js +84 -84
  28. package/dist/vendor.umd.cjs +78 -78
  29. package/lib/engine/codegen/register_types.js +2 -0
  30. package/lib/engine/codegen/register_types.js.map +1 -1
  31. package/lib/engine/engine_addressables.js.map +1 -1
  32. package/lib/engine/engine_components.js +3 -1
  33. package/lib/engine/engine_components.js.map +1 -1
  34. package/lib/engine/engine_context.d.ts +10 -1
  35. package/lib/engine/engine_context.js +33 -12
  36. package/lib/engine/engine_context.js.map +1 -1
  37. package/lib/engine/engine_element.js +12 -10
  38. package/lib/engine/engine_element.js.map +1 -1
  39. package/lib/engine/engine_gameobject.js +5 -0
  40. package/lib/engine/engine_gameobject.js.map +1 -1
  41. package/lib/engine/engine_license.d.ts +2 -0
  42. package/lib/engine/engine_license.js +103 -62
  43. package/lib/engine/engine_license.js.map +1 -1
  44. package/lib/engine/engine_networking_blob.js +40 -24
  45. package/lib/engine/engine_networking_blob.js.map +1 -1
  46. package/lib/engine/engine_physics_rapier.js +10 -9
  47. package/lib/engine/engine_physics_rapier.js.map +1 -1
  48. package/lib/engine/engine_serialization_core.js +6 -2
  49. package/lib/engine/engine_serialization_core.js.map +1 -1
  50. package/lib/engine/engine_utils_screenshot.js +1 -1
  51. package/lib/engine/engine_utils_screenshot.js.map +1 -1
  52. package/lib/engine/js-extensions/RGBAColor.d.ts +1 -0
  53. package/lib/engine/js-extensions/RGBAColor.js +48 -0
  54. package/lib/engine/js-extensions/RGBAColor.js.map +1 -1
  55. package/lib/engine/physics/workers/mesh-bvh/GenerateMeshBVHWorker.js +4 -3
  56. package/lib/engine/physics/workers/mesh-bvh/GenerateMeshBVHWorker.js.map +1 -1
  57. package/lib/engine/webcomponents/needle menu/needle-menu-spatial.js +6 -6
  58. package/lib/engine/webcomponents/needle menu/needle-menu-spatial.js.map +1 -1
  59. package/lib/engine/webcomponents/needle menu/needle-menu.d.ts +4 -0
  60. package/lib/engine/webcomponents/needle menu/needle-menu.js +13 -2
  61. package/lib/engine/webcomponents/needle menu/needle-menu.js.map +1 -1
  62. package/lib/engine/xr/NeedleXRController.js +2 -3
  63. package/lib/engine/xr/NeedleXRController.js.map +1 -1
  64. package/lib/engine/xr/NeedleXRSession.js +12 -12
  65. package/lib/engine/xr/NeedleXRSession.js.map +1 -1
  66. package/lib/engine-components/AudioSource.js +7 -0
  67. package/lib/engine-components/AudioSource.js.map +1 -1
  68. package/lib/engine-components/Camera.js +18 -12
  69. package/lib/engine-components/Camera.js.map +1 -1
  70. package/lib/engine-components/CameraUtils.js +8 -14
  71. package/lib/engine-components/CameraUtils.js.map +1 -1
  72. package/lib/engine-components/GroundProjection.js +1 -1
  73. package/lib/engine-components/GroundProjection.js.map +1 -1
  74. package/lib/engine-components/NeedleMenu.js +1 -1
  75. package/lib/engine-components/NeedleMenu.js.map +1 -1
  76. package/lib/engine-components/OrbitControls.js +3 -1
  77. package/lib/engine-components/OrbitControls.js.map +1 -1
  78. package/lib/engine-components/ReflectionProbe.d.ts +1 -0
  79. package/lib/engine-components/ReflectionProbe.js +16 -9
  80. package/lib/engine-components/ReflectionProbe.js.map +1 -1
  81. package/lib/engine-components/SceneSwitcher.js +28 -7
  82. package/lib/engine-components/SceneSwitcher.js.map +1 -1
  83. package/lib/engine-components/SyncedTransform.d.ts +6 -0
  84. package/lib/engine-components/SyncedTransform.js +10 -5
  85. package/lib/engine-components/SyncedTransform.js.map +1 -1
  86. package/lib/engine-components/codegen/components.d.ts +1 -0
  87. package/lib/engine-components/codegen/components.js +1 -0
  88. package/lib/engine-components/codegen/components.js.map +1 -1
  89. package/lib/engine-components/export/usdz/extensions/USDZUI.js +2 -1
  90. package/lib/engine-components/export/usdz/extensions/USDZUI.js.map +1 -1
  91. package/lib/engine-components/ui/BaseUIComponent.d.ts +0 -1
  92. package/lib/engine-components/ui/BaseUIComponent.js +1 -1
  93. package/lib/engine-components/ui/BaseUIComponent.js.map +1 -1
  94. package/lib/engine-components/ui/EventSystem.js +1 -1
  95. package/lib/engine-components/ui/EventSystem.js.map +1 -1
  96. package/lib/engine-components/ui/Graphic.js +1 -0
  97. package/lib/engine-components/ui/Graphic.js.map +1 -1
  98. package/lib/engine-components/ui/RaycastUtils.js +1 -1
  99. package/lib/engine-components/ui/RaycastUtils.js.map +1 -1
  100. package/lib/engine-components/ui/RectTransform.d.ts +2 -2
  101. package/lib/engine-components/ui/RectTransform.js +9 -6
  102. package/lib/engine-components/ui/RectTransform.js.map +1 -1
  103. package/lib/engine-components/ui/Symbols.d.ts +1 -0
  104. package/lib/engine-components/ui/Symbols.js +2 -0
  105. package/lib/engine-components/ui/Symbols.js.map +1 -0
  106. package/lib/engine-components/ui/Utils.js +1 -1
  107. package/lib/engine-components/ui/Utils.js.map +1 -1
  108. package/lib/engine-components/utils/EnvironmentScene.d.ts +1 -1
  109. package/lib/engine-components/utils/EnvironmentScene.js +1 -1
  110. package/lib/engine-components/utils/EnvironmentScene.js.map +1 -1
  111. package/package.json +3 -3
  112. package/plugins/common/buildinfo.js +1 -0
  113. package/plugins/common/cloud.js +2 -0
  114. package/plugins/common/license.js +174 -33
  115. package/plugins/types/userconfig.d.ts +5 -0
  116. package/plugins/vite/build-pipeline.js +4 -3
  117. package/plugins/vite/dependencies.js +17 -7
  118. package/plugins/vite/facebook-instant-games.js +7 -4
  119. package/plugins/vite/index.js +1 -1
  120. package/src/engine/codegen/register_types.ts +2 -0
  121. package/src/engine/engine_addressables.ts +3 -2
  122. package/src/engine/engine_components.ts +2 -1
  123. package/src/engine/engine_context.ts +36 -12
  124. package/src/engine/engine_element.ts +10 -9
  125. package/src/engine/engine_gameobject.ts +7 -0
  126. package/src/engine/engine_license.ts +116 -67
  127. package/src/engine/engine_networking_blob.ts +47 -26
  128. package/src/engine/engine_physics_rapier.ts +10 -12
  129. package/src/engine/engine_serialization_core.ts +6 -1
  130. package/src/engine/engine_utils_screenshot.ts +1 -1
  131. package/src/engine/js-extensions/RGBAColor.ts +50 -0
  132. package/src/engine/physics/workers/mesh-bvh/GenerateMeshBVHWorker.js +6 -6
  133. package/src/engine/webcomponents/needle menu/needle-menu-spatial.ts +6 -6
  134. package/src/engine/webcomponents/needle menu/needle-menu.ts +13 -2
  135. package/src/engine/xr/NeedleXRController.ts +2 -3
  136. package/src/engine/xr/NeedleXRSession.ts +12 -12
  137. package/src/engine-components/AudioSource.ts +8 -3
  138. package/src/engine-components/Camera.ts +34 -22
  139. package/src/engine-components/CameraUtils.ts +8 -16
  140. package/src/engine-components/GroundProjection.ts +1 -1
  141. package/src/engine-components/NeedleMenu.ts +1 -1
  142. package/src/engine-components/OrbitControls.ts +2 -1
  143. package/src/engine-components/ReflectionProbe.ts +15 -8
  144. package/src/engine-components/SceneSwitcher.ts +28 -11
  145. package/src/engine-components/SyncedTransform.ts +11 -6
  146. package/src/engine-components/codegen/components.ts +1 -0
  147. package/src/engine-components/export/usdz/extensions/USDZUI.ts +2 -2
  148. package/src/engine-components/ui/BaseUIComponent.ts +1 -1
  149. package/src/engine-components/ui/EventSystem.ts +1 -1
  150. package/src/engine-components/ui/Graphic.ts +1 -1
  151. package/src/engine-components/ui/RaycastUtils.ts +1 -1
  152. package/src/engine-components/ui/RectTransform.ts +10 -7
  153. package/src/engine-components/ui/Symbols.ts +2 -0
  154. package/src/engine-components/ui/Utils.ts +2 -1
  155. package/src/engine-components/utils/EnvironmentScene.ts +1 -1
@@ -1,5 +1,5 @@
1
1
  import { MeshBasicMaterial, Scene } from 'three';
2
- export default class EnvironmentScene extends Scene {
2
+ export declare class EnvironmentScene extends Scene {
3
3
  constructor(name: 'legacy' | 'neutral');
4
4
  createAreaLightMaterial(intensity: number): MeshBasicMaterial;
5
5
  }
@@ -167,7 +167,7 @@ const neutral = {
167
167
  },
168
168
  ]
169
169
  };
170
- export default class EnvironmentScene extends Scene {
170
+ export class EnvironmentScene extends Scene {
171
171
  constructor(name) {
172
172
  super();
173
173
  this.position.y = -3.5;
@@ -1 +1 @@
1
- {"version":3,"file":"EnvironmentScene.js","sourceRoot":"","sources":["../../../src/engine-components/utils/EnvironmentScene.ts"],"names":[],"mappings":"AAAA,2JAA2J;AAE3J;;;;;;;;;;;;;GAaG;AAEH,OAAO,EAAC,QAAQ,EAAE,WAAW,EAAE,IAAI,EAAE,iBAAiB,EAAE,oBAAoB,EAAE,UAAU,EAAE,KAAK,EAAC,MAAM,OAAO,CAAC;AA2B9G,MAAM,MAAM,GAAG;IACb,QAAQ,EAAE;QACR,SAAS,EAAE,GAAG;QACd,QAAQ,EAAE,CAAC,KAAK,EAAE,MAAM,EAAE,KAAK,CAAC;KACjC;IACD,IAAI,EAAE;QACJ,QAAQ,EAAE,CAAC,CAAC,KAAK,EAAE,MAAM,EAAE,KAAK,CAAC;QACjC,KAAK,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC;KAChC;IACD,KAAK,EAAE;QACL;YACE,QAAQ,EAAE,CAAC,CAAC,MAAM,EAAE,KAAK,EAAE,KAAK,CAAC;YACjC,QAAQ,EAAE,CAAC,KAAK;YAChB,KAAK,EAAE,CAAC,KAAK,EAAE,KAAK,EAAE,KAAK,CAAC;SAC7B;QACD;YACE,QAAQ,EAAE,CAAC,CAAC,KAAK,EAAE,CAAC,KAAK,EAAE,CAAC,KAAK,CAAC;YAClC,QAAQ,EAAE,KAAK;YACf,KAAK,EAAE,CAAC,KAAK,EAAE,KAAK,EAAE,KAAK,CAAC;SAC7B;QACD;YACE,QAAQ,EAAE,CAAC,KAAK,EAAE,KAAK,EAAE,KAAK,CAAC;YAC/B,QAAQ,EAAE,KAAK;YACf,KAAK,EAAE,CAAC,KAAK,EAAE,KAAK,EAAE,KAAK,CAAC;SAC7B;QACD;YACE,QAAQ,EAAE,CAAC,CAAC,KAAK,EAAE,KAAK,EAAE,KAAK,CAAC;YAChC,QAAQ,EAAE,KAAK;YACf,KAAK,EAAE,CAAC,KAAK,EAAE,KAAK,EAAE,KAAK,CAAC;SAC7B;QACD;YACE,QAAQ,EAAE,CAAC,KAAK,EAAE,CAAC,KAAK,EAAE,CAAC,KAAK,CAAC;YACjC,QAAQ,EAAE,CAAC,KAAK;YAChB,KAAK,EAAE,CAAC,KAAK,EAAE,KAAK,EAAE,KAAK,CAAC;SAC7B;QACD;YACE,QAAQ,EAAE,CAAC,CAAC,KAAK,EAAE,CAAC,KAAK,EAAE,CAAC,KAAK,CAAC;YAClC,QAAQ,EAAE,KAAK;YACf,KAAK,EAAE,CAAC,KAAK,EAAE,KAAK,EAAE,KAAK,CAAC;SAC7B;KACF;IACD,MAAM,EAAE;QACN;YACE,SAAS,EAAE,EAAE;YACb,QAAQ,EAAE,CAAC,CAAC,MAAM,EAAE,KAAK,EAAE,KAAK,CAAC;YACjC,KAAK,EAAE,CAAC,GAAG,EAAE,KAAK,EAAE,KAAK,CAAC;SAC3B;QACD;YACE,SAAS,EAAE,EAAE;YACb,QAAQ,EAAE,CAAC,CAAC,MAAM,EAAE,MAAM,EAAE,CAAC,KAAK,CAAC;YACnC,KAAK,EAAE,CAAC,GAAG,EAAE,KAAK,EAAE,KAAK,CAAC;SAC3B;QACD;YACE,SAAS,EAAE,EAAE;YACb,QAAQ,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,CAAC,KAAK,CAAC;YAClC,KAAK,EAAE,CAAC,IAAI,EAAE,KAAK,EAAE,KAAK,CAAC;SAC5B;QACD;YACE,SAAS,EAAE,EAAE;YACb,QAAQ,EAAE,CAAC,CAAC,KAAK,EAAE,IAAI,EAAE,MAAM,CAAC;YAChC,KAAK,EAAE,CAAC,IAAI,EAAE,KAAK,EAAE,KAAK,CAAC;SAC5B;QACD;YACE,SAAS,EAAE,EAAE;YACb,QAAQ,EAAE,CAAC,KAAK,EAAE,MAAM,EAAE,CAAC,MAAM,CAAC;YAClC,KAAK,EAAE,CAAC,GAAG,EAAE,GAAG,EAAE,GAAG,CAAC;SACvB;QACD;YACE,SAAS,EAAE,GAAG;YACd,QAAQ,EAAE,CAAC,GAAG,EAAE,IAAI,EAAE,GAAG,CAAC;YAC1B,KAAK,EAAE,CAAC,GAAG,EAAE,GAAG,EAAE,GAAG,CAAC;SACvB;KACF;CACK,CAAC;AAET,MAAM,OAAO,GAAG;IACd,QAAQ,EAAE;QACR,SAAS,EAAE,GAAG;QACd,QAAQ,EAAE,CAAC,GAAG,EAAE,IAAI,EAAE,GAAG,CAAC;KAC3B;IACD,IAAI,EAAE;QACJ,QAAQ,EAAE,CAAC,GAAG,EAAE,IAAI,EAAE,GAAG,CAAC;QAC1B,KAAK,EAAE,CAAC,IAAI,EAAE,IAAI,EAAE,IAAI,CAAC;KAC1B;IACD,KAAK,EAAE;QACL;YACE,QAAQ,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,EAAE,KAAK,CAAC;YAChC,QAAQ,EAAE,CAAC,KAAK;YAChB,KAAK,EAAE,CAAC,KAAK,EAAE,KAAK,EAAE,KAAK,CAAC;SAC7B;QACD;YACE,QAAQ,EAAE,CAAC,CAAC,KAAK,EAAE,CAAC,KAAK,EAAE,CAAC,KAAK,CAAC;YAClC,QAAQ,EAAE,KAAK;YACf,KAAK,EAAE,CAAC,KAAK,EAAE,KAAK,EAAE,KAAK,CAAC;SAC7B;QACD;YACE,QAAQ,EAAE,CAAC,KAAK,EAAE,CAAC,IAAI,EAAE,KAAK,CAAC;YAC/B,QAAQ,EAAE,KAAK;YACf,KAAK,EAAE,CAAC,KAAK,EAAE,KAAK,EAAE,KAAK,CAAC;SAC7B;QACD;YACE,QAAQ,EAAE,CAAC,CAAC,KAAK,EAAE,KAAK,EAAE,KAAK,CAAC;YAChC,QAAQ,EAAE,KAAK;YACf,KAAK,EAAE,CAAC,KAAK,EAAE,KAAK,EAAE,KAAK,CAAC;SAC7B;QACD;YACE,QAAQ,EAAE,CAAC,KAAK,EAAE,CAAC,KAAK,EAAE,CAAC,KAAK,CAAC;YACjC,QAAQ,EAAE,CAAC,KAAK;YAChB,KAAK,EAAE,CAAC,KAAK,EAAE,KAAK,EAAE,KAAK,CAAC;SAC7B;QACD;YACE,QAAQ,EAAE,CAAC,CAAC,KAAK,EAAE,CAAC,KAAK,EAAE,CAAC,KAAK,CAAC;YAClC,QAAQ,EAAE,KAAK;YACf,KAAK,EAAE,CAAC,KAAK,EAAE,KAAK,EAAE,KAAK,CAAC;SAC7B;KACF;IACD,MAAM,EAAE;QACN;YACE,SAAS,EAAE,EAAE;YACb,QAAQ,EAAE,CAAC,CAAC,IAAI,EAAE,IAAI,EAAE,GAAG,CAAC;YAC5B,KAAK,EAAE,CAAC,GAAG,EAAE,GAAG,EAAE,GAAG,CAAC;SACvB;QACD;YACE,SAAS,EAAE,EAAE;YACb,QAAQ,EAAE,CAAC,CAAC,IAAI,EAAE,IAAI,EAAE,CAAC,GAAG,CAAC;YAC7B,KAAK,EAAE,CAAC,GAAG,EAAE,GAAG,EAAE,GAAG,CAAC;SACvB;QACD;YACE,SAAS,EAAE,EAAE;YACb,QAAQ,EAAE,CAAC,IAAI,EAAE,IAAI,EAAE,GAAG,CAAC;YAC3B,KAAK,EAAE,CAAC,GAAG,EAAE,GAAG,EAAE,GAAG,CAAC;SACvB;QACD;YACE,SAAS,EAAE,EAAE;YACb,QAAQ,EAAE,CAAC,GAAG,EAAE,GAAG,EAAE,IAAI,CAAC;YAC1B,KAAK,EAAE,CAAC,GAAG,EAAE,GAAG,EAAE,GAAG,CAAC;SACvB;QACD;YACE,SAAS,EAAE,EAAE;YACb,QAAQ,EAAE,CAAC,GAAG,EAAE,GAAG,EAAE,CAAC,IAAI,CAAC;YAC3B,KAAK,EAAE,CAAC,GAAG,EAAE,GAAG,EAAE,GAAG,CAAC;SACvB;QACD;YACE,SAAS,EAAE,EAAE;YACb,QAAQ,EAAE,CAAC,CAAC,GAAG,EAAE,IAAI,EAAE,CAAC,IAAI,CAAC;YAC7B,KAAK,EAAE,CAAC,GAAG,EAAE,GAAG,EAAE,GAAG,CAAC;SACvB;QACD;YACE,SAAS,EAAE,CAAC;YACZ,QAAQ,EAAE,CAAC,GAAG,EAAE,IAAI,EAAE,GAAG,CAAC;YAC1B,KAAK,EAAE,CAAC,GAAG,EAAE,GAAG,EAAE,GAAG,CAAC;SACvB;KACF;CACK,CAAC;AAET,MAAM,CAAC,OAAO,OAAO,gBAAiB,SAAQ,KAAK;IACjD,YAAY,IAAwB;QAClC,KAAK,EAAE,CAAC;QAER,IAAI,CAAC,QAAQ,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC;QAEvB,MAAM,QAAQ,GAAG,IAAI,WAAW,EAAE,CAAC;QACnC,QAAQ,CAAC,eAAe,CAAC,IAAI,CAAC,CAAC;QAE/B,MAAM,YAAY,GACd,IAAI,oBAAoB,CAAC,EAAC,SAAS,EAAE,CAAC,EAAE,IAAI,EAAE,QAAQ,EAAC,CAAC,CAAC;QAC7D,MAAM,WAAW,GAAG,IAAI,oBAAoB,CAAC,EAAC,SAAS,EAAE,CAAC,EAAC,CAAC,CAAC;QAE7D,MAAM,IAAI,GAAG,IAAI,IAAI,QAAQ,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,OAAO,CAAC;QAEjD,MAAM,SAAS,GAAG,IAAI,UAAU,CAAC,QAAQ,EAAE,IAAI,CAAC,QAAQ,CAAC,SAAS,EAAE,EAAE,EAAE,CAAC,CAAC,CAAC;QAC3E,SAAS,CAAC,QAAQ,CAAC,GAAG,CAAC,GAAG,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC;QAClD,IAAI,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC;QAEpB,MAAM,IAAI,GAAG,IAAI,IAAI,CAAC,QAAQ,EAAE,YAAY,CAAC,CAAC;QAC9C,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,GAAG,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;QACzC,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,GAAG,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QACnC,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;QAEf,KAAK,MAAM,GAAG,IAAI,IAAI,CAAC,KAAK,EAAE;YAC5B,MAAM,IAAI,GAAG,IAAI,IAAI,CAAC,QAAQ,EAAE,WAAW,CAAC,CAAC;YAC7C,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,GAAG,GAAG,CAAC,QAAQ,CAAC,CAAC;YACnC,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,EAAE,GAAG,CAAC,QAAQ,EAAE,CAAC,CAAC,CAAC;YACtC,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,GAAG,GAAG,CAAC,KAAK,CAAC,CAAC;YAC7B,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;SAChB;QAED,KAAK,MAAM,KAAK,IAAI,IAAI,CAAC,MAAM,EAAE;YAC/B,MAAM,MAAM,GACR,IAAI,IAAI,CAAC,QAAQ,EAAE,IAAI,CAAC,uBAAuB,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC,CAAC;YACtE,MAAM,CAAC,QAAQ,CAAC,GAAG,CAAC,GAAG,KAAK,CAAC,QAAQ,CAAC,CAAC;YACvC,MAAM,CAAC,KAAK,CAAC,GAAG,CAAC,GAAG,KAAK,CAAC,KAAK,CAAC,CAAC;YACjC,IAAI,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;SAClB;IACH,CAAC;IAED,uBAAuB,CAAC,SAAiB;QACvC,MAAM,QAAQ,GAAG,IAAI,iBAAiB,EAAE,CAAC;QACzC,QAAQ,CAAC,KAAK,CAAC,SAAS,CAAC,SAAS,CAAC,CAAC;QACpC,OAAO,QAAQ,CAAC;IAClB,CAAC;CACF"}
1
+ {"version":3,"file":"EnvironmentScene.js","sourceRoot":"","sources":["../../../src/engine-components/utils/EnvironmentScene.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@needle-tools/engine",
3
- "version": "4.4.0-beta",
4
- "description": "Needle Engine is a web-based runtime for 3D apps. It runs on your machine for development with great integrations into editors like Unity or Blender - and can be deployed onto any device! It is flexible, extensible and networking and XR are built-in",
3
+ "version": "4.4.0-beta.10",
4
+ "description": "Needle Engine is a web-based runtime for 3D apps. It runs on your machine for development with great integrations into editors like Unity or Blender - and can be deployed onto any device! It is flexible, extensible and networking and XR are built-in.",
5
5
  "main": "dist/needle-engine.min.js",
6
6
  "exports": {
7
7
  ".": {
@@ -86,7 +86,7 @@
86
86
  ],
87
87
  "dependencies": {
88
88
  "@dimforge/rapier3d-compat": "^0.14.0",
89
- "@needle-tools/gltf-progressive": "^2.1.3",
89
+ "@needle-tools/gltf-progressive": "^2.1.4",
90
90
  "@webxr-input-profiles/motion-controllers": "^1.0.0",
91
91
  "flatbuffers": "2.0.4",
92
92
  "md5": "^2.3.0",
@@ -27,6 +27,7 @@ export function createBuildInfoFile(buildDirectory) {
27
27
  console.warn(`WARN: Could not write build info file to \"${buildInfoPath}\"`);
28
28
  return;
29
29
  }
30
+ console.log(`[needle-buildinfo] - Build info file successfully written to \"${buildInfoPath}\"`);
30
31
  }
31
32
 
32
33
  /** Recursively collect all files in a directory
@@ -0,0 +1,2 @@
1
+
2
+ export const NEEDLE_CLOUD_CLI_NAME = "needle-cloud@version-1";
@@ -1,9 +1,11 @@
1
1
  import { spawn } from "child_process";
2
+ import { NEEDLE_CLOUD_CLI_NAME } from "./cloud.js";
3
+ import { existsSync } from "fs";
2
4
 
3
5
  const port = 8424;
4
- const packageName = "needle-cloud@version-1";
5
6
  const licenseServerUrl = `http://localhost:${port}/api/license`;
6
7
  const projectIdentifierUrl = `http://localhost:${port}/api/public_key`;
8
+ const needleCloudApiEndpoint = "https://cloud.needle.tools/api";
7
9
 
8
10
  /**
9
11
  * Replace license string - used for webpack
@@ -11,7 +13,7 @@ const projectIdentifierUrl = `http://localhost:${port}/api/public_key`;
11
13
  * @param {{team:string|undefined}} opts
12
14
  */
13
15
  export async function replaceLicense(code, opts) {
14
- const index = code.indexOf("NEEDLE_ENGINE_LICENSE_TYPE");
16
+ const index = code?.indexOf("NEEDLE_ENGINE_LICENSE_TYPE");
15
17
  if (index >= 0) {
16
18
  const licenseType = await resolveLicense(opts);
17
19
  if (!licenseType) {
@@ -28,22 +30,72 @@ export async function replaceLicense(code, opts) {
28
30
  return code;
29
31
  }
30
32
 
31
-
32
33
  /**
33
34
  * Resolve the license using the needle engine licensing server
34
35
  * @param {{accessToken?:string, team?:string} | null} args
35
36
  * @returns {Promise<string | null>}
36
37
  */
37
38
  export async function resolveLicense(args = null) {
38
- // Wait for the server to start
39
- await waitForLicenseServer();
40
-
41
39
  let accessToken = args?.accessToken;
42
- if (process.env.NEEDLE_CLOUD_TOKEN) {
43
- console.log("INFO: Using Needle Cloud access token from environment variable");
44
- accessToken = process.env.NEEDLE_CLOUD_TOKEN;
40
+
41
+ if (!accessToken && process.env.CI) {
42
+ if (process.env.NEEDLE_CLOUD_TOKEN) {
43
+ console.log("[needle-license] INFO: Using Needle Cloud access token from environment variable");
44
+ accessToken = process.env.NEEDLE_CLOUD_TOKEN;
45
+ }
46
+ else {
47
+ console.warn("[needle-license] WARN: Missing NEEDLE_CLOUD_TOKEN for CI environment run");
48
+ }
45
49
  }
46
50
 
51
+ if (accessToken) {
52
+ const timeout = AbortSignal.timeout(10_000);
53
+ const url = new URL(`${needleCloudApiEndpoint}/v1/account/get/licenses`);
54
+ const res = await fetch(url, {
55
+ method: "GET",
56
+ signal: timeout,
57
+ headers: {
58
+ Authorization: `Bearer ${accessToken}`,
59
+ "x-needle": "cli"
60
+ }
61
+ }).catch(err => {
62
+ return { ok: false, error: err.message };
63
+ });
64
+ if ("error" in res) {
65
+ console.error(`[needle-license] Could not fetch license from Needle Cloud API (${res.error})`);
66
+ return null;
67
+ }
68
+ if (res.ok) {
69
+ const text = await res.text();
70
+ return tryParseLicense(text);
71
+ }
72
+ else {
73
+ console.error(`[needle-license] Could not fetch license from Needle Cloud API (${res.status})`);
74
+ if (process.env.CI) {
75
+ return null;
76
+ }
77
+ }
78
+ }
79
+ else if (process.env.CI) {
80
+ const isGithubCI = process.env.GITHUB_ACTIONS;
81
+ let message = "[needle-license] WARN: Missing NEEDLE_CLOUD_TOKEN for CI environment run.";
82
+ if (isGithubCI) {
83
+ const repositoryUrl = process.env.GITHUB_REPOSITORY;
84
+ const url = `${repositoryUrl}/settings/secrets/actions`;
85
+ message += `\nPlease add the token to your GitHub repository secrets: ${url}`;
86
+ }
87
+ console.warn(message);
88
+ return null;
89
+ }
90
+ else if (isStackblitz()) {
91
+ console.error("[needle-license] License server is not available in Stackblitz. Please use an access token for authorization.");
92
+ return null;
93
+ }
94
+
95
+ // Fallback to use CLI
96
+ // Wait for the server to start
97
+ await waitForLicenseServer();
98
+
47
99
  const url = new URL(licenseServerUrl);
48
100
  if (args?.team)
49
101
  url.searchParams.append("org", args.team);
@@ -51,20 +103,22 @@ export async function resolveLicense(args = null) {
51
103
  url.searchParams.append("token", accessToken);
52
104
  }
53
105
 
54
- console.log(`INFO: Fetching license...`);
106
+ console.log(`[needle-license] INFO: Fetching license...`);
107
+ const timeout = AbortSignal.timeout(10_000);
55
108
  const licenseResponse = await fetch(url.toString(), {
56
109
  method: "GET",
110
+ signal: timeout
57
111
  }).catch(err => {
58
- if (err.cause.code === "ECONNREFUSED") {
59
- return { error: "ERR: Failed to connect to license server (ECONNREFUSED)" };
112
+ if (err.cause?.code === "ECONNREFUSED") {
113
+ return { error: "[needle-license] ERR: Failed to connect to license server (ECONNREFUSED)" };
60
114
  }
61
115
  else {
62
- return { error: "ERR: Failed to fetch license." };
116
+ return { error: "[needle-license] ERR: Failed to fetch license." };
63
117
  }
64
118
  });
65
119
 
66
120
  if (!licenseResponse) {
67
- console.warn("WARN: Failed to fetch license");
121
+ console.warn("[needle-license] WARN: Failed to fetch license");
68
122
  return null;
69
123
  }
70
124
  else if ("error" in licenseResponse) {
@@ -72,59 +126,128 @@ export async function resolveLicense(args = null) {
72
126
  return null;
73
127
  }
74
128
  else if (!licenseResponse.ok) {
75
- console.error("ERROR: Failed to fetch license");
129
+ if (licenseResponse.status === 500)
130
+ console.error(`[needle-license] ERROR: Failed to fetch license (${licenseResponse.status})`);
131
+ else
132
+ console.log(`[needle-license] No license found (${licenseResponse.status})`);
76
133
  return null;
77
134
  }
78
135
 
79
136
  const text = await licenseResponse.text();
137
+ return tryParseLicense(text);
138
+ }
139
+
80
140
 
141
+ /**
142
+ * @param {string} str License string
143
+ */
144
+ function tryParseLicense(str) {
81
145
  try {
82
146
  /** @type {{needle_engine_license:string}} */
83
- const licenseJson = JSON.parse(text);
84
- console.log("\n");
147
+ const licenseJson = JSON.parse(str);
85
148
  if (licenseJson.needle_engine_license) {
86
- console.log(`INFO: Successfully received \"${licenseJson.needle_engine_license?.toUpperCase()}\" license`)
149
+ console.log(`[needle-license] INFO: Successfully received \"${licenseJson.needle_engine_license?.toUpperCase()}\" license`)
87
150
  return licenseJson.needle_engine_license;
88
151
  }
89
152
  if ("error" in licenseJson) {
90
- console.error(`ERROR in license check: \"${licenseJson.error}\"`);
153
+ console.error(`[needle-license] ERROR in license check: \"${licenseJson.error}\"`);
91
154
  }
92
155
  else if (licenseJson.needle_engine_license == null) {
93
156
  return null;
94
157
  }
95
158
  else {
96
- console.warn("WARN: Received invalid license.", licenseJson);
159
+ console.warn("[needle-license] WARN: Received invalid license.", licenseJson);
97
160
  }
98
161
  return null;
99
162
  }
100
163
  catch (err) {
101
- console.error("ERROR: Failed to parse license response");
164
+ console.error("[needle-license] ERROR: Failed to parse license response");
102
165
  return null;
103
166
  }
104
167
  }
105
168
 
106
169
 
107
-
108
170
  /**
109
171
  * @param {string | undefined} project_id
110
172
  */
111
173
  export async function getPublicIdentifier(project_id) {
174
+
175
+ let accessToken = undefined;
176
+ if (process.env.CI) {
177
+ if (process.env.NEEDLE_CLOUD_TOKEN) {
178
+ console.log("[needle-identifier] INFO: Using Needle Cloud access token from environment variable");
179
+ accessToken = process.env.NEEDLE_CLOUD_TOKEN;
180
+ }
181
+
182
+ const url = new URL(`${needleCloudApiEndpoint}/v1/account/public_key`);
183
+ const body = {
184
+ project_id: project_id || process.env.GITHUB_REPOSITORY || undefined,
185
+ machine_id: process.env.GITHUB_REPOSITORY_ID || "unknown",
186
+ }
187
+ const timeout = AbortSignal.timeout(10_000);
188
+ const res = await fetch(url, {
189
+ method: "POST",
190
+ signal: timeout,
191
+ headers: {
192
+ Authorization: `Bearer ${accessToken}`,
193
+ "Content-Type": "application/json",
194
+ "x-needle": "cli"
195
+ },
196
+ body: JSON.stringify(body),
197
+ }).catch(err => {
198
+ return { ok: false, error: err.message };
199
+ });
200
+ if ("error" in res) {
201
+ console.error(`[needle-identifier] Could not fetch project identifier from Needle Cloud API (${res.error})`);
202
+ return null;
203
+ }
204
+ if (res.ok) {
205
+ const text = await res.text();
206
+ try {
207
+ /** @type {{public_key:string}} */
208
+ const json = JSON.parse(text);
209
+ console.log(`[needle-identifier] INFO: Successfully received public project identifier`);
210
+ return json.public_key;
211
+ }
212
+ catch (err) {
213
+ console.error("[needle-identifier] ERROR: Failed to parse project identifier response");
214
+ return null;
215
+ }
216
+ }
217
+ else {
218
+ const message = await res.text();
219
+ console.error(`[needle-identifier] Could not fetch project identifier from Needle Cloud API (${res.status}, ${res.statusText}, ${message})`);
220
+ return null;
221
+ }
222
+ }
223
+ else if (isStackblitz()) {
224
+ console.error("[needle-license] License server is not available in Stackblitz. Please use an access token for authorization.");
225
+ return null;
226
+ }
227
+
228
+
229
+
112
230
  // Wait for the server to start
113
231
  await waitForLicenseServer();
114
232
 
233
+ console.log(`[needle-identifier] INFO: Fetching project identifier...`);
234
+ const url = new URL(projectIdentifierUrl);
235
+ if (project_id) url.searchParams.append("project_id", project_id);
236
+ const timeout = AbortSignal.timeout(10_000);
115
237
  const res = await fetch(projectIdentifierUrl, {
116
238
  method: "GET",
239
+ signal: timeout
117
240
  }).catch(err => {
118
- if (err.cause.code === "ECONNREFUSED") {
119
- return { error: "Could not connect to the license server: The connection was actively refused" };
241
+ if (err.cause?.code === "ECONNREFUSED") {
242
+ return { error: "[needle-identifier] Could not connect to the license server: The connection was actively refused" };
120
243
  }
121
244
  else {
122
- return { error: "ERR: Failed to fetch project identifier." };
245
+ return { error: "[needle-identifier] ERR: Failed to fetch project identifier." };
123
246
  }
124
247
  })
125
248
 
126
249
  if (!res) {
127
- console.warn("WARN: Failed to fetch project identifier");
250
+ console.warn("[needle-identifier] WARN: Failed to fetch project identifier");
128
251
  return null;
129
252
  }
130
253
  else if ("error" in res) {
@@ -132,7 +255,7 @@ export async function getPublicIdentifier(project_id) {
132
255
  return null;
133
256
  }
134
257
  else if (!res.ok) {
135
- console.error("ERROR: Failed to fetch project identifier");
258
+ console.error("[needle-identifier] ERROR: Failed to fetch project identifier");
136
259
  return null;
137
260
  }
138
261
  const text = await res.text();
@@ -154,24 +277,38 @@ export async function getPublicIdentifier(project_id) {
154
277
  // we need to to wait for the root URL to return a response
155
278
  async function waitForLicenseServer() {
156
279
  // Make sure the licensing server is running
157
- runCommand("npx", ["--yes", packageName, "start-server"]);
280
+ const startcmd = runCommand("npx", ["--yes", NEEDLE_CLOUD_CLI_NAME, "start-server"]);
281
+ let isRunning = true;
282
+ startcmd.then(() => isRunning = false);
158
283
 
159
284
  let attempts = 0;
160
285
  const maxAttempts = 10;
161
286
  do {
287
+ const timeout = AbortSignal.timeout(1_000);
162
288
  const response = await fetch(licenseServerUrl, {
163
289
  method: "GET",
290
+ signal: timeout
164
291
  }).catch(err => {
165
- if (err.cause.code === "ECONNREFUSED") {
166
- console.warn("WARN: Stop waiting for license server because the connection was actively refused. (ECONNREFUSED)");
167
- attempts += maxAttempts;
292
+ if (err.cause?.code === "ECONNREFUSED") {
293
+ if (!isRunning) {
294
+ console.error("[needle-license] ERR: Failed to connect to license server (ECONNREFUSED)");
295
+ }
296
+ else {
297
+ // Waiting for server to start
298
+ // EConnectRefuse happen if starting the license server for the first time
299
+ }
300
+ }
301
+ else {
302
+ if (attempts === maxAttempts) {
303
+ console.error("[needle-license] ERR: Failed to start license server...", err.message);
304
+ }
168
305
  }
169
306
  });
170
307
  if (response) {
171
308
  return true;
172
309
  }
173
310
  if (attempts === 0) {
174
- console.log("INFO: Waiting for license server to start...");
311
+ console.log("[needle-license] INFO: Waiting for license server to start...");
175
312
  }
176
313
  attempts++;
177
314
  if (attempts <= maxAttempts) {
@@ -183,6 +320,10 @@ async function waitForLicenseServer() {
183
320
  }
184
321
 
185
322
 
323
+ function isStackblitz() {
324
+ return existsSync("/home/.stackblitz")
325
+ }
326
+
186
327
  /**
187
328
  * @param {string} processName
188
329
  * @param {string[]} args
@@ -194,7 +335,7 @@ async function runCommand(processName, args) {
194
335
  if (code === 0) {
195
336
  resolve(true);
196
337
  } else {
197
- console.warn(`WARN: \"${processName}\" process exited with code ${code}\nProcess Arguments: ${args.join(" ")}`);
338
+ console.warn(`[needle-license] WARN: \"${processName}\" process exited with code ${code}\nProcess Arguments: ${args.join(" ")}`);
198
339
  resolve(false);
199
340
  }
200
341
  });
@@ -46,6 +46,8 @@ export type userSettings = {
46
46
 
47
47
  noCodegenTransform?: boolean;
48
48
  noFacebookInstantGames?: boolean;
49
+ /** Custom configuration for facebook instant games. */
50
+ facebookInstantGames: {}
49
51
  /** Set to true to create an imports.log file that shows all module imports. The file is generated when stopping the server. */
50
52
  logModuleImportChains?: boolean;
51
53
 
@@ -71,6 +73,9 @@ export type userSettings = {
71
73
  * @example "2.2.0-alpha"
72
74
  */
73
75
  version?: string;
76
+
77
+ /** If defined the access token will be used to run compression on Needle Cloud */
78
+ accessToken?: string | undefined;
74
79
  }
75
80
 
76
81
  /** required for @serializable https://github.com/vitejs/vite/issues/13736 */
@@ -1,4 +1,5 @@
1
1
  import { ChildProcess, exec } from 'child_process';
2
+ import { NEEDLE_CLOUD_CLI_NAME } from '../common/cloud.js';
2
3
  import { getOutputDirectory, loadConfig } from './config.js';
3
4
  import { existsSync, mkdirSync, readFileSync, readdirSync, rmSync, writeFileSync } from 'fs';
4
5
  import { copyFilesSync } from '../common/files.js';
@@ -168,7 +169,7 @@ export const needleBuildPipeline = async (command, config, userSettings) => {
168
169
  return buildPipelineTask = buildPipelineTask?.then(() => {
169
170
  // Copy the results to their final output directory.
170
171
  if (buildPipelineTaskResults != null) {
171
- log("Copying files from temporary output directory to final output directory...");
172
+ log(`Copying files from temporary output directory to final output directory at \"${buildPipelineTaskResults.outputDirectory}\"`);
172
173
  const ctx = { count: 0 }
173
174
  copyFilesSync(buildPipelineTaskResults.tempDirectory, buildPipelineTaskResults.outputDirectory, true, ctx);
174
175
  log(`Copied ${ctx.count} file(s)`);
@@ -255,7 +256,7 @@ async function invokeBuildPipeline(opts) {
255
256
  /** @type {null | ChildProcess} */
256
257
  let proc = null;
257
258
 
258
- let cloudAccessToken = opts.license?.accessToken;
259
+ let cloudAccessToken = opts.buildPipeline?.accessToken || opts.license?.accessToken;
259
260
  if (!cloudAccessToken) {
260
261
  cloudAccessToken = process.env.NEEDLE_CLOUD_TOKEN;
261
262
  }
@@ -292,7 +293,7 @@ async function invokeBuildPipeline(opts) {
292
293
  if (!cloudAccessToken || !(typeof cloudAccessToken === "string") || cloudAccessToken.length <= 0) {
293
294
  throw new Error("No cloud access token configured. Please set it via process.env.NEEDLE_CLOUD_TOKEN or in the vite.config.js");
294
295
  }
295
- let cmd = `npx --yes needle-cloud@main optimize "${outputDirectory}" --token ${cloudAccessToken}`;
296
+ let cmd = `npx --yes ${NEEDLE_CLOUD_CLI_NAME} optimize "${outputDirectory}" --token ${cloudAccessToken}`;
296
297
  let projectName = opts.buildPipeline?.projectName;
297
298
  // Default project name for compression
298
299
  // TODO: maybe this should be taken from the package.json name field or needle.config?
@@ -45,6 +45,13 @@ function handleOptimizeDeps(config) {
45
45
  // This needs to be excluded from optimization because otherwise the worker import fails
46
46
  // three-mesh-bvh/src/workers/generateMeshBVH.worker.js?worker
47
47
  config.optimizeDeps.exclude.push("three-mesh-bvh");
48
+
49
+ if (!config.server) config.server = {};
50
+ if (!config.server.fs) config.server.fs = {};
51
+ if (config.server.fs.strict === undefined) {
52
+ // we need to disable strictness to allow importing the worker from three-mesh-bvh node_modules in our GenerateMeshBVHWorker.js file
53
+ config.server.fs.strict = false;
54
+ }
48
55
  }
49
56
  }
50
57
 
@@ -72,13 +79,16 @@ function handleManualChunks(config) {
72
79
  })
73
80
  }
74
81
  else {
75
- if (rollupOutput.manualChunks) {
76
- // if the user has already defined manualChunks, we don't want to overwrite it
77
- console.log("[needle-dependencies] manualChunks already defined");
78
- }
79
- else {
80
- console.log("[needle-dependencies] registering manualChunks");
81
- rollupOutput.manualChunks = needleManualChunks;
82
+ // If preserveModules is true we can not modify the chunkFileNames
83
+ if (rollupOutput.preserveModules !== true) {
84
+ if (rollupOutput.manualChunks) {
85
+ // if the user has already defined manualChunks, we don't want to overwrite it
86
+ console.log("[needle-dependencies] manualChunks already defined");
87
+ }
88
+ else {
89
+ console.log("[needle-dependencies] registering manualChunks");
90
+ rollupOutput.manualChunks = needleManualChunks;
91
+ }
82
92
  }
83
93
 
84
94
  if (rollupOutput.chunkFileNames) {
@@ -39,20 +39,23 @@ export const needleFacebookInstantGames = (command, config, userSettings) => {
39
39
  if (userSettings.noFacebookInstantGames === true) return;
40
40
 
41
41
  // If the config is not present it means that we don't want to use fb instant games
42
- if (!config || !config.facebookInstantGames) return;
42
+ if (!config || !(userSettings.facebookInstantGames || config.facebookInstantGames)) return;
43
43
 
44
- log("Setup Facebook Instant Games", config.facebookInstantGames);
44
+ /** @type {import('../types').userSettings["facebookInstantGames"]} */
45
+ const facebookInstantGamesConfig = { ...config.facebookInstantGames, ...userSettings.facebookInstantGames };
46
+
47
+ log("Setup Facebook Instant Games", facebookInstantGamesConfig);
45
48
 
46
49
 
47
50
  // https://developers.facebook.com/docs/games/build/instant-games/reference/bundle-config
48
51
  let bundleConfig = {}
49
52
  const bundleConfigPath = process.cwd() + "/fbapp-config.json";
50
53
  if (existsSync(bundleConfigPath)) {
51
- log("Found facebook bundle config exists at " + bundleConfigPath + " ...");
54
+ log(`Found facebook bundle config exists at "${bundleConfigPath}" ...`);
52
55
  bundleConfig = JSON.parse(readFileSync(bundleConfigPath, 'utf8'));
53
56
  }
54
57
  else {
55
- log("No facebook bundle config exists at " + bundleConfigPath + " - will generate one now");
58
+ log(`No facebook bundle config exists at "${bundleConfigPath}" - will generate one now`);
56
59
  }
57
60
 
58
61
  // Make sure the bundle has the required arguments:
@@ -96,7 +96,7 @@ const defaultUserSettings = {
96
96
  }
97
97
  * ```
98
98
  * @param {"build" | "serve"} command
99
- * @param {{} | undefined} config
99
+ * @param {{} | undefined | null} config
100
100
  * @param {import('../types/index.js').userSettings} userSettings
101
101
  */
102
102
  export const needlePlugins = async (command, config = undefined, userSettings = {}) => {
@@ -129,6 +129,7 @@ import { SpatialGrabRaycaster } from "../../engine-components/ui/Raycaster.js";
129
129
  import { RectTransform } from "../../engine-components/ui/RectTransform.js";
130
130
  import { SpatialHtml } from "../../engine-components/ui/SpatialHtml.js";
131
131
  import { Text } from "../../engine-components/ui/Text.js";
132
+ import { EnvironmentScene } from "../../engine-components/utils/EnvironmentScene.js";
132
133
  import { LookAt } from "../../engine-components/utils/LookAt.js";
133
134
  import { OpenURL } from "../../engine-components/utils/OpenURL.js";
134
135
  import { VideoPlayer } from "../../engine-components/VideoPlayer.js";
@@ -278,6 +279,7 @@ TypeStore.add("SpatialGrabRaycaster", SpatialGrabRaycaster);
278
279
  TypeStore.add("RectTransform", RectTransform);
279
280
  TypeStore.add("SpatialHtml", SpatialHtml);
280
281
  TypeStore.add("Text", Text);
282
+ TypeStore.add("EnvironmentScene", EnvironmentScene);
281
283
  TypeStore.add("LookAt", LookAt);
282
284
  TypeStore.add("OpenURL", OpenURL);
283
285
  TypeStore.add("VideoPlayer", VideoPlayer);
@@ -280,8 +280,9 @@ export class AssetReference {
280
280
  if (debug)
281
281
  console.log("loadAssetAsync", this.url);
282
282
  if (!this.mustLoad) return this.asset;
283
- if (prog)
284
- this._progressListeners.push(prog);
283
+
284
+ if (prog) this._progressListeners.push(prog);
285
+
285
286
  if (this._loading !== undefined) {
286
287
  // console.warn("Wait for other loading thiny");
287
288
  return this._loading.then(_ => this.asset);
@@ -92,10 +92,11 @@ export function addComponent<T extends IComponent>(obj: Object3D, componentInsta
92
92
 
93
93
  if (componentInstance.gameObject === obj) return componentInstance;
94
94
  // TODO: update raycast array
95
- if (componentInstance.gameObject && componentInstance.gameObject.userData.components) {
95
+ if (componentInstance.gameObject && componentInstance.gameObject.userData?.components) {
96
96
  const index = componentInstance.gameObject.userData.components.indexOf(componentInstance);
97
97
  componentInstance.gameObject.userData.components.splice(index, 1);
98
98
  }
99
+ if (!obj.userData) obj.userData = {};
99
100
  if (!obj.userData.components) obj.userData.components = [];
100
101
  else if (obj.userData.components.includes(componentInstance)) return componentInstance;
101
102
  // TODO: do we want to disable and enable when moving?