@needle-tools/engine 4.2.4 → 4.3.0-alpha
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 +15 -0
- package/components.needle.json +1 -1
- package/dist/needle-engine.bundle.js +3517 -3493
- package/dist/needle-engine.bundle.light.js +3520 -3496
- package/dist/needle-engine.bundle.light.min.js +109 -109
- package/dist/needle-engine.bundle.light.umd.cjs +112 -112
- package/dist/needle-engine.bundle.min.js +109 -109
- package/dist/needle-engine.bundle.umd.cjs +106 -106
- package/dist/needle-engine.d.ts +9 -9
- package/dist/needle-engine.js +471 -472
- package/dist/needle-engine.light.d.ts +9 -9
- package/dist/needle-engine.light.js +471 -472
- package/dist/needle-engine.light.min.js +1 -1
- package/dist/needle-engine.light.umd.cjs +1 -1
- package/dist/needle-engine.min.js +1 -1
- package/dist/needle-engine.umd.cjs +1 -1
- package/dist/three-examples.js +825 -794
- package/dist/three-examples.light.js +825 -794
- package/dist/three-examples.light.min.js +12 -12
- package/dist/three-examples.light.umd.cjs +10 -10
- package/dist/three-examples.min.js +12 -12
- package/dist/three-examples.umd.cjs +10 -10
- package/lib/engine/codegen/register_types.js +0 -2
- package/lib/engine/codegen/register_types.js.map +1 -1
- package/lib/engine/engine_addressables.d.ts +3 -0
- package/lib/engine/engine_addressables.js +18 -0
- package/lib/engine/engine_addressables.js.map +1 -1
- package/lib/engine/engine_input.d.ts +20 -1
- package/lib/engine/engine_input.js.map +1 -1
- package/lib/engine/engine_three_utils.d.ts +1 -1
- package/lib/engine/engine_three_utils.js +3 -0
- package/lib/engine/engine_three_utils.js.map +1 -1
- package/lib/engine-components/Collider.d.ts +6 -0
- package/lib/engine-components/Collider.js +34 -26
- package/lib/engine-components/Collider.js.map +1 -1
- package/lib/engine-components/ContactShadows.js +4 -2
- package/lib/engine-components/ContactShadows.js.map +1 -1
- package/lib/engine-components/DropListener.d.ts +4 -9
- package/lib/engine-components/DropListener.js +3 -3
- package/lib/engine-components/DropListener.js.map +1 -1
- package/lib/engine-components/OrbitControls.js +0 -1
- package/lib/engine-components/OrbitControls.js.map +1 -1
- package/lib/engine-components/SceneSwitcher.d.ts +8 -0
- package/lib/engine-components/SceneSwitcher.js +28 -8
- package/lib/engine-components/SceneSwitcher.js.map +1 -1
- package/lib/engine-components/api.d.ts +1 -1
- package/lib/engine-components/codegen/components.d.ts +0 -1
- package/lib/engine-components/codegen/components.js +0 -1
- package/lib/engine-components/codegen/components.js.map +1 -1
- package/lib/engine-components/ui/EventSystem.d.ts +1 -0
- package/lib/engine-components/ui/EventSystem.js +8 -5
- package/lib/engine-components/ui/EventSystem.js.map +1 -1
- package/lib/engine-components/ui/InputField.js +6 -5
- package/lib/engine-components/ui/InputField.js.map +1 -1
- package/package.json +1 -1
- package/plugins/vite/alias.js +6 -3
- package/src/engine/codegen/register_types.ts +0 -2
- package/src/engine/engine_addressables.ts +21 -0
- package/src/engine/engine_input.ts +20 -1
- package/src/engine/engine_three_utils.ts +6 -1
- package/src/engine-components/Collider.ts +37 -30
- package/src/engine-components/ContactShadows.ts +4 -2
- package/src/engine-components/DropListener.ts +5 -5
- package/src/engine-components/OrbitControls.ts +0 -1
- package/src/engine-components/SceneSwitcher.ts +30 -8
- package/src/engine-components/api.ts +1 -1
- package/src/engine-components/codegen/components.ts +0 -1
- package/src/engine-components/ui/EventSystem.ts +9 -7
- package/src/engine-components/ui/InputField.ts +7 -6
|
@@ -217,14 +217,15 @@ export class InputField extends Behaviour {
|
|
|
217
217
|
}
|
|
218
218
|
setTextFromInputField() {
|
|
219
219
|
if (this.textComponent && InputField.htmlField) {
|
|
220
|
-
|
|
220
|
+
const oldValue = this.textComponent.text;
|
|
221
|
+
const newValue = InputField.htmlField.value;
|
|
222
|
+
const changed = this.textComponent.text !== InputField.htmlField.value;
|
|
223
|
+
this.textComponent.text = InputField.htmlField.value;
|
|
224
|
+
if (changed) {
|
|
221
225
|
if (debug)
|
|
222
|
-
console.log("
|
|
223
|
-
const oldValue = this.textComponent.text;
|
|
224
|
-
const newValue = InputField.htmlField.value;
|
|
226
|
+
console.log("[InputField] value changed:", newValue, oldValue);
|
|
225
227
|
this.onValueChanged?.invoke(newValue, oldValue);
|
|
226
228
|
}
|
|
227
|
-
this.textComponent.text = InputField.htmlField.value;
|
|
228
229
|
}
|
|
229
230
|
}
|
|
230
231
|
selectInputField() {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"InputField.js","sourceRoot":"","sources":["../../../src/engine-components/ui/InputField.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"InputField.js","sourceRoot":"","sources":["../../../src/engine-components/ui/InputField.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@needle-tools/engine",
|
|
3
|
-
"version": "4.
|
|
3
|
+
"version": "4.3.0-alpha",
|
|
4
4
|
"description": "Needle Engine is a web-based runtime for 3D apps. It runs on your machine for development with great integrations into editors like Unity or Blender - and can be deployed onto any device! It is flexible, extensible and networking and XR are built-in",
|
|
5
5
|
"main": "dist/needle-engine.min.js",
|
|
6
6
|
"exports": {
|
package/plugins/vite/alias.js
CHANGED
|
@@ -57,6 +57,8 @@ export const needleViteAlias = (command, config, userSettings) => {
|
|
|
57
57
|
}
|
|
58
58
|
if (debug) {
|
|
59
59
|
const outputFilePath = path.resolve(projectDir, 'node_modules/.vite/needle.alias.log');
|
|
60
|
+
const outputDirectory = path.dirname(outputFilePath);
|
|
61
|
+
if (!existsSync(outputDirectory)) mkdirSync(outputDirectory, { recursive: true });
|
|
60
62
|
outputDebugFile = createWriteStream(outputFilePath, { flags: "a" });
|
|
61
63
|
const timestamp = new Date().toISOString();
|
|
62
64
|
outputDebugFile.write("\n\n\n--------------------------\n");
|
|
@@ -68,7 +70,7 @@ export const needleViteAlias = (command, config, userSettings) => {
|
|
|
68
70
|
const aliasPlugin = {
|
|
69
71
|
name: "needle-alias",
|
|
70
72
|
config(config) {
|
|
71
|
-
if (debug)
|
|
73
|
+
if (debug) console.log('[needle-alias] ProjectDirectory: ' + projectDir);
|
|
72
74
|
if (!config.resolve) config.resolve = {};
|
|
73
75
|
if (!config.resolve.alias) config.resolve.alias = {};
|
|
74
76
|
const aliasDict = config.resolve.alias;
|
|
@@ -97,6 +99,7 @@ export const needleViteAlias = (command, config, userSettings) => {
|
|
|
97
99
|
let lastImporter = "";
|
|
98
100
|
/** This plugin logs all imports. This helps to find cases where incorrect folders are found/resolved. */
|
|
99
101
|
|
|
102
|
+
/** @type {import("vite").Plugin} */
|
|
100
103
|
const debuggingPlugin = {
|
|
101
104
|
name: "needle:alias-debug",
|
|
102
105
|
// needs to run before regular resolver
|
|
@@ -115,9 +118,9 @@ export const needleViteAlias = (command, config, userSettings) => {
|
|
|
115
118
|
// verbose logging for all imports
|
|
116
119
|
if (lastImporter !== importer) {
|
|
117
120
|
lastImporter = importer;
|
|
118
|
-
log(
|
|
121
|
+
log(`[needle-alias] Resolving: ${importer} (file${options?.ssr ? ", SSR" : ""})`);
|
|
119
122
|
}
|
|
120
|
-
log(
|
|
123
|
+
log(`[needle-alias] → ${id}`);
|
|
121
124
|
return;
|
|
122
125
|
},
|
|
123
126
|
}
|
|
@@ -36,7 +36,6 @@ import { DeleteBox } from "../../engine-components/DeleteBox.js";
|
|
|
36
36
|
import { Deletable } from "../../engine-components/DeleteBox.js";
|
|
37
37
|
import { DeviceFlag } from "../../engine-components/DeviceFlag.js";
|
|
38
38
|
import { DragControls } from "../../engine-components/DragControls.js";
|
|
39
|
-
import { DropListenerAddedEvent } from "../../engine-components/DropListener.js";
|
|
40
39
|
import { DropListener } from "../../engine-components/DropListener.js";
|
|
41
40
|
import { Duplicatable } from "../../engine-components/Duplicatable.js";
|
|
42
41
|
import { CallInfo } from "../../engine-components/EventList.js";
|
|
@@ -256,7 +255,6 @@ TypeStore.add("DeleteBox", DeleteBox);
|
|
|
256
255
|
TypeStore.add("Deletable", Deletable);
|
|
257
256
|
TypeStore.add("DeviceFlag", DeviceFlag);
|
|
258
257
|
TypeStore.add("DragControls", DragControls);
|
|
259
|
-
TypeStore.add("DropListenerAddedEvent", DropListenerAddedEvent);
|
|
260
258
|
TypeStore.add("DropListener", DropListener);
|
|
261
259
|
TypeStore.add("Duplicatable", Duplicatable);
|
|
262
260
|
TypeStore.add("CallInfo", CallInfo);
|
|
@@ -164,6 +164,11 @@ export class AssetReference {
|
|
|
164
164
|
return this._url;
|
|
165
165
|
}
|
|
166
166
|
|
|
167
|
+
/** The name of the assigned url. This name is deduced from the url and might not reflect the actual name of the asset */
|
|
168
|
+
get urlName(): string {
|
|
169
|
+
return this._urlName;
|
|
170
|
+
};
|
|
171
|
+
|
|
167
172
|
/**
|
|
168
173
|
* @returns true if the uri is a valid URL (http, https, blob)
|
|
169
174
|
*/
|
|
@@ -180,6 +185,7 @@ export class AssetReference {
|
|
|
180
185
|
private _asset: any;
|
|
181
186
|
private _glbRoot?: Object3D | null;
|
|
182
187
|
private _url: string;
|
|
188
|
+
private _urlName: string;
|
|
183
189
|
private _progressListeners: ProgressCallback[] = [];
|
|
184
190
|
|
|
185
191
|
private _hash?: string;
|
|
@@ -191,12 +197,27 @@ export class AssetReference {
|
|
|
191
197
|
/** @internal */
|
|
192
198
|
constructor(uri: string, hash?: string, asset: any = null) {
|
|
193
199
|
this._url = uri;
|
|
200
|
+
|
|
201
|
+
const lastUriPart = uri.lastIndexOf("/");
|
|
202
|
+
if (lastUriPart >= 0) {
|
|
203
|
+
this._urlName = uri.substring(lastUriPart + 1);
|
|
204
|
+
// remove file extension
|
|
205
|
+
const lastDot = this._urlName.lastIndexOf(".");
|
|
206
|
+
if (lastDot >= 0) {
|
|
207
|
+
this._urlName = this._urlName.substring(0, lastDot);
|
|
208
|
+
}
|
|
209
|
+
}
|
|
210
|
+
else {
|
|
211
|
+
this._urlName = uri;
|
|
212
|
+
}
|
|
213
|
+
|
|
194
214
|
this._hash = hash;
|
|
195
215
|
if (uri.includes("?v="))
|
|
196
216
|
this._hashedUri = uri;
|
|
197
217
|
else
|
|
198
218
|
this._hashedUri = hash ? uri + "?v=" + hash : uri;
|
|
199
219
|
if (asset !== null) this.asset = asset;
|
|
220
|
+
|
|
200
221
|
registerPrefabProvider(this._url, this.onResolvePrefab.bind(this));
|
|
201
222
|
}
|
|
202
223
|
|
|
@@ -255,7 +255,26 @@ export class Input implements IInput {
|
|
|
255
255
|
/** Adds an event listener for the specified event type. The callback will be called when the event is triggered.
|
|
256
256
|
* @param type The event type to listen for
|
|
257
257
|
* @param callback The callback to call when the event is triggered
|
|
258
|
-
* @param options The options for adding the event listener
|
|
258
|
+
* @param options The options for adding the event listener.
|
|
259
|
+
* @example Basic usage:
|
|
260
|
+
* ```ts
|
|
261
|
+
* input.addEventListener("pointerdown", (evt) => {
|
|
262
|
+
* console.log("Pointer down", evt.pointerId, evt.pointerType);
|
|
263
|
+
* });
|
|
264
|
+
* ```
|
|
265
|
+
* @example Adding a listener that is called after all other listeners
|
|
266
|
+
* By using a higher value for the queue the listener will be called after other listeners (default queue is 0).
|
|
267
|
+
* ```ts
|
|
268
|
+
* input.addEventListener("pointerdown", (evt) => {
|
|
269
|
+
* console.log("Pointer down", evt.pointerId, evt.pointerType);
|
|
270
|
+
* }, { queue: 10 });
|
|
271
|
+
* ```
|
|
272
|
+
* @example Adding a listener that is only called once
|
|
273
|
+
* ```ts
|
|
274
|
+
* input.addEventListener("pointerdown", (evt) => {
|
|
275
|
+
* console.log("Pointer down", evt.pointerId, evt.pointerType);
|
|
276
|
+
* }, { once: true });
|
|
277
|
+
* ```
|
|
259
278
|
*/
|
|
260
279
|
addEventListener(type: PointerEventNames, callback: PointerEventListener, options?: EventListenerOptions);
|
|
261
280
|
addEventListener(type: KeyboardEventNames, callback: KeyboardEventListener, options?: EventListenerOptions);
|
|
@@ -554,7 +554,7 @@ export function getVisibleInCustomShadowRendering(obj: Object3D): boolean {
|
|
|
554
554
|
* @param layers The layers to include. Typically the main camera's layers.
|
|
555
555
|
* @param result The result box to store the bounding box in. Returns a new box if not passed in.
|
|
556
556
|
*/
|
|
557
|
-
export function getBoundingBox(objects: Object3D[], ignore: ((obj: Object3D) => void | boolean) | Array<Object3D | null | undefined> | undefined = undefined, layers: Layers | undefined | null = undefined, result: Box3 | undefined = undefined): Box3 {
|
|
557
|
+
export function getBoundingBox(objects: Object3D | Object3D[], ignore: ((obj: Object3D) => void | boolean) | Array<Object3D | null | undefined> | undefined = undefined, layers: Layers | undefined | null = undefined, result: Box3 | undefined = undefined): Box3 {
|
|
558
558
|
const box = result || new Box3();
|
|
559
559
|
box.makeEmpty();
|
|
560
560
|
|
|
@@ -607,6 +607,10 @@ export function getBoundingBox(objects: Object3D[], ignore: ((obj: Object3D) =>
|
|
|
607
607
|
}
|
|
608
608
|
}
|
|
609
609
|
let hasAnyObject = false;
|
|
610
|
+
|
|
611
|
+
if (!Array.isArray(objects))
|
|
612
|
+
objects = [objects];
|
|
613
|
+
|
|
610
614
|
for (const object of objects) {
|
|
611
615
|
if (!object) continue;
|
|
612
616
|
hasAnyObject = true;
|
|
@@ -764,6 +768,7 @@ export function postprocessFBXMaterials(obj: Mesh, material: Material | Material
|
|
|
764
768
|
newMaterial.envMap = oldMaterial.envMap;
|
|
765
769
|
newMaterial.alphaMap = oldMaterial.alphaMap;
|
|
766
770
|
newMaterial.metalness = oldMaterial.reflectivity;
|
|
771
|
+
newMaterial.vertexColors = oldMaterial.vertexColors;
|
|
767
772
|
if (oldMaterial.shininess) {
|
|
768
773
|
// from blender source code
|
|
769
774
|
// https://github.com/blender/blender-addons/blob/5e66092bcbe0df6855b3fa814b4826add8b01360/io_scene_fbx/import_fbx.py#L1442
|
|
@@ -137,36 +137,8 @@ export class SphereCollider extends Collider implements ISphereCollider {
|
|
|
137
137
|
export class BoxCollider extends Collider implements IBoxCollider {
|
|
138
138
|
|
|
139
139
|
static add(obj: Mesh | Object3D, opts?: { rigidbody: boolean, debug?: boolean }) {
|
|
140
|
-
const collider =
|
|
141
|
-
|
|
142
|
-
// we need to transform the object into identity
|
|
143
|
-
// because the physics collider will correctly apple the object's transform again
|
|
144
|
-
// if we don't do it here we will have the transform applied twice
|
|
145
|
-
const originalPosition = obj.position.clone();
|
|
146
|
-
const originalQuaternion = obj.quaternion.clone();
|
|
147
|
-
const originalScale = obj.scale.clone();
|
|
148
|
-
obj.position.set(0, 0, 0);
|
|
149
|
-
obj.quaternion.set(0, 0, 0, 1);
|
|
150
|
-
obj.scale.set(1, 1, 1);
|
|
151
|
-
const bb = getBoundingBox([obj]);
|
|
152
|
-
obj.position.copy(originalPosition);
|
|
153
|
-
obj.quaternion.copy(originalQuaternion);
|
|
154
|
-
obj.scale.copy(originalScale);
|
|
155
|
-
|
|
156
|
-
if(opts?.debug) Gizmos.DrawWireBox3(bb, 0xffdd00, 20);
|
|
157
|
-
|
|
158
|
-
// if (!obj.geometry.boundingBox) obj.geometry.computeBoundingBox();
|
|
159
|
-
// const bb = obj.geometry.boundingBox!;
|
|
160
|
-
collider.size = bb!.getSize(new Vector3()) || new Vector3(1, 1, 1);
|
|
161
|
-
collider.center = bb!.getCenter(new Vector3()) || new Vector3(0, 0, 0);
|
|
162
|
-
if (collider.size.length() <= 0) {
|
|
163
|
-
collider.size.set(0.01, 0.01, 0.01);
|
|
164
|
-
}
|
|
165
|
-
|
|
166
|
-
// collider.center.sub(obj.position);
|
|
167
|
-
// collider.size.applyQuaternion(obj.worldQuaternion);
|
|
168
|
-
|
|
169
|
-
addComponent(obj, collider);
|
|
140
|
+
const collider = addComponent(obj, BoxCollider);
|
|
141
|
+
collider.autoFit();
|
|
170
142
|
|
|
171
143
|
if (opts?.rigidbody === true) {
|
|
172
144
|
addComponent(obj, Rigidbody, { isKinematic: false });
|
|
@@ -181,20 +153,55 @@ export class BoxCollider extends Collider implements IBoxCollider {
|
|
|
181
153
|
@serializable(Vector3)
|
|
182
154
|
center: Vector3 = new Vector3(0, 0, 0);
|
|
183
155
|
|
|
156
|
+
/** @internal */
|
|
184
157
|
onEnable() {
|
|
185
158
|
super.onEnable();
|
|
186
159
|
this.context.physics.engine?.addBoxCollider(this, this.size);
|
|
187
160
|
watchWrite(this.gameObject.scale, this.updateProperties);
|
|
188
161
|
}
|
|
189
162
|
|
|
163
|
+
/** @internal */
|
|
190
164
|
onDisable(): void {
|
|
191
165
|
super.onDisable();
|
|
192
166
|
unwatchWrite(this.gameObject.scale, this.updateProperties);
|
|
193
167
|
}
|
|
194
168
|
|
|
169
|
+
/** @internal */
|
|
195
170
|
onValidate(): void {
|
|
196
171
|
this.updateProperties();
|
|
197
172
|
}
|
|
173
|
+
|
|
174
|
+
autoFit(opts?: { debug?: boolean }) {
|
|
175
|
+
const obj = this.gameObject;
|
|
176
|
+
|
|
177
|
+
// we need to transform the object into identity
|
|
178
|
+
// because the physics collider will correctly apple the object's transform again
|
|
179
|
+
// if we don't do it here we will have the transform applied twice
|
|
180
|
+
const originalPosition = obj.position.clone();
|
|
181
|
+
const originalQuaternion = obj.quaternion.clone();
|
|
182
|
+
const originalScale = obj.scale.clone();
|
|
183
|
+
const originalParent = obj.parent;
|
|
184
|
+
obj.position.set(0, 0, 0);
|
|
185
|
+
obj.quaternion.set(0, 0, 0, 1);
|
|
186
|
+
obj.scale.set(1, 1, 1);
|
|
187
|
+
obj.parent = null;
|
|
188
|
+
obj.updateMatrix();
|
|
189
|
+
const bb = getBoundingBox([obj]);
|
|
190
|
+
obj.position.copy(originalPosition);
|
|
191
|
+
obj.quaternion.copy(originalQuaternion);
|
|
192
|
+
obj.scale.copy(originalScale);
|
|
193
|
+
obj.parent = originalParent;
|
|
194
|
+
|
|
195
|
+
if (opts?.debug === true) Gizmos.DrawWireBox3(bb, 0xffdd00, 20);
|
|
196
|
+
|
|
197
|
+
// if (!obj.geometry.boundingBox) obj.geometry.computeBoundingBox();
|
|
198
|
+
// const bb = obj.geometry.boundingBox!;
|
|
199
|
+
this.size = bb!.getSize(new Vector3()) || new Vector3(1, 1, 1);
|
|
200
|
+
this.center = bb!.getCenter(new Vector3()) || new Vector3(0, 0, 0);
|
|
201
|
+
if (this.size.length() <= 0) {
|
|
202
|
+
this.size.set(0.01, 0.01, 0.01);
|
|
203
|
+
}
|
|
204
|
+
}
|
|
198
205
|
}
|
|
199
206
|
|
|
200
207
|
/**
|
|
@@ -371,9 +371,11 @@ export class ContactShadows extends Behaviour {
|
|
|
371
371
|
// Ignore objects that don't render color
|
|
372
372
|
let hide = entry.material.colorWrite == false || mat.wireframe === true || getVisibleInCustomShadowRendering(entry.object) === false;
|
|
373
373
|
// Ignore line materials (e.g. GridHelper)
|
|
374
|
-
if (!hide && (entry.material
|
|
374
|
+
if (!hide && (entry.material["isLineMaterial"]))
|
|
375
|
+
hide = true;
|
|
376
|
+
// Ignore point materials
|
|
377
|
+
if (!hide && (entry.material["isPointsMaterial"]))
|
|
375
378
|
hide = true;
|
|
376
|
-
}
|
|
377
379
|
if (hide) {
|
|
378
380
|
objects_hidden.push(entry.object);
|
|
379
381
|
entry.object["needle:visible"] = entry.object.visible;
|
|
@@ -53,7 +53,7 @@ export declare type DropListenerNetworkEventArguments = {
|
|
|
53
53
|
contentMD5: string;
|
|
54
54
|
}
|
|
55
55
|
|
|
56
|
-
declare type
|
|
56
|
+
export declare type DropListenerOnDropArguments = {
|
|
57
57
|
sender: DropListener,
|
|
58
58
|
/** the root object added to the scene */
|
|
59
59
|
object: Object3D,
|
|
@@ -64,7 +64,7 @@ declare type AddedEventArguments = {
|
|
|
64
64
|
}
|
|
65
65
|
|
|
66
66
|
/** Dispatched when an object is dropped/changed */
|
|
67
|
-
|
|
67
|
+
class DropListenerAddedEvent<T extends DropListenerOnDropArguments> extends CustomEvent<T> {
|
|
68
68
|
constructor(detail: T) {
|
|
69
69
|
super(DropListenerEvents.ObjectAdded, { detail });
|
|
70
70
|
}
|
|
@@ -136,9 +136,9 @@ export class DropListener extends Behaviour {
|
|
|
136
136
|
|
|
137
137
|
/**
|
|
138
138
|
* Invoked after a file has been **added** to the scene.
|
|
139
|
-
* Arguments are {@link
|
|
139
|
+
* Arguments are {@link DropListenerOnDropArguments}
|
|
140
140
|
* @event object-added
|
|
141
|
-
* @param {
|
|
141
|
+
* @param {DropListenerOnDropArguments} evt
|
|
142
142
|
* @example
|
|
143
143
|
* ```typescript
|
|
144
144
|
* dropListener.onDropped.addEventListener((evt) => {
|
|
@@ -146,7 +146,7 @@ export class DropListener extends Behaviour {
|
|
|
146
146
|
* });
|
|
147
147
|
*/
|
|
148
148
|
@serializable(EventList)
|
|
149
|
-
onDropped: EventList<
|
|
149
|
+
onDropped: EventList<DropListenerOnDropArguments> = new EventList();
|
|
150
150
|
|
|
151
151
|
/** @internal */
|
|
152
152
|
onEnable(): void {
|
|
@@ -941,7 +941,6 @@ export class OrbitControls extends Behaviour implements ICameraController {
|
|
|
941
941
|
lookAt.y -= size.y * verticalOffset;
|
|
942
942
|
this.setLookTargetPosition(lookAt, immediate);
|
|
943
943
|
this.setFieldOfView(options.fov, immediate);
|
|
944
|
-
this.autoTarget = false;
|
|
945
944
|
|
|
946
945
|
if (cameraNearFar == undefined || cameraNearFar == "auto") {
|
|
947
946
|
// Check if the scene has a GroundProjectedEnv and include the scale to the far plane so that it doesnt cut off
|
|
@@ -46,6 +46,10 @@ export type LoadSceneEvent = {
|
|
|
46
46
|
index: number;
|
|
47
47
|
}
|
|
48
48
|
|
|
49
|
+
export type LoadSceneProgressEvent = LoadSceneEvent & {
|
|
50
|
+
progress: number,
|
|
51
|
+
}
|
|
52
|
+
|
|
49
53
|
/**
|
|
50
54
|
* The ISceneEventListener is called by the {@link SceneSwitcher} when a scene is loaded or unloaded.
|
|
51
55
|
* It must be added to the root object of your scene (that is being loaded) or on the same object as the SceneSwitcher
|
|
@@ -225,6 +229,15 @@ export class SceneSwitcher extends Behaviour {
|
|
|
225
229
|
*/
|
|
226
230
|
get currentlyLoadedScene() { return this._currentScene; }
|
|
227
231
|
|
|
232
|
+
/**
|
|
233
|
+
* Called when a scene starts loading
|
|
234
|
+
*/
|
|
235
|
+
@serializable(EventList)
|
|
236
|
+
sceneLoadingStart: EventList<LoadSceneEvent> = new EventList();
|
|
237
|
+
|
|
238
|
+
@serializable(EventList)
|
|
239
|
+
sceneLoadingProgress: EventList<ProgressEvent> = new EventList();
|
|
240
|
+
|
|
228
241
|
/**
|
|
229
242
|
* The sceneLoaded event is called when a scene/glTF is loaded and added to the scene
|
|
230
243
|
*/
|
|
@@ -281,7 +294,7 @@ export class SceneSwitcher extends Behaviour {
|
|
|
281
294
|
this._preloadScheduler.maxLoadAhead = this.preloadNext;
|
|
282
295
|
this._preloadScheduler.maxLoadBehind = this.preloadPrevious;
|
|
283
296
|
this._preloadScheduler.maxConcurrent = this.preloadConcurrent;
|
|
284
|
-
this._preloadScheduler.begin();
|
|
297
|
+
this._preloadScheduler.begin(2000);
|
|
285
298
|
|
|
286
299
|
// Begin loading the loading scene
|
|
287
300
|
if (this.autoLoadFirstScene && this._currentIndex === -1 && !await this.tryLoadFromQueryParam()) {
|
|
@@ -602,11 +615,13 @@ export class SceneSwitcher extends Behaviour {
|
|
|
602
615
|
|
|
603
616
|
const loadStartEvt = new CustomEvent<LoadSceneEvent>("loadscene-start", { detail: { scene: scene, switcher: this, index: index } })
|
|
604
617
|
this.dispatchEvent(loadStartEvt);
|
|
618
|
+
this.sceneLoadingStart?.invoke(loadStartEvt.detail);
|
|
605
619
|
await this.onStartLoading();
|
|
606
620
|
// start loading and wait for the scene to be loaded
|
|
607
621
|
await scene.loadAssetAsync((_, prog) => {
|
|
608
622
|
this._currentLoadingProgress = prog;
|
|
609
623
|
this.dispatchEvent(prog);
|
|
624
|
+
this.sceneLoadingProgress?.invoke(prog);
|
|
610
625
|
}).catch(console.error);
|
|
611
626
|
await this.onEndLoading();
|
|
612
627
|
const finishedEvt = new CustomEvent<LoadSceneEvent>("loadscene-finished", { detail: { scene: scene, switcher: this, index: index } });
|
|
@@ -859,26 +874,30 @@ class PreLoadScheduler {
|
|
|
859
874
|
this.maxConcurrent = maxConcurrent;
|
|
860
875
|
}
|
|
861
876
|
|
|
862
|
-
begin() {
|
|
877
|
+
begin(delay: number) {
|
|
863
878
|
if (this._isRunning) return;
|
|
864
|
-
if (debug) console.log("Preload begin")
|
|
879
|
+
if (debug) console.log("Preload begin", { delay })
|
|
865
880
|
this._isRunning = true;
|
|
866
|
-
let lastRoom: number = -
|
|
881
|
+
let lastRoom: number = -10;
|
|
867
882
|
let searchDistance: number;
|
|
868
883
|
let searchCall: number;
|
|
869
884
|
const array = this._switcher.scenes;
|
|
885
|
+
const startTime = Date.now() + delay;
|
|
870
886
|
const interval = setInterval(() => {
|
|
871
887
|
if (this.allLoaded()) {
|
|
872
888
|
if (debug)
|
|
873
|
-
console.log("All scenes loaded");
|
|
889
|
+
console.log("All scenes (pre-)loaded");
|
|
874
890
|
this.stop();
|
|
875
891
|
}
|
|
876
892
|
if (!this._isRunning) {
|
|
877
893
|
clearInterval(interval);
|
|
878
894
|
return;
|
|
879
895
|
}
|
|
896
|
+
|
|
897
|
+
if (Date.now() < startTime) return;
|
|
898
|
+
|
|
880
899
|
if (this.canLoadNewScene() === false) return;
|
|
881
|
-
if (lastRoom !== this._switcher.currentIndex) {
|
|
900
|
+
if (lastRoom === -10 || lastRoom !== this._switcher.currentIndex) {
|
|
882
901
|
lastRoom = this._switcher.currentIndex;
|
|
883
902
|
searchCall = 0;
|
|
884
903
|
searchDistance = 0;
|
|
@@ -892,8 +911,11 @@ class PreLoadScheduler {
|
|
|
892
911
|
if (roomIndex < 0) return;
|
|
893
912
|
// if (roomIndex < 0) roomIndex = array.length + roomIndex;
|
|
894
913
|
if (roomIndex < 0 || roomIndex >= array.length) return;
|
|
895
|
-
|
|
896
|
-
|
|
914
|
+
if (!this._loadTasks.some(t => t.index === roomIndex)) {
|
|
915
|
+
const scene = array[roomIndex];
|
|
916
|
+
if (debug) console.log("Preload scene", { roomIndex, searchForward, lastRoom, currentIndex: this._switcher.currentIndex, tasks: this._loadTasks.length }, scene?.url);
|
|
917
|
+
new LoadTask(roomIndex, scene, this._loadTasks);
|
|
918
|
+
}
|
|
897
919
|
}, 200);
|
|
898
920
|
}
|
|
899
921
|
|
|
@@ -52,7 +52,7 @@ import "./AnimationUtils.js"
|
|
|
52
52
|
import "./AnimationUtilsAutoplay.js"
|
|
53
53
|
|
|
54
54
|
export { DragMode } from "./DragControls.js"
|
|
55
|
-
export type { DropListenerNetworkEventArguments } from "./DropListener.js";
|
|
55
|
+
export type { DropListenerNetworkEventArguments, DropListenerOnDropArguments } from "./DropListener.js";
|
|
56
56
|
export * from "./particlesystem/api.js"
|
|
57
57
|
|
|
58
58
|
// for correct type resolution in JSDoc
|
|
@@ -34,7 +34,6 @@ export { DeleteBox } from "../DeleteBox.js";
|
|
|
34
34
|
export { Deletable } from "../DeleteBox.js";
|
|
35
35
|
export { DeviceFlag } from "../DeviceFlag.js";
|
|
36
36
|
export { DragControls } from "../DragControls.js";
|
|
37
|
-
export { DropListenerAddedEvent } from "../DropListener.js";
|
|
38
37
|
export { DropListener } from "../DropListener.js";
|
|
39
38
|
export { Duplicatable } from "../Duplicatable.js";
|
|
40
39
|
export { CallInfo } from "../EventList.js";
|
|
@@ -59,6 +59,7 @@ export class EventSystem extends Behaviour {
|
|
|
59
59
|
return ctx.scene.getComponent(EventSystem);
|
|
60
60
|
}
|
|
61
61
|
|
|
62
|
+
/** Get the currently active event system */
|
|
62
63
|
static get instance(): EventSystem | null {
|
|
63
64
|
return this.get(Context.Current);
|
|
64
65
|
}
|
|
@@ -75,7 +76,10 @@ export class EventSystem extends Behaviour {
|
|
|
75
76
|
}
|
|
76
77
|
}
|
|
77
78
|
|
|
78
|
-
get hasActiveUI() {
|
|
79
|
+
get hasActiveUI() {
|
|
80
|
+
return this.currentActiveMeshUIComponents.length > 0;
|
|
81
|
+
}
|
|
82
|
+
|
|
79
83
|
get isHoveringObjects() { return this.hoveredByID.size > 0; }
|
|
80
84
|
|
|
81
85
|
awake(): void {
|
|
@@ -424,7 +428,6 @@ export class EventSystem extends Behaviour {
|
|
|
424
428
|
const res = UIRaycastUtils.isInteractable(actualGo, this.out);
|
|
425
429
|
if (!res) return false;
|
|
426
430
|
canvasGroup = this.out.canvasGroup ?? null;
|
|
427
|
-
|
|
428
431
|
const handled = this.handleMeshUIIntersection(object, pressedOrClicked);
|
|
429
432
|
if (!clicked && handled) {
|
|
430
433
|
// return true;
|
|
@@ -753,7 +756,6 @@ export class EventSystem extends Behaviour {
|
|
|
753
756
|
}
|
|
754
757
|
|
|
755
758
|
private resetMeshUIStates() {
|
|
756
|
-
|
|
757
759
|
if (this.context.input.getPointerPressedCount() > 0) {
|
|
758
760
|
MeshUIHelper.resetLastSelected();
|
|
759
761
|
}
|
|
@@ -816,7 +818,7 @@ class MeshUIHelper {
|
|
|
816
818
|
let foundBlock: Object3D | null = null;
|
|
817
819
|
|
|
818
820
|
if (intersect) {
|
|
819
|
-
foundBlock = this.
|
|
821
|
+
foundBlock = this.findBlockOrTextInParent(intersect);
|
|
820
822
|
// console.log(intersect, "-- found block:", foundBlock)
|
|
821
823
|
if (foundBlock && foundBlock !== this.lastSelected) {
|
|
822
824
|
const interactable = foundBlock["interactable"];
|
|
@@ -840,13 +842,13 @@ class MeshUIHelper {
|
|
|
840
842
|
this.needsUpdate = true;
|
|
841
843
|
}
|
|
842
844
|
|
|
843
|
-
static
|
|
845
|
+
static findBlockOrTextInParent(elem: any): Object3D | null {
|
|
844
846
|
if (!elem) return null;
|
|
845
|
-
if (elem.isBlock) {
|
|
847
|
+
if (elem.isBlock || (elem.isText)) {
|
|
846
848
|
// @TODO : Replace states managements
|
|
847
849
|
// if (Object.keys(elem.states).length > 0)
|
|
848
850
|
return elem;
|
|
849
851
|
}
|
|
850
|
-
return this.
|
|
852
|
+
return this.findBlockOrTextInParent(elem.parent);
|
|
851
853
|
}
|
|
852
854
|
}
|
|
@@ -238,14 +238,15 @@ export class InputField extends Behaviour implements IPointerEventHandler {
|
|
|
238
238
|
|
|
239
239
|
private setTextFromInputField() {
|
|
240
240
|
if (this.textComponent && InputField.htmlField) {
|
|
241
|
-
|
|
242
|
-
|
|
243
|
-
|
|
244
|
-
|
|
245
|
-
|
|
241
|
+
const oldValue = this.textComponent.text;
|
|
242
|
+
const newValue = InputField.htmlField.value;
|
|
243
|
+
const changed = this.textComponent.text !== InputField.htmlField.value;
|
|
244
|
+
this.textComponent.text = InputField.htmlField.value;
|
|
245
|
+
|
|
246
|
+
if (changed) {
|
|
247
|
+
if (debug) console.log("[InputField] value changed:", newValue, oldValue);
|
|
246
248
|
this.onValueChanged?.invoke(newValue, oldValue);
|
|
247
249
|
}
|
|
248
|
-
this.textComponent.text = InputField.htmlField.value;
|
|
249
250
|
}
|
|
250
251
|
}
|
|
251
252
|
|