@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,4 @@
|
|
|
1
|
+
import type { LoadScene3DResourcesOptions, Node3D, Scene3DResourceResolver } from '@flighthq/types';
|
|
2
|
+
export declare function loadScene3DResources(scene: Readonly<Node3D>, resolver: Scene3DResourceResolver, options?: Readonly<LoadScene3DResourcesOptions>): Promise<void>;
|
|
3
|
+
export declare function waitForScene3DResourceResolver(resolver: Readonly<Scene3DResourceResolver>): Promise<void>;
|
|
4
|
+
//# sourceMappingURL=resolveScene3DResourcesAndWait.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"resolveScene3DResourcesAndWait.d.ts","sourceRoot":"","sources":["../src/resolveScene3DResourcesAndWait.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAEV,2BAA2B,EAC3B,MAAM,EACN,uBAAuB,EAExB,MAAM,iBAAiB,CAAC;AAYzB,wBAAsB,oBAAoB,CACxC,KAAK,EAAE,QAAQ,CAAC,MAAM,CAAC,EACvB,QAAQ,EAAE,uBAAuB,EACjC,OAAO,CAAC,EAAE,QAAQ,CAAC,2BAA2B,CAAC,GAC9C,OAAO,CAAC,IAAI,CAAC,CAwBf;AAID,wBAAsB,8BAA8B,CAAC,QAAQ,EAAE,QAAQ,CAAC,uBAAuB,CAAC,GAAG,OAAO,CAAC,IAAI,CAAC,CAK/G"}
|
|
@@ -0,0 +1,57 @@
|
|
|
1
|
+
import { emitSignal } from '@flighthq/signals';
|
|
2
|
+
import { ResourceResolutionState } from '@flighthq/types';
|
|
3
|
+
import { Scene3DResourceResolverRuntimeKey } from '@flighthq/types';
|
|
4
|
+
import { getScene3DResourceTextures } from './getScene3DResourceTextures';
|
|
5
|
+
import { resolveScene3DResources } from './resolveScene3DResources';
|
|
6
|
+
// Eager/deterministic asynchronous load: runs one resolveScene3DResources pass, then awaits every in-flight
|
|
7
|
+
// load it started so the scene is fully resolved (or each ref settled to Failed) on return. The
|
|
8
|
+
// deterministic sibling of the fire-and-forget resolveScene3DResources — for loads, tests, and capture
|
|
9
|
+
// that need the finished scene rather than progressive availability.
|
|
10
|
+
export async function loadScene3DResources(scene, resolver, options) {
|
|
11
|
+
const refs = getSelectedScene3DResourceReferences(scene, resolver, options);
|
|
12
|
+
resolveScene3DResources(scene, resolver, options);
|
|
13
|
+
const runtime = resolver[Scene3DResourceResolverRuntimeKey];
|
|
14
|
+
const total = refs.size;
|
|
15
|
+
let loaded = 0;
|
|
16
|
+
const pending = [];
|
|
17
|
+
const progress = options?.progress;
|
|
18
|
+
for (const ref of refs) {
|
|
19
|
+
if (ref.state === ResourceResolutionState.Resolved || ref.state === ResourceResolutionState.Failed) {
|
|
20
|
+
loaded++;
|
|
21
|
+
continue;
|
|
22
|
+
}
|
|
23
|
+
const entry = runtime.inFlight.get(ref);
|
|
24
|
+
if (entry === undefined)
|
|
25
|
+
continue;
|
|
26
|
+
pending.push(entry.promise.then(() => {
|
|
27
|
+
loaded++;
|
|
28
|
+
if (progress !== undefined)
|
|
29
|
+
emitSignal(progress, { loaded, total });
|
|
30
|
+
}));
|
|
31
|
+
}
|
|
32
|
+
if (progress !== undefined)
|
|
33
|
+
emitSignal(progress, { loaded, total });
|
|
34
|
+
await Promise.allSettled(pending);
|
|
35
|
+
}
|
|
36
|
+
// Waits for the loads that are pending at call time without revealing or exposing the resolver's
|
|
37
|
+
// private request records. New work queued after the snapshot belongs to the caller's next bracket.
|
|
38
|
+
export async function waitForScene3DResourceResolver(resolver) {
|
|
39
|
+
const runtime = resolver[Scene3DResourceResolverRuntimeKey];
|
|
40
|
+
const promises = [];
|
|
41
|
+
for (const entry of runtime.inFlight.values())
|
|
42
|
+
promises.push(entry.promise);
|
|
43
|
+
await Promise.allSettled(promises);
|
|
44
|
+
}
|
|
45
|
+
function getSelectedScene3DResourceReferences(scene, resolver, options) {
|
|
46
|
+
const textures = [];
|
|
47
|
+
const refs = new Set();
|
|
48
|
+
getScene3DResourceTextures(scene, resolver.registry, textures);
|
|
49
|
+
for (const texture of textures) {
|
|
50
|
+
const ref = texture.resource;
|
|
51
|
+
if (ref !== null && ref !== undefined && (options?.select === undefined || options.select(texture, ref))) {
|
|
52
|
+
refs.add(ref);
|
|
53
|
+
}
|
|
54
|
+
}
|
|
55
|
+
return refs;
|
|
56
|
+
}
|
|
57
|
+
//# sourceMappingURL=resolveScene3DResourcesAndWait.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"resolveScene3DResourcesAndWait.js","sourceRoot":"","sources":["../src/resolveScene3DResourcesAndWait.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,3 @@
|
|
|
1
|
+
import type { Node3D, Scene3DResourceResolver, Scene3DResourceRevealOptions, TweenManager } from '@flighthq/types';
|
|
2
|
+
export declare function revealScene3DResourcesOnResolve(resolver: Scene3DResourceResolver, scene: Readonly<Node3D>, tweenManager: TweenManager, options?: Readonly<Scene3DResourceRevealOptions>): () => void;
|
|
3
|
+
//# sourceMappingURL=revealScene3DResourcesOnResolve.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"revealScene3DResourcesOnResolve.d.ts","sourceRoot":"","sources":["../src/revealScene3DResourcesOnResolve.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAEV,MAAM,EACN,uBAAuB,EACvB,4BAA4B,EAE5B,YAAY,EACb,MAAM,iBAAiB,CAAC;AAkBzB,wBAAgB,+BAA+B,CAC7C,QAAQ,EAAE,uBAAuB,EACjC,KAAK,EAAE,QAAQ,CAAC,MAAM,CAAC,EACvB,YAAY,EAAE,YAAY,EAC1B,OAAO,CAAC,EAAE,QAAQ,CAAC,4BAA4B,CAAC,GAC/C,MAAM,IAAI,CAgCZ"}
|
|
@@ -0,0 +1,95 @@
|
|
|
1
|
+
import { forEachNodeDescendant } from '@flighthq/node';
|
|
2
|
+
import { isMesh } from '@flighthq/scene3d';
|
|
3
|
+
import { connectSignal, disconnectSignal } from '@flighthq/signals';
|
|
4
|
+
import { createTween } from '@flighthq/tween';
|
|
5
|
+
import { ResourceResolutionState } from '@flighthq/types';
|
|
6
|
+
import { getScene3DMaterialTextures } from './sceneMaterialTextureRegistry';
|
|
7
|
+
import { enableScene3DResourceSignals } from './sceneResourceSignals';
|
|
8
|
+
// The standard streamed-texture fade-in, composed from node opacity (P1/P2) + @flighthq/tween: every
|
|
9
|
+
// object carrying a still-pending texture is hidden to `from` up front, and only after every required
|
|
10
|
+
// texture settles does the recipe fade its owning object's `node.alpha` up to 1 over `fadeSeconds`.
|
|
11
|
+
// Failure counts as settled so the renderer's fallback can be revealed instead of leaving the object
|
|
12
|
+
// permanently hidden. A cancelled load does not settle and remains pending until a later resolution
|
|
13
|
+
// pass re-requests it. The resolver only reports availability; this recipe animates — the app ticks
|
|
14
|
+
// the fade via updateTweens(tweenManager, dt), and a node-opacity-honoring renderer makes it visible.
|
|
15
|
+
//
|
|
16
|
+
// Call BEFORE resolveScene3DResources so objects start hidden rather than popping. Returns a disposer
|
|
17
|
+
// that disconnects the signal listener (the tween manager and any in-flight tweens are the caller's).
|
|
18
|
+
// A texture shared across meshes fades every owning object; an object with several pending textures
|
|
19
|
+
// fades in when the first of them resolves.
|
|
20
|
+
export function revealScene3DResourcesOnResolve(resolver, scene, tweenManager, options) {
|
|
21
|
+
const fadeSeconds = options?.fadeSeconds ?? 0.4;
|
|
22
|
+
const from = options?.from ?? 0;
|
|
23
|
+
const tweenOptions = options?.ease !== undefined ? { ease: options.ease } : undefined;
|
|
24
|
+
const ownersByTexture = new Map();
|
|
25
|
+
const owners = [];
|
|
26
|
+
collectPendingTextureOwners(scene, resolver, ownersByTexture, owners);
|
|
27
|
+
for (const owner of owners) {
|
|
28
|
+
owner.node.alpha = from;
|
|
29
|
+
}
|
|
30
|
+
const signals = enableScene3DResourceSignals(resolver);
|
|
31
|
+
const slot = (event) => {
|
|
32
|
+
const textureOwners = ownersByTexture.get(event.texture);
|
|
33
|
+
if (textureOwners === undefined)
|
|
34
|
+
return;
|
|
35
|
+
// A resource must emit at most one terminal event for a Texture, but deleting here also makes the
|
|
36
|
+
// reveal atom robust to a caller manually replaying or forwarding the same event.
|
|
37
|
+
ownersByTexture.delete(event.texture);
|
|
38
|
+
for (const owner of textureOwners) {
|
|
39
|
+
owner.pending.delete(event.texture);
|
|
40
|
+
if (owner.pending.size === 0) {
|
|
41
|
+
createTween(tweenManager, owner.node, fadeSeconds, { alpha: 1 }, tweenOptions);
|
|
42
|
+
}
|
|
43
|
+
}
|
|
44
|
+
};
|
|
45
|
+
connectSignal(signals.onResourceResolved, slot);
|
|
46
|
+
connectSignal(signals.onResourceFailed, slot);
|
|
47
|
+
return () => {
|
|
48
|
+
disconnectSignal(signals.onResourceResolved, slot);
|
|
49
|
+
disconnectSignal(signals.onResourceFailed, slot);
|
|
50
|
+
};
|
|
51
|
+
}
|
|
52
|
+
// Maps each unresolved/loading texture to its owning Mesh reveal state. Already bound images and
|
|
53
|
+
// previously failed references are settled before this recipe begins, so they must not hide an owner
|
|
54
|
+
// waiting for an event that will never arrive. Repeated texture slots on one owner count only once.
|
|
55
|
+
function collectPendingTextureOwners(scene, resolver, ownersByTexture, owners) {
|
|
56
|
+
const slots = [];
|
|
57
|
+
const ownersByNode = new Map();
|
|
58
|
+
const visit = (node) => {
|
|
59
|
+
if (!isMesh(node))
|
|
60
|
+
return;
|
|
61
|
+
const owner = node;
|
|
62
|
+
const materials = node.materials;
|
|
63
|
+
for (let i = 0; i < materials.length; i++) {
|
|
64
|
+
const material = materials[i];
|
|
65
|
+
if (material === null)
|
|
66
|
+
continue;
|
|
67
|
+
slots.length = 0;
|
|
68
|
+
getScene3DMaterialTextures(resolver.registry, material, slots);
|
|
69
|
+
for (let j = 0; j < slots.length; j++) {
|
|
70
|
+
const texture = slots[j];
|
|
71
|
+
const ref = texture.resource;
|
|
72
|
+
if (ref == null || texture.image !== null || ref.state === ResourceResolutionState.Failed)
|
|
73
|
+
continue;
|
|
74
|
+
let ownerState = ownersByNode.get(owner);
|
|
75
|
+
if (ownerState === undefined) {
|
|
76
|
+
ownerState = { node: owner, pending: new Set() };
|
|
77
|
+
ownersByNode.set(owner, ownerState);
|
|
78
|
+
owners.push(ownerState);
|
|
79
|
+
}
|
|
80
|
+
if (ownerState.pending.has(texture))
|
|
81
|
+
continue;
|
|
82
|
+
ownerState.pending.add(texture);
|
|
83
|
+
let textureOwners = ownersByTexture.get(texture);
|
|
84
|
+
if (textureOwners === undefined) {
|
|
85
|
+
textureOwners = [];
|
|
86
|
+
ownersByTexture.set(texture, textureOwners);
|
|
87
|
+
}
|
|
88
|
+
textureOwners.push(ownerState);
|
|
89
|
+
}
|
|
90
|
+
}
|
|
91
|
+
};
|
|
92
|
+
visit(scene);
|
|
93
|
+
forEachNodeDescendant(scene, (node) => visit(node));
|
|
94
|
+
}
|
|
95
|
+
//# sourceMappingURL=revealScene3DResourcesOnResolve.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"revealScene3DResourcesOnResolve.js","sourceRoot":"","sources":["../src/revealScene3DResourcesOnResolve.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
import type { Scene3DDocument, Scene3DDocumentLoadOptions } from '@flighthq/types';
|
|
2
|
+
export declare function getScene3DDocumentBasePathFromUrl(url: string): string | null;
|
|
3
|
+
export declare function loadScene3DDocumentBytesFromUrl(url: string, options?: Readonly<Scene3DDocumentLoadOptions>): Promise<Uint8Array | null>;
|
|
4
|
+
export declare function loadScene3DDocumentTextFromUrl(url: string, options?: Readonly<Scene3DDocumentLoadOptions>): Promise<string | null>;
|
|
5
|
+
export declare function setScene3DDocumentResourceBasePathFromUrl(document: Scene3DDocument, url: string): void;
|
|
6
|
+
//# sourceMappingURL=sceneDocumentSource.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"sceneDocumentSource.d.ts","sourceRoot":"","sources":["../src/sceneDocumentSource.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAkC,eAAe,EAAE,0BAA0B,EAAE,MAAM,iBAAiB,CAAC;AAGnH,wBAAgB,iCAAiC,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAK5E;AAMD,wBAAsB,+BAA+B,CACnD,GAAG,EAAE,MAAM,EACX,OAAO,CAAC,EAAE,QAAQ,CAAC,0BAA0B,CAAC,GAC7C,OAAO,CAAC,UAAU,GAAG,IAAI,CAAC,CAO5B;AAKD,wBAAsB,8BAA8B,CAClD,GAAG,EAAE,MAAM,EACX,OAAO,CAAC,EAAE,QAAQ,CAAC,0BAA0B,CAAC,GAC7C,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,CAOxB;AAID,wBAAgB,yCAAyC,CAAC,QAAQ,EAAE,eAAe,EAAE,GAAG,EAAE,MAAM,GAAG,IAAI,CAQtG"}
|
|
@@ -0,0 +1,55 @@
|
|
|
1
|
+
import { sendNetRequest } from '@flighthq/net';
|
|
2
|
+
import { connectSignal, createSignal, emitSignal } from '@flighthq/signals';
|
|
3
|
+
import { ImageResourceReferenceKind } from '@flighthq/types';
|
|
4
|
+
export function getScene3DDocumentBasePathFromUrl(url) {
|
|
5
|
+
const query = url.search(/[?#]/);
|
|
6
|
+
const source = query >= 0 ? url.slice(0, query) : url;
|
|
7
|
+
const slash = source.lastIndexOf('/');
|
|
8
|
+
return slash < 0 ? null : source.slice(0, slash);
|
|
9
|
+
}
|
|
10
|
+
// Fetches a scene file's raw bytes from a URL through the active @flighthq/net backend (responseType
|
|
11
|
+
// 'arraybuffer'), for the binary document loaders (glTF `.glb`, AWD, MD2, 3DS). Returns the bytes on a 2xx
|
|
12
|
+
// response, or null on any expected transport/HTTP failure. No resource resolution or renderer/GPU work
|
|
13
|
+
// happens here; callers compose parsing and later resource acquisition explicitly.
|
|
14
|
+
export async function loadScene3DDocumentBytesFromUrl(url, options) {
|
|
15
|
+
const response = await sendNetRequest({ method: 'GET', responseType: 'arraybuffer', url }, createScene3DDocumentNetRequestOptions(url, options));
|
|
16
|
+
if (!response.ok || !(response.body instanceof ArrayBuffer))
|
|
17
|
+
return null;
|
|
18
|
+
return new Uint8Array(response.body);
|
|
19
|
+
}
|
|
20
|
+
// Fetches a scene file's text from a URL through the active @flighthq/net backend (responseType 'text'),
|
|
21
|
+
// for the text document loaders (OBJ, MD5). Returns the text on a 2xx response, or null on any expected
|
|
22
|
+
// transport/HTTP failure. Fetches only source text — no parsing, resource realization, or rendering work.
|
|
23
|
+
export async function loadScene3DDocumentTextFromUrl(url, options) {
|
|
24
|
+
const response = await sendNetRequest({ method: 'GET', responseType: 'text', url }, createScene3DDocumentNetRequestOptions(url, options));
|
|
25
|
+
if (!response.ok || typeof response.body !== 'string')
|
|
26
|
+
return null;
|
|
27
|
+
return response.body;
|
|
28
|
+
}
|
|
29
|
+
// Carries the loaded model's directory onto relative external image references emitted by formats whose
|
|
30
|
+
// parser consumed only in-hand bytes/text. Existing non-null base paths are authoritative and untouched.
|
|
31
|
+
export function setScene3DDocumentResourceBasePathFromUrl(document, url) {
|
|
32
|
+
const basePath = getScene3DDocumentBasePathFromUrl(url);
|
|
33
|
+
if (basePath === null)
|
|
34
|
+
return;
|
|
35
|
+
for (const resource of document.resources) {
|
|
36
|
+
if (resource.kind === ImageResourceReferenceKind.External && resource.basePath === null) {
|
|
37
|
+
resource.basePath = basePath;
|
|
38
|
+
}
|
|
39
|
+
}
|
|
40
|
+
}
|
|
41
|
+
function createScene3DDocumentNetRequestOptions(url, options) {
|
|
42
|
+
if (options === undefined)
|
|
43
|
+
return undefined;
|
|
44
|
+
const out = { signal: options.signal };
|
|
45
|
+
const outputProgress = options.progress;
|
|
46
|
+
if (outputProgress !== undefined) {
|
|
47
|
+
const progress = createSignal();
|
|
48
|
+
connectSignal(progress, (event) => {
|
|
49
|
+
emitSignal(outputProgress, { loaded: event.loaded, phase: event.phase, total: event.total, url });
|
|
50
|
+
});
|
|
51
|
+
out.progress = progress;
|
|
52
|
+
}
|
|
53
|
+
return out;
|
|
54
|
+
}
|
|
55
|
+
//# sourceMappingURL=sceneDocumentSource.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"sceneDocumentSource.js","sourceRoot":"","sources":["../src/sceneDocumentSource.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
import type { Kind, Material, Scene3DMaterialTextureLister, Scene3DMaterialTextureRegistry, Texture } from '@flighthq/types';
|
|
2
|
+
export declare function createScene3DMaterialTextureRegistry(): Scene3DMaterialTextureRegistry;
|
|
3
|
+
export declare function getScene3DMaterialTextures(registry: Readonly<Scene3DMaterialTextureRegistry>, material: Readonly<Material>, out: Texture[]): void;
|
|
4
|
+
export declare function registerBuiltInScene3DMaterialTextures(registry: Scene3DMaterialTextureRegistry): void;
|
|
5
|
+
export declare function registerScene3DMaterialTextures(registry: Scene3DMaterialTextureRegistry, kind: Kind, lister: Scene3DMaterialTextureLister): void;
|
|
6
|
+
//# sourceMappingURL=sceneMaterialTextureRegistry.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"sceneMaterialTextureRegistry.d.ts","sourceRoot":"","sources":["../src/sceneMaterialTextureRegistry.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EACV,IAAI,EACJ,QAAQ,EACR,4BAA4B,EAC5B,8BAA8B,EAE9B,OAAO,EAER,MAAM,iBAAiB,CAAC;AAGzB,wBAAgB,oCAAoC,IAAI,8BAA8B,CAErF;AAKD,wBAAgB,0BAA0B,CACxC,QAAQ,EAAE,QAAQ,CAAC,8BAA8B,CAAC,EAClD,QAAQ,EAAE,QAAQ,CAAC,QAAQ,CAAC,EAC5B,GAAG,EAAE,OAAO,EAAE,GACb,IAAI,CAGN;AAID,wBAAgB,sCAAsC,CAAC,QAAQ,EAAE,8BAA8B,GAAG,IAAI,CAGrG;AAID,wBAAgB,+BAA+B,CAC7C,QAAQ,EAAE,8BAA8B,EACxC,IAAI,EAAE,IAAI,EACV,MAAM,EAAE,4BAA4B,GACnC,IAAI,CAEN"}
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
import { createEntity } from '@flighthq/entity';
|
|
2
|
+
import { StandardPbrMaterialKind, UnlitMaterialKind } from '@flighthq/types';
|
|
3
|
+
export function createScene3DMaterialTextureRegistry() {
|
|
4
|
+
return createEntity({ listers: new Map() });
|
|
5
|
+
}
|
|
6
|
+
// Looks up the lister for `material.kind` and, when present, appends the material's non-null Textures
|
|
7
|
+
// to `out`. An unregistered kind appends nothing. Does not clear `out` — it accumulates across the
|
|
8
|
+
// materials of a mesh.
|
|
9
|
+
export function getScene3DMaterialTextures(registry, material, out) {
|
|
10
|
+
const lister = registry.listers.get(material.kind);
|
|
11
|
+
if (lister !== undefined)
|
|
12
|
+
lister(material, out);
|
|
13
|
+
}
|
|
14
|
+
// Registers the built-in surface-material listers (StandardPbrMaterial and UnlitMaterial). Opt-in so
|
|
15
|
+
// it carries no top-level side effect; callers that build their own registry invoke it explicitly.
|
|
16
|
+
export function registerBuiltInScene3DMaterialTextures(registry) {
|
|
17
|
+
registerScene3DMaterialTextures(registry, StandardPbrMaterialKind, listStandardPbrMaterialTextures);
|
|
18
|
+
registerScene3DMaterialTextures(registry, UnlitMaterialKind, listUnlitMaterialTextures);
|
|
19
|
+
}
|
|
20
|
+
// Binds `lister` to `kind` (last-write-wins; overriding a built-in with a custom lister is a
|
|
21
|
+
// feature, not an error — no registration guard).
|
|
22
|
+
export function registerScene3DMaterialTextures(registry, kind, lister) {
|
|
23
|
+
registry.listers.set(kind, lister);
|
|
24
|
+
}
|
|
25
|
+
function listStandardPbrMaterialTextures(material, out) {
|
|
26
|
+
const pbr = material;
|
|
27
|
+
if (pbr.baseColorMap !== null)
|
|
28
|
+
out.push(pbr.baseColorMap);
|
|
29
|
+
if (pbr.emissiveMap !== null)
|
|
30
|
+
out.push(pbr.emissiveMap);
|
|
31
|
+
if (pbr.metallicRoughnessMap !== null)
|
|
32
|
+
out.push(pbr.metallicRoughnessMap);
|
|
33
|
+
if (pbr.normalMap !== null)
|
|
34
|
+
out.push(pbr.normalMap);
|
|
35
|
+
if (pbr.occlusionMap !== null)
|
|
36
|
+
out.push(pbr.occlusionMap);
|
|
37
|
+
}
|
|
38
|
+
function listUnlitMaterialTextures(material, out) {
|
|
39
|
+
const unlit = material;
|
|
40
|
+
if (unlit.baseColorMap !== null)
|
|
41
|
+
out.push(unlit.baseColorMap);
|
|
42
|
+
}
|
|
43
|
+
//# sourceMappingURL=sceneMaterialTextureRegistry.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"sceneMaterialTextureRegistry.js","sourceRoot":"","sources":["../src/sceneMaterialTextureRegistry.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,kBAAkB,CAAC;AAUhD,OAAO,EAAE,uBAAuB,EAAE,iBAAiB,EAAE,MAAM,iBAAiB,CAAC;AAE7E,MAAM,UAAU,oCAAoC;IAClD,OAAO,YAAY,CAAC,EAAE,OAAO,EAAE,IAAI,GAAG,EAAE,EAAE,CAAC,CAAC;AAC9C,CAAC;AAED,sGAAsG;AACtG,mGAAmG;AACnG,uBAAuB;AACvB,MAAM,UAAU,0BAA0B,CACxC,QAAkD,EAClD,QAA4B,EAC5B,GAAc;IAEd,MAAM,MAAM,GAAG,QAAQ,CAAC,OAAO,CAAC,GAAG,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC;IACnD,IAAI,MAAM,KAAK,SAAS;QAAE,MAAM,CAAC,QAAQ,EAAE,GAAG,CAAC,CAAC;AAClD,CAAC;AAED,qGAAqG;AACrG,mGAAmG;AACnG,MAAM,UAAU,sCAAsC,CAAC,QAAwC;IAC7F,+BAA+B,CAAC,QAAQ,EAAE,uBAAuB,EAAE,+BAA+B,CAAC,CAAC;IACpG,+BAA+B,CAAC,QAAQ,EAAE,iBAAiB,EAAE,yBAAyB,CAAC,CAAC;AAC1F,CAAC;AAED,6FAA6F;AAC7F,kDAAkD;AAClD,MAAM,UAAU,+BAA+B,CAC7C,QAAwC,EACxC,IAAU,EACV,MAAoC;IAEpC,QAAQ,CAAC,OAAO,CAAC,GAAG,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC;AACrC,CAAC;AAED,SAAS,+BAA+B,CAAC,QAA4B,EAAE,GAAc;IACnF,MAAM,GAAG,GAAG,QAAyC,CAAC;IACtD,IAAI,GAAG,CAAC,YAAY,KAAK,IAAI;QAAE,GAAG,CAAC,IAAI,CAAC,GAAG,CAAC,YAAY,CAAC,CAAC;IAC1D,IAAI,GAAG,CAAC,WAAW,KAAK,IAAI;QAAE,GAAG,CAAC,IAAI,CAAC,GAAG,CAAC,WAAW,CAAC,CAAC;IACxD,IAAI,GAAG,CAAC,oBAAoB,KAAK,IAAI;QAAE,GAAG,CAAC,IAAI,CAAC,GAAG,CAAC,oBAAoB,CAAC,CAAC;IAC1E,IAAI,GAAG,CAAC,SAAS,KAAK,IAAI;QAAE,GAAG,CAAC,IAAI,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC;IACpD,IAAI,GAAG,CAAC,YAAY,KAAK,IAAI;QAAE,GAAG,CAAC,IAAI,CAAC,GAAG,CAAC,YAAY,CAAC,CAAC;AAC5D,CAAC;AAED,SAAS,yBAAyB,CAAC,QAA4B,EAAE,GAAc;IAC7E,MAAM,KAAK,GAAG,QAAmC,CAAC;IAClD,IAAI,KAAK,CAAC,YAAY,KAAK,IAAI;QAAE,GAAG,CAAC,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC,CAAC;AAChE,CAAC"}
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
import type { ImageResourceReference, ImageResourceReferenceResolutionExplanation, ResolveScene3DResourcesOptions, Node3D, Scene3DResourceResolver } from '@flighthq/types';
|
|
2
|
+
export declare function explainImageResourceReferenceResolution(ref: Readonly<ImageResourceReference>): ImageResourceReferenceResolutionExplanation;
|
|
3
|
+
export declare function resetFailedImageResourceReference(ref: ImageResourceReference): boolean;
|
|
4
|
+
export declare function retryFailedScene3DResources(scene: Readonly<Node3D>, resolver: Scene3DResourceResolver, options?: Readonly<ResolveScene3DResourcesOptions>): number;
|
|
5
|
+
//# sourceMappingURL=sceneResourceRecovery.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"sceneResourceRecovery.d.ts","sourceRoot":"","sources":["../src/sceneResourceRecovery.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,sBAAsB,EACtB,2CAA2C,EAC3C,8BAA8B,EAC9B,MAAM,EACN,uBAAuB,EAExB,MAAM,iBAAiB,CAAC;AAQzB,wBAAgB,uCAAuC,CACrD,GAAG,EAAE,QAAQ,CAAC,sBAAsB,CAAC,GACpC,2CAA2C,CAO7C;AAID,wBAAgB,iCAAiC,CAAC,GAAG,EAAE,sBAAsB,GAAG,OAAO,CAKtF;AAKD,wBAAgB,2BAA2B,CACzC,KAAK,EAAE,QAAQ,CAAC,MAAM,CAAC,EACvB,QAAQ,EAAE,uBAAuB,EACjC,OAAO,CAAC,EAAE,QAAQ,CAAC,8BAA8B,CAAC,GACjD,MAAM,CAaR"}
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
import { ResourceResolutionState } from '@flighthq/types';
|
|
2
|
+
import { getScene3DResourceTextures } from './getScene3DResourceTextures';
|
|
3
|
+
import { resolveScene3DResources } from './resolveScene3DResources';
|
|
4
|
+
// Returns a detached plain-data explanation suitable for logs, tools, and serialization. It never
|
|
5
|
+
// throws and exposes no resolver runtime or raw thrown value.
|
|
6
|
+
export function explainImageResourceReferenceResolution(ref) {
|
|
7
|
+
return {
|
|
8
|
+
failure: ref.failure === null ? null : { ...ref.failure },
|
|
9
|
+
kind: ref.kind,
|
|
10
|
+
retryable: ref.state === ResourceResolutionState.Failed,
|
|
11
|
+
state: ref.state,
|
|
12
|
+
};
|
|
13
|
+
}
|
|
14
|
+
// Returns a failed reference to the requestable state. Loading/resolved/unresolved references are
|
|
15
|
+
// unchanged so this atom cannot invalidate live work or a successfully bound resource accidentally.
|
|
16
|
+
export function resetFailedImageResourceReference(ref) {
|
|
17
|
+
if (ref.state !== ResourceResolutionState.Failed)
|
|
18
|
+
return false;
|
|
19
|
+
ref.failure = null;
|
|
20
|
+
ref.state = ResourceResolutionState.Unresolved;
|
|
21
|
+
return true;
|
|
22
|
+
}
|
|
23
|
+
// Resets every selected failed identity once, then performs a normal resolver pass under the same
|
|
24
|
+
// selection/priority policy. The normal pass remains authoritative for the working set, including its
|
|
25
|
+
// documented cancellation behavior when visibility selection drops an existing subscriber.
|
|
26
|
+
export function retryFailedScene3DResources(scene, resolver, options) {
|
|
27
|
+
const textures = [];
|
|
28
|
+
getScene3DResourceTextures(scene, resolver.registry, textures);
|
|
29
|
+
const reset = new Set();
|
|
30
|
+
for (let i = 0; i < textures.length; i++) {
|
|
31
|
+
const texture = textures[i];
|
|
32
|
+
const ref = texture.resource;
|
|
33
|
+
if (ref == null || reset.has(ref))
|
|
34
|
+
continue;
|
|
35
|
+
if (options?.select !== undefined && !options.select(texture, ref))
|
|
36
|
+
continue;
|
|
37
|
+
if (resetFailedImageResourceReference(ref))
|
|
38
|
+
reset.add(ref);
|
|
39
|
+
}
|
|
40
|
+
resolveScene3DResources(scene, resolver, options);
|
|
41
|
+
return reset.size;
|
|
42
|
+
}
|
|
43
|
+
//# sourceMappingURL=sceneResourceRecovery.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"sceneResourceRecovery.js","sourceRoot":"","sources":["../src/sceneResourceRecovery.ts"],"names":[],"mappings":"AAQA,OAAO,EAAE,uBAAuB,EAAE,MAAM,iBAAiB,CAAC;AAE1D,OAAO,EAAE,0BAA0B,EAAE,MAAM,8BAA8B,CAAC;AAC1E,OAAO,EAAE,uBAAuB,EAAE,MAAM,2BAA2B,CAAC;AAEpE,kGAAkG;AAClG,8DAA8D;AAC9D,MAAM,UAAU,uCAAuC,CACrD,GAAqC;IAErC,OAAO;QACL,OAAO,EAAE,GAAG,CAAC,OAAO,KAAK,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,GAAG,GAAG,CAAC,OAAO,EAAE;QACzD,IAAI,EAAE,GAAG,CAAC,IAAI;QACd,SAAS,EAAE,GAAG,CAAC,KAAK,KAAK,uBAAuB,CAAC,MAAM;QACvD,KAAK,EAAE,GAAG,CAAC,KAAK;KACjB,CAAC;AACJ,CAAC;AAED,kGAAkG;AAClG,oGAAoG;AACpG,MAAM,UAAU,iCAAiC,CAAC,GAA2B;IAC3E,IAAI,GAAG,CAAC,KAAK,KAAK,uBAAuB,CAAC,MAAM;QAAE,OAAO,KAAK,CAAC;IAC/D,GAAG,CAAC,OAAO,GAAG,IAAI,CAAC;IACnB,GAAG,CAAC,KAAK,GAAG,uBAAuB,CAAC,UAAU,CAAC;IAC/C,OAAO,IAAI,CAAC;AACd,CAAC;AAED,kGAAkG;AAClG,sGAAsG;AACtG,2FAA2F;AAC3F,MAAM,UAAU,2BAA2B,CACzC,KAAuB,EACvB,QAAiC,EACjC,OAAkD;IAElD,MAAM,QAAQ,GAAc,EAAE,CAAC;IAC/B,0BAA0B,CAAC,KAAK,EAAE,QAAQ,CAAC,QAAQ,EAAE,QAAQ,CAAC,CAAC;IAC/D,MAAM,KAAK,GAAG,IAAI,GAAG,EAA0B,CAAC;IAChD,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,QAAQ,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;QACzC,MAAM,OAAO,GAAG,QAAQ,CAAC,CAAC,CAAC,CAAC;QAC5B,MAAM,GAAG,GAAG,OAAO,CAAC,QAAQ,CAAC;QAC7B,IAAI,GAAG,IAAI,IAAI,IAAI,KAAK,CAAC,GAAG,CAAC,GAAG,CAAC;YAAE,SAAS;QAC5C,IAAI,OAAO,EAAE,MAAM,KAAK,SAAS,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,OAAO,EAAE,GAAG,CAAC;YAAE,SAAS;QAC7E,IAAI,iCAAiC,CAAC,GAAG,CAAC;YAAE,KAAK,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;IAC7D,CAAC;IACD,uBAAuB,CAAC,KAAK,EAAE,QAAQ,EAAE,OAAO,CAAC,CAAC;IAClD,OAAO,KAAK,CAAC,IAAI,CAAC;AACpB,CAAC"}
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
import type { Scene3DResourceResolver, Scene3DResourceResolverOptions } from '@flighthq/types';
|
|
2
|
+
export declare function createBuiltInScene3DResourceResolver(options?: Readonly<Scene3DResourceResolverOptions>): Scene3DResourceResolver;
|
|
3
|
+
export declare function createScene3DResourceResolver(options?: Readonly<Scene3DResourceResolverOptions>): Scene3DResourceResolver;
|
|
4
|
+
export declare function disposeScene3DResourceResolver(resolver: Scene3DResourceResolver): void;
|
|
5
|
+
//# sourceMappingURL=sceneResourceResolver.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"sceneResourceResolver.d.ts","sourceRoot":"","sources":["../src/sceneResourceResolver.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,uBAAuB,EAAE,8BAA8B,EAAE,MAAM,iBAAiB,CAAC;AAY/F,wBAAgB,oCAAoC,CAClD,OAAO,CAAC,EAAE,QAAQ,CAAC,8BAA8B,CAAC,GACjD,uBAAuB,CAIzB;AAED,wBAAgB,6BAA6B,CAC3C,OAAO,CAAC,EAAE,QAAQ,CAAC,8BAA8B,CAAC,GACjD,uBAAuB,CAgBzB;AAID,wBAAgB,8BAA8B,CAAC,QAAQ,EAAE,uBAAuB,GAAG,IAAI,CAStF"}
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
import { createEntity } from '@flighthq/entity';
|
|
2
|
+
import { cancelResourceLoad, createResourceLoader, disposeResourceLoader, startResourceLoad } from '@flighthq/loader';
|
|
3
|
+
import { Scene3DResourceResolverRuntimeKey } from '@flighthq/types';
|
|
4
|
+
import { fetchWebImageResource } from './imageResourceFetch';
|
|
5
|
+
import { createScene3DMaterialTextureRegistry, registerBuiltInScene3DMaterialTextures, } from './sceneMaterialTextureRegistry';
|
|
6
|
+
// Explicit preconfigured assembly for the common Standard PBR + Unlit path. The primitive constructor
|
|
7
|
+
// above stays empty so importing/creating it cannot silently pull material families into a custom lane.
|
|
8
|
+
export function createBuiltInScene3DResourceResolver(options) {
|
|
9
|
+
const resolver = createScene3DResourceResolver(options);
|
|
10
|
+
registerBuiltInScene3DMaterialTextures(resolver.registry);
|
|
11
|
+
return resolver;
|
|
12
|
+
}
|
|
13
|
+
export function createScene3DResourceResolver(options) {
|
|
14
|
+
// Streaming so passes can queue after the loader has started; dedupe off since each pending texture
|
|
15
|
+
// is queued once under a unique auto-assigned key, and disabling it avoids an unbounded dedupe map.
|
|
16
|
+
const loader = createResourceLoader({ dedupe: false, maxConcurrent: options?.maxConcurrent, streaming: true });
|
|
17
|
+
startResourceLoad(loader);
|
|
18
|
+
return createEntity({
|
|
19
|
+
fetch: options?.fetch ?? fetchWebImageResource,
|
|
20
|
+
registry: options?.registry ?? createScene3DMaterialTextureRegistry(),
|
|
21
|
+
[Scene3DResourceResolverRuntimeKey]: {
|
|
22
|
+
inFlight: new Map(),
|
|
23
|
+
loader,
|
|
24
|
+
resolved: new Map(),
|
|
25
|
+
signals: null,
|
|
26
|
+
},
|
|
27
|
+
});
|
|
28
|
+
}
|
|
29
|
+
// Releases the resolver: cancels and disposes the loader, aborts every in-flight controller, and
|
|
30
|
+
// clears the in-flight map. GC-managed teardown (no GPU/native resource), so dispose, not destroy.
|
|
31
|
+
export function disposeScene3DResourceResolver(resolver) {
|
|
32
|
+
const runtime = resolver[Scene3DResourceResolverRuntimeKey];
|
|
33
|
+
cancelResourceLoad(runtime.loader);
|
|
34
|
+
disposeResourceLoader(runtime.loader);
|
|
35
|
+
for (const entry of runtime.inFlight.values()) {
|
|
36
|
+
entry.controller.abort();
|
|
37
|
+
}
|
|
38
|
+
runtime.inFlight.clear();
|
|
39
|
+
runtime.resolved.clear();
|
|
40
|
+
}
|
|
41
|
+
//# sourceMappingURL=sceneResourceResolver.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"sceneResourceResolver.js","sourceRoot":"","sources":["../src/sceneResourceResolver.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,kBAAkB,CAAC;AAChD,OAAO,EAAE,kBAAkB,EAAE,oBAAoB,EAAE,qBAAqB,EAAE,iBAAiB,EAAE,MAAM,kBAAkB,CAAC;AAEtH,OAAO,EAAE,iCAAiC,EAAE,MAAM,iBAAiB,CAAC;AAGpE,OAAO,EAAE,qBAAqB,EAAE,MAAM,sBAAsB,CAAC;AAC7D,OAAO,EACL,oCAAoC,EACpC,sCAAsC,GACvC,MAAM,gCAAgC,CAAC;AAExC,sGAAsG;AACtG,wGAAwG;AACxG,MAAM,UAAU,oCAAoC,CAClD,OAAkD;IAElD,MAAM,QAAQ,GAAG,6BAA6B,CAAC,OAAO,CAAC,CAAC;IACxD,sCAAsC,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC;IAC1D,OAAO,QAAQ,CAAC;AAClB,CAAC;AAED,MAAM,UAAU,6BAA6B,CAC3C,OAAkD;IAElD,oGAAoG;IACpG,oGAAoG;IACpG,MAAM,MAAM,GAAG,oBAAoB,CAAC,EAAE,MAAM,EAAE,KAAK,EAAE,aAAa,EAAE,OAAO,EAAE,aAAa,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IAC/G,iBAAiB,CAAC,MAAM,CAAC,CAAC;IAE1B,OAAO,YAAY,CAAC;QAClB,KAAK,EAAE,OAAO,EAAE,KAAK,IAAI,qBAAqB;QAC9C,QAAQ,EAAE,OAAO,EAAE,QAAQ,IAAI,oCAAoC,EAAE;QACrE,CAAC,iCAAiC,CAAC,EAAE;YACnC,QAAQ,EAAE,IAAI,GAAG,EAAE;YACnB,MAAM;YACN,QAAQ,EAAE,IAAI,GAAG,EAAE;YACnB,OAAO,EAAE,IAAI;SACd;KACF,CAAC,CAAC;AACL,CAAC;AAED,iGAAiG;AACjG,mGAAmG;AACnG,MAAM,UAAU,8BAA8B,CAAC,QAAiC;IAC9E,MAAM,OAAO,GAAI,QAA+C,CAAC,iCAAiC,CAAC,CAAC;IACpG,kBAAkB,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC;IACnC,qBAAqB,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC;IACtC,KAAK,MAAM,KAAK,IAAI,OAAO,CAAC,QAAQ,CAAC,MAAM,EAAE,EAAE,CAAC;QAC9C,KAAK,CAAC,UAAU,CAAC,KAAK,EAAE,CAAC;IAC3B,CAAC;IACD,OAAO,CAAC,QAAQ,CAAC,KAAK,EAAE,CAAC;IACzB,OAAO,CAAC,QAAQ,CAAC,KAAK,EAAE,CAAC;AAC3B,CAAC"}
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
import type { Scene3DResourceResolver, Scene3DResourceSignals } from '@flighthq/types';
|
|
2
|
+
export declare function createScene3DResourceSignals(): Scene3DResourceSignals;
|
|
3
|
+
export declare function enableScene3DResourceSignals(resolver: Scene3DResourceResolver): Scene3DResourceSignals;
|
|
4
|
+
export declare function getScene3DResourceSignals(resolver: Readonly<Scene3DResourceResolver>): Scene3DResourceSignals | null;
|
|
5
|
+
//# sourceMappingURL=sceneResourceSignals.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"sceneResourceSignals.d.ts","sourceRoot":"","sources":["../src/sceneResourceSignals.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,uBAAuB,EAAE,sBAAsB,EAAE,MAAM,iBAAiB,CAAC;AAIvF,wBAAgB,4BAA4B,IAAI,sBAAsB,CAErE;AAID,wBAAgB,4BAA4B,CAAC,QAAQ,EAAE,uBAAuB,GAAG,sBAAsB,CAMtG;AAGD,wBAAgB,yBAAyB,CAAC,QAAQ,EAAE,QAAQ,CAAC,uBAAuB,CAAC,GAAG,sBAAsB,GAAG,IAAI,CAEpH"}
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
import { createEntity } from '@flighthq/entity';
|
|
2
|
+
import { createSignal } from '@flighthq/signals';
|
|
3
|
+
import { Scene3DResourceResolverRuntimeKey } from '@flighthq/types';
|
|
4
|
+
export function createScene3DResourceSignals() {
|
|
5
|
+
return createEntity({ onResourceFailed: createSignal(), onResourceResolved: createSignal() });
|
|
6
|
+
}
|
|
7
|
+
// Enables (once) and returns the resolver's availability signals. Idempotent: repeated calls return
|
|
8
|
+
// the same group so listeners connected earlier stay attached.
|
|
9
|
+
export function enableScene3DResourceSignals(resolver) {
|
|
10
|
+
const runtime = resolver[Scene3DResourceResolverRuntimeKey];
|
|
11
|
+
if (runtime.signals !== null)
|
|
12
|
+
return runtime.signals;
|
|
13
|
+
const signals = createScene3DResourceSignals();
|
|
14
|
+
runtime.signals = signals;
|
|
15
|
+
return signals;
|
|
16
|
+
}
|
|
17
|
+
// Returns the resolver's availability signals, or `null` when they were never enabled.
|
|
18
|
+
export function getScene3DResourceSignals(resolver) {
|
|
19
|
+
return resolver[Scene3DResourceResolverRuntimeKey].signals;
|
|
20
|
+
}
|
|
21
|
+
//# sourceMappingURL=sceneResourceSignals.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"sceneResourceSignals.js","sourceRoot":"","sources":["../src/sceneResourceSignals.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,kBAAkB,CAAC;AAChD,OAAO,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAC;AAEjD,OAAO,EAAE,iCAAiC,EAAE,MAAM,iBAAiB,CAAC;AAGpE,MAAM,UAAU,4BAA4B;IAC1C,OAAO,YAAY,CAAC,EAAE,gBAAgB,EAAE,YAAY,EAAE,EAAE,kBAAkB,EAAE,YAAY,EAAE,EAAE,CAAC,CAAC;AAChG,CAAC;AAED,oGAAoG;AACpG,+DAA+D;AAC/D,MAAM,UAAU,4BAA4B,CAAC,QAAiC;IAC5E,MAAM,OAAO,GAAI,QAA+C,CAAC,iCAAiC,CAAC,CAAC;IACpG,IAAI,OAAO,CAAC,OAAO,KAAK,IAAI;QAAE,OAAO,OAAO,CAAC,OAAO,CAAC;IACrD,MAAM,OAAO,GAAG,4BAA4B,EAAE,CAAC;IAC/C,OAAO,CAAC,OAAO,GAAG,OAAO,CAAC;IAC1B,OAAO,OAAO,CAAC;AACjB,CAAC;AAED,uFAAuF;AACvF,MAAM,UAAU,yBAAyB,CAAC,QAA2C;IACnF,OAAQ,QAA+C,CAAC,iCAAiC,CAAC,CAAC,OAAO,CAAC;AACrG,CAAC"}
|
|
@@ -0,0 +1,3 @@
|
|
|
1
|
+
import type { Scene3DDocument, Scene3DDocumentLoadOptions } from '@flighthq/types';
|
|
2
|
+
export declare function loadScene3DDocumentFrom3dsUrl(url: string, options?: Readonly<Scene3DDocumentLoadOptions>): Promise<Scene3DDocument | null>;
|
|
3
|
+
//# sourceMappingURL=threeDsLoad.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"threeDsLoad.d.ts","sourceRoot":"","sources":["../src/threeDsLoad.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,eAAe,EAAE,0BAA0B,EAAE,MAAM,iBAAiB,CAAC;AAOnF,wBAAsB,6BAA6B,CACjD,GAAG,EAAE,MAAM,EACX,OAAO,CAAC,EAAE,QAAQ,CAAC,0BAA0B,CAAC,GAC7C,OAAO,CAAC,eAAe,GAAG,IAAI,CAAC,CAMjC"}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
import { parse3ds } from '@flighthq/scene3d-formats';
|
|
2
|
+
import { loadScene3DDocumentBytesFromUrl, setScene3DDocumentResourceBasePathFromUrl } from './sceneDocumentSource';
|
|
3
|
+
// Fetches an Autodesk 3DS binary 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 resolve
|
|
5
|
+
// on your own schedule. Returns null on transport failure; it never creates a renderer or GPU resource.
|
|
6
|
+
export async function loadScene3DDocumentFrom3dsUrl(url, options) {
|
|
7
|
+
const bytes = await loadScene3DDocumentBytesFromUrl(url, options);
|
|
8
|
+
if (bytes === null)
|
|
9
|
+
return null;
|
|
10
|
+
const document = parse3ds(bytes);
|
|
11
|
+
setScene3DDocumentResourceBasePathFromUrl(document, url);
|
|
12
|
+
return document;
|
|
13
|
+
}
|
|
14
|
+
//# sourceMappingURL=threeDsLoad.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"threeDsLoad.js","sourceRoot":"","sources":["../src/threeDsLoad.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,2BAA2B,CAAC;AAGrD,OAAO,EAAE,+BAA+B,EAAE,yCAAyC,EAAE,MAAM,uBAAuB,CAAC;AAEnH,8GAA8G;AAC9G,8GAA8G;AAC9G,wGAAwG;AACxG,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"}
|
package/package.json
ADDED
|
@@ -0,0 +1,55 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "@flighthq/scene3d-resources",
|
|
3
|
+
"version": "0.2.1-next.840.857425c",
|
|
4
|
+
"repository": {
|
|
5
|
+
"type": "git",
|
|
6
|
+
"url": "https://github.com/flighthq/flight.git",
|
|
7
|
+
"directory": "packages/scene3d-resources"
|
|
8
|
+
},
|
|
9
|
+
"type": "module",
|
|
10
|
+
"main": "dist/index.js",
|
|
11
|
+
"types": "dist/index.d.ts",
|
|
12
|
+
"exports": {
|
|
13
|
+
".": {
|
|
14
|
+
"types": "./dist/index.d.ts",
|
|
15
|
+
"default": "./dist/index.js"
|
|
16
|
+
}
|
|
17
|
+
},
|
|
18
|
+
"files": [
|
|
19
|
+
"dist",
|
|
20
|
+
"src/**/*.test.ts",
|
|
21
|
+
"!dist/**/*.test.js",
|
|
22
|
+
"!dist/**/*.test.d.ts",
|
|
23
|
+
"!dist/**/*.test.js.map",
|
|
24
|
+
"!dist/**/*.test.d.ts.map"
|
|
25
|
+
],
|
|
26
|
+
"scripts": {
|
|
27
|
+
"build": "tsc -b",
|
|
28
|
+
"clean": "tsc -b --clean",
|
|
29
|
+
"test": "vitest run --config vitest.config.ts",
|
|
30
|
+
"test:watch": "vitest --watch --config vitest.config.ts",
|
|
31
|
+
"prepack": "npm run clean && npm run clean:dist && npm run build",
|
|
32
|
+
"clean:dist": "tsx ../../scripts/clean-package-dist.ts"
|
|
33
|
+
},
|
|
34
|
+
"dependencies": {
|
|
35
|
+
"@flighthq/entity": "0.2.1-next.840.857425c",
|
|
36
|
+
"@flighthq/image": "0.2.1-next.840.857425c",
|
|
37
|
+
"@flighthq/loader": "0.2.1-next.840.857425c",
|
|
38
|
+
"@flighthq/log": "0.2.1-next.840.857425c",
|
|
39
|
+
"@flighthq/net": "0.2.1-next.840.857425c",
|
|
40
|
+
"@flighthq/node": "0.2.1-next.840.857425c",
|
|
41
|
+
"@flighthq/scene3d": "0.2.1-next.840.857425c",
|
|
42
|
+
"@flighthq/scene3d-formats": "0.2.1-next.840.857425c",
|
|
43
|
+
"@flighthq/signals": "0.2.1-next.840.857425c",
|
|
44
|
+
"@flighthq/tween": "0.2.1-next.840.857425c",
|
|
45
|
+
"@flighthq/types": "0.2.1-next.840.857425c"
|
|
46
|
+
},
|
|
47
|
+
"devDependencies": {
|
|
48
|
+
"@flighthq/materials": "*",
|
|
49
|
+
"@flighthq/mesh": "*",
|
|
50
|
+
"@flighthq/texture": "*",
|
|
51
|
+
"typescript": "^5.3.0"
|
|
52
|
+
},
|
|
53
|
+
"description": "Renderer-neutral scene-document URL acquisition and caller-driven resolution of scene texture references into live ImageResources",
|
|
54
|
+
"sideEffects": false
|
|
55
|
+
}
|