@needle-tools/engine 4.5.2 → 4.5.4
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 +6 -0
- package/dist/{needle-engine.bundle-b57b2055.light.min.js → needle-engine.bundle-3de53f53.light.min.js} +130 -130
- package/dist/{needle-engine.bundle-bcb5a31b.light.umd.cjs → needle-engine.bundle-3fd607cc.light.umd.cjs} +111 -111
- package/dist/{needle-engine.bundle-99bb72c3.js → needle-engine.bundle-49a4fe2f.js} +3071 -3022
- package/dist/{needle-engine.bundle-adcbea18.light.js → needle-engine.bundle-6da875f4.light.js} +3391 -3342
- package/dist/{needle-engine.bundle-caf79082.umd.cjs → needle-engine.bundle-8959a299.umd.cjs} +111 -111
- package/dist/{needle-engine.bundle-ac883b5a.min.js → needle-engine.bundle-9f1a1512.min.js} +130 -130
- package/dist/needle-engine.js +194 -193
- package/dist/needle-engine.light.js +194 -193
- 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/lib/engine/engine_gameobject.js +23 -3
- package/lib/engine/engine_gameobject.js.map +1 -1
- package/lib/engine/engine_loaders.js +2 -0
- package/lib/engine/engine_loaders.js.map +1 -1
- package/lib/engine/engine_serialization_core.d.ts +10 -1
- package/lib/engine/engine_serialization_core.js +5 -4
- package/lib/engine/engine_serialization_core.js.map +1 -1
- package/lib/engine/engine_utils_format.d.ts +2 -1
- package/lib/engine/engine_utils_format.js +28 -1
- package/lib/engine/engine_utils_format.js.map +1 -1
- package/lib/engine-components/DropListener.js +32 -20
- package/lib/engine-components/DropListener.js.map +1 -1
- package/package.json +1 -1
- package/src/engine/engine_gameobject.ts +24 -6
- package/src/engine/engine_loaders.ts +3 -0
- package/src/engine/engine_serialization_core.ts +22 -12
- package/src/engine/engine_utils_format.ts +31 -2
- package/src/engine-components/DropListener.ts +38 -23
|
@@ -1,5 +1,4 @@
|
|
|
1
1
|
import { AxesHelper, Box3, Cache, Object3D, Vector2, Vector3 } from "three";
|
|
2
|
-
import type { GLTF } from "three/examples/jsm/loaders/GLTFLoader.js";
|
|
3
2
|
|
|
4
3
|
import { isDevEnvironment } from "../engine/debug/index.js";
|
|
5
4
|
import { AnimationUtils } from "../engine/engine_animation.js";
|
|
@@ -15,6 +14,7 @@ import { serializable } from "../engine/engine_serialization_decorator.js";
|
|
|
15
14
|
import { fitObjectIntoVolume, getBoundingBox, placeOnSurface } from "../engine/engine_three_utils.js";
|
|
16
15
|
import { IGameObject, Model, Vec3 } from "../engine/engine_types.js";
|
|
17
16
|
import { getParam, setParamWithoutReload } from "../engine/engine_utils.js";
|
|
17
|
+
import { determineMimeTypeFromExtension } from "../engine/engine_utils_format.js";
|
|
18
18
|
import { Animation } from "./Animation.js";
|
|
19
19
|
import { Behaviour } from "./Component.js";
|
|
20
20
|
import { EventList } from "./EventList.js";
|
|
@@ -398,6 +398,7 @@ export class DropListener extends Behaviour {
|
|
|
398
398
|
if (!Array.isArray(fileList)) return;
|
|
399
399
|
if (!fileList.length) return;
|
|
400
400
|
|
|
401
|
+
|
|
401
402
|
this.deleteDropEvent();
|
|
402
403
|
this.removePreviouslyAddedObjects();
|
|
403
404
|
setParamWithoutReload(blobKeyName, null);
|
|
@@ -408,7 +409,20 @@ export class DropListener extends Behaviour {
|
|
|
408
409
|
|
|
409
410
|
for (const file of fileList) {
|
|
410
411
|
if (!file) continue;
|
|
411
|
-
|
|
412
|
+
|
|
413
|
+
if (file.type.startsWith("image/")) {
|
|
414
|
+
// Ignore dropped images
|
|
415
|
+
if (debug) console.warn("Ignoring dropped image file", file.name, file.type);
|
|
416
|
+
continue;
|
|
417
|
+
}
|
|
418
|
+
else if (file.name.endsWith(".bin")) {
|
|
419
|
+
// Ignore dropped binary files
|
|
420
|
+
if (debug) console.warn("Ignoring dropped binary file", file.name, file.type);
|
|
421
|
+
continue;
|
|
422
|
+
}
|
|
423
|
+
|
|
424
|
+
|
|
425
|
+
console.debug("Load file " + file.name + " + " + file.type);
|
|
412
426
|
const res = await FileHelper.loadFile(file, this.context, { guid: this.guid });
|
|
413
427
|
if (res) {
|
|
414
428
|
this.dispatchEvent(new CustomEvent(DropListenerEvents.FileDropped, { detail: file }));
|
|
@@ -625,38 +639,39 @@ namespace FileHelper {
|
|
|
625
639
|
* @returns Promise containing the loaded model and its content hash, or null if loading failed
|
|
626
640
|
*/
|
|
627
641
|
export async function loadFile(file: File, context: Context, args: { guid: string }): Promise<{ model: Model, contentMD5: string } | null> {
|
|
628
|
-
|
|
629
|
-
|
|
630
|
-
|
|
631
|
-
|
|
632
|
-
|
|
633
|
-
|
|
634
|
-
|
|
635
|
-
|
|
636
|
-
|
|
637
|
-
|
|
642
|
+
// first load it locally
|
|
643
|
+
const seed = args.guid;
|
|
644
|
+
const prov = new InstantiateIdProvider(seed);
|
|
645
|
+
|
|
646
|
+
const blob = new Blob([file], { type: file.type || determineMimeTypeFromExtension(file.name) || undefined });
|
|
647
|
+
const objectUrl = URL.createObjectURL(blob);
|
|
648
|
+
|
|
649
|
+
const model = await getLoader().loadSync(context, objectUrl, file.name, prov).catch(err => {
|
|
650
|
+
console.error(`Failed to load file "${file.name}" (${file.type}):`, err);
|
|
651
|
+
return null;
|
|
652
|
+
})
|
|
653
|
+
|
|
654
|
+
URL.revokeObjectURL(objectUrl); // clean up the object URL
|
|
655
|
+
|
|
656
|
+
if (model) {
|
|
638
657
|
return new Promise((resolve, _reject) => {
|
|
639
658
|
const reader = new FileReader()
|
|
640
659
|
reader.readAsArrayBuffer(file);
|
|
641
660
|
reader.onloadend = async (_ev: ProgressEvent<FileReader>) => {
|
|
642
661
|
const content = reader.result as ArrayBuffer;
|
|
643
|
-
|
|
644
|
-
|
|
645
|
-
const prov = new InstantiateIdProvider(seed);
|
|
646
|
-
const model = await getLoader().parseSync(context, content, file.name, prov);
|
|
647
|
-
if (model) {
|
|
648
|
-
const hash = BlobStorage.hashMD5(content);
|
|
649
|
-
resolve({ model, contentMD5: hash });
|
|
650
|
-
}
|
|
662
|
+
const hash = BlobStorage.hashMD5(content);
|
|
663
|
+
return resolve({ model, contentMD5: hash });
|
|
651
664
|
};
|
|
652
665
|
});
|
|
653
666
|
}
|
|
654
667
|
else {
|
|
655
|
-
console.warn(
|
|
668
|
+
console.warn(`Failed to load "${file.name}" (${file.type})`);
|
|
669
|
+
return null;
|
|
656
670
|
}
|
|
657
|
-
|
|
658
|
-
return null;
|
|
659
671
|
}
|
|
672
|
+
// return new Promise((resolve, _reject) => {
|
|
673
|
+
// });
|
|
674
|
+
// }
|
|
660
675
|
|
|
661
676
|
/**
|
|
662
677
|
* Loads a 3D model from a URL with progress visualization
|