@needle-tools/engine 2.64.0-pre → 2.65.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.
- package/CHANGELOG.md +11 -0
- package/dist/needle-engine.js +5078 -5055
- package/dist/needle-engine.umd.cjs +84 -84
- package/lib/engine/api.js.map +1 -1
- package/lib/engine/assets/index.js.map +1 -1
- package/lib/engine/assets/logo.svg +1 -0
- package/lib/engine/codegen/register_types.js +169 -169
- package/lib/engine/codegen/register_types.js.map +1 -1
- package/lib/engine/debug/debug.js.map +1 -1
- package/lib/engine/debug/debug_console.js.map +1 -1
- package/lib/engine/debug/debug_overlay.js.map +1 -1
- package/lib/engine/debug/index.js.map +1 -1
- package/lib/engine/engine.js.map +1 -1
- package/lib/engine/engine_addressables.js.map +1 -1
- package/lib/engine/engine_application.js.map +1 -1
- package/lib/engine/engine_assetdatabase.js.map +1 -1
- package/lib/engine/engine_camera.js.map +1 -1
- package/lib/engine/engine_components.js.map +1 -1
- package/lib/engine/engine_constants.js.map +1 -1
- package/lib/engine/engine_context_registry.js.map +1 -1
- package/lib/engine/engine_coroutine.js.map +1 -1
- package/lib/engine/engine_create_objects.js.map +1 -1
- package/lib/engine/engine_default_parameters.js.map +1 -1
- package/lib/engine/engine_element.d.ts +6 -4
- package/lib/engine/engine_element.js +152 -165
- package/lib/engine/engine_element.js.map +1 -1
- package/lib/engine/engine_element_loading.js.map +1 -1
- package/lib/engine/engine_element_overlay.js.map +1 -1
- package/lib/engine/engine_fileloader.js.map +1 -1
- package/lib/engine/engine_gameobject.d.ts +4 -2
- package/lib/engine/engine_gameobject.js +32 -13
- package/lib/engine/engine_gameobject.js.map +1 -1
- package/lib/engine/engine_generic_utils.js.map +1 -1
- package/lib/engine/engine_gizmos.js.map +1 -1
- package/lib/engine/engine_gltf.d.ts +1 -1
- package/lib/engine/engine_gltf.js.map +1 -1
- package/lib/engine/engine_gltf_builtin_components.js.map +1 -1
- package/lib/engine/engine_hot_reload.js.map +1 -1
- package/lib/engine/engine_input.js.map +1 -1
- package/lib/engine/engine_input_utils.js.map +1 -1
- package/lib/engine/engine_instancing.js.map +1 -1
- package/lib/engine/engine_license.js.map +1 -1
- package/lib/engine/engine_lightdata.js.map +1 -1
- package/lib/engine/engine_loaders.js.map +1 -1
- package/lib/engine/engine_mainloop_utils.js +36 -6
- package/lib/engine/engine_mainloop_utils.js.map +1 -1
- package/lib/engine/engine_math.js.map +1 -1
- package/lib/engine/engine_networking.js.map +1 -1
- package/lib/engine/engine_networking_auto.js.map +1 -1
- package/lib/engine/engine_networking_files.js.map +1 -1
- package/lib/engine/engine_networking_files_default_components.js.map +1 -1
- package/lib/engine/engine_networking_instantiate.js.map +1 -1
- package/lib/engine/engine_networking_peer.js.map +1 -1
- package/lib/engine/engine_networking_types.js.map +1 -1
- package/lib/engine/engine_networking_utils.js.map +1 -1
- package/lib/engine/engine_networking_websocket.js.map +1 -1
- package/lib/engine/engine_physics.js.map +1 -1
- package/lib/engine/engine_physics.types.js.map +1 -1
- package/lib/engine/engine_playerview.js.map +1 -1
- package/lib/engine/engine_rendererdata.js.map +1 -1
- package/lib/engine/engine_scenetools.js.map +1 -1
- package/lib/engine/engine_serialization.js.map +1 -1
- package/lib/engine/engine_serialization_builtin_serializer.js.map +1 -1
- package/lib/engine/engine_serialization_core.js.map +1 -1
- package/lib/engine/engine_serialization_decorator.js.map +1 -1
- package/lib/engine/engine_setup.d.ts +5 -2
- package/lib/engine/engine_setup.js +14 -5
- package/lib/engine/engine_setup.js.map +1 -1
- package/lib/engine/engine_shaders.js.map +1 -1
- package/lib/engine/engine_texture.js.map +1 -1
- package/lib/engine/engine_three_utils.js.map +1 -1
- package/lib/engine/engine_time.js.map +1 -1
- package/lib/engine/engine_types.js.map +1 -1
- package/lib/engine/engine_typestore.js.map +1 -1
- package/lib/engine/engine_util_decorator.js.map +1 -1
- package/lib/engine/engine_utils.js.map +1 -1
- package/lib/engine/engine_utils_screenshot.js.map +1 -1
- package/lib/engine/engine_web_api.js.map +1 -1
- package/lib/engine/extensions/EXT_texture_exr.js.map +1 -1
- package/lib/engine/extensions/NEEDLE_animator_controller_model.js.map +1 -1
- package/lib/engine/extensions/NEEDLE_components.js.map +1 -1
- package/lib/engine/extensions/NEEDLE_gameobject_data.js.map +1 -1
- package/lib/engine/extensions/NEEDLE_lighting_settings.js.map +1 -1
- package/lib/engine/extensions/NEEDLE_lightmaps.js.map +1 -1
- package/lib/engine/extensions/NEEDLE_persistent_assets.js.map +1 -1
- package/lib/engine/extensions/NEEDLE_progressive.js.map +1 -1
- package/lib/engine/extensions/NEEDLE_render_objects.js.map +1 -1
- package/lib/engine/extensions/NEEDLE_techniques_webgl.js.map +1 -1
- package/lib/engine/extensions/extension_resolver.js.map +1 -1
- package/lib/engine/extensions/extension_utils.js.map +1 -1
- package/lib/engine/extensions/extensions.js.map +1 -1
- package/lib/engine/js-extensions/Camera.js.map +1 -1
- package/lib/engine/js-extensions/Layers.js.map +1 -1
- package/lib/engine/js-extensions/index.js.map +1 -1
- package/lib/engine/shaders/shaderData.js.map +1 -1
- package/lib/engine/tests/test_utils.js.map +1 -1
- package/lib/engine-components/AlignmentConstraint.js.map +1 -1
- package/lib/engine-components/Animation.js.map +1 -1
- package/lib/engine-components/AnimationCurve.js.map +1 -1
- package/lib/engine-components/Animator.js.map +1 -1
- package/lib/engine-components/AnimatorController.js.map +1 -1
- package/lib/engine-components/AudioListener.js.map +1 -1
- package/lib/engine-components/AudioSource.js.map +1 -1
- package/lib/engine-components/AvatarLoader.js.map +1 -1
- package/lib/engine-components/AxesHelper.js.map +1 -1
- package/lib/engine-components/BasicIKConstraint.js.map +1 -1
- package/lib/engine-components/BoxCollider.js.map +1 -1
- package/lib/engine-components/BoxHelperComponent.js.map +1 -1
- package/lib/engine-components/Camera.d.ts +3 -1
- package/lib/engine-components/Camera.js +11 -10
- package/lib/engine-components/Camera.js.map +1 -1
- package/lib/engine-components/CameraUtils.js.map +1 -1
- package/lib/engine-components/CharacterController.js.map +1 -1
- package/lib/engine-components/Collider.js.map +1 -1
- package/lib/engine-components/Component.d.ts +1 -1
- package/lib/engine-components/Component.js +2 -2
- package/lib/engine-components/Component.js.map +1 -1
- package/lib/engine-components/DeleteBox.js.map +1 -1
- package/lib/engine-components/DeviceFlag.js.map +1 -1
- package/lib/engine-components/DragControls.js.map +1 -1
- package/lib/engine-components/DropListener.js.map +1 -1
- package/lib/engine-components/Duplicatable.js.map +1 -1
- package/lib/engine-components/EventList.js.map +1 -1
- package/lib/engine-components/EventTrigger.js.map +1 -1
- package/lib/engine-components/EventType.js.map +1 -1
- package/lib/engine-components/FlyControls.js.map +1 -1
- package/lib/engine-components/Fog.js.map +1 -1
- package/lib/engine-components/Gizmos.js.map +1 -1
- package/lib/engine-components/GridHelper.js.map +1 -1
- package/lib/engine-components/GroundProjection.js.map +1 -1
- package/lib/engine-components/Interactable.js.map +1 -1
- package/lib/engine-components/Joints.js.map +1 -1
- package/lib/engine-components/LODGroup.js.map +1 -1
- package/lib/engine-components/Light.d.ts +0 -2
- package/lib/engine-components/Light.js +22 -14
- package/lib/engine-components/Light.js.map +1 -1
- package/lib/engine-components/LookAtConstraint.js.map +1 -1
- package/lib/engine-components/NestedGltf.js.map +1 -1
- package/lib/engine-components/Networking.js.map +1 -1
- package/lib/engine-components/OffsetConstraint.js.map +1 -1
- package/lib/engine-components/OrbitControls.js.map +1 -1
- package/lib/engine-components/ParticleSystem.js.map +1 -1
- package/lib/engine-components/ParticleSystemModules.js.map +1 -1
- package/lib/engine-components/ParticleSystemSubEmitter.js.map +1 -1
- package/lib/engine-components/PlayerColor.js.map +1 -1
- package/lib/engine-components/ReflectionProbe.js.map +1 -1
- package/lib/engine-components/Renderer.js.map +1 -1
- package/lib/engine-components/RendererLightmap.js.map +1 -1
- package/lib/engine-components/RigidBody.js.map +1 -1
- package/lib/engine-components/ScreenCapture.js.map +1 -1
- package/lib/engine-components/ShadowCatcher.js.map +1 -1
- package/lib/engine-components/Skybox.d.ts +2 -0
- package/lib/engine-components/Skybox.js +43 -21
- package/lib/engine-components/Skybox.js.map +1 -1
- package/lib/engine-components/SmoothFollow.js.map +1 -1
- package/lib/engine-components/SpatialTrigger.js.map +1 -1
- package/lib/engine-components/SpectatorCamera.js.map +1 -1
- package/lib/engine-components/SphereCollider.js.map +1 -1
- package/lib/engine-components/SpriteRenderer.js.map +1 -1
- package/lib/engine-components/SyncedCamera.js.map +1 -1
- package/lib/engine-components/SyncedRoom.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/TransformGizmo.js.map +1 -1
- package/lib/engine-components/VideoPlayer.js.map +1 -1
- package/lib/engine-components/Voip.js.map +1 -1
- package/lib/engine-components/Volume.js +2 -0
- package/lib/engine-components/Volume.js.map +1 -1
- package/lib/engine-components/WebARSessionRoot.js.map +1 -1
- package/lib/engine-components/WebXR.js.map +1 -1
- package/lib/engine-components/WebXRAvatar.js.map +1 -1
- package/lib/engine-components/WebXRController.js.map +1 -1
- package/lib/engine-components/WebXRGrabRendering.js.map +1 -1
- package/lib/engine-components/WebXRRig.js.map +1 -1
- package/lib/engine-components/WebXRSync.js.map +1 -1
- package/lib/engine-components/XRFlag.js.map +1 -1
- package/lib/engine-components/avatar/AvatarBlink_Simple.js.map +1 -1
- package/lib/engine-components/avatar/AvatarEyeLook_Rotation.js.map +1 -1
- package/lib/engine-components/avatar/Avatar_Brain_LookAt.js.map +1 -1
- package/lib/engine-components/avatar/Avatar_MouthShapes.js.map +1 -1
- package/lib/engine-components/avatar/Avatar_MustacheShake.js.map +1 -1
- package/lib/engine-components/codegen/components.js.map +1 -1
- package/lib/engine-components/debug/LogStats.js.map +1 -1
- package/lib/engine-components/export/gltf/GltfExport.js.map +1 -1
- package/lib/engine-components/export/usdz/Extension.js.map +1 -1
- package/lib/engine-components/export/usdz/USDZExporter.js.map +1 -1
- package/lib/engine-components/export/usdz/extensions/Animation.js.map +1 -1
- package/lib/engine-components/export/usdz/types.js.map +1 -1
- package/lib/engine-components/export/usdz/utils/animationutils.js.map +1 -1
- package/lib/engine-components/export/usdz/utils/quicklook.js.map +1 -1
- package/lib/engine-components/export/usdz/utils/timeutils.js.map +1 -1
- package/lib/engine-components/js-extensions/ExtensionUtils.js.map +1 -1
- package/lib/engine-components/js-extensions/Object3D.js +1 -1
- package/lib/engine-components/js-extensions/Object3D.js.map +1 -1
- package/lib/engine-components/js-extensions/RGBAColor.js.map +1 -1
- package/lib/engine-components/js-extensions/Vector.js.map +1 -1
- package/lib/engine-components/timeline/PlayableDirector.js.map +1 -1
- package/lib/engine-components/timeline/SignalAsset.js.map +1 -1
- package/lib/engine-components/timeline/TimelineModels.js.map +1 -1
- package/lib/engine-components/timeline/TimelineTracks.js.map +1 -1
- package/lib/engine-components/ui/BaseUIComponent.js.map +1 -1
- package/lib/engine-components/ui/Button.js.map +1 -1
- package/lib/engine-components/ui/Canvas.js +2 -2
- package/lib/engine-components/ui/Canvas.js.map +1 -1
- package/lib/engine-components/ui/CanvasGroup.js.map +1 -1
- package/lib/engine-components/ui/EventSystem.js.map +1 -1
- package/lib/engine-components/ui/Graphic.js.map +1 -1
- package/lib/engine-components/ui/Image.js.map +1 -1
- package/lib/engine-components/ui/InputField.js.map +1 -1
- package/lib/engine-components/ui/Interfaces.js.map +1 -1
- package/lib/engine-components/ui/Keyboard.js.map +1 -1
- package/lib/engine-components/ui/Layout.js.map +1 -1
- package/lib/engine-components/ui/PointerEvents.js.map +1 -1
- package/lib/engine-components/ui/RaycastUtils.js.map +1 -1
- package/lib/engine-components/ui/Raycaster.js.map +1 -1
- package/lib/engine-components/ui/RectTransform.js.map +1 -1
- package/lib/engine-components/ui/SpatialHtml.js.map +1 -1
- package/lib/engine-components/ui/Text.js.map +1 -1
- package/lib/engine-components/ui/Utils.js.map +1 -1
- package/lib/engine-components-experimental/Presentation.js.map +1 -1
- package/lib/engine-components-experimental/networking/PlayerSync.js.map +1 -1
- package/lib/engine-schemes/schemes.js.map +1 -1
- package/lib/engine-schemes/synced-camera-model.js.map +1 -1
- package/lib/engine-schemes/synced-transform-model.js.map +1 -1
- package/lib/engine-schemes/transform.js.map +1 -1
- package/lib/engine-schemes/vec2.js.map +1 -1
- package/lib/engine-schemes/vec3.js.map +1 -1
- package/lib/engine-schemes/vec4.js.map +1 -1
- package/lib/engine-schemes/vr-user-state-buffer.js.map +1 -1
- package/lib/include/three/ARButton.js.map +1 -1
- package/lib/include/three/EXT_mesh_gpu_instancing_exporter.js.map +1 -1
- package/lib/include/three/VRButton.js.map +1 -1
- package/lib/needle-engine.js.map +1 -1
- package/package.json +16 -3
- package/plugins/generate-font.js +65 -0
- package/plugins/vite/poster-client.js +3 -5
- package/plugins/vite/reload.js +2 -2
- package/src/engine/codegen/register_types.js +171 -171
- package/src/engine/engine_element.ts +162 -178
- package/src/engine/engine_gameobject.ts +583 -558
- package/src/engine/engine_gltf.ts +1 -1
- package/src/engine/engine_mainloop_utils.ts +36 -7
- package/src/engine/engine_setup.ts +20 -7
- package/src/engine-components/Camera.ts +14 -12
- package/src/engine-components/Component.ts +2 -2
- package/src/engine-components/Light.ts +20 -13
- package/src/engine-components/Skybox.ts +49 -22
- package/src/engine-components/Volume.ts +1 -0
- package/src/engine-components/js-extensions/Object3D.ts +1 -1
- package/src/engine-components/ui/Canvas.ts +2 -2
- package/lib/tsconfig.tsbuildinfo +0 -1
- package/lib/vite.config.d.ts +0 -2
- package/lib/vite.config.js +0 -26
- package/lib/vite.config.js.map +0 -1
- package/src/tsconfig.json +0 -33
|
@@ -8,64 +8,12 @@ import { setDracoDecoderPath, setDracoDecoderType, setKtx2TranscoderPath } from
|
|
|
8
8
|
import { getLoader, registerLoader } from "../engine/engine_gltf";
|
|
9
9
|
import { NeedleGltfLoader } from "./engine_scenetools";
|
|
10
10
|
import { INeedleEngineComponent } from "./engine_types";
|
|
11
|
-
|
|
11
|
+
//
|
|
12
12
|
// registering loader here too to make sure it's imported when using engine via vanilla js
|
|
13
13
|
registerLoader(NeedleGltfLoader);
|
|
14
14
|
|
|
15
15
|
const debug = getParam("debugwebcomponent");
|
|
16
16
|
|
|
17
|
-
class EngineElementSourceFileWatcher {
|
|
18
|
-
|
|
19
|
-
private id: string;
|
|
20
|
-
private context: Context;
|
|
21
|
-
private previouslyAdded: any;
|
|
22
|
-
private previousSource?: string;
|
|
23
|
-
private networkEvent: string;
|
|
24
|
-
|
|
25
|
-
constructor(id: string, context: Context) {
|
|
26
|
-
this.id = id;
|
|
27
|
-
this.context = context;
|
|
28
|
-
this.networkEvent = "needle-engine-source-changed";
|
|
29
|
-
if (this.id) this.networkEvent += "-" + this.id;
|
|
30
|
-
this.context.connection.beginListen(this.networkEvent, fn => {
|
|
31
|
-
this.onSourceChanged(fn, true);
|
|
32
|
-
});
|
|
33
|
-
}
|
|
34
|
-
|
|
35
|
-
async onSourceChanged(newSource: string, dontSend: boolean = false, isStartup: boolean = false) {
|
|
36
|
-
if (this.previouslyAdded) {
|
|
37
|
-
// if event was from remote and source didnt change do nothing
|
|
38
|
-
if (dontSend && newSource === this.previousSource) { }
|
|
39
|
-
else
|
|
40
|
-
GameObject.destroySynced(this.previouslyAdded);
|
|
41
|
-
}
|
|
42
|
-
this.previouslyAdded = null;
|
|
43
|
-
|
|
44
|
-
if (!dontSend) {
|
|
45
|
-
this.context.connection.send(this.networkEvent, newSource);
|
|
46
|
-
}
|
|
47
|
-
|
|
48
|
-
this.previousSource = newSource;
|
|
49
|
-
Context.Current = this.context;
|
|
50
|
-
const res = await getLoader().loadSync(this.context, newSource, this.getHashFromString(newSource), false);
|
|
51
|
-
if (!isStartup)
|
|
52
|
-
processNewScripts(this.context);
|
|
53
|
-
const obj = res?.scene;
|
|
54
|
-
if (obj) {
|
|
55
|
-
this.previouslyAdded = obj;
|
|
56
|
-
this.context.scene.add(obj);
|
|
57
|
-
}
|
|
58
|
-
}
|
|
59
|
-
|
|
60
|
-
private getHashFromString(str: string) {
|
|
61
|
-
let hash = 0;
|
|
62
|
-
for (let i = 0; i < str.length; i++) {
|
|
63
|
-
hash = str.charCodeAt(i) + ((hash << 5) - hash);
|
|
64
|
-
}
|
|
65
|
-
return hash;
|
|
66
|
-
}
|
|
67
|
-
}
|
|
68
|
-
|
|
69
17
|
const htmlTagName = "needle-engine";
|
|
70
18
|
const vrContainerClassName = "vr";
|
|
71
19
|
const desktopContainerClassname = "desktop";
|
|
@@ -81,7 +29,7 @@ export class EngineElement extends HTMLElement implements INeedleEngineComponent
|
|
|
81
29
|
|
|
82
30
|
public get cameraControls(): boolean {
|
|
83
31
|
const attr = this.getAttribute("camera-controls");
|
|
84
|
-
if(attr === null || attr === "False" || attr === "false" || attr === "0") return false;
|
|
32
|
+
if (attr === null || attr === "False" || attr === "false" || attr === "0") return false;
|
|
85
33
|
return true;
|
|
86
34
|
}
|
|
87
35
|
|
|
@@ -102,144 +50,42 @@ export class EngineElement extends HTMLElement implements INeedleEngineComponent
|
|
|
102
50
|
});
|
|
103
51
|
}
|
|
104
52
|
|
|
105
|
-
public get
|
|
53
|
+
public get context() { return this._context; }
|
|
106
54
|
|
|
107
|
-
/**@obsolete use
|
|
108
|
-
|
|
55
|
+
/**@obsolete use context */
|
|
56
|
+
public get Context() { return this._context; }
|
|
57
|
+
/**@obsolete use Needle.GameObject */
|
|
58
|
+
private gameObject = GameObject;
|
|
59
|
+
/**@obsolete use Needle.GameObject */
|
|
109
60
|
private GameObject = GameObject;
|
|
110
61
|
|
|
111
|
-
private _context: Context
|
|
62
|
+
private _context: Context;
|
|
112
63
|
private _overlay_ar: AROverlayHandler;
|
|
113
64
|
private _loadingProgress01: number = 0;
|
|
114
|
-
|
|
115
|
-
private _watcher?: EngineElementSourceFileWatcher;
|
|
116
65
|
private _loadingView?: ILoadingViewHandler;
|
|
117
66
|
|
|
118
67
|
constructor() {
|
|
119
68
|
super();
|
|
120
69
|
this._overlay_ar = new AROverlayHandler();
|
|
70
|
+
this._context = new Context({ domElement: this });
|
|
121
71
|
}
|
|
122
72
|
|
|
123
73
|
async connectedCallback() {
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
// user can set a function name or a path to a gltf or glb to be loaded
|
|
130
|
-
const srcFile = () => {
|
|
131
|
-
const srcVal = this.getAttribute("src");
|
|
132
|
-
if (srcVal?.endsWith(".glb") || srcVal?.endsWith(".gltf")) {
|
|
133
|
-
return srcVal;
|
|
134
|
-
}
|
|
135
|
-
return null;
|
|
136
|
-
};
|
|
137
|
-
let src: string | null = "loadScene";
|
|
138
|
-
const srcAttributeValue = srcFile();
|
|
139
|
-
if (srcAttributeValue) src = srcAttributeValue;
|
|
140
|
-
|
|
141
|
-
const alias = this.getAttribute("alias");
|
|
142
|
-
const hash = this.getAttribute("hash");
|
|
143
|
-
this._context = new Context({ name: src, domElement: this, alias: alias, hash: hash ?? undefined });
|
|
144
|
-
this._watcher = new EngineElementSourceFileWatcher(this.getAttribute("id") ?? alias ?? "", this._context);
|
|
74
|
+
if (debug) {
|
|
75
|
+
console.log("<needle-engine> connected");
|
|
76
|
+
console.dir(this);
|
|
77
|
+
}
|
|
145
78
|
|
|
79
|
+
this.onSetupDesktop();
|
|
80
|
+
const src = this.getAttribute("src");
|
|
146
81
|
if (src && src.length > 0) {
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
// HACK: if no explicit glb is assigned we have to wait for the codegen function to be available
|
|
150
|
-
// it happened in one case during local development where the function was not yet registered
|
|
151
|
-
// but this component was connected already
|
|
152
|
-
if (!srcAttributeValue) {
|
|
153
|
-
while (Object.keys(build_scene_functions).length <= 0) {
|
|
154
|
-
if (!this.isConnected) return;
|
|
155
|
-
await delay(10);
|
|
156
|
-
}
|
|
157
|
-
}
|
|
158
|
-
|
|
159
|
-
let fn: (context: Context) => Promise<void> = build_scene_functions[src] ?? window[src];
|
|
160
|
-
// if no load function is found (e.g. when generated code was deleted or import removed) then just load the glb
|
|
161
|
-
// or if an explicit src file is provided
|
|
162
|
-
let previousFileLoaded: string | null = null;
|
|
163
|
-
if (!fn || srcAttributeValue) {
|
|
164
|
-
if (srcAttributeValue)
|
|
165
|
-
src = srcAttributeValue;
|
|
166
|
-
fn = async _ => {
|
|
167
|
-
const file = srcFile();
|
|
168
|
-
if (file && this._watcher) {
|
|
169
|
-
previousFileLoaded = file;
|
|
170
|
-
await this._watcher.onSourceChanged(file, true, true);
|
|
171
|
-
}
|
|
172
|
-
}
|
|
173
|
-
}
|
|
174
|
-
if (fn) {
|
|
175
|
-
this.classList.add("loading");
|
|
176
|
-
if (debug)
|
|
177
|
-
console.log("Needle Engine: Begin loading", alias ?? "");
|
|
178
|
-
const allowOverridingDefaultLoading = true;
|
|
179
|
-
// default loading can be overriden by calling preventDefault in the onload start event
|
|
180
|
-
const useDefaultLoading = this.dispatchEvent(new CustomEvent("loadstart", {
|
|
181
|
-
detail: {
|
|
182
|
-
context: this._context,
|
|
183
|
-
alias: alias
|
|
184
|
-
},
|
|
185
|
-
cancelable: allowOverridingDefaultLoading
|
|
186
|
-
}));
|
|
187
|
-
if (!this._loadingView && useDefaultLoading)
|
|
188
|
-
this._loadingView = new EngineLoadingView(this);
|
|
189
|
-
if (useDefaultLoading)
|
|
190
|
-
this._loadingView?.onLoadingBegin("begin load");
|
|
191
|
-
// setup the loading callback for the default loading handler and the user defined one
|
|
192
|
-
const loadingCallback = (progress: LoadingProgressArgs, message?: string) => {
|
|
193
|
-
this._loadingProgress01 = calculateProgress01(progress);
|
|
194
|
-
if (useDefaultLoading)
|
|
195
|
-
this._loadingView?.onLoadingUpdate(progress, message);
|
|
196
|
-
this.dispatchEvent(new CustomEvent("progress", {
|
|
197
|
-
detail: {
|
|
198
|
-
context: this._context,
|
|
199
|
-
name: progress.name,
|
|
200
|
-
progress: progress.progress,
|
|
201
|
-
index: progress.index,
|
|
202
|
-
count: progress.count,
|
|
203
|
-
totalProgress01: this._loadingProgress01
|
|
204
|
-
}
|
|
205
|
-
}));
|
|
206
|
-
}
|
|
207
|
-
this.onBeforeBeginLoading();
|
|
208
|
-
await this._context.onCreate(fn, { progress: loadingCallback });
|
|
209
|
-
const file = srcFile();
|
|
210
|
-
if (file) {
|
|
211
|
-
// only if we didnt load this file here already
|
|
212
|
-
if (file !== previousFileLoaded)
|
|
213
|
-
await this._watcher.onSourceChanged(file, true, true);
|
|
214
|
-
}
|
|
215
|
-
this._loadingProgress01 = 1;
|
|
216
|
-
if (useDefaultLoading)
|
|
217
|
-
this._loadingView?.onLoadingFinished("creating scene");
|
|
218
|
-
this.classList.remove("loading");
|
|
219
|
-
this.classList.add("loading-finished");
|
|
220
|
-
if (debug)
|
|
221
|
-
console.log("Needle Engine: finished loading", alias ?? "");
|
|
222
|
-
this.dispatchEvent(new CustomEvent("loadfinished", {
|
|
223
|
-
detail: {
|
|
224
|
-
context: this._context,
|
|
225
|
-
src: alias ?? src
|
|
226
|
-
}
|
|
227
|
-
}));
|
|
228
|
-
this.onSetupDesktop();
|
|
229
|
-
}
|
|
230
|
-
else {
|
|
231
|
-
console.error("Could not find scene function named \"" + src + "\", it must be either in global scope " +
|
|
232
|
-
"or added to build_scene_functions", build_scene_functions);
|
|
233
|
-
}
|
|
234
|
-
} else {
|
|
235
|
-
console.error("Missing src attribute - please provide a function name", this);
|
|
82
|
+
await this.onLoad(src, true);
|
|
236
83
|
}
|
|
84
|
+
this.onSetupDesktop();
|
|
237
85
|
}
|
|
238
86
|
|
|
239
87
|
disconnectedCallback() {
|
|
240
|
-
|
|
241
|
-
this._context.onDestroy();
|
|
242
|
-
}
|
|
88
|
+
this._context?.onDestroy();
|
|
243
89
|
}
|
|
244
90
|
|
|
245
91
|
static get observedAttributes() {
|
|
@@ -260,7 +106,14 @@ export class EngineElement extends HTMLElement implements INeedleEngineComponent
|
|
|
260
106
|
// console.log(name, oldValue, newValue);
|
|
261
107
|
switch (name) {
|
|
262
108
|
case "src":
|
|
263
|
-
|
|
109
|
+
if (debug) console.log("src changed to type:", typeof newValue, ", from \"", _oldValue, "\" to \"", newValue)
|
|
110
|
+
this.onLoad(newValue, false);
|
|
111
|
+
// this._watcher?.onSourceChanged(newValue);
|
|
112
|
+
break;
|
|
113
|
+
case "hash":
|
|
114
|
+
if (this._context) {
|
|
115
|
+
this._context.hash = newValue;
|
|
116
|
+
}
|
|
264
117
|
break;
|
|
265
118
|
case "loadstart":
|
|
266
119
|
case "progress":
|
|
@@ -288,6 +141,119 @@ export class EngineElement extends HTMLElement implements INeedleEngineComponent
|
|
|
288
141
|
}
|
|
289
142
|
}
|
|
290
143
|
|
|
144
|
+
private async onLoad(src: string | null, isStartup: boolean) {
|
|
145
|
+
if (!src || !src.length) {
|
|
146
|
+
console.error("Needle Engine: No source specified", src);
|
|
147
|
+
return;
|
|
148
|
+
}
|
|
149
|
+
if (!this._context) {
|
|
150
|
+
console.error("Needle Engine: Context not initialized");
|
|
151
|
+
return;
|
|
152
|
+
}
|
|
153
|
+
const alias = this.getAttribute("alias");
|
|
154
|
+
this.classList.add("loading");
|
|
155
|
+
if (debug) console.log("Needle Engine: Begin loading", alias ?? "");
|
|
156
|
+
|
|
157
|
+
|
|
158
|
+
// Loading start events
|
|
159
|
+
const allowOverridingDefaultLoading = true;
|
|
160
|
+
// default loading can be overriden by calling preventDefault in the onload start event
|
|
161
|
+
const useDefaultLoading = this.dispatchEvent(new CustomEvent("loadstart", {
|
|
162
|
+
detail: {
|
|
163
|
+
context: this._context,
|
|
164
|
+
alias: alias
|
|
165
|
+
},
|
|
166
|
+
cancelable: allowOverridingDefaultLoading
|
|
167
|
+
}));
|
|
168
|
+
if (!this._loadingView && useDefaultLoading)
|
|
169
|
+
this._loadingView = new EngineLoadingView(this);
|
|
170
|
+
if (useDefaultLoading)
|
|
171
|
+
this._loadingView?.onLoadingBegin("begin load");
|
|
172
|
+
this.onBeforeBeginLoading();
|
|
173
|
+
|
|
174
|
+
if (debug) console.log(src);
|
|
175
|
+
let filesToLoad: Array<string>;
|
|
176
|
+
if (src.startsWith("[") && src.endsWith("]")) {
|
|
177
|
+
filesToLoad = JSON.parse(src);
|
|
178
|
+
}
|
|
179
|
+
else filesToLoad = [src];
|
|
180
|
+
|
|
181
|
+
let loadFunction: any = null;
|
|
182
|
+
|
|
183
|
+
if (typeof src === "string") {
|
|
184
|
+
loadFunction = async (ctx: Context) => {
|
|
185
|
+
let hash = 0;
|
|
186
|
+
if (ctx.hash) hash = Number.parseInt(ctx.hash) ?? 0;
|
|
187
|
+
const loader = getLoader();
|
|
188
|
+
for (let i = 0; i < filesToLoad.length; i++) {
|
|
189
|
+
const url = filesToLoad[i];
|
|
190
|
+
const fileName = getNameFromUrl(url);
|
|
191
|
+
const progress: LoadingProgressArgs = {
|
|
192
|
+
name: fileName,
|
|
193
|
+
progress: null!,
|
|
194
|
+
index: i,
|
|
195
|
+
count: filesToLoad.length
|
|
196
|
+
};
|
|
197
|
+
const progressEventArgs = {
|
|
198
|
+
detail: {
|
|
199
|
+
context: ctx,
|
|
200
|
+
name: fileName,
|
|
201
|
+
progress: progress.progress,
|
|
202
|
+
index: i,
|
|
203
|
+
count: filesToLoad.length,
|
|
204
|
+
totalProgress01: this._loadingProgress01
|
|
205
|
+
}
|
|
206
|
+
}
|
|
207
|
+
const res = await loader.loadSync(ctx, url, hash, false, prog => {
|
|
208
|
+
// Calc progress
|
|
209
|
+
progress.progress = prog;
|
|
210
|
+
this._loadingProgress01 = calculateProgress01(progress);
|
|
211
|
+
// Update overlay if we use it
|
|
212
|
+
if (useDefaultLoading) this._loadingView?.onLoadingUpdate(progress);
|
|
213
|
+
// Dispatch event
|
|
214
|
+
progressEventArgs.detail.progress = prog;
|
|
215
|
+
progressEventArgs.detail.totalProgress01 = this._loadingProgress01;
|
|
216
|
+
this.dispatchEvent(new CustomEvent("progress", progressEventArgs));
|
|
217
|
+
});
|
|
218
|
+
const obj = res?.scene;
|
|
219
|
+
if (obj) GameObject.add(obj, ctx.scene, ctx);
|
|
220
|
+
}
|
|
221
|
+
if (!isStartup)
|
|
222
|
+
processNewScripts(ctx);
|
|
223
|
+
};
|
|
224
|
+
}
|
|
225
|
+
if (!loadFunction) {
|
|
226
|
+
console.error("Needle Engine: No load function found", src);
|
|
227
|
+
return;
|
|
228
|
+
}
|
|
229
|
+
const currentHash = this.getAttribute("hash");
|
|
230
|
+
if (currentHash !== null && currentHash !== undefined)
|
|
231
|
+
this._context.hash = currentHash;
|
|
232
|
+
this._context.alias = alias;
|
|
233
|
+
if (!this._context.isCreated)
|
|
234
|
+
await this._context.onCreate(loadFunction);
|
|
235
|
+
else {
|
|
236
|
+
await loadFunction(this._context);
|
|
237
|
+
}
|
|
238
|
+
|
|
239
|
+
|
|
240
|
+
|
|
241
|
+
|
|
242
|
+
this._loadingProgress01 = 1;
|
|
243
|
+
if (useDefaultLoading)
|
|
244
|
+
this._loadingView?.onLoadingFinished("creating scene");
|
|
245
|
+
this.classList.remove("loading");
|
|
246
|
+
this.classList.add("loading-finished");
|
|
247
|
+
if (debug)
|
|
248
|
+
console.log("Needle Engine: finished loading", alias ?? "");
|
|
249
|
+
this.dispatchEvent(new CustomEvent("loadfinished", {
|
|
250
|
+
detail: {
|
|
251
|
+
context: this._context,
|
|
252
|
+
src: alias ?? src
|
|
253
|
+
}
|
|
254
|
+
}));
|
|
255
|
+
}
|
|
256
|
+
|
|
291
257
|
private registerEventFromAttribute(eventName: string, code: string) {
|
|
292
258
|
if (typeof code === "string" && code.length > 0) {
|
|
293
259
|
// indirect eval https://esbuild.github.io/content-types/#direct-eval
|
|
@@ -334,10 +300,6 @@ export class EngineElement extends HTMLElement implements INeedleEngineComponent
|
|
|
334
300
|
this.dispatchEvent(new CustomEvent("exit-vr", { detail: { session: session, context: this._context } }));
|
|
335
301
|
}
|
|
336
302
|
|
|
337
|
-
private onElementsChanged() {
|
|
338
|
-
|
|
339
|
-
}
|
|
340
|
-
|
|
341
303
|
private onSetupAR() {
|
|
342
304
|
this.classList.add(arSessionActiveClassName);
|
|
343
305
|
this.classList.remove(desktopSessionActiveClassName);
|
|
@@ -425,3 +387,25 @@ if (!window.customElements.get(htmlTagName))
|
|
|
425
387
|
|
|
426
388
|
|
|
427
389
|
|
|
390
|
+
|
|
391
|
+
|
|
392
|
+
|
|
393
|
+
|
|
394
|
+
|
|
395
|
+
function getHashFromString(str: string) {
|
|
396
|
+
let hash = 0;
|
|
397
|
+
for (let i = 0; i < str.length; i++) {
|
|
398
|
+
hash = str.charCodeAt(i) + ((hash << 5) - hash);
|
|
399
|
+
}
|
|
400
|
+
return hash;
|
|
401
|
+
}
|
|
402
|
+
|
|
403
|
+
function getNameFromUrl(str: string) {
|
|
404
|
+
const parts = str.split("/");
|
|
405
|
+
let name = parts[parts.length - 1];
|
|
406
|
+
// Remove params
|
|
407
|
+
let index = name.indexOf("?")
|
|
408
|
+
if (index > 0)
|
|
409
|
+
name = name.substring(0, index);
|
|
410
|
+
return name;
|
|
411
|
+
}
|