@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.
- package/CHANGELOG.md +16 -0
- package/dist/needle-engine.d.ts +3128 -2942
- package/dist/needle-engine.js +455 -455
- package/dist/needle-engine.js.map +4 -4
- package/dist/needle-engine.min.js +54 -54
- package/dist/needle-engine.min.js.map +4 -4
- package/lib/engine/api.d.ts +3 -0
- package/lib/engine/api.js +4 -0
- package/lib/engine/api.js.map +1 -0
- package/lib/engine/engine.d.ts +4 -3
- package/lib/engine/engine_addressables.d.ts +5 -4
- package/lib/engine/engine_addressables.js +8 -7
- package/lib/engine/engine_addressables.js.map +1 -1
- package/lib/engine/engine_components.d.ts +17 -0
- package/lib/engine/engine_components.js +240 -0
- package/lib/engine/engine_components.js.map +1 -0
- package/lib/engine/engine_element.js +4 -3
- package/lib/engine/engine_element.js.map +1 -1
- package/lib/engine/engine_element_loading.js +4 -1
- package/lib/engine/engine_element_loading.js.map +1 -1
- package/lib/engine/engine_gameobject.d.ts +33 -0
- package/lib/engine/engine_gameobject.js +449 -0
- package/lib/engine/engine_gameobject.js.map +1 -0
- package/lib/engine/engine_gltf.d.ts +13 -2
- package/lib/engine/engine_gltf.js +7 -1
- package/lib/engine/engine_gltf.js.map +1 -1
- package/lib/engine/engine_gltf_builtin_components.d.ts +3 -3
- package/lib/engine/engine_gltf_builtin_components.js +2 -3
- package/lib/engine/engine_gltf_builtin_components.js.map +1 -1
- package/lib/engine/engine_lightdata.d.ts +1 -1
- package/lib/engine/engine_lightdata.js.map +1 -1
- package/lib/engine/engine_mainloop_utils.d.ts +2 -2
- package/lib/engine/engine_mainloop_utils.js +7 -6
- package/lib/engine/engine_mainloop_utils.js.map +1 -1
- package/lib/engine/engine_networking.d.ts +6 -10
- package/lib/engine/engine_networking.js +7 -11
- package/lib/engine/engine_networking.js.map +1 -1
- package/lib/engine/engine_networking_files.d.ts +1 -1
- package/lib/engine/engine_networking_files.js +8 -7
- package/lib/engine/engine_networking_files.js.map +1 -1
- package/lib/engine/engine_networking_files_default_components.d.ts +2 -2
- package/lib/engine/engine_networking_files_default_components.js +38 -43
- package/lib/engine/engine_networking_files_default_components.js.map +1 -1
- package/lib/engine/engine_networking_instantiate.d.ts +8 -6
- package/lib/engine/engine_networking_instantiate.js +12 -9
- package/lib/engine/engine_networking_instantiate.js.map +1 -1
- package/lib/engine/engine_networking_types.d.ts +14 -0
- package/lib/engine/engine_networking_types.js +8 -0
- package/lib/engine/engine_networking_types.js.map +1 -0
- package/lib/engine/engine_physics.d.ts +5 -24
- package/lib/engine/engine_physics.js +27 -61
- package/lib/engine/engine_physics.js.map +1 -1
- package/lib/engine/engine_rendererdata.d.ts +1 -1
- package/lib/engine/engine_rendererdata.js.map +1 -1
- package/lib/engine/engine_scenetools.d.ts +2 -2
- package/lib/engine/engine_scenetools.js +22 -5
- package/lib/engine/engine_scenetools.js.map +1 -1
- package/lib/engine/engine_serialization_builtin_serializer.d.ts +1 -1
- package/lib/engine/engine_serialization_core.d.ts +1 -1
- package/lib/engine/engine_serialization_decorator.d.ts +1 -1
- package/lib/engine/engine_setup.d.ts +14 -15
- package/lib/engine/engine_setup.js +34 -23
- package/lib/engine/engine_setup.js.map +1 -1
- package/lib/engine/engine_three_utils.js +0 -6
- package/lib/engine/engine_three_utils.js.map +1 -1
- package/lib/engine/engine_types.d.ts +108 -0
- package/lib/engine/engine_types.js +50 -0
- package/lib/engine/engine_types.js.map +1 -0
- package/lib/engine/engine_utils.d.ts +1 -1
- package/lib/engine/engine_utils.js.map +1 -1
- package/lib/engine/extensions/NEEDLE_components.js +2 -2
- package/lib/engine/extensions/NEEDLE_components.js.map +1 -1
- package/lib/engine/extensions/NEEDLE_deferred_texture.d.ts +1 -1
- package/lib/engine/extensions/NEEDLE_lighting_settings.d.ts +1 -1
- package/lib/engine/extensions/NEEDLE_lightmaps.d.ts +1 -1
- package/lib/engine/extensions/NEEDLE_render_objects.d.ts +2 -2
- package/lib/engine/extensions/NEEDLE_techniques_webgl.d.ts +1 -1
- package/lib/engine/extensions/NEEDLE_techniques_webgl.js +3 -2
- package/lib/engine/extensions/NEEDLE_techniques_webgl.js.map +1 -1
- package/lib/engine/extensions/extensions.d.ts +1 -1
- package/lib/engine-components/Animator.js.map +1 -1
- package/lib/engine-components/AvatarLoader.js +6 -5
- package/lib/engine-components/AvatarLoader.js.map +1 -1
- package/lib/engine-components/Camera.d.ts +2 -2
- package/lib/engine-components/Camera.js +6 -12
- package/lib/engine-components/Camera.js.map +1 -1
- package/lib/engine-components/CameraUtils.d.ts +3 -0
- package/lib/engine-components/CameraUtils.js +15 -0
- package/lib/engine-components/CameraUtils.js.map +1 -0
- package/lib/engine-components/Collider.d.ts +3 -1
- package/lib/engine-components/Collider.js +11 -0
- package/lib/engine-components/Collider.js.map +1 -1
- package/lib/engine-components/Component.d.ts +21 -55
- package/lib/engine-components/Component.js +67 -466
- package/lib/engine-components/Component.js.map +1 -1
- package/lib/engine-components/Duplicatable.js +2 -1
- package/lib/engine-components/Duplicatable.js.map +1 -1
- package/lib/engine-components/LODGroup.js.map +1 -1
- package/lib/engine-components/Light.d.ts +2 -1
- package/lib/engine-components/Light.js +2 -2
- package/lib/engine-components/Light.js.map +1 -1
- package/lib/engine-components/NestedGltf.js +2 -1
- package/lib/engine-components/NestedGltf.js.map +1 -1
- package/lib/engine-components/Networking.d.ts +3 -1
- package/lib/engine-components/Networking.js +3 -0
- package/lib/engine-components/Networking.js.map +1 -1
- package/lib/engine-components/OrbitControls.js +4 -2
- package/lib/engine-components/OrbitControls.js.map +1 -1
- package/lib/engine-components/Renderer.d.ts +3 -2
- package/lib/engine-components/Renderer.js +2 -0
- package/lib/engine-components/Renderer.js.map +1 -1
- package/lib/engine-components/{Rigidbody.d.ts → RigidBody.d.ts} +2 -1
- package/lib/engine-components/{Rigidbody.js → RigidBody.js} +1 -1
- package/lib/engine-components/{Rigidbody.js.map → RigidBody.js.map} +1 -1
- package/lib/engine-components/ScreenCapture.js.map +1 -1
- package/lib/engine-components/SpectatorCamera.js.map +1 -1
- package/lib/engine-components/SyncedCamera.js +2 -1
- package/lib/engine-components/SyncedCamera.js.map +1 -1
- package/lib/engine-components/SyncedTransform.js.map +1 -1
- package/lib/engine-components/TestRunner.js.map +1 -1
- package/lib/engine-components/Voip.js +2 -1
- package/lib/engine-components/Voip.js.map +1 -1
- package/lib/engine-components/WebXR.js.map +1 -1
- package/lib/engine-components/WebXRController.js +28 -8
- package/lib/engine-components/WebXRController.js.map +1 -1
- package/lib/engine-components/WebXRGrabRendering.d.ts +1 -1
- package/lib/engine-components/WebXRGrabRendering.js +1 -1
- package/lib/engine-components/WebXRGrabRendering.js.map +1 -1
- package/lib/engine-components/WebXRSync.js +1 -1
- package/lib/engine-components/WebXRSync.js.map +1 -1
- package/lib/engine-components/avatar/Avatar_Brain_LookAt.js.map +1 -1
- package/lib/engine-components/codegen/components.d.ts +1 -1
- package/lib/engine-components/codegen/components.js +1 -1
- package/lib/engine-components/codegen/components.js.map +1 -1
- package/lib/engine-components/js-extensions/ExtensionUtils.d.ts +4 -0
- package/lib/engine-components/js-extensions/ExtensionUtils.js +56 -0
- package/lib/engine-components/js-extensions/ExtensionUtils.js.map +1 -0
- package/lib/engine-components/js-extensions/Object3D.js +27 -50
- package/lib/engine-components/js-extensions/Object3D.js.map +1 -1
- package/lib/engine-components/js-extensions/Vector.d.ts +2 -0
- package/lib/engine-components/js-extensions/Vector.js +16 -0
- package/lib/engine-components/js-extensions/Vector.js.map +1 -0
- package/lib/engine-components/timeline/PlayableDirector.d.ts +2 -1
- package/lib/engine-components/timeline/PlayableDirector.js.map +1 -1
- package/lib/engine-components/ui/BaseUIComponent.d.ts +1 -0
- package/lib/engine-components/ui/BaseUIComponent.js +11 -5
- package/lib/engine-components/ui/BaseUIComponent.js.map +1 -1
- package/lib/engine-components/ui/Canvas.d.ts +3 -0
- package/lib/engine-components/ui/Canvas.js +12 -1
- package/lib/engine-components/ui/Canvas.js.map +1 -1
- package/lib/engine-components/ui/CanvasScaler.d.ts +0 -0
- package/lib/engine-components/ui/CanvasScaler.js +17 -0
- package/lib/engine-components/ui/CanvasScaler.js.map +1 -0
- package/lib/engine-components/ui/EventSystem.d.ts +1 -1
- package/lib/engine-components/ui/EventSystem.js +11 -31
- package/lib/engine-components/ui/EventSystem.js.map +1 -1
- package/lib/engine-components/ui/Graphic.js +2 -1
- package/lib/engine-components/ui/Graphic.js.map +1 -1
- package/lib/engine-components/ui/Keyboard.js +2 -1
- package/lib/engine-components/ui/Keyboard.js.map +1 -1
- package/lib/engine-components/ui/RaycastUtils.d.ts +11 -0
- package/lib/engine-components/ui/RaycastUtils.js +62 -0
- package/lib/engine-components/ui/RaycastUtils.js.map +1 -0
- package/lib/engine-components/ui/Raycaster.js.map +1 -1
- package/lib/engine-components/ui/Text.js +8 -3
- package/lib/engine-components/ui/Text.js.map +1 -1
- package/lib/engine-components/ui/Utils.js +3 -2
- package/lib/engine-components/ui/Utils.js.map +1 -1
- package/lib/needle-engine.d.ts +3 -1
- package/lib/needle-engine.js +4 -2
- package/lib/needle-engine.js.map +1 -1
- package/package.json +12 -1
- package/src/engine/api.ts +3 -0
- package/src/engine/codegen/register_types.js +2 -2
- package/src/engine/engine_addressables.ts +12 -10
- package/src/engine/{engine_components.js → engine_components.ts} +66 -61
- package/src/engine/engine_element.ts +4 -3
- package/src/engine/engine_element_loading.ts +5 -1
- package/src/engine/engine_gameobject.ts +506 -0
- package/src/engine/engine_gltf.ts +21 -2
- package/src/engine/engine_gltf_builtin_components.ts +8 -7
- package/src/engine/engine_lightdata.ts +1 -1
- package/src/engine/engine_mainloop_utils.ts +13 -11
- package/src/engine/engine_networking.ts +14 -17
- package/src/engine/engine_networking_files.ts +14 -11
- package/src/engine/engine_networking_files_default_components.ts +53 -52
- package/src/engine/engine_networking_instantiate.ts +24 -14
- package/src/engine/engine_networking_types.ts +19 -0
- package/src/engine/engine_physics.ts +45 -77
- package/src/engine/engine_rendererdata.ts +1 -1
- package/src/engine/engine_scenetools.ts +30 -6
- package/src/engine/engine_serialization_core.ts +1 -1
- package/src/engine/engine_serialization_decorator.ts +1 -1
- package/src/engine/engine_setup.ts +51 -37
- package/src/engine/engine_three_utils.ts +0 -8
- package/src/engine/engine_types.ts +188 -0
- package/src/engine/engine_utils.ts +1 -3
- package/src/engine/extensions/NEEDLE_components.ts +2 -2
- package/src/engine/extensions/NEEDLE_deferred_texture.ts +1 -1
- package/src/engine/extensions/NEEDLE_lighting_settings.ts +1 -1
- package/src/engine/extensions/NEEDLE_lightmaps.ts +1 -1
- package/src/engine/extensions/NEEDLE_render_objects.ts +4 -4
- package/src/engine/extensions/NEEDLE_techniques_webgl.ts +5 -4
- package/src/engine/extensions/extensions.ts +1 -1
- package/src/engine-components/Animator.ts +3 -3
- package/src/engine-components/AvatarLoader.ts +6 -5
- package/src/engine-components/Camera.ts +10 -13
- package/src/engine-components/CameraUtils.ts +15 -0
- package/src/engine-components/Collider.ts +17 -2
- package/src/engine-components/Component.ts +87 -541
- package/src/engine-components/Duplicatable.ts +4 -3
- package/src/engine-components/LODGroup.ts +1 -1
- package/src/engine-components/Light.ts +3 -2
- package/src/engine-components/NestedGltf.ts +2 -1
- package/src/engine-components/Networking.ts +6 -1
- package/src/engine-components/OrbitControls.ts +5 -5
- package/src/engine-components/Renderer.ts +5 -1
- package/src/engine-components/RigidBody.ts +2 -1
- package/src/engine-components/ScreenCapture.ts +1 -1
- package/src/engine-components/SpectatorCamera.ts +7 -5
- package/src/engine-components/SyncedCamera.ts +2 -1
- package/src/engine-components/SyncedTransform.ts +1 -1
- package/src/engine-components/TestRunner.ts +1 -2
- package/src/engine-components/Voip.ts +2 -1
- package/src/engine-components/WebXR.ts +2 -2
- package/src/engine-components/WebXRController.ts +30 -10
- package/src/engine-components/WebXRGrabRendering.ts +1 -1
- package/src/engine-components/WebXRSync.ts +1 -1
- package/src/engine-components/avatar/Avatar_Brain_LookAt.ts +2 -1
- package/src/engine-components/codegen/components.ts +1 -1
- package/src/engine-components/js-extensions/ExtensionUtils.ts +66 -0
- package/src/engine-components/js-extensions/Object3D.ts +37 -61
- package/src/engine-components/js-extensions/Vector.ts +17 -0
- package/src/engine-components/timeline/PlayableDirector.ts +2 -1
- package/src/engine-components/ui/BaseUIComponent.ts +17 -6
- package/src/engine-components/ui/Canvas.ts +14 -2
- package/src/engine-components/ui/CanvasScaler.ts +21 -0
- package/src/engine-components/ui/EventSystem.ts +11 -25
- package/src/engine-components/ui/Graphic.ts +2 -1
- package/src/engine-components/ui/Keyboard.ts +2 -1
- package/src/engine-components/ui/RaycastUtils.ts +64 -0
- package/src/engine-components/ui/Raycaster.ts +2 -0
- package/src/engine-components/ui/Text.ts +8 -4
- package/src/engine-components/ui/Utils.ts +3 -2
- package/src/needle-engine.ts +7 -2
|
@@ -0,0 +1,506 @@
|
|
|
1
|
+
import { Object3D } from "three";
|
|
2
|
+
import { processNewScripts } from "./engine_mainloop_utils";
|
|
3
|
+
import { InstantiateIdProvider } from "./engine_networking_instantiate";
|
|
4
|
+
import { Context, registerComponent } from "./engine_setup";
|
|
5
|
+
import { logHierarchy, setWorldPosition, setWorldQuaternion } from "./engine_three_utils";
|
|
6
|
+
import { GuidsMap, IComponent as Component, IComponent, IGameObject as GameObject, UIDProvider } from "./engine_types";
|
|
7
|
+
import { getParam, tryFindObject } from "./engine_utils";
|
|
8
|
+
import { apply } from "../engine-components/js-extensions/Object3D";
|
|
9
|
+
import { InstancingUtil } from "./engine_instancing";
|
|
10
|
+
import { activeInHierarchyFieldName } from "./engine_constants";
|
|
11
|
+
|
|
12
|
+
const debug = getParam("debuggetcomponent");
|
|
13
|
+
|
|
14
|
+
|
|
15
|
+
export enum HideFlags {
|
|
16
|
+
None = 0,
|
|
17
|
+
HideInHierarchy = 1,
|
|
18
|
+
HideInInspector = 2,
|
|
19
|
+
DontSaveInEditor = 4,
|
|
20
|
+
NotEditable = 8,
|
|
21
|
+
DontSaveInBuild = 16, // 0x00000010
|
|
22
|
+
DontUnloadUnusedAsset = 32, // 0x00000020
|
|
23
|
+
DontSave = DontUnloadUnusedAsset | DontSaveInBuild | DontSaveInEditor, // 0x00000034
|
|
24
|
+
HideAndDontSave = DontSave | NotEditable | HideInHierarchy, // 0x0000003D
|
|
25
|
+
}
|
|
26
|
+
|
|
27
|
+
|
|
28
|
+
export class InstantiateOptions {
|
|
29
|
+
idProvider?: UIDProvider | undefined;
|
|
30
|
+
|
|
31
|
+
//** parent guid */
|
|
32
|
+
parent?: string | undefined | Object3D;
|
|
33
|
+
/** for duplicatable parenting */
|
|
34
|
+
keepWorldPosition?: boolean
|
|
35
|
+
position?: THREE.Vector3 | undefined;
|
|
36
|
+
rotation?: THREE.Quaternion | undefined;
|
|
37
|
+
scale?: THREE.Vector3 | undefined;
|
|
38
|
+
|
|
39
|
+
visible?: boolean | undefined;
|
|
40
|
+
|
|
41
|
+
context?: Context | undefined;
|
|
42
|
+
}
|
|
43
|
+
|
|
44
|
+
|
|
45
|
+
|
|
46
|
+
// export function setActive(go: Object3D, active: boolean, processStart: boolean = true) {
|
|
47
|
+
// if (!go) return;
|
|
48
|
+
// go.visible = active;
|
|
49
|
+
// main.updateActiveInHierarchyWithoutEventCall(go);
|
|
50
|
+
// if (active && processStart)
|
|
51
|
+
// main.processStart(Context.Current, go);
|
|
52
|
+
// }
|
|
53
|
+
|
|
54
|
+
export function isActiveSelf(go: Object3D): boolean {
|
|
55
|
+
return go.visible || isUsingInstancing(go);
|
|
56
|
+
}
|
|
57
|
+
|
|
58
|
+
export function isActiveInHierarchy(go: Object3D): boolean {
|
|
59
|
+
return go[activeInHierarchyFieldName] || isUsingInstancing(go);
|
|
60
|
+
}
|
|
61
|
+
|
|
62
|
+
export function markAsInstancedRendered(go: THREE.Object3D, instanced: boolean) {
|
|
63
|
+
go["__isUsingInstancing"] = instanced;
|
|
64
|
+
}
|
|
65
|
+
|
|
66
|
+
export function isUsingInstancing(instance: THREE.Object3D): boolean { return InstancingUtil.isUsingInstancing(instance); }
|
|
67
|
+
|
|
68
|
+
|
|
69
|
+
export function findByGuid(guid: string, hierarchy: THREE.Object3D): GameObject | IComponent | null | undefined {
|
|
70
|
+
return tryFindObject(guid, hierarchy, true, true);
|
|
71
|
+
}
|
|
72
|
+
|
|
73
|
+
|
|
74
|
+
export function destroy(instance: Object3D | Component, recursive: boolean = true, isRoot: boolean = true) {
|
|
75
|
+
const comp = instance as Component;
|
|
76
|
+
if (comp.isComponent) {
|
|
77
|
+
comp.__internalDestroy();
|
|
78
|
+
return;
|
|
79
|
+
}
|
|
80
|
+
|
|
81
|
+
const obj = instance as GameObject;
|
|
82
|
+
if (debug) console.log(obj);
|
|
83
|
+
|
|
84
|
+
if (recursive && obj.children) {
|
|
85
|
+
for (const ch of obj.children) {
|
|
86
|
+
destroy(ch, recursive, false);
|
|
87
|
+
}
|
|
88
|
+
}
|
|
89
|
+
|
|
90
|
+
const components = obj.userData.components;
|
|
91
|
+
if (components) {
|
|
92
|
+
let lastLength = components.length;
|
|
93
|
+
for (let i = 0; i < components.length; i++) {
|
|
94
|
+
const comp: Component = components[i];
|
|
95
|
+
comp.__internalDestroy();
|
|
96
|
+
// if (comp.destroy) {
|
|
97
|
+
// if (debug) console.log("destroying", comp);
|
|
98
|
+
// comp.destroy();
|
|
99
|
+
// }
|
|
100
|
+
// components will be removed from componentlist in destroy
|
|
101
|
+
if (components.length < lastLength) {
|
|
102
|
+
lastLength = components.length;
|
|
103
|
+
i--;
|
|
104
|
+
}
|
|
105
|
+
}
|
|
106
|
+
}
|
|
107
|
+
if (isRoot)
|
|
108
|
+
obj.removeFromParent();
|
|
109
|
+
}
|
|
110
|
+
|
|
111
|
+
|
|
112
|
+
export function foreachComponent(instance: THREE.Object3D, cb: (comp: Component) => any, recursive: boolean = true): any {
|
|
113
|
+
if (!instance) return;
|
|
114
|
+
if(!instance.isObject3D){
|
|
115
|
+
new Error("Expected Object3D but got " + instance);
|
|
116
|
+
}
|
|
117
|
+
if (instance.userData?.components) {
|
|
118
|
+
for (let i = 0; i < instance.userData.components.length; i++) {
|
|
119
|
+
const comp = instance.userData.components[i];
|
|
120
|
+
if (comp?.isComponent === true) {
|
|
121
|
+
const res = cb(comp);
|
|
122
|
+
if (res !== undefined) return res;
|
|
123
|
+
}
|
|
124
|
+
}
|
|
125
|
+
}
|
|
126
|
+
|
|
127
|
+
if (recursive && instance.children) {
|
|
128
|
+
for (let i = 0; i < instance.children.length; i++) {
|
|
129
|
+
const child = instance.children[i];
|
|
130
|
+
if (!child) continue;
|
|
131
|
+
const res = foreachComponent(child, cb, recursive);
|
|
132
|
+
if (res !== undefined) return res;
|
|
133
|
+
}
|
|
134
|
+
}
|
|
135
|
+
}
|
|
136
|
+
|
|
137
|
+
|
|
138
|
+
declare class NewGameObjectReferenceInfo {
|
|
139
|
+
original: THREE.Object3D;
|
|
140
|
+
clone: THREE.Object3D;
|
|
141
|
+
}
|
|
142
|
+
|
|
143
|
+
export function instantiate(instance: GameObject | Object3D | null, opts: InstantiateOptions | null = null): GameObject | null {
|
|
144
|
+
if (instance === null) return null;
|
|
145
|
+
|
|
146
|
+
let options: InstantiateOptions | null = null;
|
|
147
|
+
if (opts !== null) {
|
|
148
|
+
// 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
|
|
149
|
+
if (opts["x"] !== undefined) {
|
|
150
|
+
options = new InstantiateOptions();
|
|
151
|
+
options.position = opts as unknown as THREE.Vector3;
|
|
152
|
+
}
|
|
153
|
+
else {
|
|
154
|
+
// if (opts instanceof InstantiateOptions)
|
|
155
|
+
options = opts as InstantiateOptions;
|
|
156
|
+
// else {
|
|
157
|
+
// options = new InstantiateOptions();
|
|
158
|
+
// Object.assign(options, opts);
|
|
159
|
+
// }
|
|
160
|
+
}
|
|
161
|
+
}
|
|
162
|
+
|
|
163
|
+
let context = Context.Current;
|
|
164
|
+
if (options?.context) context = options.context;
|
|
165
|
+
if (debug && context.alias)
|
|
166
|
+
console.log("context", context.alias);
|
|
167
|
+
|
|
168
|
+
// we need to create the id provider before calling internal instantiate because cloned gameobjects also create new guids
|
|
169
|
+
if (options && !options.idProvider) {
|
|
170
|
+
options.idProvider = new InstantiateIdProvider(Date.now());
|
|
171
|
+
}
|
|
172
|
+
|
|
173
|
+
const components: Array<Component> = [];
|
|
174
|
+
const goMapping: { [key: string]: NewGameObjectReferenceInfo } = {}; // used to resolve references on components to components on other gameobjects to their new counterpart
|
|
175
|
+
const skinnedMeshes: { [key: string]: NewGameObjectReferenceInfo } = {};
|
|
176
|
+
const clone = internalInstantiate(context, instance, options, components, goMapping, skinnedMeshes);
|
|
177
|
+
|
|
178
|
+
if (clone) {
|
|
179
|
+
resolveReferences(goMapping);
|
|
180
|
+
resolveAndBindSkinnedMeshBones(skinnedMeshes, goMapping);
|
|
181
|
+
}
|
|
182
|
+
|
|
183
|
+
if (debug) {
|
|
184
|
+
logHierarchy(instance, true);
|
|
185
|
+
logHierarchy(clone, true);
|
|
186
|
+
}
|
|
187
|
+
|
|
188
|
+
const guidsMap: GuidsMap = {};
|
|
189
|
+
for (const i in components) {
|
|
190
|
+
const copy = components[i];
|
|
191
|
+
const oldGuid = copy.guid;
|
|
192
|
+
if (options && options.idProvider) {
|
|
193
|
+
copy.guid = options.idProvider.generateUUID();
|
|
194
|
+
guidsMap[oldGuid] = copy.guid;
|
|
195
|
+
if (debug)
|
|
196
|
+
console.log(copy.name, copy.guid)
|
|
197
|
+
}
|
|
198
|
+
registerComponent(copy, context);
|
|
199
|
+
if (copy.__internalNewInstanceCreated)
|
|
200
|
+
copy.__internalNewInstanceCreated();
|
|
201
|
+
}
|
|
202
|
+
for (const i in components) {
|
|
203
|
+
const copy = components[i];
|
|
204
|
+
if (copy.resolveGuids)
|
|
205
|
+
copy.resolveGuids(guidsMap);
|
|
206
|
+
if (copy.enabled === false) continue;
|
|
207
|
+
else copy.enabled = true;
|
|
208
|
+
}
|
|
209
|
+
|
|
210
|
+
processNewScripts(context);
|
|
211
|
+
|
|
212
|
+
return clone as GameObject;
|
|
213
|
+
}
|
|
214
|
+
|
|
215
|
+
|
|
216
|
+
function internalInstantiate(
|
|
217
|
+
context: Context, instance: GameObject | THREE.Object3D, opts: InstantiateOptions | null,
|
|
218
|
+
componentsList: Array<Component>,
|
|
219
|
+
newGameObjectsMap: { [key: string]: NewGameObjectReferenceInfo },
|
|
220
|
+
skinnedMeshesMap: { [key: string]: NewGameObjectReferenceInfo }
|
|
221
|
+
)
|
|
222
|
+
: GameObject | THREE.Object3D | null {
|
|
223
|
+
if (!instance) return null;
|
|
224
|
+
// prepare, remove things that dont work out of the box
|
|
225
|
+
// e.g. user data we want to manually clone
|
|
226
|
+
// also children throw errors (e.g. recursive toJson with nested meshes)
|
|
227
|
+
const userData = instance.userData;
|
|
228
|
+
instance.userData = {};
|
|
229
|
+
const children = instance.children;
|
|
230
|
+
instance.children = [];
|
|
231
|
+
let clone: THREE.Object3D | GameObject;
|
|
232
|
+
clone = instance.clone(false);
|
|
233
|
+
apply(clone);
|
|
234
|
+
instance.userData = userData;
|
|
235
|
+
instance.children = children;
|
|
236
|
+
|
|
237
|
+
// make reference from old id to new object
|
|
238
|
+
newGameObjectsMap[instance.uuid] = { original: instance, clone: clone };
|
|
239
|
+
|
|
240
|
+
if (instance.type === "SkinnedMesh") {
|
|
241
|
+
skinnedMeshesMap[instance.uuid] = { original: instance, clone: clone };
|
|
242
|
+
}
|
|
243
|
+
|
|
244
|
+
// DO NOT EVER RENAME BECAUSE IT BREAKS / MIGHT BREAK ANIMATIONS
|
|
245
|
+
// clone.name += " (Clone)";
|
|
246
|
+
|
|
247
|
+
if (opts?.visible !== undefined)
|
|
248
|
+
clone.visible = opts.visible;
|
|
249
|
+
|
|
250
|
+
if (opts?.idProvider) {
|
|
251
|
+
clone.uuid = opts.idProvider.generateUUID();
|
|
252
|
+
const cloneGo: GameObject = clone as GameObject;
|
|
253
|
+
if (cloneGo) cloneGo.guid = clone.uuid;
|
|
254
|
+
}
|
|
255
|
+
|
|
256
|
+
if (instance.animations && instance.animations.length > 0) {
|
|
257
|
+
clone.animations = [...instance.animations];
|
|
258
|
+
}
|
|
259
|
+
|
|
260
|
+
const parent = instance.parent;
|
|
261
|
+
if (parent) {
|
|
262
|
+
parent.add(clone);
|
|
263
|
+
}
|
|
264
|
+
|
|
265
|
+
// apply transform
|
|
266
|
+
if (opts?.position) {
|
|
267
|
+
setWorldPosition(clone, opts.position);
|
|
268
|
+
}
|
|
269
|
+
else clone.position.copy(instance.position);
|
|
270
|
+
if (opts?.rotation) {
|
|
271
|
+
setWorldQuaternion(clone, opts.rotation);
|
|
272
|
+
// clone.quaternion.copy(opts.rotation);
|
|
273
|
+
}
|
|
274
|
+
else clone.quaternion.copy(instance.quaternion);
|
|
275
|
+
if (opts?.scale) {
|
|
276
|
+
// TODO: make set world scale work
|
|
277
|
+
clone.scale.copy(opts.scale);
|
|
278
|
+
}
|
|
279
|
+
else clone.scale.copy(instance.scale);
|
|
280
|
+
|
|
281
|
+
if (opts?.parent && opts.parent !== "scene") {
|
|
282
|
+
let requestedParent: Object3D | null = null;
|
|
283
|
+
if (typeof opts.parent === "string") {
|
|
284
|
+
requestedParent = tryFindObject(opts.parent, context.scene, true);
|
|
285
|
+
}
|
|
286
|
+
else {
|
|
287
|
+
requestedParent = opts.parent;
|
|
288
|
+
}
|
|
289
|
+
if (requestedParent) {
|
|
290
|
+
const func = opts.keepWorldPosition === true ? requestedParent.attach : requestedParent.add;
|
|
291
|
+
if (!func) console.error("Invalid parent object", requestedParent, "received when instantiating:", instance);
|
|
292
|
+
else func.call(requestedParent, clone);
|
|
293
|
+
}
|
|
294
|
+
else console.warn("could not find parent:", opts.parent);
|
|
295
|
+
}
|
|
296
|
+
|
|
297
|
+
for (const [key, value] of Object.entries(instance.userData)) {
|
|
298
|
+
if (key === "components") continue;
|
|
299
|
+
clone.userData[key] = value;
|
|
300
|
+
}
|
|
301
|
+
|
|
302
|
+
if (instance.userData?.components) {
|
|
303
|
+
const components = instance.userData.components;
|
|
304
|
+
const newComponents: Component[] = [];
|
|
305
|
+
clone.userData.components = newComponents;
|
|
306
|
+
for (let i = 0; i < components.length; i++) {
|
|
307
|
+
const comp = components[i];
|
|
308
|
+
const copy = Object.create(comp);
|
|
309
|
+
Object.assign(copy, comp);
|
|
310
|
+
newComponents.push(copy);
|
|
311
|
+
copy.gameObject = clone;
|
|
312
|
+
// copy.transform = clone;
|
|
313
|
+
componentsList.push(copy);
|
|
314
|
+
|
|
315
|
+
}
|
|
316
|
+
}
|
|
317
|
+
|
|
318
|
+
// children should just clone the original transform
|
|
319
|
+
if (opts) {
|
|
320
|
+
opts.position = undefined;
|
|
321
|
+
opts.rotation = undefined;
|
|
322
|
+
opts.scale = undefined;
|
|
323
|
+
opts.parent = undefined;
|
|
324
|
+
}
|
|
325
|
+
|
|
326
|
+
for (const ch in instance.children) {
|
|
327
|
+
const child = instance.children[ch];
|
|
328
|
+
const newChild = internalInstantiate(context, child as GameObject, opts, componentsList, newGameObjectsMap, skinnedMeshesMap);
|
|
329
|
+
if (newChild)
|
|
330
|
+
clone.add(newChild);
|
|
331
|
+
}
|
|
332
|
+
|
|
333
|
+
return clone;
|
|
334
|
+
|
|
335
|
+
}
|
|
336
|
+
|
|
337
|
+
function resolveAndBindSkinnedMeshBones(
|
|
338
|
+
skinnedMeshes: { [key: string]: NewGameObjectReferenceInfo },
|
|
339
|
+
newObjectsMap: { [key: string]: NewGameObjectReferenceInfo }
|
|
340
|
+
) {
|
|
341
|
+
for (const key in skinnedMeshes) {
|
|
342
|
+
const val = skinnedMeshes[key];
|
|
343
|
+
const original = val.original as THREE.SkinnedMesh;
|
|
344
|
+
const originalSkeleton = original.skeleton;
|
|
345
|
+
const clone = val.clone as THREE.SkinnedMesh;
|
|
346
|
+
// clone.updateWorldMatrix(true, true);
|
|
347
|
+
if (!originalSkeleton) {
|
|
348
|
+
console.warn("Skinned mesh has no skeleton?", val);
|
|
349
|
+
continue;
|
|
350
|
+
}
|
|
351
|
+
const originalBones = originalSkeleton.bones;
|
|
352
|
+
const clonedSkeleton = clone.skeleton.clone();
|
|
353
|
+
|
|
354
|
+
clone.skeleton = clonedSkeleton;
|
|
355
|
+
clone.bindMatrix.clone().copy(original.bindMatrix);
|
|
356
|
+
// console.log(clone.bindMatrix)
|
|
357
|
+
clone.bindMatrixInverse.copy(original.bindMatrixInverse);
|
|
358
|
+
// clone.bindMatrix.multiplyScalar(.025);
|
|
359
|
+
// console.assert(originalSkeleton.uuid !== clonedSkeleton.uuid);
|
|
360
|
+
// console.assert(originalBones.length === clonedSkeleton.bones.length);
|
|
361
|
+
const bones: Array<THREE.Bone> = [];
|
|
362
|
+
clonedSkeleton.bones = bones;
|
|
363
|
+
for (let i = 0; i < originalBones.length; i++) {
|
|
364
|
+
const bone = originalBones[i];
|
|
365
|
+
const newBoneInfo = newObjectsMap[bone.uuid];
|
|
366
|
+
const clonedBone = newBoneInfo.clone as THREE.Bone;
|
|
367
|
+
// console.log("NEW BONE: ", clonedBone, "BEFORE", newBoneInfo.original);
|
|
368
|
+
bones.push(clonedBone);
|
|
369
|
+
}
|
|
370
|
+
// clone.skeleton = new THREE.Skeleton(bones);
|
|
371
|
+
// clone.skeleton.update();
|
|
372
|
+
// clone.pose();
|
|
373
|
+
// clone.scale.set(1,1,1);
|
|
374
|
+
// clone.position.y += .1;
|
|
375
|
+
// console.log("ORIG", original, "CLONE", clone);
|
|
376
|
+
}
|
|
377
|
+
for (const key in skinnedMeshes) {
|
|
378
|
+
const clone = skinnedMeshes[key].clone as THREE.SkinnedMesh;
|
|
379
|
+
clone.skeleton.update();
|
|
380
|
+
// clone.skeleton.calculateInverses();
|
|
381
|
+
clone.bind(clone.skeleton, clone.bindMatrix);
|
|
382
|
+
clone.updateMatrixWorld(true);
|
|
383
|
+
// clone.pose();
|
|
384
|
+
}
|
|
385
|
+
}
|
|
386
|
+
|
|
387
|
+
// private static bindNewSkinnedMeshBones(source, clone) {
|
|
388
|
+
// const sourceLookup = new Map();
|
|
389
|
+
// const cloneLookup = new Map();
|
|
390
|
+
// // const clone = source.clone(false);
|
|
391
|
+
|
|
392
|
+
// function parallelTraverse(a, b, callback) {
|
|
393
|
+
// callback(a, b);
|
|
394
|
+
// for (let i = 0; i < a.children.length; i++) {
|
|
395
|
+
// parallelTraverse(a.children[i], b.children[i], callback);
|
|
396
|
+
// }
|
|
397
|
+
// }
|
|
398
|
+
// parallelTraverse(source, clone, function (sourceNode, clonedNode) {
|
|
399
|
+
// sourceLookup.set(clonedNode, sourceNode);
|
|
400
|
+
// cloneLookup.set(sourceNode, clonedNode);
|
|
401
|
+
// });
|
|
402
|
+
|
|
403
|
+
// clone.traverse(function (node) {
|
|
404
|
+
// if (!node.isSkinnedMesh) return;
|
|
405
|
+
// const clonedMesh = node;
|
|
406
|
+
// const sourceMesh = sourceLookup.get(node);
|
|
407
|
+
// const sourceBones = sourceMesh.skeleton.bones;
|
|
408
|
+
|
|
409
|
+
// clonedMesh.skeleton = sourceMesh.skeleton.clone();
|
|
410
|
+
// clonedMesh.bindMatrix.copy(sourceMesh.bindMatrix);
|
|
411
|
+
|
|
412
|
+
// clonedMesh.skeleton.bones = sourceBones.map(function (bone) {
|
|
413
|
+
// return cloneLookup.get(bone);
|
|
414
|
+
// });
|
|
415
|
+
// clonedMesh.bind(clonedMesh.skeleton, clonedMesh.bindMatrix);
|
|
416
|
+
// });
|
|
417
|
+
// return clone;
|
|
418
|
+
|
|
419
|
+
// }
|
|
420
|
+
|
|
421
|
+
function resolveReferences(newObjectsMap: { [key: string]: NewGameObjectReferenceInfo }) {
|
|
422
|
+
// for every object that is newly created we want to update references to their newly created counterparts
|
|
423
|
+
// e.g. a collider instance referencing a rigidbody instance should be updated so that
|
|
424
|
+
// the cloned collider does not reference the cloned rigidbody (instead of the original rigidbody)
|
|
425
|
+
for (const key in newObjectsMap) {
|
|
426
|
+
const val = newObjectsMap[key];
|
|
427
|
+
const clone = val.clone;
|
|
428
|
+
// resolve references
|
|
429
|
+
if (clone.userData?.components) {
|
|
430
|
+
for (let i = 0; i < clone.userData.components.length; i++) {
|
|
431
|
+
const copy = clone.userData.components[i];
|
|
432
|
+
// find referenced within a cloned gameobject
|
|
433
|
+
const entries = Object.entries(copy);
|
|
434
|
+
// console.log(copy, entries);
|
|
435
|
+
for (const [key, value] of entries) {
|
|
436
|
+
if (Array.isArray(value)) {
|
|
437
|
+
const clonedArray: Array<any> = [];
|
|
438
|
+
copy[key] = clonedArray;
|
|
439
|
+
// console.log(copy, key, value, copy[key]);
|
|
440
|
+
for (let i = 0; i < value.length; i++) {
|
|
441
|
+
const entry = value[i];
|
|
442
|
+
// push value types into new array
|
|
443
|
+
if (typeof entry !== "object") {
|
|
444
|
+
clonedArray.push(entry);
|
|
445
|
+
continue;
|
|
446
|
+
}
|
|
447
|
+
const res: any = postProcessNewInstance(copy, key, entry, newObjectsMap);
|
|
448
|
+
if (res !== undefined)
|
|
449
|
+
clonedArray.push(res);
|
|
450
|
+
else clonedArray.push(entry);
|
|
451
|
+
}
|
|
452
|
+
// console.log(copy[key])
|
|
453
|
+
}
|
|
454
|
+
else if (typeof value === "object") {
|
|
455
|
+
const res = postProcessNewInstance(copy, key, value as IComponent | Object3D, newObjectsMap);
|
|
456
|
+
if (res !== undefined) {
|
|
457
|
+
copy[key] = res;
|
|
458
|
+
}
|
|
459
|
+
}
|
|
460
|
+
}
|
|
461
|
+
}
|
|
462
|
+
}
|
|
463
|
+
}
|
|
464
|
+
|
|
465
|
+
}
|
|
466
|
+
|
|
467
|
+
function postProcessNewInstance(copy: THREE.Object3D, key: string, value : IComponent | Object3D, newObjectsMap: { [key: string]: NewGameObjectReferenceInfo }) {
|
|
468
|
+
if(value === null || value === undefined) return;
|
|
469
|
+
if ((value as IComponent).isComponent === true) {
|
|
470
|
+
const originalGameObjectReference = value["gameObject"];
|
|
471
|
+
// console.log(key, value, originalGameObjectReference);
|
|
472
|
+
if (originalGameObjectReference) {
|
|
473
|
+
const id = originalGameObjectReference.uuid;
|
|
474
|
+
const newGameObject = newObjectsMap[id]?.clone;
|
|
475
|
+
if (!newGameObject) {
|
|
476
|
+
// reference has not changed!
|
|
477
|
+
if (debug)
|
|
478
|
+
console.log("reference did not change", key, copy, value);
|
|
479
|
+
return;
|
|
480
|
+
}
|
|
481
|
+
const index = originalGameObjectReference.userData.components.indexOf(value);
|
|
482
|
+
if (index >= 0) {
|
|
483
|
+
if (debug)
|
|
484
|
+
console.log(key, id);
|
|
485
|
+
const found = newGameObject.userData.components[index];
|
|
486
|
+
return found;
|
|
487
|
+
}
|
|
488
|
+
else {
|
|
489
|
+
console.warn("could not find component", key, value);
|
|
490
|
+
}
|
|
491
|
+
}
|
|
492
|
+
} else if ((value as Object3D).isObject3D === true) {
|
|
493
|
+
// console.log(value);
|
|
494
|
+
if (key === "gameObject") return;
|
|
495
|
+
const originalGameObjectReference = value as Object3D;
|
|
496
|
+
if (originalGameObjectReference) {
|
|
497
|
+
const id = originalGameObjectReference.uuid;
|
|
498
|
+
const newGameObject = newObjectsMap[id]?.clone;
|
|
499
|
+
if (newGameObject) {
|
|
500
|
+
if (debug)
|
|
501
|
+
console.log(key, "old", value, "new", newGameObject);
|
|
502
|
+
return newGameObject;
|
|
503
|
+
}
|
|
504
|
+
}
|
|
505
|
+
}
|
|
506
|
+
}
|
|
@@ -1,4 +1,23 @@
|
|
|
1
|
+
import { SourceIdentifier, UIDProvider } from "./engine_types";
|
|
2
|
+
import { Context } from "./engine_setup";
|
|
3
|
+
import { NEEDLE_components } from "./extensions/NEEDLE_components";
|
|
4
|
+
import { SerializationContext } from "./engine_serialization_core";
|
|
5
|
+
import { GLTF } from 'three/examples/jsm/loaders/GLTFLoader.js'
|
|
1
6
|
|
|
2
7
|
|
|
3
|
-
|
|
4
|
-
|
|
8
|
+
export interface INeedleGltfLoader {
|
|
9
|
+
createBuiltinComponents(context: Context, gltfId : SourceIdentifier, gltf, seed: number | null | UIDProvider, extension?: NEEDLE_components) : Promise<void>
|
|
10
|
+
writeBuiltinComponentData(comp: object, context: SerializationContext);
|
|
11
|
+
parseSync(context: Context, data, path: string, seed: number | UIDProvider | null): Promise<GLTF | undefined>;
|
|
12
|
+
loadSync(context: Context, url: string, seed: number | UIDProvider | null, _allowAddingAnimator: boolean, prog?: (ProgressEvent) => void): Promise<GLTF | undefined>
|
|
13
|
+
}
|
|
14
|
+
|
|
15
|
+
let gltfLoader: INeedleGltfLoader;
|
|
16
|
+
|
|
17
|
+
export function getLoader(): INeedleGltfLoader {
|
|
18
|
+
return gltfLoader;
|
|
19
|
+
}
|
|
20
|
+
|
|
21
|
+
export function registerLoader(loader : INeedleGltfLoader){
|
|
22
|
+
gltfLoader = loader;
|
|
23
|
+
}
|
|
@@ -1,8 +1,6 @@
|
|
|
1
|
-
import "./codegen/register_types";
|
|
2
|
-
import { addNewComponentInstance } from "./engine_components";
|
|
3
1
|
import { TypeStore } from "./engine_typestore";
|
|
4
2
|
import * as THREE from "three";
|
|
5
|
-
import { Component, GameObject
|
|
3
|
+
import { Component, GameObject } from "../engine-components/Component";
|
|
6
4
|
import { InstantiateIdProvider } from "./engine_networking_instantiate"
|
|
7
5
|
import { Context } from "./engine_setup";
|
|
8
6
|
import { deserializeObject, serializeObject } from "./engine_serialization";
|
|
@@ -10,7 +8,10 @@ import { assign, ISerializable, SerializationContext } from "./engine_serializat
|
|
|
10
8
|
import { NEEDLE_components } from "./extensions/NEEDLE_components";
|
|
11
9
|
import { debugExtension } from "./engine_default_parameters";
|
|
12
10
|
import { builtinComponentKeyName } from "./engine_constants";
|
|
13
|
-
import { SourceIdentifier } from "./
|
|
11
|
+
import { SourceIdentifier } from "./engine_types";
|
|
12
|
+
import { UIDProvider } from "./engine_types";
|
|
13
|
+
import { addNewComponentInstance } from "./engine_components";
|
|
14
|
+
|
|
14
15
|
|
|
15
16
|
const debug = debugExtension;
|
|
16
17
|
|
|
@@ -31,7 +32,7 @@ export function writeBuiltinComponentData(comp: Component, context: Serializatio
|
|
|
31
32
|
return null;
|
|
32
33
|
}
|
|
33
34
|
|
|
34
|
-
export async function createBuiltinComponents(context: Context, gltfId
|
|
35
|
+
export async function createBuiltinComponents(context: Context, gltfId: SourceIdentifier, gltf, seed: number | null | UIDProvider = null, extension?: NEEDLE_components) {
|
|
35
36
|
if (!gltf) return;
|
|
36
37
|
const lateResolve: Array<(gltf: THREE.Object3D) => {}> = [];
|
|
37
38
|
|
|
@@ -147,7 +148,7 @@ async function onCreateBuiltinComponents(context: SerializationContext, obj: THR
|
|
|
147
148
|
// dont call awake here because some references might not be resolved yet and components that access those fields in awake will throw
|
|
148
149
|
// for example Duplicatable reference to object might still be { node: id }
|
|
149
150
|
const callAwake = false;
|
|
150
|
-
addNewComponentInstance(
|
|
151
|
+
addNewComponentInstance(obj, instance, callAwake);
|
|
151
152
|
deserialize.push({ instance, compData, obj });
|
|
152
153
|
}
|
|
153
154
|
else {
|
|
@@ -163,7 +164,7 @@ async function onCreateBuiltinComponents(context: SerializationContext, obj: THR
|
|
|
163
164
|
}
|
|
164
165
|
// console.debug("finished adding gltf builtin components", obj);
|
|
165
166
|
}
|
|
166
|
-
if(unknownComponentsBuffer.length > 0){
|
|
167
|
+
if (unknownComponentsBuffer.length > 0) {
|
|
167
168
|
const unknown = unknownComponentsBuffer.join(", ");
|
|
168
169
|
console.warn("unknown components: " + unknown);
|
|
169
170
|
unknownComponentsBuffer.length = 0;
|
|
@@ -1,9 +1,9 @@
|
|
|
1
1
|
import { LightmapType } from "./extensions/NEEDLE_lightmaps";
|
|
2
2
|
import { Texture } from "three";
|
|
3
|
-
import { SourceIdentifier } from "./engine_gltf";
|
|
4
3
|
import { Context } from "./engine_setup";
|
|
5
4
|
import * as THREE from "three";
|
|
6
5
|
import { getParam } from "./engine_utils";
|
|
6
|
+
import { SourceIdentifier } from "./engine_types";
|
|
7
7
|
|
|
8
8
|
const debugLightmap = getParam("debuglightmaps") ? true : false;
|
|
9
9
|
|
|
@@ -1,9 +1,10 @@
|
|
|
1
1
|
import { Context } from './engine_setup';
|
|
2
2
|
import * as utils from "./engine_generic_utils";
|
|
3
3
|
import * as constants from "./engine_constants";
|
|
4
|
-
import { Behaviour, Component, GameObject } from '../engine-components/Component';
|
|
5
4
|
import { getParam } from './engine_utils';
|
|
6
5
|
import { Object3D } from 'three';
|
|
6
|
+
import { IComponent } from './engine_types';
|
|
7
|
+
import { isActiveSelf } from './engine_gameobject';
|
|
7
8
|
|
|
8
9
|
const debug = getParam("debugnewscripts");
|
|
9
10
|
|
|
@@ -38,7 +39,7 @@ export function processNewScripts(context: Context) {
|
|
|
38
39
|
// Check valid scripts and add all valid to the scripts array
|
|
39
40
|
for (let i = 0; i < new_scripts_buffer.length; i++) {
|
|
40
41
|
try {
|
|
41
|
-
const script:
|
|
42
|
+
const script: IComponent = new_scripts_buffer[i];
|
|
42
43
|
if (script.destroyed) continue;
|
|
43
44
|
if (!script.gameObject) {
|
|
44
45
|
console.error("MISSING GAMEOBJECT - will ignore", script);
|
|
@@ -61,7 +62,7 @@ export function processNewScripts(context: Context) {
|
|
|
61
62
|
// Awake
|
|
62
63
|
for (let i = 0; i < new_scripts_buffer.length; i++) {
|
|
63
64
|
try {
|
|
64
|
-
const script:
|
|
65
|
+
const script: IComponent = new_scripts_buffer[i];
|
|
65
66
|
if (script.destroyed) {
|
|
66
67
|
removeScriptFromContext(new_scripts_buffer[i], context);
|
|
67
68
|
new_scripts_buffer.splice(i, 1);
|
|
@@ -89,7 +90,7 @@ export function processNewScripts(context: Context) {
|
|
|
89
90
|
// OnEnable
|
|
90
91
|
for (let i = 0; i < new_scripts_buffer.length; i++) {
|
|
91
92
|
try {
|
|
92
|
-
const script:
|
|
93
|
+
const script: IComponent = new_scripts_buffer[i];
|
|
93
94
|
if (script.destroyed) continue;
|
|
94
95
|
// console.log(script, script.enabled, script.activeAndEnabled);
|
|
95
96
|
if (script.enabled === false) continue;
|
|
@@ -138,7 +139,7 @@ export function processNewScripts(context: Context) {
|
|
|
138
139
|
context.new_scripts_post_setup_callbacks.length = 0;
|
|
139
140
|
}
|
|
140
141
|
|
|
141
|
-
export function processRemoveFromScene(script:
|
|
142
|
+
export function processRemoveFromScene(script: IComponent) {
|
|
142
143
|
if (!script) return;
|
|
143
144
|
script.__internalDisable();
|
|
144
145
|
removeScriptFromContext(script, script.context);
|
|
@@ -217,7 +218,7 @@ export function updateIsActive() {
|
|
|
217
218
|
function updateIsActiveInHierarchyRecursiveRuntime(go: THREE.Object3D, activeInHierarchy: boolean, allowEventCall: boolean) {
|
|
218
219
|
let activeStateChanged: boolean = false;
|
|
219
220
|
|
|
220
|
-
const active =
|
|
221
|
+
const active = isActiveSelf(go);
|
|
221
222
|
// if (activeInHierarchy) {
|
|
222
223
|
// const prevActive = previousActiveMap[go.uuid];
|
|
223
224
|
// if (prevActive !== undefined) {
|
|
@@ -238,7 +239,7 @@ function updateIsActiveInHierarchyRecursiveRuntime(go: THREE.Object3D, activeInH
|
|
|
238
239
|
previousActiveMap[go.uuid] = active;
|
|
239
240
|
|
|
240
241
|
|
|
241
|
-
if (activeInHierarchy) activeInHierarchy =
|
|
242
|
+
if (activeInHierarchy) activeInHierarchy = isActiveSelf(go);
|
|
242
243
|
go[constants.activeInHierarchyFieldName] = activeInHierarchy;
|
|
243
244
|
|
|
244
245
|
// only raise events here if we didnt call enable etc already
|
|
@@ -250,9 +251,10 @@ function updateIsActiveInHierarchyRecursiveRuntime(go: THREE.Object3D, activeInH
|
|
|
250
251
|
perComponent(go, comp => {
|
|
251
252
|
if (activeInHierarchy) {
|
|
252
253
|
utils.safeInvoke(comp.__internalAwake.bind(comp));
|
|
253
|
-
comp.
|
|
254
|
+
comp.enabled = true;
|
|
255
|
+
// comp.onEnable();
|
|
254
256
|
}
|
|
255
|
-
else comp.
|
|
257
|
+
else comp.enabled = false;
|
|
256
258
|
});
|
|
257
259
|
}
|
|
258
260
|
}
|
|
@@ -274,7 +276,7 @@ export function updateActiveInHierarchyWithoutEventCall(go: THREE.Object3D) {
|
|
|
274
276
|
while (current) {
|
|
275
277
|
if (!current) break;
|
|
276
278
|
if (current.type === "Scene") foundScene = true;
|
|
277
|
-
if (!
|
|
279
|
+
if (!isActiveSelf(current)) {
|
|
278
280
|
activeInHierarchy = false;
|
|
279
281
|
break;
|
|
280
282
|
}
|
|
@@ -287,7 +289,7 @@ export function updateActiveInHierarchyWithoutEventCall(go: THREE.Object3D) {
|
|
|
287
289
|
go[constants.activeInHierarchyFieldName] = activeInHierarchy && foundScene;
|
|
288
290
|
}
|
|
289
291
|
|
|
290
|
-
function perComponent(go: THREE.Object3D, evt: (comp:
|
|
292
|
+
function perComponent(go: THREE.Object3D, evt: (comp: IComponent) => void) {
|
|
291
293
|
if (go.userData?.components) {
|
|
292
294
|
for (const comp of go.userData.components) {
|
|
293
295
|
evt(comp);
|