@needle-tools/engine 2.35.5-pre → 2.37.0-pre

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 (168) hide show
  1. package/CHANGELOG.md +31 -0
  2. package/dist/needle-engine.d.ts +312 -232
  3. package/dist/needle-engine.js +456 -437
  4. package/dist/needle-engine.js.map +4 -4
  5. package/dist/needle-engine.min.js +81 -76
  6. package/dist/needle-engine.min.js.map +4 -4
  7. package/lib/engine/api.d.ts +1 -0
  8. package/lib/engine/api.js +1 -0
  9. package/lib/engine/api.js.map +1 -1
  10. package/lib/engine/debug/debug.d.ts +1 -0
  11. package/lib/engine/debug/debug.js +3 -0
  12. package/lib/engine/debug/debug.js.map +1 -1
  13. package/lib/engine/debug/debug_overlay.js +12 -1
  14. package/lib/engine/debug/debug_overlay.js.map +1 -1
  15. package/lib/engine/engine_element_loading.js +1 -1
  16. package/lib/engine/engine_element_loading.js.map +1 -1
  17. package/lib/engine/engine_gameobject.d.ts +1 -0
  18. package/lib/engine/engine_gameobject.js +15 -2
  19. package/lib/engine/engine_gameobject.js.map +1 -1
  20. package/lib/engine/engine_gltf_builtin_components.js +4 -0
  21. package/lib/engine/engine_gltf_builtin_components.js.map +1 -1
  22. package/lib/engine/engine_mainloop_utils.d.ts +1 -1
  23. package/lib/engine/engine_mainloop_utils.js +7 -3
  24. package/lib/engine/engine_mainloop_utils.js.map +1 -1
  25. package/lib/engine/engine_physics.d.ts +49 -57
  26. package/lib/engine/engine_physics.js +464 -417
  27. package/lib/engine/engine_physics.js.map +1 -1
  28. package/lib/engine/engine_physics.types.d.ts +16 -0
  29. package/lib/engine/engine_physics.types.js +19 -0
  30. package/lib/engine/engine_physics.types.js.map +1 -0
  31. package/lib/engine/engine_serialization_core.d.ts +3 -0
  32. package/lib/engine/engine_serialization_core.js +19 -6
  33. package/lib/engine/engine_serialization_core.js.map +1 -1
  34. package/lib/engine/engine_setup.js +4 -2
  35. package/lib/engine/engine_setup.js.map +1 -1
  36. package/lib/engine/engine_time.d.ts +1 -0
  37. package/lib/engine/engine_time.js +1 -0
  38. package/lib/engine/engine_time.js.map +1 -1
  39. package/lib/engine/engine_types.d.ts +46 -26
  40. package/lib/engine/engine_types.js +24 -37
  41. package/lib/engine/engine_types.js.map +1 -1
  42. package/lib/engine/engine_typestore.d.ts +1 -0
  43. package/lib/engine/engine_typestore.js +1 -0
  44. package/lib/engine/engine_typestore.js.map +1 -1
  45. package/lib/engine/engine_util_decorator.d.ts +6 -0
  46. package/lib/engine/engine_util_decorator.js +54 -0
  47. package/lib/engine/engine_util_decorator.js.map +1 -0
  48. package/lib/engine/engine_utils.d.ts +1 -1
  49. package/lib/engine/engine_utils.js +2 -2
  50. package/lib/engine/engine_utils.js.map +1 -1
  51. package/lib/engine/extensions/NEEDLE_animator_controller_model.js.map +1 -1
  52. package/lib/engine/extensions/NEEDLE_gameobject_data.js +2 -0
  53. package/lib/engine/extensions/NEEDLE_gameobject_data.js.map +1 -1
  54. package/lib/engine/extensions/NEEDLE_techniques_webgl.js +5 -0
  55. package/lib/engine/extensions/NEEDLE_techniques_webgl.js.map +1 -1
  56. package/lib/engine-components/Animation.d.ts +5 -0
  57. package/lib/engine-components/Animation.js +14 -0
  58. package/lib/engine-components/Animation.js.map +1 -1
  59. package/lib/engine-components/AnimatorController.d.ts +1 -0
  60. package/lib/engine-components/AnimatorController.js +14 -7
  61. package/lib/engine-components/AnimatorController.js.map +1 -1
  62. package/lib/engine-components/BoxHelperComponent.d.ts +2 -2
  63. package/lib/engine-components/BoxHelperComponent.js +28 -9
  64. package/lib/engine-components/BoxHelperComponent.js.map +1 -1
  65. package/lib/engine-components/Collider.d.ts +7 -2
  66. package/lib/engine-components/Collider.js +27 -15
  67. package/lib/engine-components/Collider.js.map +1 -1
  68. package/lib/engine-components/Component.d.ts +8 -16
  69. package/lib/engine-components/Component.js +18 -117
  70. package/lib/engine-components/Component.js.map +1 -1
  71. package/lib/engine-components/DragControls.js +9 -6
  72. package/lib/engine-components/DragControls.js.map +1 -1
  73. package/lib/engine-components/GroundProjection.d.ts +2 -0
  74. package/lib/engine-components/GroundProjection.js +18 -6
  75. package/lib/engine-components/GroundProjection.js.map +1 -1
  76. package/lib/engine-components/NavMesh.d.ts +0 -5
  77. package/lib/engine-components/NavMesh.js +100 -10
  78. package/lib/engine-components/NavMesh.js.map +1 -1
  79. package/lib/engine-components/NestedGltf.js +2 -0
  80. package/lib/engine-components/NestedGltf.js.map +1 -1
  81. package/lib/engine-components/ReflectionProbe.d.ts +22 -0
  82. package/lib/engine-components/ReflectionProbe.js +134 -0
  83. package/lib/engine-components/ReflectionProbe.js.map +1 -0
  84. package/lib/engine-components/Renderer.d.ts +13 -2
  85. package/lib/engine-components/Renderer.js +96 -45
  86. package/lib/engine-components/Renderer.js.map +1 -1
  87. package/lib/engine-components/RigidBody.d.ts +40 -25
  88. package/lib/engine-components/RigidBody.js +253 -142
  89. package/lib/engine-components/RigidBody.js.map +1 -1
  90. package/lib/engine-components/SpatialTrigger.js +1 -1
  91. package/lib/engine-components/SpatialTrigger.js.map +1 -1
  92. package/lib/engine-components/SpectatorCamera.d.ts +1 -0
  93. package/lib/engine-components/SpectatorCamera.js +9 -2
  94. package/lib/engine-components/SpectatorCamera.js.map +1 -1
  95. package/lib/engine-components/SpringJoint.d.ts +0 -13
  96. package/lib/engine-components/SpringJoint.js +42 -41
  97. package/lib/engine-components/SpringJoint.js.map +1 -1
  98. package/lib/engine-components/VideoPlayer.js.map +1 -1
  99. package/lib/engine-components/WebARSessionRoot.d.ts +7 -7
  100. package/lib/engine-components/WebARSessionRoot.js +7 -7
  101. package/lib/engine-components/WebARSessionRoot.js.map +1 -1
  102. package/lib/engine-components/WebXR.d.ts +10 -8
  103. package/lib/engine-components/WebXR.js +50 -26
  104. package/lib/engine-components/WebXR.js.map +1 -1
  105. package/lib/engine-components/WebXRAvatar.d.ts +4 -5
  106. package/lib/engine-components/WebXRAvatar.js +9 -8
  107. package/lib/engine-components/WebXRAvatar.js.map +1 -1
  108. package/lib/engine-components/WebXRController.d.ts +21 -21
  109. package/lib/engine-components/WebXRController.js +90 -68
  110. package/lib/engine-components/WebXRController.js.map +1 -1
  111. package/lib/engine-components/WebXRGrabRendering.d.ts +3 -3
  112. package/lib/engine-components/WebXRGrabRendering.js +2 -2
  113. package/lib/engine-components/WebXRGrabRendering.js.map +1 -1
  114. package/lib/engine-components/WebXRSync.d.ts +8 -8
  115. package/lib/engine-components/WebXRSync.js +15 -15
  116. package/lib/engine-components/WebXRSync.js.map +1 -1
  117. package/lib/engine-components/codegen/components.d.ts +2 -3
  118. package/lib/engine-components/codegen/components.js +2 -3
  119. package/lib/engine-components/codegen/components.js.map +1 -1
  120. package/lib/engine-components/ui/EventSystem.d.ts +1 -0
  121. package/lib/engine-components/ui/EventSystem.js +21 -1
  122. package/lib/engine-components/ui/EventSystem.js.map +1 -1
  123. package/package.json +3 -4
  124. package/src/engine/api.ts +2 -1
  125. package/src/engine/codegen/register_types.js +291 -6
  126. package/src/engine/debug/debug.ts +4 -0
  127. package/src/engine/debug/debug_overlay.ts +9 -2
  128. package/src/engine/engine_element_loading.ts +1 -1
  129. package/src/engine/engine_gameobject.ts +19 -6
  130. package/src/engine/engine_gltf_builtin_components.ts +5 -1
  131. package/src/engine/engine_mainloop_utils.ts +7 -3
  132. package/src/engine/engine_physics.ts +508 -469
  133. package/src/engine/engine_physics.types.ts +19 -0
  134. package/src/engine/engine_serialization_core.ts +22 -8
  135. package/src/engine/engine_setup.ts +6 -2
  136. package/src/engine/engine_time.ts +2 -0
  137. package/src/engine/engine_types.ts +82 -55
  138. package/src/engine/engine_typestore.ts +2 -0
  139. package/src/engine/engine_util_decorator.ts +69 -0
  140. package/src/engine/engine_utils.ts +6 -5
  141. package/src/engine/extensions/EXT_texture_exr.js +1 -1
  142. package/src/engine/extensions/NEEDLE_animator_controller_model.ts +2 -1
  143. package/src/engine/extensions/NEEDLE_gameobject_data.ts +2 -0
  144. package/src/engine/extensions/NEEDLE_techniques_webgl.ts +7 -0
  145. package/src/engine-components/Animation.ts +14 -1
  146. package/src/engine-components/AnimatorController.ts +19 -9
  147. package/src/engine-components/BoxHelperComponent.ts +30 -9
  148. package/src/engine-components/Collider.ts +29 -29
  149. package/src/engine-components/Component.ts +26 -135
  150. package/src/engine-components/DragControls.ts +9 -5
  151. package/src/engine-components/GroundProjection.ts +22 -7
  152. package/src/engine-components/NavMesh.ts +114 -115
  153. package/src/engine-components/NestedGltf.ts +2 -0
  154. package/src/engine-components/ReflectionProbe.ts +141 -0
  155. package/src/engine-components/Renderer.ts +796 -737
  156. package/src/engine-components/RigidBody.ts +258 -149
  157. package/src/engine-components/SpatialTrigger.ts +1 -1
  158. package/src/engine-components/SpectatorCamera.ts +10 -2
  159. package/src/engine-components/SpringJoint.ts +41 -41
  160. package/src/engine-components/VideoPlayer.ts +1 -2
  161. package/src/engine-components/WebARSessionRoot.ts +16 -16
  162. package/src/engine-components/WebXR.ts +65 -50
  163. package/src/engine-components/WebXRAvatar.ts +16 -16
  164. package/src/engine-components/WebXRController.ts +143 -112
  165. package/src/engine-components/WebXRGrabRendering.ts +6 -6
  166. package/src/engine-components/WebXRSync.ts +20 -20
  167. package/src/engine-components/codegen/components.ts +2 -3
  168. package/src/engine-components/ui/EventSystem.ts +26 -3
@@ -1,8 +1,8 @@
1
1
  import { Behaviour, GameObject } from "./Component";
2
2
  import { RoomEvents, OwnershipModel, NetworkConnection } from "../engine/engine_networking";
3
3
  import { WebXR, WebXREvent } from "./WebXR";
4
- import * as THREE from "three";
5
- import * as utils from "../engine/engine_utils";
4
+ import { Group, Quaternion, Vector3, Vector4, WebXRManager, XRFrame, XRInputSource, XRRigidTransform, XRSession } from "three";
5
+ import { getParam } from "../engine/engine_utils";
6
6
  import { Voip } from "./Voip";
7
7
  import { Builder, Long } from "flatbuffers";
8
8
  import { VrUserStateBuffer } from "../engine-schemes/vr-user-state-buffer";
@@ -17,9 +17,9 @@ import { WebXRAvatar } from "./WebXRAvatar";
17
17
  // import { InteractiveGroup } from 'three/examples/jsm/interactive/InteractiveGroup.js';
18
18
  // import { renderer, sceneData } from "../engine/engine_setup";
19
19
 
20
- const debugLogs = utils.getParam("debugxr");
21
- const debugAvatar = utils.getParam("debugavatar");
22
- // const debugAvatarVoip = utils.getParam("debugavatarvoip");
20
+ const debugLogs = getParam("debugxr");
21
+ const debugAvatar = getParam("debugavatar");
22
+ // const debugAvatarVoip = getParam("debugavatarvoip");
23
23
 
24
24
  enum WebXRSyncEvent {
25
25
  WebXR_UserJoined = "webxr-user-joined",
@@ -51,23 +51,23 @@ export class VRUserState {
51
51
  public guid: string;
52
52
  public time!: number;
53
53
  public avatarId!: string;
54
- public position: THREE.Vector3 = new THREE.Vector3();
55
- public rotation: THREE.Vector4 = new THREE.Vector4();
54
+ public position: Vector3 = new Vector3();
55
+ public rotation: Vector4 = new Vector4();
56
56
  public scale: number = 1;
57
57
 
58
- public posLeftHand = new THREE.Vector3();
59
- public posRightHand = new THREE.Vector3();
58
+ public posLeftHand = new Vector3();
59
+ public posRightHand = new Vector3();
60
60
 
61
- public rotLeftHand = new THREE.Quaternion();
62
- public rotRightHand = new THREE.Quaternion();
61
+ public rotLeftHand = new Quaternion();
62
+ public rotRightHand = new Quaternion();
63
63
 
64
64
  public constructor(guid: string) {
65
65
  this.guid = guid;
66
66
  }
67
67
 
68
- private static invertRotation: THREE.Quaternion = new THREE.Quaternion().setFromAxisAngle(new THREE.Vector3(0, 1, 0), Math.PI);
68
+ private static invertRotation: Quaternion = new Quaternion().setFromAxisAngle(new Vector3(0, 1, 0), Math.PI);
69
69
 
70
- public update(rig: THREE.Group, pos: DOMPointReadOnly, rot: DOMPointReadOnly, webXR: WebXR, avatarId: string) {
70
+ public update(rig: Group, pos: DOMPointReadOnly, rot: DOMPointReadOnly, webXR: WebXR, avatarId: string) {
71
71
  this.time = getTimeStampNow();
72
72
  this.avatarId = avatarId;
73
73
  this.position.set(pos.x, pos.y, pos.z);
@@ -117,8 +117,8 @@ export class VRUserState {
117
117
  }
118
118
  }
119
119
 
120
- private static quat0: THREE.Quaternion = new THREE.Quaternion();
121
- private static quat1: THREE.Quaternion = new THREE.Quaternion();
120
+ private static quat0: Quaternion = new Quaternion();
121
+ private static quat1: Quaternion = new Quaternion();
122
122
 
123
123
  public sendAsBuffer(builder: Builder, net: NetworkConnection) {
124
124
  builder.clear();
@@ -379,7 +379,7 @@ export class WebXRSync extends Behaviour {
379
379
  }
380
380
  }
381
381
 
382
- private onXRSessionStart(_evt: { session: THREE.XRSession }) {
382
+ private onXRSessionStart(_evt: { session: XRSession }) {
383
383
  console.log("XR session started");
384
384
  this.context.connection.send(WebXRSyncEvent.WebXR_UserJoined, { id: this.context.connection.connectionId, mode: XRMode.VR });
385
385
 
@@ -399,7 +399,7 @@ export class WebXRSync extends Behaviour {
399
399
  }
400
400
  }
401
401
 
402
- private onXRSessionEnded(_evt: { session: THREE.XRSession }) {
402
+ private onXRSessionEnded(_evt: { session: XRSession }) {
403
403
  console.log("XR session ended");
404
404
  this.context.connection.send(WebXRSyncEvent.WebXR_UserLeft, { id: this.context.connection.connectionId, mode: XRMode.VR });
405
405
  }
@@ -408,7 +408,7 @@ export class WebXRSync extends Behaviour {
408
408
  private xrState: VRUserState | null = null;
409
409
  private builder: Builder = new Builder(1024);
410
410
 
411
- private onXRSessionUpdate(evt: { rig: THREE.Group, frame: THREE.XRFrame, xr: THREE.WebXRManager, input: THREE.XRInputSource[] }) {
411
+ private onXRSessionUpdate(evt: { rig: Group, frame: XRFrame, xr: WebXRManager, input: XRInputSource[] }) {
412
412
 
413
413
  this.xrState ??= new VRUserState(this.context.connection.connectionId ?? this.k_LocalAvatarNoNetworkingGuid);
414
414
  this.ownership ??= new OwnershipModel(this.context.connection, this.context.connection.connectionId ?? this.k_LocalAvatarNoNetworkingGuid);
@@ -419,7 +419,7 @@ export class WebXRSync extends Behaviour {
419
419
  const { frame, xr, rig } = evt;
420
420
  const pose = frame.getViewerPose(xr.getReferenceSpace()!);
421
421
  if (!pose) return; // e.g. if user is not wearing headset
422
- const transform: THREE.XRRigidTransform = pose?.transform;
422
+ const transform: XRRigidTransform = pose?.transform;
423
423
  const pos = transform.position;
424
424
  const rot = transform.orientation;
425
425
  this.xrState.update(rig, pos, rot, this.webXR!, this.getAvatarId());
@@ -451,7 +451,7 @@ export class WebXRSync extends Behaviour {
451
451
  }
452
452
 
453
453
  private getAvatarId() {
454
- const urlAvatar = utils.getParam("avatar") as string;
454
+ const urlAvatar = getParam("avatar") as string;
455
455
  const avatarId = urlAvatar ?? null;
456
456
  return avatarId;
457
457
  }
@@ -16,6 +16,7 @@ export { Camera } from "../Camera";
16
16
  export { Collider } from "../Collider";
17
17
  export { SphereCollider } from "../Collider";
18
18
  export { BoxCollider } from "../Collider";
19
+ export { MeshCollider } from "../Collider";
19
20
  export { DeleteBox } from "../DeleteBox";
20
21
  export { Deletable } from "../DeleteBox";
21
22
  export { DeviceFlag } from "../DeviceFlag";
@@ -38,8 +39,6 @@ export { Light } from "../Light";
38
39
  export { LODModel } from "../LODGroup";
39
40
  export { LODGroup } from "../LODGroup";
40
41
  export { LookAtConstraint } from "../LookAtConstraint";
41
- export { NavMesh } from "../NavMesh";
42
- export { NavMeshAgent } from "../NavMesh";
43
42
  export { NestedGltf } from "../NestedGltf";
44
43
  export { Networking } from "../Networking";
45
44
  export { OffsetConstraint } from "../OffsetConstraint";
@@ -50,6 +49,7 @@ export { MainModule } from "../ParticleSystemModules";
50
49
  export { EmissionModule } from "../ParticleSystemModules";
51
50
  export { ShapeModule } from "../ParticleSystemModules";
52
51
  export { PlayerColor } from "../PlayerColor";
52
+ export { ReflectionProbe } from "../ReflectionProbe";
53
53
  export { FieldWithDefault } from "../Renderer";
54
54
  export { Renderer } from "../Renderer";
55
55
  export { MeshRenderer } from "../Renderer";
@@ -63,7 +63,6 @@ export { SmoothFollow } from "../SmoothFollow";
63
63
  export { SpatialTriggerReceiver } from "../SpatialTrigger";
64
64
  export { SpatialTrigger } from "../SpatialTrigger";
65
65
  export { SpectatorCamera } from "../SpectatorCamera";
66
- export { SpringJoint } from "../SpringJoint";
67
66
  export { Sprite } from "../SpriteRenderer";
68
67
  export { SpriteRenderer } from "../SpriteRenderer";
69
68
  export { SyncedCamera } from "../SyncedCamera";
@@ -5,7 +5,7 @@ import { ControllerEvents, WebXRController } from "../WebXRController";
5
5
  import * as ThreeMeshUI from 'three-mesh-ui'
6
6
  import { Context } from "../../engine/engine_setup";
7
7
  import { OrbitControls } from "../OrbitControls";
8
- import { PointerEventData } from "./PointerEvents";
8
+ import { IPointerEventHandler, PointerEventData } from "./PointerEvents";
9
9
  import { Raycaster } from "./Raycaster";
10
10
  import { InputEvents, KeyCode } from "../../engine/engine_input";
11
11
  import { Object3D } from "three";
@@ -83,6 +83,7 @@ export class EventSystem extends Behaviour {
83
83
 
84
84
  onEnable(): void {
85
85
 
86
+ const grabbed: Map<any, Object3D | null> = new Map();
86
87
  this._selectStartFn ??= (ctrl, args: { grab: THREE.Object3D | null }) => {
87
88
  if (!args.grab) return;
88
89
  MeshUIHelper.resetLastSelected();
@@ -92,6 +93,7 @@ export class EventSystem extends Behaviour {
92
93
  opts.isUp = ctrl.selectionUp;
93
94
  opts.isPressed = ctrl.selectionPressed;
94
95
  opts.isClicked = false;
96
+ grabbed.set(ctrl, args.grab);
95
97
  if (args.grab && !this.handleEvents(args.grab, opts)) {
96
98
  args.grab = null;
97
99
  };
@@ -105,6 +107,21 @@ export class EventSystem extends Behaviour {
105
107
  opts.isPressed = ctrl.selectionPressed;
106
108
  opts.isClicked = ctrl.selectionClick;
107
109
  this.handleEvents(args.grab, opts);
110
+
111
+ const prevGrabbed = grabbed.get(ctrl);
112
+ grabbed.set(ctrl, null);
113
+ if (prevGrabbed) {
114
+ for (let i = 0; i < this.raisedPointerDownEvents.length; i++) {
115
+ const comp = this.raisedPointerDownEvents[i];
116
+ const obj = this.raisedPointerDownObjects[i];
117
+ if (obj === prevGrabbed && comp) {
118
+ comp.onPointerUp?.call(comp, opts);
119
+ this.raisedPointerDownEvents.splice(i, 1);
120
+ this.raisedPointerDownObjects.splice(i, 1);
121
+ i--;
122
+ }
123
+ }
124
+ }
108
125
  };
109
126
 
110
127
  const controllerRcOpts = new RaycastOptions();
@@ -143,8 +160,11 @@ export class EventSystem extends Behaviour {
143
160
  private lastPointerEvent: PointerEventData | null = null;
144
161
  private objectsHoveredThisFrame: THREE.Object3D[] = [];
145
162
  private objectsHoveredLastFrame: THREE.Object3D[] = [];
163
+
146
164
  // todo: these should be listed by input source (e.g. per controller, mouse, touch)
147
- private raisedPointerDownEvents: any[] = [];
165
+ private raisedPointerDownEvents: IPointerEventHandler[] = []; // << keep in sync
166
+ private raisedPointerDownObjects: THREE.Object3D[] = []; // < keep in sync
167
+
148
168
  private _didMove: boolean = false;
149
169
 
150
170
  onBeforeUpdate() {
@@ -216,6 +236,7 @@ export class EventSystem extends Behaviour {
216
236
  }
217
237
  }
218
238
  this.raisedPointerDownEvents.length = 0;
239
+ this.raisedPointerDownObjects.length = 0;
219
240
  }
220
241
 
221
242
  for (const obj of this.objectsHoveredLastFrame) {
@@ -310,6 +331,7 @@ export class EventSystem extends Behaviour {
310
331
  return false;
311
332
  }
312
333
 
334
+ const originalObject = object;
313
335
  args.object = object;
314
336
  this.lastPointerEvent = args;
315
337
 
@@ -326,7 +348,7 @@ export class EventSystem extends Behaviour {
326
348
  const actualGo = parent[$shadowDomOwner].gameObject;
327
349
  if (actualGo) {
328
350
  const res = UIRaycastUtils.isInteractable(actualGo, this.out);
329
- if(!res) return this.out.canvasGroup?.interactable ?? false;
351
+ if (!res) return this.out.canvasGroup?.interactable ?? false;
330
352
  canvasGroup = this.out.canvasGroup ?? null;
331
353
 
332
354
  const handled = this.handleMeshUIIntersection(object, pressedOrClicked);
@@ -371,6 +393,7 @@ export class EventSystem extends Behaviour {
371
393
  comp.onPointerDown(args);
372
394
  // need to save this to also send pointer up event
373
395
  this.raisedPointerDownEvents.push(comp);
396
+ this.raisedPointerDownObjects.push(originalObject);
374
397
  }
375
398
  }
376
399