@needle-tools/engine 2.34.0-pre → 2.35.1-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 (245) hide show
  1. package/CHANGELOG.md +16 -0
  2. package/dist/needle-engine.d.ts +3128 -2942
  3. package/dist/needle-engine.js +455 -455
  4. package/dist/needle-engine.js.map +4 -4
  5. package/dist/needle-engine.min.js +54 -54
  6. package/dist/needle-engine.min.js.map +4 -4
  7. package/lib/engine/api.d.ts +3 -0
  8. package/lib/engine/api.js +4 -0
  9. package/lib/engine/api.js.map +1 -0
  10. package/lib/engine/engine.d.ts +4 -3
  11. package/lib/engine/engine_addressables.d.ts +5 -4
  12. package/lib/engine/engine_addressables.js +8 -7
  13. package/lib/engine/engine_addressables.js.map +1 -1
  14. package/lib/engine/engine_components.d.ts +17 -0
  15. package/lib/engine/engine_components.js +240 -0
  16. package/lib/engine/engine_components.js.map +1 -0
  17. package/lib/engine/engine_element.js +4 -3
  18. package/lib/engine/engine_element.js.map +1 -1
  19. package/lib/engine/engine_element_loading.js +4 -1
  20. package/lib/engine/engine_element_loading.js.map +1 -1
  21. package/lib/engine/engine_gameobject.d.ts +33 -0
  22. package/lib/engine/engine_gameobject.js +449 -0
  23. package/lib/engine/engine_gameobject.js.map +1 -0
  24. package/lib/engine/engine_gltf.d.ts +13 -2
  25. package/lib/engine/engine_gltf.js +7 -1
  26. package/lib/engine/engine_gltf.js.map +1 -1
  27. package/lib/engine/engine_gltf_builtin_components.d.ts +3 -3
  28. package/lib/engine/engine_gltf_builtin_components.js +2 -3
  29. package/lib/engine/engine_gltf_builtin_components.js.map +1 -1
  30. package/lib/engine/engine_lightdata.d.ts +1 -1
  31. package/lib/engine/engine_lightdata.js.map +1 -1
  32. package/lib/engine/engine_mainloop_utils.d.ts +2 -2
  33. package/lib/engine/engine_mainloop_utils.js +7 -6
  34. package/lib/engine/engine_mainloop_utils.js.map +1 -1
  35. package/lib/engine/engine_networking.d.ts +6 -10
  36. package/lib/engine/engine_networking.js +7 -11
  37. package/lib/engine/engine_networking.js.map +1 -1
  38. package/lib/engine/engine_networking_files.d.ts +1 -1
  39. package/lib/engine/engine_networking_files.js +8 -7
  40. package/lib/engine/engine_networking_files.js.map +1 -1
  41. package/lib/engine/engine_networking_files_default_components.d.ts +2 -2
  42. package/lib/engine/engine_networking_files_default_components.js +38 -43
  43. package/lib/engine/engine_networking_files_default_components.js.map +1 -1
  44. package/lib/engine/engine_networking_instantiate.d.ts +8 -6
  45. package/lib/engine/engine_networking_instantiate.js +12 -9
  46. package/lib/engine/engine_networking_instantiate.js.map +1 -1
  47. package/lib/engine/engine_networking_types.d.ts +14 -0
  48. package/lib/engine/engine_networking_types.js +8 -0
  49. package/lib/engine/engine_networking_types.js.map +1 -0
  50. package/lib/engine/engine_physics.d.ts +5 -24
  51. package/lib/engine/engine_physics.js +27 -61
  52. package/lib/engine/engine_physics.js.map +1 -1
  53. package/lib/engine/engine_rendererdata.d.ts +1 -1
  54. package/lib/engine/engine_rendererdata.js.map +1 -1
  55. package/lib/engine/engine_scenetools.d.ts +2 -2
  56. package/lib/engine/engine_scenetools.js +22 -5
  57. package/lib/engine/engine_scenetools.js.map +1 -1
  58. package/lib/engine/engine_serialization_builtin_serializer.d.ts +1 -1
  59. package/lib/engine/engine_serialization_core.d.ts +1 -1
  60. package/lib/engine/engine_serialization_decorator.d.ts +1 -1
  61. package/lib/engine/engine_setup.d.ts +14 -15
  62. package/lib/engine/engine_setup.js +34 -23
  63. package/lib/engine/engine_setup.js.map +1 -1
  64. package/lib/engine/engine_three_utils.js +0 -6
  65. package/lib/engine/engine_three_utils.js.map +1 -1
  66. package/lib/engine/engine_types.d.ts +108 -0
  67. package/lib/engine/engine_types.js +50 -0
  68. package/lib/engine/engine_types.js.map +1 -0
  69. package/lib/engine/engine_utils.d.ts +1 -1
  70. package/lib/engine/engine_utils.js.map +1 -1
  71. package/lib/engine/extensions/NEEDLE_components.js +2 -2
  72. package/lib/engine/extensions/NEEDLE_components.js.map +1 -1
  73. package/lib/engine/extensions/NEEDLE_deferred_texture.d.ts +1 -1
  74. package/lib/engine/extensions/NEEDLE_lighting_settings.d.ts +1 -1
  75. package/lib/engine/extensions/NEEDLE_lightmaps.d.ts +1 -1
  76. package/lib/engine/extensions/NEEDLE_render_objects.d.ts +2 -2
  77. package/lib/engine/extensions/NEEDLE_techniques_webgl.d.ts +1 -1
  78. package/lib/engine/extensions/NEEDLE_techniques_webgl.js +3 -2
  79. package/lib/engine/extensions/NEEDLE_techniques_webgl.js.map +1 -1
  80. package/lib/engine/extensions/extensions.d.ts +1 -1
  81. package/lib/engine-components/Animator.js.map +1 -1
  82. package/lib/engine-components/AvatarLoader.js +6 -5
  83. package/lib/engine-components/AvatarLoader.js.map +1 -1
  84. package/lib/engine-components/Camera.d.ts +2 -2
  85. package/lib/engine-components/Camera.js +6 -12
  86. package/lib/engine-components/Camera.js.map +1 -1
  87. package/lib/engine-components/CameraUtils.d.ts +3 -0
  88. package/lib/engine-components/CameraUtils.js +15 -0
  89. package/lib/engine-components/CameraUtils.js.map +1 -0
  90. package/lib/engine-components/Collider.d.ts +3 -1
  91. package/lib/engine-components/Collider.js +11 -0
  92. package/lib/engine-components/Collider.js.map +1 -1
  93. package/lib/engine-components/Component.d.ts +21 -55
  94. package/lib/engine-components/Component.js +67 -466
  95. package/lib/engine-components/Component.js.map +1 -1
  96. package/lib/engine-components/Duplicatable.js +2 -1
  97. package/lib/engine-components/Duplicatable.js.map +1 -1
  98. package/lib/engine-components/LODGroup.js.map +1 -1
  99. package/lib/engine-components/Light.d.ts +2 -1
  100. package/lib/engine-components/Light.js +2 -2
  101. package/lib/engine-components/Light.js.map +1 -1
  102. package/lib/engine-components/NestedGltf.js +2 -1
  103. package/lib/engine-components/NestedGltf.js.map +1 -1
  104. package/lib/engine-components/Networking.d.ts +3 -1
  105. package/lib/engine-components/Networking.js +3 -0
  106. package/lib/engine-components/Networking.js.map +1 -1
  107. package/lib/engine-components/OrbitControls.js +4 -2
  108. package/lib/engine-components/OrbitControls.js.map +1 -1
  109. package/lib/engine-components/Renderer.d.ts +3 -2
  110. package/lib/engine-components/Renderer.js +2 -0
  111. package/lib/engine-components/Renderer.js.map +1 -1
  112. package/lib/engine-components/{Rigidbody.d.ts → RigidBody.d.ts} +2 -1
  113. package/lib/engine-components/{Rigidbody.js → RigidBody.js} +1 -1
  114. package/lib/engine-components/{Rigidbody.js.map → RigidBody.js.map} +1 -1
  115. package/lib/engine-components/ScreenCapture.js.map +1 -1
  116. package/lib/engine-components/SpectatorCamera.js.map +1 -1
  117. package/lib/engine-components/SyncedCamera.js +2 -1
  118. package/lib/engine-components/SyncedCamera.js.map +1 -1
  119. package/lib/engine-components/SyncedTransform.js.map +1 -1
  120. package/lib/engine-components/TestRunner.js.map +1 -1
  121. package/lib/engine-components/Voip.js +2 -1
  122. package/lib/engine-components/Voip.js.map +1 -1
  123. package/lib/engine-components/WebXR.js.map +1 -1
  124. package/lib/engine-components/WebXRController.js +28 -8
  125. package/lib/engine-components/WebXRController.js.map +1 -1
  126. package/lib/engine-components/WebXRGrabRendering.d.ts +1 -1
  127. package/lib/engine-components/WebXRGrabRendering.js +1 -1
  128. package/lib/engine-components/WebXRGrabRendering.js.map +1 -1
  129. package/lib/engine-components/WebXRSync.js +1 -1
  130. package/lib/engine-components/WebXRSync.js.map +1 -1
  131. package/lib/engine-components/avatar/Avatar_Brain_LookAt.js.map +1 -1
  132. package/lib/engine-components/codegen/components.d.ts +1 -1
  133. package/lib/engine-components/codegen/components.js +1 -1
  134. package/lib/engine-components/codegen/components.js.map +1 -1
  135. package/lib/engine-components/js-extensions/ExtensionUtils.d.ts +4 -0
  136. package/lib/engine-components/js-extensions/ExtensionUtils.js +56 -0
  137. package/lib/engine-components/js-extensions/ExtensionUtils.js.map +1 -0
  138. package/lib/engine-components/js-extensions/Object3D.js +27 -50
  139. package/lib/engine-components/js-extensions/Object3D.js.map +1 -1
  140. package/lib/engine-components/js-extensions/Vector.d.ts +2 -0
  141. package/lib/engine-components/js-extensions/Vector.js +16 -0
  142. package/lib/engine-components/js-extensions/Vector.js.map +1 -0
  143. package/lib/engine-components/timeline/PlayableDirector.d.ts +2 -1
  144. package/lib/engine-components/timeline/PlayableDirector.js.map +1 -1
  145. package/lib/engine-components/ui/BaseUIComponent.d.ts +1 -0
  146. package/lib/engine-components/ui/BaseUIComponent.js +11 -5
  147. package/lib/engine-components/ui/BaseUIComponent.js.map +1 -1
  148. package/lib/engine-components/ui/Canvas.d.ts +3 -0
  149. package/lib/engine-components/ui/Canvas.js +12 -1
  150. package/lib/engine-components/ui/Canvas.js.map +1 -1
  151. package/lib/engine-components/ui/CanvasScaler.d.ts +0 -0
  152. package/lib/engine-components/ui/CanvasScaler.js +17 -0
  153. package/lib/engine-components/ui/CanvasScaler.js.map +1 -0
  154. package/lib/engine-components/ui/EventSystem.d.ts +1 -1
  155. package/lib/engine-components/ui/EventSystem.js +11 -31
  156. package/lib/engine-components/ui/EventSystem.js.map +1 -1
  157. package/lib/engine-components/ui/Graphic.js +2 -1
  158. package/lib/engine-components/ui/Graphic.js.map +1 -1
  159. package/lib/engine-components/ui/Keyboard.js +2 -1
  160. package/lib/engine-components/ui/Keyboard.js.map +1 -1
  161. package/lib/engine-components/ui/RaycastUtils.d.ts +11 -0
  162. package/lib/engine-components/ui/RaycastUtils.js +62 -0
  163. package/lib/engine-components/ui/RaycastUtils.js.map +1 -0
  164. package/lib/engine-components/ui/Raycaster.js.map +1 -1
  165. package/lib/engine-components/ui/Text.js +8 -3
  166. package/lib/engine-components/ui/Text.js.map +1 -1
  167. package/lib/engine-components/ui/Utils.js +3 -2
  168. package/lib/engine-components/ui/Utils.js.map +1 -1
  169. package/lib/needle-engine.d.ts +3 -1
  170. package/lib/needle-engine.js +4 -2
  171. package/lib/needle-engine.js.map +1 -1
  172. package/package.json +12 -1
  173. package/src/engine/api.ts +3 -0
  174. package/src/engine/codegen/register_types.js +2 -2
  175. package/src/engine/engine_addressables.ts +12 -10
  176. package/src/engine/{engine_components.js → engine_components.ts} +66 -61
  177. package/src/engine/engine_element.ts +4 -3
  178. package/src/engine/engine_element_loading.ts +5 -1
  179. package/src/engine/engine_gameobject.ts +506 -0
  180. package/src/engine/engine_gltf.ts +21 -2
  181. package/src/engine/engine_gltf_builtin_components.ts +8 -7
  182. package/src/engine/engine_lightdata.ts +1 -1
  183. package/src/engine/engine_mainloop_utils.ts +13 -11
  184. package/src/engine/engine_networking.ts +14 -17
  185. package/src/engine/engine_networking_files.ts +14 -11
  186. package/src/engine/engine_networking_files_default_components.ts +53 -52
  187. package/src/engine/engine_networking_instantiate.ts +24 -14
  188. package/src/engine/engine_networking_types.ts +19 -0
  189. package/src/engine/engine_physics.ts +45 -77
  190. package/src/engine/engine_rendererdata.ts +1 -1
  191. package/src/engine/engine_scenetools.ts +30 -6
  192. package/src/engine/engine_serialization_core.ts +1 -1
  193. package/src/engine/engine_serialization_decorator.ts +1 -1
  194. package/src/engine/engine_setup.ts +51 -37
  195. package/src/engine/engine_three_utils.ts +0 -8
  196. package/src/engine/engine_types.ts +188 -0
  197. package/src/engine/engine_utils.ts +1 -3
  198. package/src/engine/extensions/NEEDLE_components.ts +2 -2
  199. package/src/engine/extensions/NEEDLE_deferred_texture.ts +1 -1
  200. package/src/engine/extensions/NEEDLE_lighting_settings.ts +1 -1
  201. package/src/engine/extensions/NEEDLE_lightmaps.ts +1 -1
  202. package/src/engine/extensions/NEEDLE_render_objects.ts +4 -4
  203. package/src/engine/extensions/NEEDLE_techniques_webgl.ts +5 -4
  204. package/src/engine/extensions/extensions.ts +1 -1
  205. package/src/engine-components/Animator.ts +3 -3
  206. package/src/engine-components/AvatarLoader.ts +6 -5
  207. package/src/engine-components/Camera.ts +10 -13
  208. package/src/engine-components/CameraUtils.ts +15 -0
  209. package/src/engine-components/Collider.ts +17 -2
  210. package/src/engine-components/Component.ts +87 -541
  211. package/src/engine-components/Duplicatable.ts +4 -3
  212. package/src/engine-components/LODGroup.ts +1 -1
  213. package/src/engine-components/Light.ts +3 -2
  214. package/src/engine-components/NestedGltf.ts +2 -1
  215. package/src/engine-components/Networking.ts +6 -1
  216. package/src/engine-components/OrbitControls.ts +5 -5
  217. package/src/engine-components/Renderer.ts +5 -1
  218. package/src/engine-components/RigidBody.ts +2 -1
  219. package/src/engine-components/ScreenCapture.ts +1 -1
  220. package/src/engine-components/SpectatorCamera.ts +7 -5
  221. package/src/engine-components/SyncedCamera.ts +2 -1
  222. package/src/engine-components/SyncedTransform.ts +1 -1
  223. package/src/engine-components/TestRunner.ts +1 -2
  224. package/src/engine-components/Voip.ts +2 -1
  225. package/src/engine-components/WebXR.ts +2 -2
  226. package/src/engine-components/WebXRController.ts +30 -10
  227. package/src/engine-components/WebXRGrabRendering.ts +1 -1
  228. package/src/engine-components/WebXRSync.ts +1 -1
  229. package/src/engine-components/avatar/Avatar_Brain_LookAt.ts +2 -1
  230. package/src/engine-components/codegen/components.ts +1 -1
  231. package/src/engine-components/js-extensions/ExtensionUtils.ts +66 -0
  232. package/src/engine-components/js-extensions/Object3D.ts +37 -61
  233. package/src/engine-components/js-extensions/Vector.ts +17 -0
  234. package/src/engine-components/timeline/PlayableDirector.ts +2 -1
  235. package/src/engine-components/ui/BaseUIComponent.ts +17 -6
  236. package/src/engine-components/ui/Canvas.ts +14 -2
  237. package/src/engine-components/ui/CanvasScaler.ts +21 -0
  238. package/src/engine-components/ui/EventSystem.ts +11 -25
  239. package/src/engine-components/ui/Graphic.ts +2 -1
  240. package/src/engine-components/ui/Keyboard.ts +2 -1
  241. package/src/engine-components/ui/RaycastUtils.ts +64 -0
  242. package/src/engine-components/ui/Raycaster.ts +2 -0
  243. package/src/engine-components/ui/Text.ts +8 -4
  244. package/src/engine-components/ui/Utils.ts +3 -2
  245. package/src/needle-engine.ts +7 -2
@@ -1,14 +1,12 @@
1
1
  import * as THREE from "three";
2
- import * as object from "../engine/engine_components";
3
2
  import { Mathf } from "../engine/engine_math";
4
3
  import * as threeutils from "../engine/engine_three_utils";
5
- import * as utils from "../engine/engine_utils";
6
4
  import { activeInHierarchyFieldName } from "../engine/engine_constants";
7
5
  import { Context, FrameEvent } from "../engine/engine_setup";
8
6
  import * as main from "../engine/engine_mainloop_utils";
9
- import { InstantiateIdProvider, syncDestroy, syncInstantiate } from "../engine/engine_networking_instantiate";
10
- import * as Object3DExtensions from "./js-extensions/Object3D";
11
- import { InstancingUtil } from "../engine/engine_instancing";
7
+ import { syncDestroy, syncInstantiate } from "../engine/engine_networking_instantiate";
8
+ import { addNewComponentInstance, destroyComponentInstance, findObjectOfType, findObjectsOfType, getComponent, getComponentInChildren, getComponentInParent, getComponents, getComponentsInChildren, getComponentsInParent, getOrAddComponent, moveComponentInstance, removeComponent } from "../engine/engine_components";
9
+ import { findByGuid, destroy, instantiate, foreachComponent, markAsInstancedRendered, isActiveInHierarchy, isActiveSelf, isUsingInstancing } from "../engine/engine_gameobject";
12
10
  // export interface ISerializationCallbackReceiver {
13
11
  // onBeforeSerialize?(): object | void;
14
12
  // onAfterSerialize?();
@@ -16,31 +14,6 @@ import { InstancingUtil } from "../engine/engine_instancing";
16
14
  // onAfterDeserialize?();
17
15
  // onDeserialize?(key: string, value: any): any | void;
18
16
  // }
19
- const debug = utils.getParam("debugcomponents");
20
- export var HideFlags;
21
- (function (HideFlags) {
22
- HideFlags[HideFlags["None"] = 0] = "None";
23
- HideFlags[HideFlags["HideInHierarchy"] = 1] = "HideInHierarchy";
24
- HideFlags[HideFlags["HideInInspector"] = 2] = "HideInInspector";
25
- HideFlags[HideFlags["DontSaveInEditor"] = 4] = "DontSaveInEditor";
26
- HideFlags[HideFlags["NotEditable"] = 8] = "NotEditable";
27
- HideFlags[HideFlags["DontSaveInBuild"] = 16] = "DontSaveInBuild";
28
- HideFlags[HideFlags["DontUnloadUnusedAsset"] = 32] = "DontUnloadUnusedAsset";
29
- HideFlags[HideFlags["DontSave"] = 52] = "DontSave";
30
- HideFlags[HideFlags["HideAndDontSave"] = 61] = "HideAndDontSave";
31
- })(HideFlags || (HideFlags = {}));
32
- export class InstantiateOptions {
33
- idProvider;
34
- //** parent guid */
35
- parent;
36
- /** for duplicatable parenting */
37
- keepWorldPosition;
38
- position;
39
- rotation;
40
- scale;
41
- visible;
42
- context;
43
- }
44
17
  class GameObject extends THREE.Object3D {
45
18
  guid;
46
19
  static setActive(go, active, processStart = true) {
@@ -52,38 +25,17 @@ class GameObject extends THREE.Object3D {
52
25
  main.processStart(Context.Current, go);
53
26
  }
54
27
  static isActiveSelf(go) {
55
- return go.visible || GameObject.isUsingInstancing(go);
28
+ return isActiveSelf(go);
56
29
  }
57
30
  static isActiveInHierarchy(go) {
58
- return go[activeInHierarchyFieldName] || GameObject.isUsingInstancing(go);
31
+ return isActiveInHierarchy(go);
59
32
  }
60
33
  static markAsInstancedRendered(go, instanced) {
61
- go["__isUsingInstancing"] = instanced;
34
+ markAsInstancedRendered(go, instanced);
62
35
  }
63
- static isUsingInstancing(instance) { return InstancingUtil.isUsingInstancing(instance); }
36
+ static isUsingInstancing(instance) { return isUsingInstancing(instance); }
64
37
  static foreachComponent(instance, cb, recursive = true) {
65
- if (!instance)
66
- return;
67
- if (instance.userData.components) {
68
- for (let i = 0; i < instance.userData.components.length; i++) {
69
- const comp = instance.userData.components[i];
70
- if (comp instanceof Behaviour) {
71
- const res = cb(comp);
72
- if (res !== undefined)
73
- return res;
74
- }
75
- }
76
- }
77
- if (recursive && instance.children) {
78
- for (let i = 0; i < instance.children.length; i++) {
79
- const child = instance.children[i];
80
- if (!child)
81
- continue;
82
- const res = GameObject.foreachComponent(child, cb, recursive);
83
- if (res !== undefined)
84
- return res;
85
- }
86
- }
38
+ return foreachComponent(instance, cb, recursive);
87
39
  }
88
40
  static instantiateSynced(instance, opts) {
89
41
  if (!instance)
@@ -91,336 +43,7 @@ class GameObject extends THREE.Object3D {
91
43
  return syncInstantiate(instance, opts);
92
44
  }
93
45
  static instantiate(instance, opts = null) {
94
- if (instance === null)
95
- return null;
96
- let options = null;
97
- if (opts !== null) {
98
- // if x is defined assume this is a vec3 - this is just to not break everything at once and stay a little bit backwards compatible
99
- if (opts["x"] !== undefined) {
100
- options = new InstantiateOptions();
101
- options.position = opts;
102
- }
103
- else {
104
- // if (opts instanceof InstantiateOptions)
105
- options = opts;
106
- // else {
107
- // options = new InstantiateOptions();
108
- // Object.assign(options, opts);
109
- // }
110
- }
111
- }
112
- let context = Context.Current;
113
- if (options?.context)
114
- context = options.context;
115
- if (debug && context.alias)
116
- console.log("context", context.alias);
117
- // we need to create the id provider before calling internal instantiate because cloned gameobjects also create new guids
118
- if (options && !options.idProvider) {
119
- options.idProvider = new InstantiateIdProvider(Date.now());
120
- }
121
- const components = [];
122
- const goMapping = {}; // used to resolve references on components to components on other gameobjects to their new counterpart
123
- const skinnedMeshes = {};
124
- const clone = this.internalInstantiate(context, instance, options, components, goMapping, skinnedMeshes);
125
- if (clone) {
126
- this.resolveReferences(goMapping);
127
- this.resolveAndBindSkinnedMeshBones(skinnedMeshes, goMapping);
128
- }
129
- if (debug) {
130
- threeutils.logHierarchy(instance, true);
131
- threeutils.logHierarchy(clone, true);
132
- }
133
- const guidsMap = {};
134
- for (const i in components) {
135
- const copy = components[i];
136
- const oldGuid = copy.guid;
137
- if (options && options.idProvider) {
138
- copy.guid = options.idProvider.generateUUID();
139
- guidsMap[oldGuid] = copy.guid;
140
- if (debug)
141
- console.log(copy.name, copy.guid);
142
- }
143
- object.registerComponent(copy, context);
144
- if (copy.__internalNewInstanceCreated)
145
- copy.__internalNewInstanceCreated();
146
- }
147
- for (const i in components) {
148
- const copy = components[i];
149
- if (copy.resolveGuids)
150
- copy.resolveGuids(guidsMap);
151
- if (copy.enabled === false)
152
- continue;
153
- else
154
- copy.enabled = true;
155
- }
156
- main.processNewScripts(context);
157
- return clone;
158
- }
159
- static internalInstantiate(context, instance, opts, componentsList, newGameObjectsMap, skinnedMeshesMap) {
160
- if (!instance)
161
- return null;
162
- // prepare, remove things that dont work out of the box
163
- // e.g. user data we want to manually clone
164
- // also children throw errors (e.g. recursive toJson with nested meshes)
165
- const userData = instance.userData;
166
- instance.userData = {};
167
- const children = instance.children;
168
- instance.children = [];
169
- let clone;
170
- clone = instance.clone(false);
171
- Object3DExtensions.apply(clone);
172
- instance.userData = userData;
173
- instance.children = children;
174
- // make reference from old id to new object
175
- newGameObjectsMap[instance.uuid] = { original: instance, clone: clone };
176
- if (instance.type === "SkinnedMesh") {
177
- skinnedMeshesMap[instance.uuid] = { original: instance, clone: clone };
178
- }
179
- // DO NOT EVER RENAME BECAUSE IT BREAKS / MIGHT BREAK ANIMATIONS
180
- // clone.name += " (Clone)";
181
- if (opts?.visible !== undefined)
182
- clone.visible = opts.visible;
183
- if (opts?.idProvider) {
184
- clone.uuid = opts.idProvider.generateUUID();
185
- const cloneGo = clone;
186
- if (cloneGo)
187
- cloneGo.guid = clone.uuid;
188
- }
189
- if (instance.animations && instance.animations.length > 0) {
190
- clone.animations = [...instance.animations];
191
- }
192
- const parent = instance.parent;
193
- if (parent) {
194
- parent.add(clone);
195
- }
196
- // apply transform
197
- if (opts?.position) {
198
- threeutils.setWorldPosition(clone, opts.position);
199
- }
200
- else
201
- clone.position.copy(instance.position);
202
- if (opts?.rotation) {
203
- threeutils.setWorldQuaternion(clone, opts.rotation);
204
- // clone.quaternion.copy(opts.rotation);
205
- }
206
- else
207
- clone.quaternion.copy(instance.quaternion);
208
- if (opts?.scale) {
209
- // TODO: make set world scale work
210
- clone.scale.copy(opts.scale);
211
- }
212
- else
213
- clone.scale.copy(instance.scale);
214
- if (opts?.parent && opts.parent !== "scene") {
215
- let requestedParent = null;
216
- if (typeof opts.parent === "string") {
217
- requestedParent = utils.tryFindObject(opts.parent, context.scene, true);
218
- }
219
- else {
220
- requestedParent = opts.parent;
221
- }
222
- if (requestedParent) {
223
- const func = opts.keepWorldPosition === true ? requestedParent.attach : requestedParent.add;
224
- if (!func)
225
- console.error("Invalid parent object", requestedParent, "received when instantiating:", instance);
226
- else
227
- func.call(requestedParent, clone);
228
- }
229
- else
230
- console.warn("could not find parent:", opts.parent);
231
- }
232
- for (const [key, value] of Object.entries(instance.userData)) {
233
- if (key === "components")
234
- continue;
235
- clone.userData[key] = value;
236
- }
237
- if (instance.userData?.components) {
238
- const components = instance.userData.components;
239
- const newComponents = [];
240
- clone.userData.components = newComponents;
241
- for (let i = 0; i < components.length; i++) {
242
- const comp = components[i];
243
- const copy = Object.create(comp);
244
- Object.assign(copy, comp);
245
- newComponents.push(copy);
246
- copy.gameObject = clone;
247
- // copy.transform = clone;
248
- componentsList.push(copy);
249
- }
250
- }
251
- // children should just clone the original transform
252
- if (opts) {
253
- opts.position = undefined;
254
- opts.rotation = undefined;
255
- opts.scale = undefined;
256
- opts.parent = undefined;
257
- }
258
- for (const ch in instance.children) {
259
- const child = instance.children[ch];
260
- const newChild = GameObject.internalInstantiate(context, child, opts, componentsList, newGameObjectsMap, skinnedMeshesMap);
261
- if (newChild)
262
- clone.add(newChild);
263
- }
264
- return clone;
265
- }
266
- static resolveAndBindSkinnedMeshBones(skinnedMeshes, newObjectsMap) {
267
- for (const key in skinnedMeshes) {
268
- const val = skinnedMeshes[key];
269
- const original = val.original;
270
- const originalSkeleton = original.skeleton;
271
- const clone = val.clone;
272
- // clone.updateWorldMatrix(true, true);
273
- if (!originalSkeleton) {
274
- console.warn("Skinned mesh has no skeleton?", val);
275
- continue;
276
- }
277
- const originalBones = originalSkeleton.bones;
278
- const clonedSkeleton = clone.skeleton.clone();
279
- clone.skeleton = clonedSkeleton;
280
- clone.bindMatrix.clone().copy(original.bindMatrix);
281
- // console.log(clone.bindMatrix)
282
- clone.bindMatrixInverse.copy(original.bindMatrixInverse);
283
- // clone.bindMatrix.multiplyScalar(.025);
284
- // console.assert(originalSkeleton.uuid !== clonedSkeleton.uuid);
285
- // console.assert(originalBones.length === clonedSkeleton.bones.length);
286
- const bones = [];
287
- clonedSkeleton.bones = bones;
288
- for (let i = 0; i < originalBones.length; i++) {
289
- const bone = originalBones[i];
290
- const newBoneInfo = newObjectsMap[bone.uuid];
291
- const clonedBone = newBoneInfo.clone;
292
- // console.log("NEW BONE: ", clonedBone, "BEFORE", newBoneInfo.original);
293
- bones.push(clonedBone);
294
- }
295
- // clone.skeleton = new THREE.Skeleton(bones);
296
- // clone.skeleton.update();
297
- // clone.pose();
298
- // clone.scale.set(1,1,1);
299
- // clone.position.y += .1;
300
- // console.log("ORIG", original, "CLONE", clone);
301
- }
302
- for (const key in skinnedMeshes) {
303
- const clone = skinnedMeshes[key].clone;
304
- clone.skeleton.update();
305
- // clone.skeleton.calculateInverses();
306
- clone.bind(clone.skeleton, clone.bindMatrix);
307
- clone.updateMatrixWorld(true);
308
- // clone.pose();
309
- }
310
- }
311
- // private static bindNewSkinnedMeshBones(source, clone) {
312
- // const sourceLookup = new Map();
313
- // const cloneLookup = new Map();
314
- // // const clone = source.clone(false);
315
- // function parallelTraverse(a, b, callback) {
316
- // callback(a, b);
317
- // for (let i = 0; i < a.children.length; i++) {
318
- // parallelTraverse(a.children[i], b.children[i], callback);
319
- // }
320
- // }
321
- // parallelTraverse(source, clone, function (sourceNode, clonedNode) {
322
- // sourceLookup.set(clonedNode, sourceNode);
323
- // cloneLookup.set(sourceNode, clonedNode);
324
- // });
325
- // clone.traverse(function (node) {
326
- // if (!node.isSkinnedMesh) return;
327
- // const clonedMesh = node;
328
- // const sourceMesh = sourceLookup.get(node);
329
- // const sourceBones = sourceMesh.skeleton.bones;
330
- // clonedMesh.skeleton = sourceMesh.skeleton.clone();
331
- // clonedMesh.bindMatrix.copy(sourceMesh.bindMatrix);
332
- // clonedMesh.skeleton.bones = sourceBones.map(function (bone) {
333
- // return cloneLookup.get(bone);
334
- // });
335
- // clonedMesh.bind(clonedMesh.skeleton, clonedMesh.bindMatrix);
336
- // });
337
- // return clone;
338
- // }
339
- static resolveReferences(newObjectsMap) {
340
- // for every object that is newly created we want to update references to their newly created counterparts
341
- // e.g. a collider instance referencing a rigidbody instance should be updated so that
342
- // the cloned collider does not reference the cloned rigidbody (instead of the original rigidbody)
343
- for (const key in newObjectsMap) {
344
- const val = newObjectsMap[key];
345
- const clone = val.clone;
346
- // resolve references
347
- if (clone.userData?.components) {
348
- for (let i = 0; i < clone.userData.components.length; i++) {
349
- const copy = clone.userData.components[i];
350
- // find referenced within a cloned gameobject
351
- const entries = Object.entries(copy);
352
- // console.log(copy, entries);
353
- for (const [key, value] of entries) {
354
- if (Array.isArray(value)) {
355
- const clonedArray = [];
356
- copy[key] = clonedArray;
357
- // console.log(copy, key, value, copy[key]);
358
- for (let i = 0; i < value.length; i++) {
359
- const entry = value[i];
360
- // push value types into new array
361
- if (typeof entry !== "object") {
362
- clonedArray.push(entry);
363
- continue;
364
- }
365
- const res = this.postProcessNewInstance(copy, key, entry, newObjectsMap);
366
- if (res !== undefined)
367
- clonedArray.push(res);
368
- else
369
- clonedArray.push(entry);
370
- }
371
- // console.log(copy[key])
372
- }
373
- else if (typeof value === "object") {
374
- const res = this.postProcessNewInstance(copy, key, value, newObjectsMap);
375
- if (res !== undefined) {
376
- copy[key] = res;
377
- }
378
- }
379
- }
380
- }
381
- }
382
- }
383
- }
384
- static postProcessNewInstance(copy, key, value, newObjectsMap) {
385
- if (value instanceof Component || value instanceof Behaviour) {
386
- const originalGameObjectReference = value["gameObject"];
387
- // console.log(key, value, originalGameObjectReference);
388
- if (originalGameObjectReference) {
389
- const id = originalGameObjectReference.uuid;
390
- const newGameObject = newObjectsMap[id]?.clone;
391
- if (!newGameObject) {
392
- // reference has not changed!
393
- if (debug)
394
- console.log("reference did not change", key, copy, value);
395
- return;
396
- }
397
- const index = originalGameObjectReference.userData.components.indexOf(value);
398
- if (index >= 0) {
399
- if (debug)
400
- console.log(key, id);
401
- const found = newGameObject.userData.components[index];
402
- return found;
403
- }
404
- else {
405
- console.warn("could not find component", key, value);
406
- }
407
- }
408
- }
409
- else if (value instanceof THREE.Object3D) {
410
- // console.log(value);
411
- if (key === "gameObject")
412
- return;
413
- const originalGameObjectReference = value;
414
- if (originalGameObjectReference) {
415
- const id = originalGameObjectReference.uuid;
416
- const newGameObject = newObjectsMap[id]?.clone;
417
- if (newGameObject) {
418
- if (debug)
419
- console.log(key, "old", value, "new", newGameObject);
420
- return newGameObject;
421
- }
422
- }
423
- }
46
+ return instantiate(instance, opts);
424
47
  }
425
48
  static destroySynced(instance, context, recursive = true) {
426
49
  if (!instance)
@@ -430,38 +53,7 @@ class GameObject extends THREE.Object3D {
430
53
  syncDestroy(go, context.connection, recursive);
431
54
  }
432
55
  static destroy(instance, recursive = true, isRoot = true) {
433
- const comp = instance;
434
- if (comp.isComponent) {
435
- comp.destroy();
436
- return;
437
- }
438
- const obj = instance;
439
- if (debug)
440
- console.log(obj);
441
- if (recursive && obj.children) {
442
- for (const ch of obj.children) {
443
- GameObject.destroy(ch, recursive, false);
444
- }
445
- }
446
- const components = obj.userData.components;
447
- if (components) {
448
- let lastLength = components.length;
449
- for (let i = 0; i < components.length; i++) {
450
- const comp = components[i];
451
- if (comp.destroy) {
452
- if (debug)
453
- console.log("destroying", comp);
454
- comp.destroy();
455
- }
456
- // components will be removed from componentlist in destroy
457
- if (components.length < lastLength) {
458
- lastLength = components.length;
459
- i--;
460
- }
461
- }
462
- }
463
- if (isRoot)
464
- obj.removeFromParent();
56
+ return destroy(instance, recursive, isRoot);
465
57
  }
466
58
  /**
467
59
  * Add an object to parent and also ensure all components are being registered
@@ -519,24 +111,22 @@ class GameObject extends THREE.Object3D {
519
111
  }
520
112
  static addNewComponent(go, type, callAwake = true) {
521
113
  const instance = new type();
522
- object.addNewComponentInstance(instance, go, callAwake);
114
+ //@ts-ignore
115
+ addNewComponentInstance(go, instance, callAwake);
523
116
  return instance;
524
117
  }
525
118
  static addComponent(go, instance) {
526
119
  if (instance.gameObject == null) {
527
120
  throw new Error("Did you mean to create a new component? Use addNewComponent");
528
121
  }
529
- object.moveComponentInstance(instance, go);
122
+ moveComponentInstance(go, instance);
530
123
  }
531
124
  static removeComponent(instance) {
532
- object.removeComponent(instance.gameObject, instance);
125
+ removeComponent(instance.gameObject, instance);
533
126
  return instance;
534
127
  }
535
128
  static getOrAddComponent(go, typeName) {
536
- const comp = this.getComponent(go, typeName);
537
- if (comp)
538
- return comp;
539
- return this.addNewComponent(go, typeName);
129
+ return getOrAddComponent(go, typeName);
540
130
  }
541
131
  static getComponent(go, typeName) {
542
132
  if (go === null)
@@ -545,35 +135,36 @@ class GameObject extends THREE.Object3D {
545
135
  // not ideal, but I dont know a good/sane way to do this otherwise
546
136
  // const res = TypeStore.get(typeName);
547
137
  // if(res) typeName = res;
548
- return object.getComponent(typeName, go);
138
+ return getComponent(go, typeName);
549
139
  }
550
140
  static getComponents(go, typeName, arr = null) {
551
141
  if (go === null)
552
142
  return arr ?? [];
553
- return object.getComponents(typeName, go, arr);
143
+ return getComponents(go, typeName, arr);
554
144
  }
555
145
  static findByGuid(guid, hierarchy) {
556
- return utils.tryFindObject(guid, hierarchy, true, true);
146
+ const res = findByGuid(guid, hierarchy);
147
+ return res;
557
148
  }
558
149
  static findObjectOfType(typeName, context, includeInactive = true) {
559
- return object.findObjectOfType(typeName, context, includeInactive);
150
+ return findObjectOfType(typeName, context ?? Context.Current, includeInactive);
560
151
  }
561
152
  static findObjectsOfType(typeName, context) {
562
153
  const arr = [];
563
- object.findObjectsOfType(typeName, arr, context);
154
+ findObjectsOfType(typeName, arr, context);
564
155
  return arr;
565
156
  }
566
157
  static getComponentInChildren(go, typeName) {
567
- return object.getComponentInChildren(typeName, go);
158
+ return getComponentInChildren(go, typeName);
568
159
  }
569
160
  static getComponentsInChildren(go, typeName, arr = null) {
570
- return object.getComponentsInChildren(typeName, go, arr);
161
+ return getComponentsInChildren(go, typeName, arr ?? undefined);
571
162
  }
572
163
  static getComponentInParent(go, typeName) {
573
- return object.getComponentInParent(typeName, go);
164
+ return getComponentInParent(go, typeName);
574
165
  }
575
166
  static getComponentsInParent(go, typeName, arr = null) {
576
- return object.getComponentsInParent(typeName, go, arr);
167
+ return getComponentsInParent(go, typeName, arr);
577
168
  }
578
169
  static getAllComponents(go) {
579
170
  const componentsList = go.userData?.components;
@@ -657,6 +248,11 @@ class Component {
657
248
  return true;
658
249
  return res;
659
250
  }
251
+ set __isActiveInHierarchy(val) {
252
+ if (!this.gameObject)
253
+ return;
254
+ this.gameObject[activeInHierarchyFieldName] = val;
255
+ }
660
256
  gameObject;
661
257
  guid = "invalid";
662
258
  sourceId;
@@ -678,10 +274,9 @@ class Component {
678
274
  return this.__destroyed;
679
275
  }
680
276
  destroy() {
681
- if (this.destroyed)
277
+ if (this.__destroyed)
682
278
  return;
683
- // console.log("destroy", this);
684
- object.destroyComponentInstance(this);
279
+ this.__internalDestroy();
685
280
  }
686
281
  __didAwake = false;
687
282
  __didStart = false;
@@ -713,10 +308,11 @@ class Component {
713
308
  }
714
309
  __internalEnable() {
715
310
  if (this.__didEnable)
716
- return;
311
+ return false;
717
312
  // console.trace("INTERNAL ENABLE");
718
313
  this.__didEnable = true;
719
314
  this.onEnable();
315
+ return true;
720
316
  }
721
317
  __internalDisable() {
722
318
  if (!this.__didEnable)
@@ -726,7 +322,39 @@ class Component {
726
322
  this.onDisable();
727
323
  this._collisions?.clear();
728
324
  }
325
+ __internalDestroy() {
326
+ if (this.__destroyed)
327
+ return;
328
+ this.__destroyed = true;
329
+ this.destroy?.call(this);
330
+ // console.log("destroy", this);
331
+ destroyComponentInstance(this);
332
+ }
333
+ // isActiveAndEnabled: boolean = false;
334
+ get enabled() {
335
+ return this.__isEnabled ?? true; // if it has no enabled field it is always enabled
336
+ }
337
+ set enabled(val) {
338
+ // when called from animationclip we receive numbers
339
+ // due to interpolation they can be anything between 0 and 1
340
+ if (typeof val === "number") {
341
+ if (val >= 0.5)
342
+ val = true;
343
+ else
344
+ val = false;
345
+ }
346
+ // need to check here because codegen is calling this before everything is setup
347
+ if (!this.__didAwake)
348
+ return;
349
+ if (val) {
350
+ this.__internalEnable();
351
+ }
352
+ else {
353
+ this.__internalDisable();
354
+ }
355
+ }
729
356
  constructor() {
357
+ // super();
730
358
  this.__internalNewInstanceCreated();
731
359
  }
732
360
  _collisionExitRoutine;
@@ -909,7 +537,7 @@ class Component {
909
537
  Component._worldQuaternionBuffer.setFromEuler(Component._worldEulerBuffer);
910
538
  this.worldQuaternion = Component._worldQuaternionBuffer;
911
539
  }
912
- static _forward = new THREE.Vector3(0, 0, 1);
540
+ static _forward = new THREE.Vector3();
913
541
  get forward() {
914
542
  return Component._forward.set(0, 0, -1).applyQuaternion(this.worldQuaternion);
915
543
  }
@@ -937,33 +565,6 @@ class Component {
937
565
  }
938
566
  }
939
567
  class Behaviour extends Component {
940
- // isActiveAndEnabled: boolean = false;
941
- get enabled() {
942
- return this.__isEnabled ?? true; // if it has no enabled field it is always enabled
943
- }
944
- set enabled(val) {
945
- // when called from animationclip we receive numbers
946
- // due to interpolation they can be anything between 0 and 1
947
- if (typeof val === "number") {
948
- if (val >= 0.5)
949
- val = true;
950
- else
951
- val = false;
952
- }
953
- if (val === this.__isEnabled)
954
- return;
955
- this.__isEnabled = val;
956
- // console.log(val);
957
- // need to check here because codegen is calling this before everything is setup
958
- if (!this.__didAwake)
959
- return;
960
- if (val) {
961
- this.__internalEnable();
962
- }
963
- else {
964
- this.__internalDisable();
965
- }
966
- }
967
568
  }
968
569
  export { Behaviour, Component, GameObject };
969
570
  //# sourceMappingURL=Component.js.map