@flighthq/scene3d-resources 0.2.1-next.840.857425c
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/dist/awd2Load.d.ts +3 -0
- package/dist/awd2Load.d.ts.map +1 -0
- package/dist/awd2Load.js +15 -0
- package/dist/awd2Load.js.map +1 -0
- package/dist/enableScene3DResourceFailureGuards.d.ts +5 -0
- package/dist/enableScene3DResourceFailureGuards.d.ts.map +1 -0
- package/dist/enableScene3DResourceFailureGuards.js +52 -0
- package/dist/enableScene3DResourceFailureGuards.js.map +1 -0
- package/dist/getScene3DResourceTextures.d.ts +3 -0
- package/dist/getScene3DResourceTextures.d.ts.map +1 -0
- package/dist/getScene3DResourceTextures.js +37 -0
- package/dist/getScene3DResourceTextures.js.map +1 -0
- package/dist/gltfLoad.d.ts +4 -0
- package/dist/gltfLoad.d.ts.map +1 -0
- package/dist/gltfLoad.js +58 -0
- package/dist/gltfLoad.js.map +1 -0
- package/dist/imageResourceFetch.d.ts +4 -0
- package/dist/imageResourceFetch.d.ts.map +1 -0
- package/dist/imageResourceFetch.js +29 -0
- package/dist/imageResourceFetch.js.map +1 -0
- package/dist/index.d.ts +18 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +18 -0
- package/dist/index.js.map +1 -0
- package/dist/md2Load.d.ts +3 -0
- package/dist/md2Load.d.ts.map +1 -0
- package/dist/md2Load.js +15 -0
- package/dist/md2Load.js.map +1 -0
- package/dist/md5Load.d.ts +3 -0
- package/dist/md5Load.d.ts.map +1 -0
- package/dist/md5Load.js +15 -0
- package/dist/md5Load.js.map +1 -0
- package/dist/objLoad.d.ts +3 -0
- package/dist/objLoad.d.ts.map +1 -0
- package/dist/objLoad.js +16 -0
- package/dist/objLoad.js.map +1 -0
- package/dist/resolveScene3DResources.d.ts +4 -0
- package/dist/resolveScene3DResources.d.ts.map +1 -0
- package/dist/resolveScene3DResources.js +175 -0
- package/dist/resolveScene3DResources.js.map +1 -0
- package/dist/resolveScene3DResourcesAndWait.d.ts +4 -0
- package/dist/resolveScene3DResourcesAndWait.d.ts.map +1 -0
- package/dist/resolveScene3DResourcesAndWait.js +57 -0
- package/dist/resolveScene3DResourcesAndWait.js.map +1 -0
- package/dist/revealScene3DResourcesOnResolve.d.ts +3 -0
- package/dist/revealScene3DResourcesOnResolve.d.ts.map +1 -0
- package/dist/revealScene3DResourcesOnResolve.js +95 -0
- package/dist/revealScene3DResourcesOnResolve.js.map +1 -0
- package/dist/sceneDocumentSource.d.ts +6 -0
- package/dist/sceneDocumentSource.d.ts.map +1 -0
- package/dist/sceneDocumentSource.js +55 -0
- package/dist/sceneDocumentSource.js.map +1 -0
- package/dist/sceneMaterialTextureRegistry.d.ts +6 -0
- package/dist/sceneMaterialTextureRegistry.d.ts.map +1 -0
- package/dist/sceneMaterialTextureRegistry.js +43 -0
- package/dist/sceneMaterialTextureRegistry.js.map +1 -0
- package/dist/sceneResourceRecovery.d.ts +5 -0
- package/dist/sceneResourceRecovery.d.ts.map +1 -0
- package/dist/sceneResourceRecovery.js +43 -0
- package/dist/sceneResourceRecovery.js.map +1 -0
- package/dist/sceneResourceResolver.d.ts +5 -0
- package/dist/sceneResourceResolver.d.ts.map +1 -0
- package/dist/sceneResourceResolver.js +41 -0
- package/dist/sceneResourceResolver.js.map +1 -0
- package/dist/sceneResourceSignals.d.ts +5 -0
- package/dist/sceneResourceSignals.d.ts.map +1 -0
- package/dist/sceneResourceSignals.js +21 -0
- package/dist/sceneResourceSignals.js.map +1 -0
- package/dist/threeDsLoad.d.ts +3 -0
- package/dist/threeDsLoad.d.ts.map +1 -0
- package/dist/threeDsLoad.js +14 -0
- package/dist/threeDsLoad.js.map +1 -0
- package/package.json +55 -0
- package/src/awd2Load.test.ts +63 -0
- package/src/enableScene3DResourceFailureGuards.test.ts +116 -0
- package/src/getScene3DResourceTextures.test.ts +101 -0
- package/src/gltfLoad.test.ts +118 -0
- package/src/imageResourceFetch.test.ts +95 -0
- package/src/md2Load.test.ts +63 -0
- package/src/md5Load.test.ts +63 -0
- package/src/objLoad.test.ts +63 -0
- package/src/resolveScene3DResources.test.ts +335 -0
- package/src/resolveScene3DResourcesAndWait.test.ts +119 -0
- package/src/revealScene3DResourcesOnResolve.test.ts +164 -0
- package/src/sceneDocumentSource.test.ts +116 -0
- package/src/sceneMaterialTextureRegistry.test.ts +95 -0
- package/src/sceneResourceRecovery.test.ts +98 -0
- package/src/sceneResourceResolver.test.ts +80 -0
- package/src/sceneResourceResolverTreeShaking.test.ts +51 -0
- package/src/sceneResourceSignals.test.ts +51 -0
- package/src/threeDsLoad.test.ts +63 -0
|
@@ -0,0 +1,3 @@
|
|
|
1
|
+
import type { Scene3DDocument, Scene3DDocumentLoadOptions } from '@flighthq/types';
|
|
2
|
+
export declare function loadScene3DDocumentFromAwd2Url(url: string, options?: Readonly<Scene3DDocumentLoadOptions>): Promise<Scene3DDocument | null>;
|
|
3
|
+
//# sourceMappingURL=awd2Load.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"awd2Load.d.ts","sourceRoot":"","sources":["../src/awd2Load.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,eAAe,EAAE,0BAA0B,EAAE,MAAM,iBAAiB,CAAC;AAQnF,wBAAsB,8BAA8B,CAClD,GAAG,EAAE,MAAM,EACX,OAAO,CAAC,EAAE,QAAQ,CAAC,0BAA0B,CAAC,GAC7C,OAAO,CAAC,eAAe,GAAG,IAAI,CAAC,CAMjC"}
|
package/dist/awd2Load.js
ADDED
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
import { parseAwd2 } from '@flighthq/scene3d-formats';
|
|
2
|
+
import { loadScene3DDocumentBytesFromUrl, setScene3DDocumentResourceBasePathFromUrl } from './sceneDocumentSource';
|
|
3
|
+
// Fetches an Away3D AWD file from a URL and parses it into a format-neutral Scene3DDocument (geometry, skins,
|
|
4
|
+
// and its skeleton animation). Fetches only the FILE — the document's texture refs stay unresolved; assemble
|
|
5
|
+
// with createScene3DFromDocument and resolve on your own schedule with resolveScene3DResources. On a fetch
|
|
6
|
+
// failure returns null; it never creates a renderer or GPU resource.
|
|
7
|
+
export async function loadScene3DDocumentFromAwd2Url(url, options) {
|
|
8
|
+
const bytes = await loadScene3DDocumentBytesFromUrl(url, options);
|
|
9
|
+
if (bytes === null)
|
|
10
|
+
return null;
|
|
11
|
+
const document = parseAwd2(bytes);
|
|
12
|
+
setScene3DDocumentResourceBasePathFromUrl(document, url);
|
|
13
|
+
return document;
|
|
14
|
+
}
|
|
15
|
+
//# sourceMappingURL=awd2Load.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"awd2Load.js","sourceRoot":"","sources":["../src/awd2Load.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,2BAA2B,CAAC;AAGtD,OAAO,EAAE,+BAA+B,EAAE,yCAAyC,EAAE,MAAM,uBAAuB,CAAC;AAEnH,8GAA8G;AAC9G,6GAA6G;AAC7G,2GAA2G;AAC3G,qEAAqE;AACrE,MAAM,CAAC,KAAK,UAAU,8BAA8B,CAClD,GAAW,EACX,OAA8C;IAE9C,MAAM,KAAK,GAAG,MAAM,+BAA+B,CAAC,GAAG,EAAE,OAAO,CAAC,CAAC;IAClE,IAAI,KAAK,KAAK,IAAI;QAAE,OAAO,IAAI,CAAC;IAChC,MAAM,QAAQ,GAAG,SAAS,CAAC,KAAK,CAAC,CAAC;IAClC,yCAAyC,CAAC,QAAQ,EAAE,GAAG,CAAC,CAAC;IACzD,OAAO,QAAQ,CAAC;AAClB,CAAC"}
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
import type { Scene3DResourceResolver } from '@flighthq/types';
|
|
2
|
+
export declare function areScene3DResourceFailureGuardsEnabled(resolver: Readonly<Scene3DResourceResolver>): boolean;
|
|
3
|
+
export declare function disableScene3DResourceFailureGuards(resolver: Scene3DResourceResolver): void;
|
|
4
|
+
export declare function enableScene3DResourceFailureGuards(resolver: Scene3DResourceResolver): () => void;
|
|
5
|
+
//# sourceMappingURL=enableScene3DResourceFailureGuards.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"enableScene3DResourceFailureGuards.d.ts","sourceRoot":"","sources":["../src/enableScene3DResourceFailureGuards.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAwB,uBAAuB,EAAE,MAAM,iBAAiB,CAAC;AAOrF,wBAAgB,sCAAsC,CAAC,QAAQ,EAAE,QAAQ,CAAC,uBAAuB,CAAC,GAAG,OAAO,CAE3G;AAGD,wBAAgB,mCAAmC,CAAC,QAAQ,EAAE,uBAAuB,GAAG,IAAI,CAO3F;AAMD,wBAAgB,kCAAkC,CAAC,QAAQ,EAAE,uBAAuB,GAAG,MAAM,IAAI,CA6BhG"}
|
|
@@ -0,0 +1,52 @@
|
|
|
1
|
+
import { logOnce } from '@flighthq/log';
|
|
2
|
+
import { connectSignal, disconnectSignal } from '@flighthq/signals';
|
|
3
|
+
import { LogLevel } from '@flighthq/types';
|
|
4
|
+
import { explainImageResourceReferenceResolution } from './sceneResourceRecovery';
|
|
5
|
+
import { enableScene3DResourceSignals } from './sceneResourceSignals';
|
|
6
|
+
// Returns whether the failure guard is installed on `resolver`.
|
|
7
|
+
export function areScene3DResourceFailureGuardsEnabled(resolver) {
|
|
8
|
+
return _guards.has(resolver);
|
|
9
|
+
}
|
|
10
|
+
// Removes the resolver-scoped guard. Repeated calls are harmless.
|
|
11
|
+
export function disableScene3DResourceFailureGuards(resolver) {
|
|
12
|
+
const guard = _guards.get(resolver);
|
|
13
|
+
if (guard === undefined)
|
|
14
|
+
return;
|
|
15
|
+
const signals = enableScene3DResourceSignals(resolver);
|
|
16
|
+
disconnectSignal(signals.onResourceFailed, guard.failed);
|
|
17
|
+
disconnectSignal(signals.onResourceResolved, guard.resolved);
|
|
18
|
+
_guards.delete(resolver);
|
|
19
|
+
}
|
|
20
|
+
// Installs an opt-in warning guard over the resolver's failure signal. The async resolver still
|
|
21
|
+
// settles normally and never throws for an expected unavailable image; diagnostics remain in this
|
|
22
|
+
// separately imported module so the base resolver does not carry @flighthq/log. One shared reference
|
|
23
|
+
// warns once per failed attempt, even when several Texture subscribers receive the event. Idempotent.
|
|
24
|
+
export function enableScene3DResourceFailureGuards(resolver) {
|
|
25
|
+
if (_guards.has(resolver))
|
|
26
|
+
return () => disableScene3DResourceFailureGuards(resolver);
|
|
27
|
+
const warned = new WeakMap();
|
|
28
|
+
const signals = enableScene3DResourceSignals(resolver);
|
|
29
|
+
const failed = (event) => {
|
|
30
|
+
if (warned.has(event.ref) && warned.get(event.ref) === event.ref.failure)
|
|
31
|
+
return;
|
|
32
|
+
warned.set(event.ref, event.ref.failure);
|
|
33
|
+
const explanation = explainImageResourceReferenceResolution(event.ref);
|
|
34
|
+
logOnce(`scene-resources:image-resource-resolution-failed:${++_attemptId}`, LogLevel.Warn, {
|
|
35
|
+
failureKind: explanation.failure?.kind ?? null,
|
|
36
|
+
failureName: explanation.failure?.name ?? null,
|
|
37
|
+
failureMessage: explanation.failure?.message ?? null,
|
|
38
|
+
message: 'resolveScene3DResources: image resource resolution failed — call retryFailedScene3DResources to request it again',
|
|
39
|
+
resourceKind: explanation.kind,
|
|
40
|
+
}, 'scene-resources');
|
|
41
|
+
};
|
|
42
|
+
const resolved = (event) => {
|
|
43
|
+
warned.delete(event.ref);
|
|
44
|
+
};
|
|
45
|
+
connectSignal(signals.onResourceFailed, failed);
|
|
46
|
+
connectSignal(signals.onResourceResolved, resolved);
|
|
47
|
+
_guards.set(resolver, { failed, resolved });
|
|
48
|
+
return () => disableScene3DResourceFailureGuards(resolver);
|
|
49
|
+
}
|
|
50
|
+
const _guards = new WeakMap();
|
|
51
|
+
let _attemptId = 0;
|
|
52
|
+
//# sourceMappingURL=enableScene3DResourceFailureGuards.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"enableScene3DResourceFailureGuards.js","sourceRoot":"","sources":["../src/enableScene3DResourceFailureGuards.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,3 @@
|
|
|
1
|
+
import type { Scene3DMaterialTextureRegistry, Node3D, Texture } from '@flighthq/types';
|
|
2
|
+
export declare function getScene3DResourceTextures(scene: Readonly<Node3D>, registry: Readonly<Scene3DMaterialTextureRegistry>, out: Texture[]): void;
|
|
3
|
+
//# sourceMappingURL=getScene3DResourceTextures.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"getScene3DResourceTextures.d.ts","sourceRoot":"","sources":["../src/getScene3DResourceTextures.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAY,8BAA8B,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,iBAAiB,CAAC;AASjG,wBAAgB,0BAA0B,CACxC,KAAK,EAAE,QAAQ,CAAC,MAAM,CAAC,EACvB,QAAQ,EAAE,QAAQ,CAAC,8BAA8B,CAAC,EAClD,GAAG,EAAE,OAAO,EAAE,GACb,IAAI,CAUN"}
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
import { forEachNodeDescendant } from '@flighthq/node';
|
|
2
|
+
import { isMesh } from '@flighthq/scene3d';
|
|
3
|
+
import { getScene3DMaterialTextures } from './sceneMaterialTextureRegistry';
|
|
4
|
+
// Clears `out`, then fills it with the unique Textures reachable through `scene` whose `resource` is
|
|
5
|
+
// non-null. Walks the root node and every descendant; for each
|
|
6
|
+
// Mesh node it enumerates each non-null material's texture slots through the registry. Shared
|
|
7
|
+
// Textures (a parser memoizes one Texture object across meshes) are deduped by identity, so a
|
|
8
|
+
// resolver requests each pending image at most once.
|
|
9
|
+
export function getScene3DResourceTextures(scene, registry, out) {
|
|
10
|
+
out.length = 0;
|
|
11
|
+
const seen = new Set();
|
|
12
|
+
const slots = [];
|
|
13
|
+
collectNodeResourceTextures(scene, registry, out, seen, slots);
|
|
14
|
+
// forEachNodeDescendant yields Node<Node3DTraits>; the intersection Node3D is re-narrowed by
|
|
15
|
+
// isMesh inside the collector, so the cast only restores the trait fields the walk generic drops.
|
|
16
|
+
forEachNodeDescendant(scene, (node) => collectNodeResourceTextures(node, registry, out, seen, slots));
|
|
17
|
+
}
|
|
18
|
+
function collectNodeResourceTextures(node, registry, out, seen, slots) {
|
|
19
|
+
if (!isMesh(node))
|
|
20
|
+
return;
|
|
21
|
+
const materials = node.materials;
|
|
22
|
+
for (let i = 0; i < materials.length; i++) {
|
|
23
|
+
const material = materials[i];
|
|
24
|
+
if (material === null)
|
|
25
|
+
continue;
|
|
26
|
+
slots.length = 0;
|
|
27
|
+
getScene3DMaterialTextures(registry, material, slots);
|
|
28
|
+
for (let j = 0; j < slots.length; j++) {
|
|
29
|
+
const texture = slots[j];
|
|
30
|
+
if (texture.resource == null || seen.has(texture))
|
|
31
|
+
continue;
|
|
32
|
+
seen.add(texture);
|
|
33
|
+
out.push(texture);
|
|
34
|
+
}
|
|
35
|
+
}
|
|
36
|
+
}
|
|
37
|
+
//# sourceMappingURL=getScene3DResourceTextures.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"getScene3DResourceTextures.js","sourceRoot":"","sources":["../src/getScene3DResourceTextures.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,qBAAqB,EAAE,MAAM,gBAAgB,CAAC;AACvD,OAAO,EAAE,MAAM,EAAE,MAAM,mBAAmB,CAAC;AAG3C,OAAO,EAAE,0BAA0B,EAAE,MAAM,gCAAgC,CAAC;AAE5E,qGAAqG;AACrG,+DAA+D;AAC/D,8FAA8F;AAC9F,8FAA8F;AAC9F,qDAAqD;AACrD,MAAM,UAAU,0BAA0B,CACxC,KAAuB,EACvB,QAAkD,EAClD,GAAc;IAEd,GAAG,CAAC,MAAM,GAAG,CAAC,CAAC;IACf,MAAM,IAAI,GAAG,IAAI,GAAG,EAAW,CAAC;IAChC,MAAM,KAAK,GAAc,EAAE,CAAC;IAC5B,2BAA2B,CAAC,KAAK,EAAE,QAAQ,EAAE,GAAG,EAAE,IAAI,EAAE,KAAK,CAAC,CAAC;IAC/D,6FAA6F;IAC7F,kGAAkG;IAClG,qBAAqB,CAAC,KAAK,EAAE,CAAC,IAAI,EAAE,EAAE,CACpC,2BAA2B,CAAC,IAAwB,EAAE,QAAQ,EAAE,GAAG,EAAE,IAAI,EAAE,KAAK,CAAC,CAClF,CAAC;AACJ,CAAC;AAED,SAAS,2BAA2B,CAClC,IAAsB,EACtB,QAAkD,EAClD,GAAc,EACd,IAAkB,EAClB,KAAgB;IAEhB,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC;QAAE,OAAO;IAC1B,MAAM,SAAS,GAAG,IAAI,CAAC,SAAS,CAAC;IACjC,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,SAAS,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;QAC1C,MAAM,QAAQ,GAAG,SAAS,CAAC,CAAC,CAAoB,CAAC;QACjD,IAAI,QAAQ,KAAK,IAAI;YAAE,SAAS;QAChC,KAAK,CAAC,MAAM,GAAG,CAAC,CAAC;QACjB,0BAA0B,CAAC,QAAQ,EAAE,QAAQ,EAAE,KAAK,CAAC,CAAC;QACtD,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,KAAK,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;YACtC,MAAM,OAAO,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC;YACzB,IAAI,OAAO,CAAC,QAAQ,IAAI,IAAI,IAAI,IAAI,CAAC,GAAG,CAAC,OAAO,CAAC;gBAAE,SAAS;YAC5D,IAAI,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;YAClB,GAAG,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;QACpB,CAAC;IACH,CAAC;AACH,CAAC"}
|
|
@@ -0,0 +1,4 @@
|
|
|
1
|
+
import type { Scene3DDocument, Scene3DDocumentLoadOptions } from '@flighthq/types';
|
|
2
|
+
export declare function loadScene3DDocumentFromGlbUrl(url: string, options?: Readonly<Scene3DDocumentLoadOptions>): Promise<Scene3DDocument | null>;
|
|
3
|
+
export declare function loadScene3DDocumentFromGltfUrl(url: string, options?: Readonly<Scene3DDocumentLoadOptions>): Promise<Scene3DDocument | null>;
|
|
4
|
+
//# sourceMappingURL=gltfLoad.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"gltfLoad.d.ts","sourceRoot":"","sources":["../src/gltfLoad.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAgB,eAAe,EAAE,0BAA0B,EAAE,MAAM,iBAAiB,CAAC;AAWjG,wBAAsB,6BAA6B,CACjD,GAAG,EAAE,MAAM,EACX,OAAO,CAAC,EAAE,QAAQ,CAAC,0BAA0B,CAAC,GAC7C,OAAO,CAAC,eAAe,GAAG,IAAI,CAAC,CAIjC;AAMD,wBAAsB,8BAA8B,CAClD,GAAG,EAAE,MAAM,EACX,OAAO,CAAC,EAAE,QAAQ,CAAC,0BAA0B,CAAC,GAC7C,OAAO,CAAC,eAAe,GAAG,IAAI,CAAC,CAgBjC"}
|
package/dist/gltfLoad.js
ADDED
|
@@ -0,0 +1,58 @@
|
|
|
1
|
+
import { parseGlb, parseGltf } from '@flighthq/scene3d-formats';
|
|
2
|
+
import { getScene3DDocumentBasePathFromUrl, loadScene3DDocumentBytesFromUrl, loadScene3DDocumentTextFromUrl, } from './sceneDocumentSource';
|
|
3
|
+
// Fetches a binary glTF (`.glb`) from a URL and parses it into a format-neutral Scene3DDocument. Fetches only
|
|
4
|
+
// the FILE — the document's texture refs stay unresolved; assemble with createScene3DFromDocument and load
|
|
5
|
+
// resources on your own schedule. Returns null on transport failure and never touches rendering/GPU state.
|
|
6
|
+
export async function loadScene3DDocumentFromGlbUrl(url, options) {
|
|
7
|
+
const bytes = await loadScene3DDocumentBytesFromUrl(url, options);
|
|
8
|
+
if (bytes === null)
|
|
9
|
+
return null;
|
|
10
|
+
return parseGlb(bytes, undefined, { basePath: getScene3DDocumentBasePathFromUrl(url) });
|
|
11
|
+
}
|
|
12
|
+
// Fetches a glTF file from a URL and parses it into a format-neutral Scene3DDocument. The JSON `.gltf` form is
|
|
13
|
+
// fetched as text; every external `.bin` required to build inline geometry is fetched too, while image URIs
|
|
14
|
+
// remain unresolved resource refs carrying the model's base path. Assemble with createScene3DFromDocument and
|
|
15
|
+
// load images explicitly. Returns null if the main source or required geometry closure cannot be acquired.
|
|
16
|
+
export async function loadScene3DDocumentFromGltfUrl(url, options) {
|
|
17
|
+
const source = await loadScene3DDocumentTextFromUrl(url, options);
|
|
18
|
+
if (source === null)
|
|
19
|
+
return null;
|
|
20
|
+
let gltf;
|
|
21
|
+
try {
|
|
22
|
+
gltf = JSON.parse(source);
|
|
23
|
+
}
|
|
24
|
+
catch {
|
|
25
|
+
return null;
|
|
26
|
+
}
|
|
27
|
+
if (gltf === null || typeof gltf !== 'object')
|
|
28
|
+
return null;
|
|
29
|
+
const basePath = getScene3DDocumentBasePathFromUrl(url);
|
|
30
|
+
const externalBuffers = await loadGltfExternalBuffers(gltf, basePath, options);
|
|
31
|
+
if (externalBuffers === null)
|
|
32
|
+
return null;
|
|
33
|
+
return parseGltf(gltf, undefined, { basePath, externalBuffers });
|
|
34
|
+
}
|
|
35
|
+
async function loadGltfExternalBuffers(gltf, basePath, options) {
|
|
36
|
+
const uris = new Set();
|
|
37
|
+
for (const buffer of gltf.buffers ?? []) {
|
|
38
|
+
const uri = buffer.uri;
|
|
39
|
+
if (uri !== undefined && !uri.startsWith('data:'))
|
|
40
|
+
uris.add(uri);
|
|
41
|
+
}
|
|
42
|
+
const externalBuffers = {};
|
|
43
|
+
const entries = [...uris];
|
|
44
|
+
const bytes = await Promise.all(entries.map((uri) => loadScene3DDocumentBytesFromUrl(resolveGltfBufferUrl(uri, basePath), options)));
|
|
45
|
+
for (let i = 0; i < entries.length; i++) {
|
|
46
|
+
const value = bytes[i];
|
|
47
|
+
if (value === null)
|
|
48
|
+
return null;
|
|
49
|
+
externalBuffers[entries[i]] = value;
|
|
50
|
+
}
|
|
51
|
+
return externalBuffers;
|
|
52
|
+
}
|
|
53
|
+
function resolveGltfBufferUrl(uri, basePath) {
|
|
54
|
+
if (basePath === null || uri.startsWith('/') || /^[a-zA-Z][a-zA-Z0-9+.-]*:/.test(uri))
|
|
55
|
+
return uri;
|
|
56
|
+
return basePath.endsWith('/') ? `${basePath}${uri}` : `${basePath}/${uri}`;
|
|
57
|
+
}
|
|
58
|
+
//# sourceMappingURL=gltfLoad.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"gltfLoad.js","sourceRoot":"","sources":["../src/gltfLoad.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,4 @@
|
|
|
1
|
+
import type { ExternalImageResourceReference, ImageResource } from '@flighthq/types';
|
|
2
|
+
export declare function fetchWebImageResource(ref: Readonly<ExternalImageResourceReference>, signal: AbortSignal): Promise<ImageResource | null>;
|
|
3
|
+
export declare function resolveImageResourceUri(uri: string, basePath: string | null): string;
|
|
4
|
+
//# sourceMappingURL=imageResourceFetch.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"imageResourceFetch.d.ts","sourceRoot":"","sources":["../src/imageResourceFetch.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,8BAA8B,EAAE,aAAa,EAAE,MAAM,iBAAiB,CAAC;AAKrF,wBAAsB,qBAAqB,CACzC,GAAG,EAAE,QAAQ,CAAC,8BAA8B,CAAC,EAC7C,MAAM,EAAE,WAAW,GAClB,OAAO,CAAC,aAAa,GAAG,IAAI,CAAC,CAQ/B;AAKD,wBAAgB,uBAAuB,CAAC,GAAG,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,IAAI,GAAG,MAAM,CAIpF"}
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
import { loadImageResourceFromUrl } from '@flighthq/image';
|
|
2
|
+
// The web external-fetch seam: resolves the ref's `uri` against its `basePath`, then decodes it
|
|
3
|
+
// through @flighthq/image. Returns `null` on any throw (an expected fetch/decode failure), except a
|
|
4
|
+
// caller-driven abort, which rejects so the resolver can distinguish cancellation from failure.
|
|
5
|
+
export async function fetchWebImageResource(ref, signal) {
|
|
6
|
+
const url = resolveImageResourceUri(ref.uri, ref.basePath);
|
|
7
|
+
try {
|
|
8
|
+
return await loadImageResourceFromUrl(url, undefined, signal);
|
|
9
|
+
}
|
|
10
|
+
catch (error) {
|
|
11
|
+
if (signal.aborted)
|
|
12
|
+
throw error;
|
|
13
|
+
return null;
|
|
14
|
+
}
|
|
15
|
+
}
|
|
16
|
+
// Joins an external ref's `uri` to its `basePath`. An absolute `uri` — one carrying a scheme
|
|
17
|
+
// (`http:`, `https:`, `data:`, …) or rooted at `/` — is used verbatim; otherwise `basePath` (when
|
|
18
|
+
// non-null) is prefixed, inserting a single `/` separator.
|
|
19
|
+
export function resolveImageResourceUri(uri, basePath) {
|
|
20
|
+
if (basePath === null || isAbsoluteImageResourceUri(uri))
|
|
21
|
+
return uri;
|
|
22
|
+
if (basePath.endsWith('/') || uri.startsWith('/'))
|
|
23
|
+
return `${basePath}${uri}`;
|
|
24
|
+
return `${basePath}/${uri}`;
|
|
25
|
+
}
|
|
26
|
+
function isAbsoluteImageResourceUri(uri) {
|
|
27
|
+
return uri.startsWith('/') || /^[a-zA-Z][a-zA-Z0-9+.-]*:/.test(uri);
|
|
28
|
+
}
|
|
29
|
+
//# sourceMappingURL=imageResourceFetch.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"imageResourceFetch.js","sourceRoot":"","sources":["../src/imageResourceFetch.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,wBAAwB,EAAE,MAAM,iBAAiB,CAAC;AAG3D,gGAAgG;AAChG,oGAAoG;AACpG,gGAAgG;AAChG,MAAM,CAAC,KAAK,UAAU,qBAAqB,CACzC,GAA6C,EAC7C,MAAmB;IAEnB,MAAM,GAAG,GAAG,uBAAuB,CAAC,GAAG,CAAC,GAAG,EAAE,GAAG,CAAC,QAAQ,CAAC,CAAC;IAC3D,IAAI,CAAC;QACH,OAAO,MAAM,wBAAwB,CAAC,GAAG,EAAE,SAAS,EAAE,MAAM,CAAC,CAAC;IAChE,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,IAAI,MAAM,CAAC,OAAO;YAAE,MAAM,KAAK,CAAC;QAChC,OAAO,IAAI,CAAC;IACd,CAAC;AACH,CAAC;AAED,6FAA6F;AAC7F,kGAAkG;AAClG,2DAA2D;AAC3D,MAAM,UAAU,uBAAuB,CAAC,GAAW,EAAE,QAAuB;IAC1E,IAAI,QAAQ,KAAK,IAAI,IAAI,0BAA0B,CAAC,GAAG,CAAC;QAAE,OAAO,GAAG,CAAC;IACrE,IAAI,QAAQ,CAAC,QAAQ,CAAC,GAAG,CAAC,IAAI,GAAG,CAAC,UAAU,CAAC,GAAG,CAAC;QAAE,OAAO,GAAG,QAAQ,GAAG,GAAG,EAAE,CAAC;IAC9E,OAAO,GAAG,QAAQ,IAAI,GAAG,EAAE,CAAC;AAC9B,CAAC;AAED,SAAS,0BAA0B,CAAC,GAAW;IAC7C,OAAO,GAAG,CAAC,UAAU,CAAC,GAAG,CAAC,IAAI,2BAA2B,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;AACtE,CAAC"}
|
package/dist/index.d.ts
ADDED
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
export * from './getScene3DResourceTextures';
|
|
2
|
+
export * from './threeDsLoad';
|
|
3
|
+
export * from './gltfLoad';
|
|
4
|
+
export * from './md2Load';
|
|
5
|
+
export * from './md5Load';
|
|
6
|
+
export * from './objLoad';
|
|
7
|
+
export * from './sceneDocumentSource';
|
|
8
|
+
export * from './awd2Load';
|
|
9
|
+
export * from './resolveScene3DResources';
|
|
10
|
+
export * from './resolveScene3DResourcesAndWait';
|
|
11
|
+
export * from './revealScene3DResourcesOnResolve';
|
|
12
|
+
export * from './sceneMaterialTextureRegistry';
|
|
13
|
+
export * from './sceneResourceRecovery';
|
|
14
|
+
export * from './imageResourceFetch';
|
|
15
|
+
export * from './sceneResourceResolver';
|
|
16
|
+
export * from './sceneResourceSignals';
|
|
17
|
+
export * from './enableScene3DResourceFailureGuards';
|
|
18
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,8BAA8B,CAAC;AAC7C,cAAc,eAAe,CAAC;AAC9B,cAAc,YAAY,CAAC;AAC3B,cAAc,WAAW,CAAC;AAC1B,cAAc,WAAW,CAAC;AAC1B,cAAc,WAAW,CAAC;AAC1B,cAAc,uBAAuB,CAAC;AACtC,cAAc,YAAY,CAAC;AAC3B,cAAc,2BAA2B,CAAC;AAC1C,cAAc,kCAAkC,CAAC;AACjD,cAAc,mCAAmC,CAAC;AAClD,cAAc,gCAAgC,CAAC;AAC/C,cAAc,yBAAyB,CAAC;AACxC,cAAc,sBAAsB,CAAC;AACrC,cAAc,yBAAyB,CAAC;AACxC,cAAc,wBAAwB,CAAC;AACvC,cAAc,sCAAsC,CAAC"}
|
package/dist/index.js
ADDED
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
export * from './getScene3DResourceTextures';
|
|
2
|
+
export * from './threeDsLoad';
|
|
3
|
+
export * from './gltfLoad';
|
|
4
|
+
export * from './md2Load';
|
|
5
|
+
export * from './md5Load';
|
|
6
|
+
export * from './objLoad';
|
|
7
|
+
export * from './sceneDocumentSource';
|
|
8
|
+
export * from './awd2Load';
|
|
9
|
+
export * from './resolveScene3DResources';
|
|
10
|
+
export * from './resolveScene3DResourcesAndWait';
|
|
11
|
+
export * from './revealScene3DResourcesOnResolve';
|
|
12
|
+
export * from './sceneMaterialTextureRegistry';
|
|
13
|
+
export * from './sceneResourceRecovery';
|
|
14
|
+
export * from './imageResourceFetch';
|
|
15
|
+
export * from './sceneResourceResolver';
|
|
16
|
+
export * from './sceneResourceSignals';
|
|
17
|
+
export * from './enableScene3DResourceFailureGuards';
|
|
18
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,8BAA8B,CAAC;AAC7C,cAAc,eAAe,CAAC;AAC9B,cAAc,YAAY,CAAC;AAC3B,cAAc,WAAW,CAAC;AAC1B,cAAc,WAAW,CAAC;AAC1B,cAAc,WAAW,CAAC;AAC1B,cAAc,uBAAuB,CAAC;AACtC,cAAc,YAAY,CAAC;AAC3B,cAAc,2BAA2B,CAAC;AAC1C,cAAc,kCAAkC,CAAC;AACjD,cAAc,mCAAmC,CAAC;AAClD,cAAc,gCAAgC,CAAC;AAC/C,cAAc,yBAAyB,CAAC;AACxC,cAAc,sBAAsB,CAAC;AACrC,cAAc,yBAAyB,CAAC;AACxC,cAAc,wBAAwB,CAAC;AACvC,cAAc,sCAAsC,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"md2Load.d.ts","sourceRoot":"","sources":["../src/md2Load.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,eAAe,EAAE,0BAA0B,EAAE,MAAM,iBAAiB,CAAC;AAQnF,wBAAsB,6BAA6B,CACjD,GAAG,EAAE,MAAM,EACX,OAAO,CAAC,EAAE,QAAQ,CAAC,0BAA0B,CAAC,GAC7C,OAAO,CAAC,eAAe,GAAG,IAAI,CAAC,CAMjC"}
|
package/dist/md2Load.js
ADDED
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
import { parseMd2 } from '@flighthq/scene3d-formats';
|
|
2
|
+
import { loadScene3DDocumentBytesFromUrl, setScene3DDocumentResourceBasePathFromUrl } from './sceneDocumentSource';
|
|
3
|
+
// Fetches an id Software MD2 (Quake 2) model from a URL and parses it into a format-neutral Scene3DDocument
|
|
4
|
+
// (a morph-animated mesh). Fetches only the FILE — the document's skin texture ref stays unresolved;
|
|
5
|
+
// assemble with createScene3DFromDocument and resolve on your own schedule. Returns null on transport failure;
|
|
6
|
+
// it never creates a renderer or GPU resource.
|
|
7
|
+
export async function loadScene3DDocumentFromMd2Url(url, options) {
|
|
8
|
+
const bytes = await loadScene3DDocumentBytesFromUrl(url, options);
|
|
9
|
+
if (bytes === null)
|
|
10
|
+
return null;
|
|
11
|
+
const document = parseMd2(bytes);
|
|
12
|
+
setScene3DDocumentResourceBasePathFromUrl(document, url);
|
|
13
|
+
return document;
|
|
14
|
+
}
|
|
15
|
+
//# sourceMappingURL=md2Load.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"md2Load.js","sourceRoot":"","sources":["../src/md2Load.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,2BAA2B,CAAC;AAGrD,OAAO,EAAE,+BAA+B,EAAE,yCAAyC,EAAE,MAAM,uBAAuB,CAAC;AAEnH,4GAA4G;AAC5G,qGAAqG;AACrG,+GAA+G;AAC/G,+CAA+C;AAC/C,MAAM,CAAC,KAAK,UAAU,6BAA6B,CACjD,GAAW,EACX,OAA8C;IAE9C,MAAM,KAAK,GAAG,MAAM,+BAA+B,CAAC,GAAG,EAAE,OAAO,CAAC,CAAC;IAClE,IAAI,KAAK,KAAK,IAAI;QAAE,OAAO,IAAI,CAAC;IAChC,MAAM,QAAQ,GAAG,QAAQ,CAAC,KAAK,CAAC,CAAC;IACjC,yCAAyC,CAAC,QAAQ,EAAE,GAAG,CAAC,CAAC;IACzD,OAAO,QAAQ,CAAC;AAClB,CAAC"}
|
|
@@ -0,0 +1,3 @@
|
|
|
1
|
+
import type { Scene3DDocument, Scene3DDocumentLoadOptions } from '@flighthq/types';
|
|
2
|
+
export declare function loadScene3DDocumentFromMd5MeshUrl(url: string, options?: Readonly<Scene3DDocumentLoadOptions>): Promise<Scene3DDocument | null>;
|
|
3
|
+
//# sourceMappingURL=md5Load.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"md5Load.d.ts","sourceRoot":"","sources":["../src/md5Load.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,eAAe,EAAE,0BAA0B,EAAE,MAAM,iBAAiB,CAAC;AAQnF,wBAAsB,iCAAiC,CACrD,GAAG,EAAE,MAAM,EACX,OAAO,CAAC,EAAE,QAAQ,CAAC,0BAA0B,CAAC,GAC7C,OAAO,CAAC,eAAe,GAAG,IAAI,CAAC,CAMjC"}
|
package/dist/md5Load.js
ADDED
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
import { parseMd5Mesh } from '@flighthq/scene3d-formats';
|
|
2
|
+
import { loadScene3DDocumentTextFromUrl, setScene3DDocumentResourceBasePathFromUrl } from './sceneDocumentSource';
|
|
3
|
+
// Fetches an MD5 mesh file (`.md5mesh`) from a URL and parses it into a format-neutral Scene3DDocument (mesh +
|
|
4
|
+
// skeleton). Fetches only the mesh FILE — a paired `.md5anim` is a separate file, and the document's shader
|
|
5
|
+
// texture refs stay unresolved; assemble with createScene3DFromDocument and resolve on your own schedule with
|
|
6
|
+
// loadScene3DResources. Returns null on transport failure; it never creates a renderer or GPU resource.
|
|
7
|
+
export async function loadScene3DDocumentFromMd5MeshUrl(url, options) {
|
|
8
|
+
const source = await loadScene3DDocumentTextFromUrl(url, options);
|
|
9
|
+
if (source === null)
|
|
10
|
+
return null;
|
|
11
|
+
const document = parseMd5Mesh(source);
|
|
12
|
+
setScene3DDocumentResourceBasePathFromUrl(document, url);
|
|
13
|
+
return document;
|
|
14
|
+
}
|
|
15
|
+
//# sourceMappingURL=md5Load.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"md5Load.js","sourceRoot":"","sources":["../src/md5Load.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,2BAA2B,CAAC;AAGzD,OAAO,EAAE,8BAA8B,EAAE,yCAAyC,EAAE,MAAM,uBAAuB,CAAC;AAElH,+GAA+G;AAC/G,4GAA4G;AAC5G,8GAA8G;AAC9G,wGAAwG;AACxG,MAAM,CAAC,KAAK,UAAU,iCAAiC,CACrD,GAAW,EACX,OAA8C;IAE9C,MAAM,MAAM,GAAG,MAAM,8BAA8B,CAAC,GAAG,EAAE,OAAO,CAAC,CAAC;IAClE,IAAI,MAAM,KAAK,IAAI;QAAE,OAAO,IAAI,CAAC;IACjC,MAAM,QAAQ,GAAG,YAAY,CAAC,MAAM,CAAC,CAAC;IACtC,yCAAyC,CAAC,QAAQ,EAAE,GAAG,CAAC,CAAC;IACzD,OAAO,QAAQ,CAAC;AAClB,CAAC"}
|
|
@@ -0,0 +1,3 @@
|
|
|
1
|
+
import type { ObjMaterialLibrary, Scene3DDocument, Scene3DDocumentLoadOptions } from '@flighthq/types';
|
|
2
|
+
export declare function loadScene3DDocumentFromObjUrl(url: string, materials?: Readonly<ObjMaterialLibrary>, options?: Readonly<Scene3DDocumentLoadOptions>): Promise<Scene3DDocument | null>;
|
|
3
|
+
//# sourceMappingURL=objLoad.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"objLoad.d.ts","sourceRoot":"","sources":["../src/objLoad.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,kBAAkB,EAAE,eAAe,EAAE,0BAA0B,EAAE,MAAM,iBAAiB,CAAC;AASvG,wBAAsB,6BAA6B,CACjD,GAAG,EAAE,MAAM,EACX,SAAS,CAAC,EAAE,QAAQ,CAAC,kBAAkB,CAAC,EACxC,OAAO,CAAC,EAAE,QAAQ,CAAC,0BAA0B,CAAC,GAC7C,OAAO,CAAC,eAAe,GAAG,IAAI,CAAC,CAMjC"}
|
package/dist/objLoad.js
ADDED
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
import { parseObj } from '@flighthq/scene3d-formats';
|
|
2
|
+
import { loadScene3DDocumentTextFromUrl, setScene3DDocumentResourceBasePathFromUrl } from './sceneDocumentSource';
|
|
3
|
+
// Fetches a Wavefront OBJ file from a URL and parses it into a format-neutral Scene3DDocument, using an
|
|
4
|
+
// optional already-parsed MTL library for its materials. Fetches only the OBJ FILE (the `.mtl` sidecar and
|
|
5
|
+
// its image URIs are the caller's to fetch/parse) — the document's texture refs stay unresolved; assemble
|
|
6
|
+
// with createScene3DFromDocument and resolve on your own schedule. Returns null on transport failure; it
|
|
7
|
+
// never creates a renderer or GPU resource.
|
|
8
|
+
export async function loadScene3DDocumentFromObjUrl(url, materials, options) {
|
|
9
|
+
const source = await loadScene3DDocumentTextFromUrl(url, options);
|
|
10
|
+
if (source === null)
|
|
11
|
+
return null;
|
|
12
|
+
const document = parseObj(source, materials);
|
|
13
|
+
setScene3DDocumentResourceBasePathFromUrl(document, url);
|
|
14
|
+
return document;
|
|
15
|
+
}
|
|
16
|
+
//# sourceMappingURL=objLoad.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"objLoad.js","sourceRoot":"","sources":["../src/objLoad.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,2BAA2B,CAAC;AAGrD,OAAO,EAAE,8BAA8B,EAAE,yCAAyC,EAAE,MAAM,uBAAuB,CAAC;AAElH,wGAAwG;AACxG,2GAA2G;AAC3G,0GAA0G;AAC1G,yGAAyG;AACzG,4CAA4C;AAC5C,MAAM,CAAC,KAAK,UAAU,6BAA6B,CACjD,GAAW,EACX,SAAwC,EACxC,OAA8C;IAE9C,MAAM,MAAM,GAAG,MAAM,8BAA8B,CAAC,GAAG,EAAE,OAAO,CAAC,CAAC;IAClE,IAAI,MAAM,KAAK,IAAI;QAAE,OAAO,IAAI,CAAC;IACjC,MAAM,QAAQ,GAAG,QAAQ,CAAC,MAAM,EAAE,SAAS,CAAC,CAAC;IAC7C,yCAAyC,CAAC,QAAQ,EAAE,GAAG,CAAC,CAAC;IACzD,OAAO,QAAQ,CAAC;AAClB,CAAC"}
|
|
@@ -0,0 +1,4 @@
|
|
|
1
|
+
import type { ImageResource, Node3D, ImageResourceReference, ResolveScene3DResourcesOptions, Scene3DResourceResolver } from '@flighthq/types';
|
|
2
|
+
export declare function resolveOneScene3DResourceTexture(resolver: Readonly<Scene3DResourceResolver>, ref: Readonly<ImageResourceReference>, signal: AbortSignal): Promise<ImageResource | null>;
|
|
3
|
+
export declare function resolveScene3DResources(scene: Readonly<Node3D>, resolver: Scene3DResourceResolver, options?: Readonly<ResolveScene3DResourcesOptions>): void;
|
|
4
|
+
//# sourceMappingURL=resolveScene3DResources.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"resolveScene3DResources.d.ts","sourceRoot":"","sources":["../src/resolveScene3DResources.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EACV,aAAa,EAEb,MAAM,EACN,sBAAsB,EACtB,8BAA8B,EAC9B,uBAAuB,EAExB,MAAM,iBAAiB,CAAC;AAUzB,wBAAgB,gCAAgC,CAC9C,QAAQ,EAAE,QAAQ,CAAC,uBAAuB,CAAC,EAC3C,GAAG,EAAE,QAAQ,CAAC,sBAAsB,CAAC,EACrC,MAAM,EAAE,WAAW,GAClB,OAAO,CAAC,aAAa,GAAG,IAAI,CAAC,CAK/B;AAYD,wBAAgB,uBAAuB,CACrC,KAAK,EAAE,QAAQ,CAAC,MAAM,CAAC,EACvB,QAAQ,EAAE,uBAAuB,EACjC,OAAO,CAAC,EAAE,QAAQ,CAAC,8BAA8B,CAAC,GACjD,IAAI,CA0BN"}
|
|
@@ -0,0 +1,175 @@
|
|
|
1
|
+
import { loadImageResourceFromBytes } from '@flighthq/image';
|
|
2
|
+
import { queueResourceLoad } from '@flighthq/loader';
|
|
3
|
+
import { emitSignal } from '@flighthq/signals';
|
|
4
|
+
import { ImageResourceFailureKind, ResourceResolutionState, ImageResourceReferenceKind } from '@flighthq/types';
|
|
5
|
+
import { Scene3DResourceResolverRuntimeKey } from '@flighthq/types';
|
|
6
|
+
import { getScene3DResourceTextures } from './getScene3DResourceTextures';
|
|
7
|
+
// Resolves one texture's ref to an ImageResource (or null for an expected failure): Embedded bytes
|
|
8
|
+
// decode through @flighthq/image; External URIs go through the resolver's fetch seam. Cancellation is
|
|
9
|
+
// carried by `signal` (both paths reject on abort). Exported for direct testing of the two ref kinds.
|
|
10
|
+
export function resolveOneScene3DResourceTexture(resolver, ref, signal) {
|
|
11
|
+
if (ref.kind === ImageResourceReferenceKind.Embedded) {
|
|
12
|
+
return loadImageResourceFromBytes(ref.bytes, ref.mimeType ?? undefined, signal);
|
|
13
|
+
}
|
|
14
|
+
return resolver.fetch(ref, signal);
|
|
15
|
+
}
|
|
16
|
+
// Advances resolution of `scene`'s texture resources under the given policy. Synchronous and
|
|
17
|
+
// fire-and-forget: it starts/cancels loads to match the current working set and returns immediately,
|
|
18
|
+
// so the caller re-invokes it as that set changes — that re-invocation IS the streaming/visibility
|
|
19
|
+
// driver. Each pass:
|
|
20
|
+
// 1. discovers textures and groups them by shared ImageResourceReference identity,
|
|
21
|
+
// 2. narrows their subscribers to the working set (all, or those `select` accepts),
|
|
22
|
+
// 3. cancels an in-flight load only when its final subscriber leaves, and
|
|
23
|
+
// 4. requests each unresolved identity once, fanning the result out to its Texture subscribers.
|
|
24
|
+
// Mutates `ref.state` and, on success, binds `texture.image`. Emits the availability signals when
|
|
25
|
+
// enabled.
|
|
26
|
+
export function resolveScene3DResources(scene, resolver, options) {
|
|
27
|
+
const runtime = resolver[Scene3DResourceResolverRuntimeKey];
|
|
28
|
+
const textures = [];
|
|
29
|
+
getScene3DResourceTextures(scene, resolver.registry, textures);
|
|
30
|
+
const working = new Map();
|
|
31
|
+
for (let i = 0; i < textures.length; i++) {
|
|
32
|
+
const texture = textures[i];
|
|
33
|
+
const ref = texture.resource;
|
|
34
|
+
if (ref == null)
|
|
35
|
+
continue;
|
|
36
|
+
if (texture.image !== null) {
|
|
37
|
+
runtime.resolved.set(ref, texture.image);
|
|
38
|
+
ref.failure = null;
|
|
39
|
+
ref.state = ResourceResolutionState.Resolved;
|
|
40
|
+
}
|
|
41
|
+
if (options?.select !== undefined && !options.select(texture, ref))
|
|
42
|
+
continue;
|
|
43
|
+
let subscribers = working.get(ref);
|
|
44
|
+
if (subscribers === undefined) {
|
|
45
|
+
subscribers = [];
|
|
46
|
+
working.set(ref, subscribers);
|
|
47
|
+
}
|
|
48
|
+
subscribers.push(texture);
|
|
49
|
+
}
|
|
50
|
+
cancelDroppedResolutions(resolver, working);
|
|
51
|
+
requestWorkingResolutions(resolver, working, options);
|
|
52
|
+
}
|
|
53
|
+
function cancelDroppedResolutions(resolver, working) {
|
|
54
|
+
const runtime = resolver[Scene3DResourceResolverRuntimeKey];
|
|
55
|
+
for (const [ref, entry] of runtime.inFlight) {
|
|
56
|
+
const subscribers = working.get(ref);
|
|
57
|
+
if (subscribers !== undefined && subscribers.length > 0) {
|
|
58
|
+
entry.subscribers.clear();
|
|
59
|
+
for (let i = 0; i < subscribers.length; i++)
|
|
60
|
+
entry.subscribers.add(subscribers[i]);
|
|
61
|
+
continue;
|
|
62
|
+
}
|
|
63
|
+
entry.controller.abort();
|
|
64
|
+
runtime.inFlight.delete(ref);
|
|
65
|
+
// A resource with no remaining subscribers reverts to Unresolved so a later pass re-requests it.
|
|
66
|
+
if (ref.state === ResourceResolutionState.Loading) {
|
|
67
|
+
ref.state = ResourceResolutionState.Unresolved;
|
|
68
|
+
}
|
|
69
|
+
}
|
|
70
|
+
}
|
|
71
|
+
function finishScene3DResourceResolution(resolver, ref, entry, image) {
|
|
72
|
+
const runtime = resolver[Scene3DResourceResolverRuntimeKey];
|
|
73
|
+
// Ignore a late settle whose entry was already cancelled or replaced by a newer request.
|
|
74
|
+
if (runtime.inFlight.get(ref) !== entry)
|
|
75
|
+
return;
|
|
76
|
+
runtime.inFlight.delete(ref);
|
|
77
|
+
if (image === null) {
|
|
78
|
+
ref.failure = {
|
|
79
|
+
kind: ImageResourceFailureKind.Unavailable,
|
|
80
|
+
message: 'Image resource resolution returned no image',
|
|
81
|
+
name: null,
|
|
82
|
+
};
|
|
83
|
+
ref.state = ResourceResolutionState.Failed;
|
|
84
|
+
for (const texture of entry.subscribers)
|
|
85
|
+
emitScene3DResourceEvent(resolver, texture, ref, false);
|
|
86
|
+
return;
|
|
87
|
+
}
|
|
88
|
+
runtime.resolved.set(ref, image);
|
|
89
|
+
ref.failure = null;
|
|
90
|
+
ref.state = ResourceResolutionState.Resolved;
|
|
91
|
+
for (const texture of entry.subscribers)
|
|
92
|
+
bindResolvedScene3DResource(resolver, texture, ref, image);
|
|
93
|
+
}
|
|
94
|
+
function failScene3DResourceResolution(resolver, ref, entry, cause) {
|
|
95
|
+
const runtime = resolver[Scene3DResourceResolverRuntimeKey];
|
|
96
|
+
if (runtime.inFlight.get(ref) !== entry)
|
|
97
|
+
return;
|
|
98
|
+
runtime.inFlight.delete(ref);
|
|
99
|
+
// An abort is a cancel, not a failure: the ref was already reverted to Unresolved when dropped.
|
|
100
|
+
if (entry.controller.signal.aborted)
|
|
101
|
+
return;
|
|
102
|
+
ref.failure = createImageResourceFailure(cause);
|
|
103
|
+
ref.state = ResourceResolutionState.Failed;
|
|
104
|
+
for (const texture of entry.subscribers)
|
|
105
|
+
emitScene3DResourceEvent(resolver, texture, ref, false);
|
|
106
|
+
}
|
|
107
|
+
function bindResolvedScene3DResource(resolver, texture, ref, image) {
|
|
108
|
+
if (texture.image === image)
|
|
109
|
+
return;
|
|
110
|
+
texture.image = image;
|
|
111
|
+
emitScene3DResourceEvent(resolver, texture, ref, true);
|
|
112
|
+
}
|
|
113
|
+
function emitScene3DResourceEvent(resolver, texture, ref, resolved) {
|
|
114
|
+
const signals = resolver[Scene3DResourceResolverRuntimeKey].signals;
|
|
115
|
+
if (signals === null)
|
|
116
|
+
return;
|
|
117
|
+
const event = { ref, texture };
|
|
118
|
+
emitSignal(resolved ? signals.onResourceResolved : signals.onResourceFailed, event);
|
|
119
|
+
}
|
|
120
|
+
function requestWorkingResolutions(resolver, working, options) {
|
|
121
|
+
const runtime = resolver[Scene3DResourceResolverRuntimeKey];
|
|
122
|
+
for (const [ref, subscribers] of working) {
|
|
123
|
+
const resolved = runtime.resolved.get(ref);
|
|
124
|
+
if (resolved !== undefined) {
|
|
125
|
+
ref.failure = null;
|
|
126
|
+
ref.state = ResourceResolutionState.Resolved;
|
|
127
|
+
for (let i = 0; i < subscribers.length; i++) {
|
|
128
|
+
bindResolvedScene3DResource(resolver, subscribers[i], ref, resolved);
|
|
129
|
+
}
|
|
130
|
+
continue;
|
|
131
|
+
}
|
|
132
|
+
if (runtime.inFlight.has(ref))
|
|
133
|
+
continue;
|
|
134
|
+
if (ref.state === ResourceResolutionState.Resolved)
|
|
135
|
+
ref.state = ResourceResolutionState.Unresolved;
|
|
136
|
+
if (ref.state !== ResourceResolutionState.Unresolved)
|
|
137
|
+
continue;
|
|
138
|
+
ref.failure = null;
|
|
139
|
+
ref.state = ResourceResolutionState.Loading;
|
|
140
|
+
const controller = new AbortController();
|
|
141
|
+
let priority = 0;
|
|
142
|
+
if (options?.priority !== undefined) {
|
|
143
|
+
priority = Number.NEGATIVE_INFINITY;
|
|
144
|
+
for (let i = 0; i < subscribers.length; i++) {
|
|
145
|
+
priority = Math.max(priority, options.priority(subscribers[i], ref));
|
|
146
|
+
}
|
|
147
|
+
}
|
|
148
|
+
const handle = queueResourceLoad(runtime.loader, {
|
|
149
|
+
load: (loaderSignal) => {
|
|
150
|
+
// Wire the loader's own cancellation (dispose/cancel) into our per-texture controller.
|
|
151
|
+
if (loaderSignal.aborted)
|
|
152
|
+
controller.abort(loaderSignal.reason);
|
|
153
|
+
else
|
|
154
|
+
loaderSignal.addEventListener('abort', () => controller.abort(loaderSignal.reason), { once: true });
|
|
155
|
+
return resolveOneScene3DResourceTexture(resolver, ref, controller.signal);
|
|
156
|
+
},
|
|
157
|
+
priority,
|
|
158
|
+
});
|
|
159
|
+
const entry = {
|
|
160
|
+
controller,
|
|
161
|
+
promise: _resolvedVoid,
|
|
162
|
+
subscribers: new Set(subscribers),
|
|
163
|
+
};
|
|
164
|
+
entry.promise = handle.promise.then((image) => finishScene3DResourceResolution(resolver, ref, entry, image), (cause) => failScene3DResourceResolution(resolver, ref, entry, cause));
|
|
165
|
+
runtime.inFlight.set(ref, entry);
|
|
166
|
+
}
|
|
167
|
+
}
|
|
168
|
+
const _resolvedVoid = Promise.resolve();
|
|
169
|
+
function createImageResourceFailure(cause) {
|
|
170
|
+
if (cause instanceof Error) {
|
|
171
|
+
return { kind: ImageResourceFailureKind.Error, message: cause.message, name: cause.name };
|
|
172
|
+
}
|
|
173
|
+
return { kind: ImageResourceFailureKind.Error, message: String(cause), name: null };
|
|
174
|
+
}
|
|
175
|
+
//# sourceMappingURL=resolveScene3DResources.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"resolveScene3DResources.js","sourceRoot":"","sources":["../src/resolveScene3DResources.ts"],"names":[],"mappings":"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"}
|