@needle-tools/engine 4.8.8-next.5cb3196 → 4.8.8-next.63ac8fb

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 (62) hide show
  1. package/README.md +12 -3
  2. package/components.needle.json +1 -1
  3. package/dist/{needle-engine.bundle-D83YACrg.umd.cjs → needle-engine.bundle-CMCOdGQK.umd.cjs} +100 -100
  4. package/dist/{needle-engine.bundle-SWdTk441.min.js → needle-engine.bundle-iScLhzlc.min.js} +95 -95
  5. package/dist/{needle-engine.bundle-DJA-sz_-.js → needle-engine.bundle-sf6JwVsZ.js} +2018 -1989
  6. package/dist/needle-engine.d.ts +7 -0
  7. package/dist/needle-engine.js +2 -2
  8. package/dist/needle-engine.min.js +1 -1
  9. package/dist/needle-engine.umd.cjs +1 -1
  10. package/lib/engine/engine_addressables.js +2 -0
  11. package/lib/engine/engine_addressables.js.map +1 -1
  12. package/lib/engine/engine_animation.js +4 -4
  13. package/lib/engine/engine_animation.js.map +1 -1
  14. package/lib/engine/engine_assetdatabase.js +6 -6
  15. package/lib/engine/engine_assetdatabase.js.map +1 -1
  16. package/lib/engine/engine_camera.d.ts +15 -2
  17. package/lib/engine/engine_camera.js +9 -2
  18. package/lib/engine/engine_camera.js.map +1 -1
  19. package/lib/engine/engine_context.d.ts +8 -2
  20. package/lib/engine/engine_context.js +21 -3
  21. package/lib/engine/engine_context.js.map +1 -1
  22. package/lib/engine/engine_create_objects.d.ts +3 -3
  23. package/lib/engine/engine_create_objects.js +5 -4
  24. package/lib/engine/engine_create_objects.js.map +1 -1
  25. package/lib/engine/engine_gameobject.js +2 -2
  26. package/lib/engine/engine_gameobject.js.map +1 -1
  27. package/lib/engine/engine_gltf_builtin_components.js +11 -11
  28. package/lib/engine/engine_gltf_builtin_components.js.map +1 -1
  29. package/lib/engine/extensions/NEEDLE_lighting_settings.js +5 -2
  30. package/lib/engine/extensions/NEEDLE_lighting_settings.js.map +1 -1
  31. package/lib/engine/extensions/NEEDLE_lightmaps.js +1 -1
  32. package/lib/engine/extensions/NEEDLE_lightmaps.js.map +1 -1
  33. package/lib/engine/js-extensions/Object3D.d.ts +1 -1
  34. package/lib/engine/js-extensions/Vector.d.ts +5 -0
  35. package/lib/engine/js-extensions/Vector.js.map +1 -1
  36. package/lib/engine-components/ContactShadows.d.ts +12 -2
  37. package/lib/engine-components/ContactShadows.js +24 -4
  38. package/lib/engine-components/ContactShadows.js.map +1 -1
  39. package/lib/engine-components/NestedGltf.d.ts +9 -4
  40. package/lib/engine-components/NestedGltf.js +32 -26
  41. package/lib/engine-components/NestedGltf.js.map +1 -1
  42. package/lib/engine-components/OrbitControls.js +2 -4
  43. package/lib/engine-components/OrbitControls.js.map +1 -1
  44. package/lib/engine-components/Renderer.js +2 -1
  45. package/lib/engine-components/Renderer.js.map +1 -1
  46. package/package.json +2 -2
  47. package/plugins/common/files.js +6 -3
  48. package/src/engine/engine_addressables.ts +2 -0
  49. package/src/engine/engine_animation.ts +4 -4
  50. package/src/engine/engine_assetdatabase.ts +7 -7
  51. package/src/engine/engine_camera.ts +15 -3
  52. package/src/engine/engine_context.ts +22 -4
  53. package/src/engine/engine_create_objects.ts +8 -7
  54. package/src/engine/engine_gameobject.ts +2 -2
  55. package/src/engine/engine_gltf_builtin_components.ts +12 -11
  56. package/src/engine/extensions/NEEDLE_lighting_settings.ts +5 -2
  57. package/src/engine/extensions/NEEDLE_lightmaps.ts +1 -1
  58. package/src/engine/js-extensions/Vector.ts +6 -0
  59. package/src/engine-components/ContactShadows.ts +27 -6
  60. package/src/engine-components/NestedGltf.ts +33 -24
  61. package/src/engine-components/OrbitControls.ts +2 -6
  62. package/src/engine-components/Renderer.ts +2 -1
@@ -169,8 +169,11 @@ export class SceneLightSettings extends Behaviour {
169
169
  this._hemisphereLightObj.removeFromParent();
170
170
  }
171
171
 
172
- if (this.sourceId)
173
- this.context.sceneLighting.internalEnableReflection(this.sourceId);
172
+ if (this.sourceId) {
173
+ if (!this.context.domElement.getAttribute("environment-image")) {
174
+ this.context.sceneLighting.internalEnableReflection(this.sourceId);
175
+ }
176
+ }
174
177
  }
175
178
 
176
179
  onDisable() {
@@ -70,7 +70,7 @@ export class NEEDLE_lightmaps implements GLTFLoaderPlugin {
70
70
  console.log(entry);
71
71
  let res: Promise<any> | null = null;
72
72
  // Check if the pointer is a json pointer:
73
- if (entry.pointer.startsWith("/textures/")) {
73
+ if (entry.pointer.startsWith("/textures/") || /** legacy support e.g. SOC */entry.pointer.startsWith("textures/")) {
74
74
  if (debug) console.log("Load texture from gltf", entry.pointer);
75
75
  res = resolveReferences(this.parser, entry.pointer).then(res => this.resolveTexture(entry, res));
76
76
  }
@@ -10,6 +10,12 @@ export function apply(object: Vector3) {
10
10
  }
11
11
  }
12
12
 
13
+ // NOTE: keep in sync with method declarations below
14
+ declare module 'three' {
15
+ export interface Vector3 {
16
+ slerp(end: Vector3, t: number): Vector3;
17
+ }
18
+ }
13
19
 
14
20
  Vector3.prototype["slerp"] = function (end: Vector3, t: number) {
15
21
  return slerp(this, end, t);
@@ -1,4 +1,4 @@
1
- import { BackSide, CustomBlending, DoubleSide, FrontSide, Group, Material, Matrix4, MaxEquation, Mesh, MeshBasicMaterial, MeshDepthMaterial, MeshStandardMaterial, MinEquation, Object3D, OrthographicCamera, PlaneGeometry, RenderItem, ShaderMaterial, Vector3, WebGLRenderTarget } from "three";
1
+ import { BackSide, CustomBlending, DoubleSide, FrontSide, Group, Material, Matrix4, MaxEquation, Mesh, MeshBasicMaterial, MeshDepthMaterial, MeshStandardMaterial, MinEquation, Object3D, OrthographicCamera, PlaneGeometry, RenderItem, ShaderMaterial, Vector3, Vector3Like, WebGLRenderTarget } from "three";
2
2
  import { HorizontalBlurShader } from 'three/examples/jsm/shaders/HorizontalBlurShader.js';
3
3
  import { VerticalBlurShader } from 'three/examples/jsm/shaders/VerticalBlurShader.js';
4
4
 
@@ -27,7 +27,14 @@ onStart(ctx => {
27
27
  shadows.darkness = intensity;
28
28
  }
29
29
  }
30
- })
30
+ });
31
+
32
+
33
+ type FitParameters = {
34
+ object?: Object3D | Object3D[];
35
+ positionOffset?: Partial<Vector3Like>;
36
+ scaleFactor?: Partial<Vector3Like>;
37
+ }
31
38
 
32
39
  // Adapted from https://github.com/mrdoob/three.js/blob/master/examples/webgl_shadow_contact.html.
33
40
 
@@ -50,7 +57,7 @@ export class ContactShadows extends Behaviour {
50
57
  * @param context The context to create the contact shadows in.
51
58
  * @returns The instance of the contact shadows.
52
59
  */
53
- static auto(context?: Context): ContactShadows {
60
+ static auto(context?: Context, params?: FitParameters): ContactShadows {
54
61
  if (!context) context = Context.Current;
55
62
  if (!context) {
56
63
  throw new Error("No context provided and no current context set.");
@@ -65,12 +72,13 @@ export class ContactShadows extends Behaviour {
65
72
  this._instances.set(context, instance);
66
73
  }
67
74
  context.scene.add(instance.gameObject);
68
- instance.fitShadows();
75
+ instance.fitShadows(params);
69
76
  return instance;
70
77
  }
71
78
 
72
79
  /**
73
80
  * When enabled the contact shadows component will be created to fit the whole scene.
81
+ * @default false
74
82
  */
75
83
  @serializable()
76
84
  autoFit: boolean = false;
@@ -107,12 +115,14 @@ export class ContactShadows extends Behaviour {
107
115
 
108
116
  /**
109
117
  * The minimum size of the shadows box
118
+ * @default undefined
110
119
  */
111
120
  minSize?: Partial<Vec3>;
112
121
 
113
122
  /**
114
123
  * When enabled the shadows will not be updated automatically. Use `needsUpdate()` to update the shadows manually.
115
124
  * This is useful when you want to update the shadows only when the scene changes.
125
+ * @default false
116
126
  */
117
127
  manualUpdate: boolean = false;
118
128
  /**
@@ -150,10 +160,11 @@ export class ContactShadows extends Behaviour {
150
160
  /**
151
161
  * Call to fit the shadows to the scene.
152
162
  */
153
- fitShadows() {
163
+ fitShadows(params: FitParameters = {}) {
154
164
  if (debug) console.warn("Fitting shadows to scene");
155
165
  setAutoFitEnabled(this.shadowsRoot, false);
156
- const box = getBoundingBox(this.context.scene.children, [this.shadowsRoot]);
166
+ const objectToFit = params.object || this.context.scene;
167
+ const box = getBoundingBox(objectToFit, [this.shadowsRoot]);
157
168
  // expand box in all directions (except below ground)
158
169
  // 0.75 expands by 75% in each direction
159
170
  // The "32" is pretty much heuristically determined – adjusting the value until we don't get a visible border anymore.
@@ -175,6 +186,16 @@ export class ContactShadows extends Behaviour {
175
186
  // We can't move GroundProjection down because of immersive-ar mesh/plane tracking where occlusion would otherwise hide GroundProjection
176
187
  this.shadowsRoot.position.set((min.x + box.max.x) / 2, min.y - offset, (min.z + box.max.z) / 2);
177
188
  this.shadowsRoot.scale.set(box.max.x - min.x, box.max.y - min.y, box.max.z - min.z);
189
+ if (params.positionOffset) {
190
+ if (params.positionOffset.x !== undefined) this.shadowsRoot.position.x += params.positionOffset.x;
191
+ if (params.positionOffset.y !== undefined) this.shadowsRoot.position.y += params.positionOffset.y;
192
+ if (params.positionOffset.z !== undefined) this.shadowsRoot.position.z += params.positionOffset.z;
193
+ }
194
+ if (params.scaleFactor) {
195
+ if (params.scaleFactor.x !== undefined) this.shadowsRoot.scale.x *= params.scaleFactor.x;
196
+ if (params.scaleFactor.y !== undefined) this.shadowsRoot.scale.y *= params.scaleFactor.y;
197
+ if (params.scaleFactor.z !== undefined) this.shadowsRoot.scale.z *= params.scaleFactor.z;
198
+ }
178
199
  this.applyMinSize();
179
200
  this.shadowsRoot.matrixWorldNeedsUpdate = true;
180
201
  if (debug) console.log("Fitted shadows to scene", this.shadowsRoot.scale.clone());
@@ -4,6 +4,7 @@ import { InstantiateIdProvider } from "../engine/engine_networking_instantiate.j
4
4
  import { serializable } from "../engine/engine_serialization_decorator.js";
5
5
  import { getParam } from "../engine/engine_utils.js";
6
6
  import { Behaviour } from "../engine-components/Component.js";
7
+ import { EventList } from "./EventList.js";
7
8
 
8
9
  const debug = getParam("debugnestedgltf");
9
10
 
@@ -11,17 +12,21 @@ const debug = getParam("debugnestedgltf");
11
12
  * It will load the gltf file and instantiate it as a child of the parent of the GameObject that has this component
12
13
  */
13
14
  export class NestedGltf extends Behaviour {
14
- /**
15
- * A reference to the gltf file that should be loaded
16
- */
15
+
16
+ /** A reference to the gltf file that should be loaded */
17
17
  @serializable(AssetReference)
18
18
  filePath?: AssetReference;
19
19
 
20
+ /** Invoked when the nested glTF file has been instantiated */
21
+ @serializable(EventList)
22
+ loaded: EventList<{ component: NestedGltf, instance: any, asset: AssetReference }> = new EventList();
23
+
20
24
  /**
21
25
  * EXPERIMENTAL for cloud asset loading
22
26
  */
23
27
  loadAssetInParent = true;
24
28
 
29
+
25
30
  private _isLoadingOrDoneLoading: boolean = false;
26
31
 
27
32
  /** Register a callback that will be called when the progress of the loading changes */
@@ -31,7 +36,7 @@ export class NestedGltf extends Behaviour {
31
36
 
32
37
  /** Begin loading the referenced gltf file in filePath */
33
38
  preload() {
34
- this.filePath?.preload();
39
+ return this.filePath?.preload() || null;
35
40
  }
36
41
 
37
42
  /** @internal */
@@ -41,27 +46,31 @@ export class NestedGltf extends Behaviour {
41
46
 
42
47
  const parent = this.gameObject.parent;
43
48
  if (parent) {
44
- this._isLoadingOrDoneLoading = true;
45
- const opts = new InstantiateOptions();
46
- // we need to provide stable guids for creating nested gltfs
47
- opts.idProvider = new InstantiateIdProvider(this.hash(this.guid));
48
- opts.parent = this.loadAssetInParent !== false ? parent : this.gameObject;
49
- this.gameObject.updateMatrix();
50
- const matrix = this.gameObject.matrix;
51
- if (debug) console.log("Load nested:", this.filePath?.url ?? this.filePath, this.gameObject.position);
52
- const res = await this.filePath?.instantiate?.call(this.filePath, opts);
53
- if (debug) console.log("Nested loaded:", this.filePath?.url ?? this.filePath, res);
54
- if (res && this.loadAssetInParent !== false) {
55
- res.matrixAutoUpdate = false;
56
- res.matrix.identity();
57
- res.applyMatrix4(matrix);
58
- res.matrixAutoUpdate = true;
59
- res.layers.disableAll();
60
- res.layers.set(this.layer);
61
-
62
- this.dispatchEvent(new CustomEvent("loaded", { detail: { instance: res, assetReference: this.filePath } }));
49
+
50
+ if (this.filePath) {
51
+
52
+ this._isLoadingOrDoneLoading = true;
53
+ const opts = new InstantiateOptions();
54
+ // we need to provide stable guids for creating nested gltfs
55
+ opts.idProvider = new InstantiateIdProvider(this.hash(this.guid));
56
+ opts.parent = this.loadAssetInParent !== false ? parent : this.gameObject;
57
+ this.gameObject.updateMatrix();
58
+ const matrix = this.gameObject.matrix;
59
+ if (debug) console.log("Load nested:", this.filePath?.url ?? this.filePath, this.gameObject.position);
60
+ const res = await this.filePath?.instantiate?.call(this.filePath, opts);
61
+ if (debug) console.log("Nested loaded:", this.filePath?.url ?? this.filePath, res);
62
+ if (res && this.loadAssetInParent !== false) {
63
+ res.matrixAutoUpdate = false;
64
+ res.matrix.identity();
65
+ res.applyMatrix4(matrix);
66
+ res.matrixAutoUpdate = true;
67
+ res.layers.disableAll();
68
+ res.layers.set(this.layer);
69
+ this.loaded.invoke({ component: this, instance: res, asset: this.filePath });
70
+ }
71
+ if (debug) console.log("Nested loading done:", this.filePath?.url ?? this.filePath, res);
63
72
  }
64
- if (debug) console.log("Nested loading done:", this.filePath?.url ?? this.filePath, res);
73
+
65
74
  }
66
75
  }
67
76
 
@@ -1044,15 +1044,13 @@ export class OrbitControls extends Behaviour implements ICameraController {
1044
1044
  // and thus we're just getting some maximum that will work for sure.
1045
1045
  const box = getBoundingBox(objects, undefined, this._camera?.threeCamera?.layers);
1046
1046
  const boxCopy = box.clone();
1047
-
1048
- camera.updateMatrixWorld();
1049
- camera.updateProjectionMatrix();
1050
1047
  box.getCenter(center);
1051
1048
 
1052
1049
  const box_size = new Vector3();
1053
1050
  box.getSize(box_size);
1054
1051
 
1055
1052
  // project this box into camera space
1053
+ camera.updateMatrixWorld();
1056
1054
  box.applyMatrix4(camera.matrixWorldInverse);
1057
1055
 
1058
1056
  box.getSize(size);
@@ -1104,6 +1102,7 @@ export class OrbitControls extends Behaviour implements ICameraController {
1104
1102
  // TODO: this doesnt take the Camera component nearClipPlane into account
1105
1103
  camera.near = (distance / 100);
1106
1104
  camera.far = boundsMax + distance * 10;
1105
+ camera.updateProjectionMatrix();
1107
1106
 
1108
1107
  // adjust maxZoom so that the ground projection radius is always inside
1109
1108
  if (groundprojection) {
@@ -1116,9 +1115,6 @@ export class OrbitControls extends Behaviour implements ICameraController {
1116
1115
  if (currentZoom < this.minZoom) this.minZoom = currentZoom * 0.9;
1117
1116
  if (currentZoom > this.maxZoom) this.maxZoom = currentZoom * 1.1;
1118
1117
 
1119
- camera.updateMatrixWorld();
1120
- camera.updateProjectionMatrix();
1121
-
1122
1118
  const direction = center.clone();
1123
1119
  if (options.fitDirection) {
1124
1120
  direction.sub(new Vector3().copy(options.fitDirection).multiplyScalar(1_000_000));
@@ -706,7 +706,8 @@ export class Renderer extends Behaviour implements IRenderer {
706
706
  }
707
707
 
708
708
  if (this.reflectionProbeUsage !== ReflectionProbeUsage.Off && this._reflectionProbe) {
709
- this._reflectionProbe.onSet(this);
709
+ if (!this._lightmaps?.length) // Currently reflectionprobes cant be used with lightmaps
710
+ this._reflectionProbe.onSet(this);
710
711
  }
711
712
  // since three 163 we need to set the envMap to the scene envMap if it is not set
712
713
  // otherwise the envmapIntensity has no effect: https://github.com/mrdoob/three.js/pull/27903