@flighthq/scene3d-resources 0.3.0 → 0.3.1-next.1041.35b950c

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.
@@ -1,4 +1,4 @@
1
- import type { SceneCoverageEntry, Scene3DKindUsage, Scene3DResourceResolver } from '@flighthq/types/contract';
2
- export declare function explainScene3DResourceCoverage(out: SceneCoverageEntry[], resolver: Readonly<Scene3DResourceResolver>, usage: Readonly<Scene3DKindUsage>): void;
1
+ import type { Scene3DKindUsage, Scene3DResourceResolver, SceneCoverageCatalog, SceneCoverageEntry } from '@flighthq/types/contract';
2
+ export declare function explainScene3DResourceCoverage(out: SceneCoverageEntry[], resolver: Readonly<Scene3DResourceResolver>, usage: Readonly<Scene3DKindUsage>, catalog: SceneCoverageCatalog): void;
3
3
  export declare function hasScene3DResourceCoverage(resolver: Readonly<Scene3DResourceResolver>, usage: Readonly<Scene3DKindUsage>): boolean;
4
4
  //# sourceMappingURL=explainScene3DResourceCoverage.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"explainScene3DResourceCoverage.d.ts","sourceRoot":"","sources":["../src/explainScene3DResourceCoverage.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,kBAAkB,EAAE,gBAAgB,EAAE,uBAAuB,EAAE,MAAM,0BAA0B,CAAC;AAkB9G,wBAAgB,8BAA8B,CAC5C,GAAG,EAAE,kBAAkB,EAAE,EACzB,QAAQ,EAAE,QAAQ,CAAC,uBAAuB,CAAC,EAC3C,KAAK,EAAE,QAAQ,CAAC,gBAAgB,CAAC,GAChC,IAAI,CAGN;AAID,wBAAgB,0BAA0B,CACxC,QAAQ,EAAE,QAAQ,CAAC,uBAAuB,CAAC,EAC3C,KAAK,EAAE,QAAQ,CAAC,gBAAgB,CAAC,GAChC,OAAO,CAET"}
1
+ {"version":3,"file":"explainScene3DResourceCoverage.d.ts","sourceRoot":"","sources":["../src/explainScene3DResourceCoverage.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAGV,gBAAgB,EAChB,uBAAuB,EACvB,oBAAoB,EACpB,kBAAkB,EACnB,MAAM,0BAA0B,CAAC;AAoBlC,wBAAgB,8BAA8B,CAC5C,GAAG,EAAE,kBAAkB,EAAE,EACzB,QAAQ,EAAE,QAAQ,CAAC,uBAAuB,CAAC,EAC3C,KAAK,EAAE,QAAQ,CAAC,gBAAgB,CAAC,EACjC,OAAO,EAAE,oBAAoB,GAC5B,IAAI,CAGN;AAID,wBAAgB,0BAA0B,CACxC,QAAQ,EAAE,QAAQ,CAAC,uBAAuB,CAAC,EAC3C,KAAK,EAAE,QAAQ,CAAC,gBAAgB,CAAC,GAChC,OAAO,CAET"}
@@ -1,42 +1,74 @@
1
- import { RenderRegistry, SceneCoverage } from '@flighthq/types/contract';
1
+ import { RenderRegistry, RequirementFacet, SceneCoverage } from '@flighthq/types/contract';
2
2
  import { hasScene3DMaterialTextureLister } from './sceneMaterialTextureRegistry';
3
3
  // Clears `out`, then reports EVERY material kind in `usage` with how well this resolver describes it —
4
4
  // satisfied ones included, so one call is a complete manifest rather than only a list of complaints. The resource
5
5
  // layer's half of the scene↔consumer seam: @flighthq/scene3d says what a document uses, each holder of a
6
- // registry answers for its own. It reads the registry rather than a table of names, so it cannot go
7
- // stale against a registrar rename.
6
+ // registry answers for its own. The verdict reads the live registry; `catalog`, the caller's complete
7
+ // resource inventory, supplies the primary remedy only for a shortfall.
8
8
  //
9
9
  // Ask it after parsing and before loading, while the answer is still actionable.
10
10
  //
11
- // A gap here is always Missing, never Fallback: the registry has no default lister, so an unlisted kind
12
- // contributes nothing rather than something approximate. Note this no longer affects which images get
13
- // fetched — getScene3DResourceTextures reads the resource back-edge and is registry-free — so the cost
14
- // of a gap is confined to consumers that need mesh→texture ownership, chiefly the reveal-on-resolve
15
- // recipe, whose meshes would wait for an event that never names them.
16
- export function explainScene3DResourceCoverage(out, resolver, usage) {
11
+ // A gap here is always a total absence, never a fallback: the registry has no default lister, so an unlisted kind
12
+ // contributes nothing rather than something approximate. Image acquisition is unaffected because
13
+ // getScene3DResourceTextures reads the resource back-edge without consulting this registry. Consumers
14
+ // that need mesh→texture ownership see only listed families. When every material on a mesh is unlisted,
15
+ // reveal-on-resolve leaves its starting alpha unchanged and installs no fade. When a listed sibling has
16
+ // pending textures, the recipe hides the mesh but waits only for those listed textures; it can reveal the
17
+ // mesh while an unlisted material's texture is still pending, so that texture may pop in later.
18
+ export function explainScene3DResourceCoverage(out, resolver, usage, catalog) {
17
19
  out.length = 0;
18
- collectScene3DResourceCoverageGaps(out, resolver, usage, false);
20
+ collectScene3DResourceCoverageGaps(out, resolver, usage, false, catalog);
19
21
  }
20
22
  // Whether this resolver can describe every material kind `usage` names. Stops at the first gap and
21
23
  // never allocates, so it is cheap enough to call per load. Use the explain form to find out WHICH kind.
22
24
  export function hasScene3DResourceCoverage(resolver, usage) {
23
- return !collectScene3DResourceCoverageGaps(null, resolver, usage, true);
25
+ return !collectScene3DResourceCoverageGaps(null, resolver, usage, true, null);
24
26
  }
25
27
  // The single implementation both tiers read, so the boolean can never disagree with the explanation.
26
28
  // `found` counts only real shortfalls, so appending satisfied entries to `out` never flips the predicate.
27
- function collectScene3DResourceCoverageGaps(out, resolver, usage, stopAtFirst) {
29
+ function collectScene3DResourceCoverageGaps(out, resolver, usage, stopAtFirst, catalog) {
28
30
  let found = false;
29
31
  for (let i = 0; i < usage.materialKinds.length; i++) {
30
32
  const kind = usage.materialKinds[i];
31
33
  if (hasScene3DMaterialTextureLister(resolver.registry, kind)) {
32
- out?.push({ coverage: SceneCoverage.Satisfied, kind, registry: RenderRegistry.MaterialTextureLister });
34
+ out?.push({
35
+ coverage: SceneCoverage.Satisfied,
36
+ facet: RequirementFacet.SceneMaterialKind,
37
+ kind,
38
+ registry: RenderRegistry.MaterialTextureLister,
39
+ });
33
40
  continue;
34
41
  }
35
42
  found = true;
36
43
  if (stopAtFirst)
37
44
  return true;
38
- out?.push({ coverage: SceneCoverage.Missing, kind, registry: RenderRegistry.MaterialTextureLister });
45
+ out?.push(createShortfallEntry(catalog, false, RequirementFacet.SceneMaterialKind, kind, RenderRegistry.MaterialTextureLister));
39
46
  }
40
47
  return found;
41
48
  }
49
+ function createShortfallEntry(catalog, fallback, facet, kind, registry) {
50
+ const registration = findCatalogRegistration(catalog, kind, registry);
51
+ const base = { facet, kind, registry };
52
+ if (registration === null) {
53
+ return {
54
+ ...base,
55
+ coverage: fallback ? SceneCoverage.FallbackUnavailable : SceneCoverage.Unavailable,
56
+ };
57
+ }
58
+ return {
59
+ ...base,
60
+ coverage: fallback ? SceneCoverage.FallbackRemediable : SceneCoverage.Unregistered,
61
+ module: registration.module,
62
+ registrar: registration.registrar,
63
+ };
64
+ }
65
+ function findCatalogRegistration(catalog, kind, registry) {
66
+ if (catalog === null)
67
+ return null;
68
+ for (const entry of catalog) {
69
+ if (entry.kind === kind && entry.registry === registry)
70
+ return entry.registrations[0] ?? null;
71
+ }
72
+ return null;
73
+ }
42
74
  //# sourceMappingURL=explainScene3DResourceCoverage.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"explainScene3DResourceCoverage.js","sourceRoot":"","sources":["../src/explainScene3DResourceCoverage.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,cAAc,EAAE,aAAa,EAAE,MAAM,0BAA0B,CAAC;AAEzE,OAAO,EAAE,+BAA+B,EAAE,MAAM,gCAAgC,CAAC;AAEjF,uGAAuG;AACvG,kHAAkH;AAClH,yGAAyG;AACzG,oGAAoG;AACpG,oCAAoC;AACpC,EAAE;AACF,iFAAiF;AACjF,EAAE;AACF,wGAAwG;AACxG,sGAAsG;AACtG,uGAAuG;AACvG,oGAAoG;AACpG,sEAAsE;AACtE,MAAM,UAAU,8BAA8B,CAC5C,GAAyB,EACzB,QAA2C,EAC3C,KAAiC;IAEjC,GAAG,CAAC,MAAM,GAAG,CAAC,CAAC;IACf,kCAAkC,CAAC,GAAG,EAAE,QAAQ,EAAE,KAAK,EAAE,KAAK,CAAC,CAAC;AAClE,CAAC;AAED,mGAAmG;AACnG,wGAAwG;AACxG,MAAM,UAAU,0BAA0B,CACxC,QAA2C,EAC3C,KAAiC;IAEjC,OAAO,CAAC,kCAAkC,CAAC,IAAI,EAAE,QAAQ,EAAE,KAAK,EAAE,IAAI,CAAC,CAAC;AAC1E,CAAC;AAED,qGAAqG;AACrG,0GAA0G;AAC1G,SAAS,kCAAkC,CACzC,GAAgC,EAChC,QAA2C,EAC3C,KAAiC,EACjC,WAAoB;IAEpB,IAAI,KAAK,GAAG,KAAK,CAAC;IAClB,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,KAAK,CAAC,aAAa,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;QACpD,MAAM,IAAI,GAAG,KAAK,CAAC,aAAa,CAAC,CAAC,CAAC,CAAC;QACpC,IAAI,+BAA+B,CAAC,QAAQ,CAAC,QAAQ,EAAE,IAAI,CAAC,EAAE,CAAC;YAC7D,GAAG,EAAE,IAAI,CAAC,EAAE,QAAQ,EAAE,aAAa,CAAC,SAAS,EAAE,IAAI,EAAE,QAAQ,EAAE,cAAc,CAAC,qBAAqB,EAAE,CAAC,CAAC;YACvG,SAAS;QACX,CAAC;QACD,KAAK,GAAG,IAAI,CAAC;QACb,IAAI,WAAW;YAAE,OAAO,IAAI,CAAC;QAC7B,GAAG,EAAE,IAAI,CAAC,EAAE,QAAQ,EAAE,aAAa,CAAC,OAAO,EAAE,IAAI,EAAE,QAAQ,EAAE,cAAc,CAAC,qBAAqB,EAAE,CAAC,CAAC;IACvG,CAAC;IACD,OAAO,KAAK,CAAC;AACf,CAAC"}
1
+ {"version":3,"file":"explainScene3DResourceCoverage.js","sourceRoot":"","sources":["../src/explainScene3DResourceCoverage.ts"],"names":[],"mappings":"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"}
package/dist/index.d.ts CHANGED
@@ -1,2 +1,2 @@
1
- export { areScene3DResourceFailureGuardsEnabled, createBuiltInScene3DResourceResolver, createScene3DResourceResolver, disableScene3DResourceFailureGuards, disposeScene3DResourceResolver, enableScene3DResourceFailureGuards, enableScene3DResourceSignals, fetchWebImageResource, getScene3DDocumentBasePathFromUrl, getScene3DResourceSignals, getScene3DResourceTextures, loadScene3DDocumentBytesFromUrl, loadScene3DDocumentFrom3dsUrl, loadScene3DDocumentFromAwd2Url, loadScene3DDocumentFromGlbUrl, loadScene3DDocumentFromGltfUrl, loadScene3DDocumentFromMd2Url, loadScene3DDocumentFromMd5MeshUrl, loadScene3DDocumentFromObjUrl, loadScene3DDocumentTextFromUrl, loadScene3DResources, resolveImageResourceUri, resolveOneScene3DResourceTexture, resolveScene3DResources, retryFailedScene3DResources, revealScene3DResourcesOnResolve, setScene3DDocumentResourceBasePathFromUrl, updateScene3DResourceStreaming, waitForScene3DResourceResolver, } from './contract';
1
+ export { areScene3DResourceFailureGuardsEnabled, createBuiltInScene3DResourceResolver, createScene3DResourceResolver, disableScene3DResourceFailureGuards, disposeScene3DResourceResolver, enableScene3DResourceFailureGuards, enableScene3DResourceSignals, explainScene3DResourceCoverage, fetchWebImageResource, getScene3DDocumentBasePathFromUrl, getScene3DResourceSignals, getScene3DResourceTextures, loadScene3DDocumentBytesFromUrl, loadScene3DDocumentFrom3dsUrl, loadScene3DDocumentFromAwd2Url, loadScene3DDocumentFromGlbUrl, loadScene3DDocumentFromGltfUrl, loadScene3DDocumentFromMd2Url, loadScene3DDocumentFromMd5MeshUrl, loadScene3DDocumentFromObjUrl, loadScene3DDocumentTextFromUrl, loadScene3DResources, resolveImageResourceUri, resolveOneScene3DResourceTexture, resolveScene3DResources, retryFailedScene3DResources, revealScene3DResourcesOnResolve, setScene3DDocumentResourceBasePathFromUrl, updateScene3DResourceStreaming, waitForScene3DResourceResolver, } from './contract';
2
2
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,sCAAsC,EACtC,oCAAoC,EACpC,6BAA6B,EAC7B,mCAAmC,EACnC,8BAA8B,EAC9B,kCAAkC,EAClC,4BAA4B,EAC5B,qBAAqB,EACrB,iCAAiC,EACjC,yBAAyB,EACzB,0BAA0B,EAC1B,+BAA+B,EAC/B,6BAA6B,EAC7B,8BAA8B,EAC9B,6BAA6B,EAC7B,8BAA8B,EAC9B,6BAA6B,EAC7B,iCAAiC,EACjC,6BAA6B,EAC7B,8BAA8B,EAC9B,oBAAoB,EACpB,uBAAuB,EACvB,gCAAgC,EAChC,uBAAuB,EACvB,2BAA2B,EAC3B,+BAA+B,EAC/B,yCAAyC,EACzC,8BAA8B,EAC9B,8BAA8B,GAC/B,MAAM,YAAY,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,sCAAsC,EACtC,oCAAoC,EACpC,6BAA6B,EAC7B,mCAAmC,EACnC,8BAA8B,EAC9B,kCAAkC,EAClC,4BAA4B,EAC5B,8BAA8B,EAC9B,qBAAqB,EACrB,iCAAiC,EACjC,yBAAyB,EACzB,0BAA0B,EAC1B,+BAA+B,EAC/B,6BAA6B,EAC7B,8BAA8B,EAC9B,6BAA6B,EAC7B,8BAA8B,EAC9B,6BAA6B,EAC7B,iCAAiC,EACjC,6BAA6B,EAC7B,8BAA8B,EAC9B,oBAAoB,EACpB,uBAAuB,EACvB,gCAAgC,EAChC,uBAAuB,EACvB,2BAA2B,EAC3B,+BAA+B,EAC/B,yCAAyC,EACzC,8BAA8B,EAC9B,8BAA8B,GAC/B,MAAM,YAAY,CAAC"}
package/dist/index.js CHANGED
@@ -1,2 +1,2 @@
1
- export { areScene3DResourceFailureGuardsEnabled, createBuiltInScene3DResourceResolver, createScene3DResourceResolver, disableScene3DResourceFailureGuards, disposeScene3DResourceResolver, enableScene3DResourceFailureGuards, enableScene3DResourceSignals, fetchWebImageResource, getScene3DDocumentBasePathFromUrl, getScene3DResourceSignals, getScene3DResourceTextures, loadScene3DDocumentBytesFromUrl, loadScene3DDocumentFrom3dsUrl, loadScene3DDocumentFromAwd2Url, loadScene3DDocumentFromGlbUrl, loadScene3DDocumentFromGltfUrl, loadScene3DDocumentFromMd2Url, loadScene3DDocumentFromMd5MeshUrl, loadScene3DDocumentFromObjUrl, loadScene3DDocumentTextFromUrl, loadScene3DResources, resolveImageResourceUri, resolveOneScene3DResourceTexture, resolveScene3DResources, retryFailedScene3DResources, revealScene3DResourcesOnResolve, setScene3DDocumentResourceBasePathFromUrl, updateScene3DResourceStreaming, waitForScene3DResourceResolver, } from './contract';
1
+ export { areScene3DResourceFailureGuardsEnabled, createBuiltInScene3DResourceResolver, createScene3DResourceResolver, disableScene3DResourceFailureGuards, disposeScene3DResourceResolver, enableScene3DResourceFailureGuards, enableScene3DResourceSignals, explainScene3DResourceCoverage, fetchWebImageResource, getScene3DDocumentBasePathFromUrl, getScene3DResourceSignals, getScene3DResourceTextures, loadScene3DDocumentBytesFromUrl, loadScene3DDocumentFrom3dsUrl, loadScene3DDocumentFromAwd2Url, loadScene3DDocumentFromGlbUrl, loadScene3DDocumentFromGltfUrl, loadScene3DDocumentFromMd2Url, loadScene3DDocumentFromMd5MeshUrl, loadScene3DDocumentFromObjUrl, loadScene3DDocumentTextFromUrl, loadScene3DResources, resolveImageResourceUri, resolveOneScene3DResourceTexture, resolveScene3DResources, retryFailedScene3DResources, revealScene3DResourcesOnResolve, setScene3DDocumentResourceBasePathFromUrl, updateScene3DResourceStreaming, waitForScene3DResourceResolver, } from './contract';
2
2
  //# sourceMappingURL=index.js.map
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,sCAAsC,EACtC,oCAAoC,EACpC,6BAA6B,EAC7B,mCAAmC,EACnC,8BAA8B,EAC9B,kCAAkC,EAClC,4BAA4B,EAC5B,qBAAqB,EACrB,iCAAiC,EACjC,yBAAyB,EACzB,0BAA0B,EAC1B,+BAA+B,EAC/B,6BAA6B,EAC7B,8BAA8B,EAC9B,6BAA6B,EAC7B,8BAA8B,EAC9B,6BAA6B,EAC7B,iCAAiC,EACjC,6BAA6B,EAC7B,8BAA8B,EAC9B,oBAAoB,EACpB,uBAAuB,EACvB,gCAAgC,EAChC,uBAAuB,EACvB,2BAA2B,EAC3B,+BAA+B,EAC/B,yCAAyC,EACzC,8BAA8B,EAC9B,8BAA8B,GAC/B,MAAM,YAAY,CAAC"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,sCAAsC,EACtC,oCAAoC,EACpC,6BAA6B,EAC7B,mCAAmC,EACnC,8BAA8B,EAC9B,kCAAkC,EAClC,4BAA4B,EAC5B,8BAA8B,EAC9B,qBAAqB,EACrB,iCAAiC,EACjC,yBAAyB,EACzB,0BAA0B,EAC1B,+BAA+B,EAC/B,6BAA6B,EAC7B,8BAA8B,EAC9B,6BAA6B,EAC7B,8BAA8B,EAC9B,6BAA6B,EAC7B,iCAAiC,EACjC,6BAA6B,EAC7B,8BAA8B,EAC9B,oBAAoB,EACpB,uBAAuB,EACvB,gCAAgC,EAChC,uBAAuB,EACvB,2BAA2B,EAC3B,+BAA+B,EAC/B,yCAAyC,EACzC,8BAA8B,EAC9B,8BAA8B,GAC/B,MAAM,YAAY,CAAC"}
@@ -1,5 +1,5 @@
1
- import type { Image, Scene3D, ImageResourceReference, ResolveScene3DResourcesOptions, Scene3DResources, Scene3DResourceResolver, UpdateScene3DResourceStreamingOptions } from '@flighthq/types/contract';
2
- export declare function resolveOneScene3DResourceTexture(resolver: Readonly<Scene3DResourceResolver>, ref: Readonly<ImageResourceReference>, signal: AbortSignal): Promise<Image | null>;
1
+ import type { ImageResourceReference, ResolveScene3DResourcesOptions, Scene3D, Scene3DResources, Scene3DResourceResolver, TextureSource, UpdateScene3DResourceStreamingOptions } from '@flighthq/types/contract';
2
+ export declare function resolveOneScene3DResourceTexture(resolver: Readonly<Scene3DResourceResolver>, ref: ImageResourceReference, signal: AbortSignal): Promise<TextureSource | null>;
3
3
  export declare function resolveScene3DResources(scene: Readonly<Scene3D>, resolver: Scene3DResourceResolver, options?: Readonly<ResolveScene3DResourcesOptions>): Scene3DResources;
4
4
  export declare function updateScene3DResourceStreaming(scene: Readonly<Scene3D>, resolver: Scene3DResourceResolver, options?: Readonly<UpdateScene3DResourceStreamingOptions>): Scene3DResources;
5
5
  //# sourceMappingURL=resolveScene3DResources.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"resolveScene3DResources.d.ts","sourceRoot":"","sources":["../src/resolveScene3DResources.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EACV,KAAK,EACL,OAAO,EACP,sBAAsB,EACtB,8BAA8B,EAC9B,gBAAgB,EAChB,uBAAuB,EAGvB,qCAAqC,EACtC,MAAM,0BAA0B,CAAC;AAelC,wBAAgB,gCAAgC,CAC9C,QAAQ,EAAE,QAAQ,CAAC,uBAAuB,CAAC,EAC3C,GAAG,EAAE,QAAQ,CAAC,sBAAsB,CAAC,EACrC,MAAM,EAAE,WAAW,GAClB,OAAO,CAAC,KAAK,GAAG,IAAI,CAAC,CAKvB;AAMD,wBAAgB,uBAAuB,CACrC,KAAK,EAAE,QAAQ,CAAC,OAAO,CAAC,EACxB,QAAQ,EAAE,uBAAuB,EACjC,OAAO,CAAC,EAAE,QAAQ,CAAC,8BAA8B,CAAC,GACjD,gBAAgB,CA0ClB;AAID,wBAAgB,8BAA8B,CAC5C,KAAK,EAAE,QAAQ,CAAC,OAAO,CAAC,EACxB,QAAQ,EAAE,uBAAuB,EACjC,OAAO,CAAC,EAAE,QAAQ,CAAC,qCAAqC,CAAC,GACxD,gBAAgB,CAQlB"}
1
+ {"version":3,"file":"resolveScene3DResources.d.ts","sourceRoot":"","sources":["../src/resolveScene3DResources.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EACV,sBAAsB,EACtB,8BAA8B,EAC9B,OAAO,EACP,gBAAgB,EAChB,uBAAuB,EAGvB,aAAa,EACb,qCAAqC,EACtC,MAAM,0BAA0B,CAAC;AAUlC,wBAAgB,gCAAgC,CAC9C,QAAQ,EAAE,QAAQ,CAAC,uBAAuB,CAAC,EAC3C,GAAG,EAAE,sBAAsB,EAC3B,MAAM,EAAE,WAAW,GAClB,OAAO,CAAC,aAAa,GAAG,IAAI,CAAC,CAE/B;AAMD,wBAAgB,uBAAuB,CACrC,KAAK,EAAE,QAAQ,CAAC,OAAO,CAAC,EACxB,QAAQ,EAAE,uBAAuB,EACjC,OAAO,CAAC,EAAE,QAAQ,CAAC,8BAA8B,CAAC,GACjD,gBAAgB,CA0ClB;AAID,wBAAgB,8BAA8B,CAC5C,KAAK,EAAE,QAAQ,CAAC,OAAO,CAAC,EACxB,QAAQ,EAAE,uBAAuB,EACjC,OAAO,CAAC,EAAE,QAAQ,CAAC,qCAAqC,CAAC,GACxD,gBAAgB,CAQlB"}
@@ -1,20 +1,17 @@
1
- import { createImageResourceFailure, loadImageResourceFromBytes } from '@flighthq/image/contract';
1
+ import { createImageResourceFailure, resolveImageResourceReference } from '@flighthq/image/contract';
2
2
  import { queueResourceLoad } from '@flighthq/loader/contract';
3
3
  import { emitSignal } from '@flighthq/signals/contract';
4
- import { ImageResourceFailureKind, ImageTextureSourceKind, ResourceResolutionState, ImageResourceReferenceKind, } from '@flighthq/types/contract';
4
+ import { ImageResourceFailureKind, ResourceResolutionState } from '@flighthq/types/contract';
5
5
  import { Scene3DResourceResolverRuntimeKey } from '@flighthq/types/contract';
6
6
  import { getScene3DResourceTextures, getScene3DTextureResourceReference } from './getScene3DResourceTextures';
7
- // Resolves one texture's ref to an Image (or null for an expected failure): Embedded bytes
7
+ // Resolves one texture's ref to a TextureSource (or null for an expected failure): Embedded bytes
8
8
  // decode through @flighthq/image; External URIs go through the resolver's fetch seam. Cancellation is
9
9
  // carried by `signal` (both paths reject on abort). Exported for direct testing of the two ref kinds.
10
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);
11
+ return resolveImageResourceReference(ref, resolver.fetch, signal);
15
12
  }
16
13
  // Reconciles the selected working set entirely synchronously. It groups shared references, recognizes
17
- // content already present on a texture, and binds resolver-cached images to every selected subscriber.
14
+ // content already present on a texture, and binds resolver-cached sources to every selected subscriber.
18
15
  // Acquisition, cancellation, Promise scheduling, and priority policy belong to the explicit update/load
19
16
  // operations.
20
17
  export function resolveScene3DResources(scene, resolver, options) {
@@ -27,9 +24,9 @@ export function resolveScene3DResources(scene, resolver, options) {
27
24
  const ref = getScene3DTextureResourceReference(scene, texture);
28
25
  if (ref == null)
29
26
  continue;
30
- const image = texture.dimension === '2d' ? texture.source : null;
31
- if (image?.kind === ImageTextureSourceKind) {
32
- runtime.resolved.set(ref, image);
27
+ const source = texture.dimension === '2d' ? texture.source : null;
28
+ if (source !== null) {
29
+ runtime.resolved.set(ref, source);
33
30
  ref.failure = null;
34
31
  ref.state = ResourceResolutionState.Resolved;
35
32
  }
@@ -45,8 +42,8 @@ export function resolveScene3DResources(scene, resolver, options) {
45
42
  const resolved = [];
46
43
  const unresolved = [];
47
44
  for (const [ref, subscribers] of working) {
48
- const image = runtime.resolved.get(ref);
49
- if (image === undefined) {
45
+ const source = runtime.resolved.get(ref);
46
+ if (source === undefined) {
50
47
  if (ref.state === ResourceResolutionState.Resolved)
51
48
  ref.state = ResourceResolutionState.Unresolved;
52
49
  unresolved.push({ ref, textures: subscribers });
@@ -55,9 +52,9 @@ export function resolveScene3DResources(scene, resolver, options) {
55
52
  ref.failure = null;
56
53
  ref.state = ResourceResolutionState.Resolved;
57
54
  for (let i = 0; i < subscribers.length; i++) {
58
- bindResolvedScene3DResource(resolver, subscribers[i], ref, image);
55
+ bindResolvedScene3DResource(resolver, subscribers[i], ref, source);
59
56
  }
60
- resolved.push({ image, ref, textures: subscribers });
57
+ resolved.push({ ref, source, textures: subscribers });
61
58
  }
62
59
  return { resolved, scene, unresolved };
63
60
  }
@@ -95,16 +92,16 @@ function cancelDroppedResolutions(resolver, working) {
95
92
  }
96
93
  }
97
94
  }
98
- function finishScene3DResourceResolution(resolver, ref, entry, image) {
95
+ function finishScene3DResourceResolution(resolver, ref, entry, source) {
99
96
  const runtime = resolver[Scene3DResourceResolverRuntimeKey];
100
97
  // Ignore a late settle whose entry was already cancelled or replaced by a newer request.
101
98
  if (runtime.inFlight.get(ref) !== entry)
102
99
  return;
103
100
  runtime.inFlight.delete(ref);
104
- if (image === null) {
105
- ref.failure = {
101
+ if (source === null) {
102
+ ref.failure ??= {
106
103
  kind: ImageResourceFailureKind.Unavailable,
107
- message: 'Image resource resolution returned no image',
104
+ message: 'Image resource resolution returned no source',
108
105
  name: null,
109
106
  };
110
107
  ref.state = ResourceResolutionState.Failed;
@@ -112,11 +109,11 @@ function finishScene3DResourceResolution(resolver, ref, entry, image) {
112
109
  emitScene3DResourceEvent(resolver, texture, ref, false);
113
110
  return;
114
111
  }
115
- runtime.resolved.set(ref, image);
112
+ runtime.resolved.set(ref, source);
116
113
  ref.failure = null;
117
114
  ref.state = ResourceResolutionState.Resolved;
118
115
  for (const texture of entry.subscribers)
119
- bindResolvedScene3DResource(resolver, texture, ref, image);
116
+ bindResolvedScene3DResource(resolver, texture, ref, source);
120
117
  }
121
118
  function failScene3DResourceResolution(resolver, ref, entry, cause) {
122
119
  const runtime = resolver[Scene3DResourceResolverRuntimeKey];
@@ -131,12 +128,12 @@ function failScene3DResourceResolution(resolver, ref, entry, cause) {
131
128
  for (const texture of entry.subscribers)
132
129
  emitScene3DResourceEvent(resolver, texture, ref, false);
133
130
  }
134
- function bindResolvedScene3DResource(resolver, texture, ref, image) {
131
+ function bindResolvedScene3DResource(resolver, texture, ref, source) {
135
132
  if (texture.dimension !== '2d')
136
133
  return;
137
- if (texture.source === image)
134
+ if (texture.source === source)
138
135
  return;
139
- texture.source = image;
136
+ texture.source = source;
140
137
  texture.version = (texture.version + 1) >>> 0;
141
138
  emitScene3DResourceEvent(resolver, texture, ref, true);
142
139
  }
@@ -191,7 +188,7 @@ function requestWorkingResolutions(resolver, working, options) {
191
188
  promise: _resolvedVoid,
192
189
  subscribers: new Set(subscribers),
193
190
  };
194
- entry.promise = handle.promise.then((image) => finishScene3DResourceResolution(resolver, ref, entry, image), (cause) => failScene3DResourceResolution(resolver, ref, entry, cause));
191
+ entry.promise = handle.promise.then((source) => finishScene3DResourceResolution(resolver, ref, entry, source), (cause) => failScene3DResourceResolution(resolver, ref, entry, cause));
195
192
  runtime.inFlight.set(ref, entry);
196
193
  }
197
194
  }
@@ -1 +1 @@
1
- {"version":3,"file":"resolveScene3DResources.js","sourceRoot":"","sources":["../src/resolveScene3DResources.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,0BAA0B,EAAE,0BAA0B,EAAE,MAAM,0BAA0B,CAAC;AAClG,OAAO,EAAE,iBAAiB,EAAE,MAAM,2BAA2B,CAAC;AAC9D,OAAO,EAAE,UAAU,EAAE,MAAM,4BAA4B,CAAC;AAYxD,OAAO,EACL,wBAAwB,EACxB,sBAAsB,EACtB,uBAAuB,EACvB,0BAA0B,GAC3B,MAAM,0BAA0B,CAAC;AAClC,OAAO,EAAE,iCAAiC,EAAE,MAAM,0BAA0B,CAAC;AAG7E,OAAO,EAAE,0BAA0B,EAAE,kCAAkC,EAAE,MAAM,8BAA8B,CAAC;AAE9G,2FAA2F;AAC3F,sGAAsG;AACtG,sGAAsG;AACtG,MAAM,UAAU,gCAAgC,CAC9C,QAA2C,EAC3C,GAAqC,EACrC,MAAmB;IAEnB,IAAI,GAAG,CAAC,IAAI,KAAK,0BAA0B,CAAC,QAAQ,EAAE,CAAC;QACrD,OAAO,0BAA0B,CAAC,GAAG,CAAC,KAAK,EAAE,GAAG,CAAC,QAAQ,IAAI,SAAS,EAAE,MAAM,CAAC,CAAC;IAClF,CAAC;IACD,OAAO,QAAQ,CAAC,KAAK,CAAC,GAAG,EAAE,MAAM,CAAC,CAAC;AACrC,CAAC;AAED,sGAAsG;AACtG,uGAAuG;AACvG,wGAAwG;AACxG,cAAc;AACd,MAAM,UAAU,uBAAuB,CACrC,KAAwB,EACxB,QAAiC,EACjC,OAAkD;IAElD,MAAM,OAAO,GAAI,QAA+C,CAAC,iCAAiC,CAAC,CAAC;IACpG,MAAM,QAAQ,GAAc,EAAE,CAAC;IAC/B,0BAA0B,CAAC,QAAQ,EAAE,KAAK,CAAC,CAAC;IAE5C,MAAM,OAAO,GAAG,IAAI,GAAG,EAAqC,CAAC;IAC7D,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,kCAAkC,CAAC,KAAK,EAAE,OAAO,CAAC,CAAC;QAC/D,IAAI,GAAG,IAAI,IAAI;YAAE,SAAS;QAC1B,MAAM,KAAK,GAAG,OAAO,CAAC,SAAS,KAAK,IAAI,CAAC,CAAC,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC;QACjE,IAAI,KAAK,EAAE,IAAI,KAAK,sBAAsB,EAAE,CAAC;YAC3C,OAAO,CAAC,QAAQ,CAAC,GAAG,CAAC,GAAG,EAAE,KAAc,CAAC,CAAC;YAC1C,GAAG,CAAC,OAAO,GAAG,IAAI,CAAC;YACnB,GAAG,CAAC,KAAK,GAAG,uBAAuB,CAAC,QAAQ,CAAC;QAC/C,CAAC;QACD,IAAI,OAAO,EAAE,MAAM,KAAK,SAAS,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,OAAO,EAAE,GAAG,CAAC;YAAE,SAAS;QAC7E,IAAI,WAAW,GAAG,OAAO,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;QACnC,IAAI,WAAW,KAAK,SAAS,EAAE,CAAC;YAC9B,WAAW,GAAG,EAAE,CAAC;YACjB,OAAO,CAAC,GAAG,CAAC,GAAG,EAAE,WAAW,CAAC,CAAC;QAChC,CAAC;QACD,WAAW,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;IAC5B,CAAC;IAED,MAAM,QAAQ,GAAiC,EAAE,CAAC;IAClD,MAAM,UAAU,GAAgC,EAAE,CAAC;IACnD,KAAK,MAAM,CAAC,GAAG,EAAE,WAAW,CAAC,IAAI,OAAO,EAAE,CAAC;QACzC,MAAM,KAAK,GAAG,OAAO,CAAC,QAAQ,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;QACxC,IAAI,KAAK,KAAK,SAAS,EAAE,CAAC;YACxB,IAAI,GAAG,CAAC,KAAK,KAAK,uBAAuB,CAAC,QAAQ;gBAAE,GAAG,CAAC,KAAK,GAAG,uBAAuB,CAAC,UAAU,CAAC;YACnG,UAAU,CAAC,IAAI,CAAC,EAAE,GAAG,EAAE,QAAQ,EAAE,WAAW,EAAE,CAAC,CAAC;YAChD,SAAS;QACX,CAAC;QACD,GAAG,CAAC,OAAO,GAAG,IAAI,CAAC;QACnB,GAAG,CAAC,KAAK,GAAG,uBAAuB,CAAC,QAAQ,CAAC;QAC7C,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,WAAW,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;YAC5C,2BAA2B,CAAC,QAAQ,EAAE,WAAW,CAAC,CAAC,CAAC,EAAE,GAAG,EAAE,KAAK,CAAC,CAAC;QACpE,CAAC;QACD,QAAQ,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,GAAG,EAAE,QAAQ,EAAE,WAAW,EAAE,CAAC,CAAC;IACvD,CAAC;IACD,OAAO,EAAE,QAAQ,EAAE,KAAK,EAAE,UAAU,EAAE,CAAC;AACzC,CAAC;AAED,uGAAuG;AACvG,yGAAyG;AACzG,MAAM,UAAU,8BAA8B,CAC5C,KAAwB,EACxB,QAAiC,EACjC,OAAyD;IAEzD,MAAM,SAAS,GAAG,uBAAuB,CAAC,KAAK,EAAE,QAAQ,EAAE,OAAO,CAAC,CAAC;IACpE,MAAM,OAAO,GAAG,IAAI,GAAG,EAAqC,CAAC;IAC7D,oCAAoC,CAAC,OAAO,EAAE,SAAS,CAAC,QAAQ,CAAC,CAAC;IAClE,oCAAoC,CAAC,OAAO,EAAE,SAAS,CAAC,UAAU,CAAC,CAAC;IACpE,wBAAwB,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC;IAC5C,yBAAyB,CAAC,QAAQ,EAAE,OAAO,EAAE,OAAO,CAAC,CAAC;IACtD,OAAO,SAAS,CAAC;AACnB,CAAC;AAED,SAAS,oCAAoC,CAC3C,GAA2C,EAC3C,MAA4C;IAE5C,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,MAAM,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;QACvC,GAAG,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,GAAG,EAAE,MAAM,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC;IAC7C,CAAC;AACH,CAAC;AAED,SAAS,wBAAwB,CAC/B,QAAiC,EACjC,OAAgE;IAEhE,MAAM,OAAO,GAAI,QAA+C,CAAC,iCAAiC,CAAC,CAAC;IACpG,KAAK,MAAM,CAAC,GAAG,EAAE,KAAK,CAAC,IAAI,OAAO,CAAC,QAAQ,EAAE,CAAC;QAC5C,MAAM,WAAW,GAAG,OAAO,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;QACrC,IAAI,WAAW,KAAK,SAAS,IAAI,WAAW,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YACxD,KAAK,CAAC,WAAW,CAAC,KAAK,EAAE,CAAC;YAC1B,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,WAAW,CAAC,MAAM,EAAE,CAAC,EAAE;gBAAE,KAAK,CAAC,WAAW,CAAC,GAAG,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC,CAAC;YACnF,SAAS;QACX,CAAC;QACD,KAAK,CAAC,UAAU,CAAC,KAAK,EAAE,CAAC;QACzB,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;QAC7B,iGAAiG;QACjG,IAAI,GAAG,CAAC,KAAK,KAAK,uBAAuB,CAAC,OAAO,EAAE,CAAC;YAClD,GAAG,CAAC,KAAK,GAAG,uBAAuB,CAAC,UAAU,CAAC;QACjD,CAAC;IACH,CAAC;AACH,CAAC;AAED,SAAS,+BAA+B,CACtC,QAAiC,EACjC,GAA2B,EAC3B,KAA8B,EAC9B,KAAmB;IAEnB,MAAM,OAAO,GAAI,QAA+C,CAAC,iCAAiC,CAAC,CAAC;IACpG,yFAAyF;IACzF,IAAI,OAAO,CAAC,QAAQ,CAAC,GAAG,CAAC,GAAG,CAAC,KAAK,KAAK;QAAE,OAAO;IAChD,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;IAC7B,IAAI,KAAK,KAAK,IAAI,EAAE,CAAC;QACnB,GAAG,CAAC,OAAO,GAAG;YACZ,IAAI,EAAE,wBAAwB,CAAC,WAAW;YAC1C,OAAO,EAAE,6CAA6C;YACtD,IAAI,EAAE,IAAI;SACX,CAAC;QACF,GAAG,CAAC,KAAK,GAAG,uBAAuB,CAAC,MAAM,CAAC;QAC3C,KAAK,MAAM,OAAO,IAAI,KAAK,CAAC,WAAW;YAAE,wBAAwB,CAAC,QAAQ,EAAE,OAAO,EAAE,GAAG,EAAE,KAAK,CAAC,CAAC;QACjG,OAAO;IACT,CAAC;IACD,OAAO,CAAC,QAAQ,CAAC,GAAG,CAAC,GAAG,EAAE,KAAK,CAAC,CAAC;IACjC,GAAG,CAAC,OAAO,GAAG,IAAI,CAAC;IACnB,GAAG,CAAC,KAAK,GAAG,uBAAuB,CAAC,QAAQ,CAAC;IAC7C,KAAK,MAAM,OAAO,IAAI,KAAK,CAAC,WAAW;QAAE,2BAA2B,CAAC,QAAQ,EAAE,OAAO,EAAE,GAAG,EAAE,KAAK,CAAC,CAAC;AACtG,CAAC;AAED,SAAS,6BAA6B,CACpC,QAAiC,EACjC,GAA2B,EAC3B,KAA8B,EAC9B,KAAc;IAEd,MAAM,OAAO,GAAI,QAA+C,CAAC,iCAAiC,CAAC,CAAC;IACpG,IAAI,OAAO,CAAC,QAAQ,CAAC,GAAG,CAAC,GAAG,CAAC,KAAK,KAAK;QAAE,OAAO;IAChD,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;IAC7B,gGAAgG;IAChG,IAAI,KAAK,CAAC,UAAU,CAAC,MAAM,CAAC,OAAO;QAAE,OAAO;IAC5C,GAAG,CAAC,OAAO,GAAG,0BAA0B,CAAC,KAAK,CAAC,CAAC;IAChD,GAAG,CAAC,KAAK,GAAG,uBAAuB,CAAC,MAAM,CAAC;IAC3C,KAAK,MAAM,OAAO,IAAI,KAAK,CAAC,WAAW;QAAE,wBAAwB,CAAC,QAAQ,EAAE,OAAO,EAAE,GAAG,EAAE,KAAK,CAAC,CAAC;AACnG,CAAC;AAED,SAAS,2BAA2B,CAClC,QAA2C,EAC3C,OAAgB,EAChB,GAA2B,EAC3B,KAAY;IAEZ,IAAI,OAAO,CAAC,SAAS,KAAK,IAAI;QAAE,OAAO;IACvC,IAAI,OAAO,CAAC,MAAM,KAAK,KAAK;QAAE,OAAO;IACrC,OAAO,CAAC,MAAM,GAAG,KAAK,CAAC;IACvB,OAAO,CAAC,OAAO,GAAG,CAAC,OAAO,CAAC,OAAO,GAAG,CAAC,CAAC,KAAK,CAAC,CAAC;IAC9C,wBAAwB,CAAC,QAAQ,EAAE,OAAO,EAAE,GAAG,EAAE,IAAI,CAAC,CAAC;AACzD,CAAC;AAED,SAAS,wBAAwB,CAC/B,QAA2C,EAC3C,OAAgB,EAChB,GAA2B,EAC3B,QAAiB;IAEjB,MAAM,OAAO,GAAI,QAA+C,CAAC,iCAAiC,CAAC,CAAC,OAAO,CAAC;IAC5G,IAAI,OAAO,KAAK,IAAI;QAAE,OAAO;IAC7B,MAAM,KAAK,GAAG,EAAE,GAAG,EAAE,OAAO,EAAE,CAAC;IAC/B,UAAU,CAAC,QAAQ,CAAC,CAAC,CAAC,OAAO,CAAC,kBAAkB,CAAC,CAAC,CAAC,OAAO,CAAC,gBAAgB,EAAE,KAAK,CAAC,CAAC;AACtF,CAAC;AAED,SAAS,yBAAyB,CAChC,QAAiC,EACjC,OAAgE,EAChE,OAAyD;IAEzD,MAAM,OAAO,GAAI,QAA+C,CAAC,iCAAiC,CAAC,CAAC;IACpG,KAAK,MAAM,CAAC,GAAG,EAAE,WAAW,CAAC,IAAI,OAAO,EAAE,CAAC;QACzC,MAAM,QAAQ,GAAG,OAAO,CAAC,QAAQ,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;QAC3C,IAAI,QAAQ,KAAK,SAAS,EAAE,CAAC;YAC3B,GAAG,CAAC,OAAO,GAAG,IAAI,CAAC;YACnB,GAAG,CAAC,KAAK,GAAG,uBAAuB,CAAC,QAAQ,CAAC;YAC7C,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,WAAW,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;gBAC5C,2BAA2B,CAAC,QAAQ,EAAE,WAAW,CAAC,CAAC,CAAC,EAAE,GAAG,EAAE,QAAQ,CAAC,CAAC;YACvE,CAAC;YACD,SAAS;QACX,CAAC;QACD,IAAI,OAAO,CAAC,QAAQ,CAAC,GAAG,CAAC,GAAG,CAAC;YAAE,SAAS;QACxC,IAAI,GAAG,CAAC,KAAK,KAAK,uBAAuB,CAAC,QAAQ;YAAE,GAAG,CAAC,KAAK,GAAG,uBAAuB,CAAC,UAAU,CAAC;QACnG,IAAI,GAAG,CAAC,KAAK,KAAK,uBAAuB,CAAC,UAAU;YAAE,SAAS;QAC/D,GAAG,CAAC,OAAO,GAAG,IAAI,CAAC;QACnB,GAAG,CAAC,KAAK,GAAG,uBAAuB,CAAC,OAAO,CAAC;QAC5C,MAAM,UAAU,GAAG,IAAI,eAAe,EAAE,CAAC;QACzC,IAAI,QAAQ,GAAG,CAAC,CAAC;QACjB,IAAI,OAAO,EAAE,QAAQ,KAAK,SAAS,EAAE,CAAC;YACpC,QAAQ,GAAG,MAAM,CAAC,iBAAiB,CAAC;YACpC,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,WAAW,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;gBAC5C,QAAQ,GAAG,IAAI,CAAC,GAAG,CAAC,QAAQ,EAAE,OAAO,CAAC,QAAQ,CAAC,WAAW,CAAC,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC,CAAC;YACvE,CAAC;QACH,CAAC;QACD,MAAM,MAAM,GAAG,iBAAiB,CAAe,OAAO,CAAC,MAAM,EAAE;YAC7D,IAAI,EAAE,CAAC,YAAY,EAAE,EAAE;gBACrB,uFAAuF;gBACvF,IAAI,YAAY,CAAC,OAAO;oBAAE,UAAU,CAAC,KAAK,CAAC,YAAY,CAAC,MAAM,CAAC,CAAC;;oBAC3D,YAAY,CAAC,gBAAgB,CAAC,OAAO,EAAE,GAAG,EAAE,CAAC,UAAU,CAAC,KAAK,CAAC,YAAY,CAAC,MAAM,CAAC,EAAE,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC;gBACzG,OAAO,gCAAgC,CAAC,QAAQ,EAAE,GAAG,EAAE,UAAU,CAAC,MAAM,CAAC,CAAC;YAC5E,CAAC;YACD,QAAQ;SACT,CAAC,CAAC;QACH,MAAM,KAAK,GAA4B;YACrC,UAAU;YACV,OAAO,EAAE,aAAa;YACtB,WAAW,EAAE,IAAI,GAAG,CAAC,WAAW,CAAC;SAClC,CAAC;QACF,KAAK,CAAC,OAAO,GAAG,MAAM,CAAC,OAAO,CAAC,IAAI,CACjC,CAAC,KAAK,EAAE,EAAE,CAAC,+BAA+B,CAAC,QAAQ,EAAE,GAAG,EAAE,KAAK,EAAE,KAAK,CAAC,EACvE,CAAC,KAAK,EAAE,EAAE,CAAC,6BAA6B,CAAC,QAAQ,EAAE,GAAG,EAAE,KAAK,EAAE,KAAK,CAAC,CACtE,CAAC;QACF,OAAO,CAAC,QAAQ,CAAC,GAAG,CAAC,GAAG,EAAE,KAAK,CAAC,CAAC;IACnC,CAAC;AACH,CAAC;AAED,MAAM,aAAa,GAAkB,OAAO,CAAC,OAAO,EAAE,CAAC"}
1
+ {"version":3,"file":"resolveScene3DResources.js","sourceRoot":"","sources":["../src/resolveScene3DResources.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,0BAA0B,EAAE,6BAA6B,EAAE,MAAM,0BAA0B,CAAC;AACrG,OAAO,EAAE,iBAAiB,EAAE,MAAM,2BAA2B,CAAC;AAC9D,OAAO,EAAE,UAAU,EAAE,MAAM,4BAA4B,CAAC;AAYxD,OAAO,EAAE,wBAAwB,EAAE,uBAAuB,EAAE,MAAM,0BAA0B,CAAC;AAC7F,OAAO,EAAE,iCAAiC,EAAE,MAAM,0BAA0B,CAAC;AAG7E,OAAO,EAAE,0BAA0B,EAAE,kCAAkC,EAAE,MAAM,8BAA8B,CAAC;AAE9G,kGAAkG;AAClG,sGAAsG;AACtG,sGAAsG;AACtG,MAAM,UAAU,gCAAgC,CAC9C,QAA2C,EAC3C,GAA2B,EAC3B,MAAmB;IAEnB,OAAO,6BAA6B,CAAC,GAAG,EAAE,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC,CAAC;AACpE,CAAC;AAED,sGAAsG;AACtG,wGAAwG;AACxG,wGAAwG;AACxG,cAAc;AACd,MAAM,UAAU,uBAAuB,CACrC,KAAwB,EACxB,QAAiC,EACjC,OAAkD;IAElD,MAAM,OAAO,GAAI,QAA+C,CAAC,iCAAiC,CAAC,CAAC;IACpG,MAAM,QAAQ,GAAc,EAAE,CAAC;IAC/B,0BAA0B,CAAC,QAAQ,EAAE,KAAK,CAAC,CAAC;IAE5C,MAAM,OAAO,GAAG,IAAI,GAAG,EAAqC,CAAC;IAC7D,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,kCAAkC,CAAC,KAAK,EAAE,OAAO,CAAC,CAAC;QAC/D,IAAI,GAAG,IAAI,IAAI;YAAE,SAAS;QAC1B,MAAM,MAAM,GAAG,OAAO,CAAC,SAAS,KAAK,IAAI,CAAC,CAAC,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC;QAClE,IAAI,MAAM,KAAK,IAAI,EAAE,CAAC;YACpB,OAAO,CAAC,QAAQ,CAAC,GAAG,CAAC,GAAG,EAAE,MAAM,CAAC,CAAC;YAClC,GAAG,CAAC,OAAO,GAAG,IAAI,CAAC;YACnB,GAAG,CAAC,KAAK,GAAG,uBAAuB,CAAC,QAAQ,CAAC;QAC/C,CAAC;QACD,IAAI,OAAO,EAAE,MAAM,KAAK,SAAS,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,OAAO,EAAE,GAAG,CAAC;YAAE,SAAS;QAC7E,IAAI,WAAW,GAAG,OAAO,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;QACnC,IAAI,WAAW,KAAK,SAAS,EAAE,CAAC;YAC9B,WAAW,GAAG,EAAE,CAAC;YACjB,OAAO,CAAC,GAAG,CAAC,GAAG,EAAE,WAAW,CAAC,CAAC;QAChC,CAAC;QACD,WAAW,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;IAC5B,CAAC;IAED,MAAM,QAAQ,GAAiC,EAAE,CAAC;IAClD,MAAM,UAAU,GAAgC,EAAE,CAAC;IACnD,KAAK,MAAM,CAAC,GAAG,EAAE,WAAW,CAAC,IAAI,OAAO,EAAE,CAAC;QACzC,MAAM,MAAM,GAAG,OAAO,CAAC,QAAQ,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;QACzC,IAAI,MAAM,KAAK,SAAS,EAAE,CAAC;YACzB,IAAI,GAAG,CAAC,KAAK,KAAK,uBAAuB,CAAC,QAAQ;gBAAE,GAAG,CAAC,KAAK,GAAG,uBAAuB,CAAC,UAAU,CAAC;YACnG,UAAU,CAAC,IAAI,CAAC,EAAE,GAAG,EAAE,QAAQ,EAAE,WAAW,EAAE,CAAC,CAAC;YAChD,SAAS;QACX,CAAC;QACD,GAAG,CAAC,OAAO,GAAG,IAAI,CAAC;QACnB,GAAG,CAAC,KAAK,GAAG,uBAAuB,CAAC,QAAQ,CAAC;QAC7C,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,WAAW,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;YAC5C,2BAA2B,CAAC,QAAQ,EAAE,WAAW,CAAC,CAAC,CAAC,EAAE,GAAG,EAAE,MAAM,CAAC,CAAC;QACrE,CAAC;QACD,QAAQ,CAAC,IAAI,CAAC,EAAE,GAAG,EAAE,MAAM,EAAE,QAAQ,EAAE,WAAW,EAAE,CAAC,CAAC;IACxD,CAAC;IACD,OAAO,EAAE,QAAQ,EAAE,KAAK,EAAE,UAAU,EAAE,CAAC;AACzC,CAAC;AAED,uGAAuG;AACvG,yGAAyG;AACzG,MAAM,UAAU,8BAA8B,CAC5C,KAAwB,EACxB,QAAiC,EACjC,OAAyD;IAEzD,MAAM,SAAS,GAAG,uBAAuB,CAAC,KAAK,EAAE,QAAQ,EAAE,OAAO,CAAC,CAAC;IACpE,MAAM,OAAO,GAAG,IAAI,GAAG,EAAqC,CAAC;IAC7D,oCAAoC,CAAC,OAAO,EAAE,SAAS,CAAC,QAAQ,CAAC,CAAC;IAClE,oCAAoC,CAAC,OAAO,EAAE,SAAS,CAAC,UAAU,CAAC,CAAC;IACpE,wBAAwB,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC;IAC5C,yBAAyB,CAAC,QAAQ,EAAE,OAAO,EAAE,OAAO,CAAC,CAAC;IACtD,OAAO,SAAS,CAAC;AACnB,CAAC;AAED,SAAS,oCAAoC,CAC3C,GAA2C,EAC3C,MAA4C;IAE5C,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,MAAM,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;QACvC,GAAG,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,GAAG,EAAE,MAAM,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC;IAC7C,CAAC;AACH,CAAC;AAED,SAAS,wBAAwB,CAC/B,QAAiC,EACjC,OAAgE;IAEhE,MAAM,OAAO,GAAI,QAA+C,CAAC,iCAAiC,CAAC,CAAC;IACpG,KAAK,MAAM,CAAC,GAAG,EAAE,KAAK,CAAC,IAAI,OAAO,CAAC,QAAQ,EAAE,CAAC;QAC5C,MAAM,WAAW,GAAG,OAAO,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;QACrC,IAAI,WAAW,KAAK,SAAS,IAAI,WAAW,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YACxD,KAAK,CAAC,WAAW,CAAC,KAAK,EAAE,CAAC;YAC1B,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,WAAW,CAAC,MAAM,EAAE,CAAC,EAAE;gBAAE,KAAK,CAAC,WAAW,CAAC,GAAG,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC,CAAC;YACnF,SAAS;QACX,CAAC;QACD,KAAK,CAAC,UAAU,CAAC,KAAK,EAAE,CAAC;QACzB,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;QAC7B,iGAAiG;QACjG,IAAI,GAAG,CAAC,KAAK,KAAK,uBAAuB,CAAC,OAAO,EAAE,CAAC;YAClD,GAAG,CAAC,KAAK,GAAG,uBAAuB,CAAC,UAAU,CAAC;QACjD,CAAC;IACH,CAAC;AACH,CAAC;AAED,SAAS,+BAA+B,CACtC,QAAiC,EACjC,GAA2B,EAC3B,KAA8B,EAC9B,MAA4B;IAE5B,MAAM,OAAO,GAAI,QAA+C,CAAC,iCAAiC,CAAC,CAAC;IACpG,yFAAyF;IACzF,IAAI,OAAO,CAAC,QAAQ,CAAC,GAAG,CAAC,GAAG,CAAC,KAAK,KAAK;QAAE,OAAO;IAChD,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;IAC7B,IAAI,MAAM,KAAK,IAAI,EAAE,CAAC;QACpB,GAAG,CAAC,OAAO,KAAK;YACd,IAAI,EAAE,wBAAwB,CAAC,WAAW;YAC1C,OAAO,EAAE,8CAA8C;YACvD,IAAI,EAAE,IAAI;SACX,CAAC;QACF,GAAG,CAAC,KAAK,GAAG,uBAAuB,CAAC,MAAM,CAAC;QAC3C,KAAK,MAAM,OAAO,IAAI,KAAK,CAAC,WAAW;YAAE,wBAAwB,CAAC,QAAQ,EAAE,OAAO,EAAE,GAAG,EAAE,KAAK,CAAC,CAAC;QACjG,OAAO;IACT,CAAC;IACD,OAAO,CAAC,QAAQ,CAAC,GAAG,CAAC,GAAG,EAAE,MAAM,CAAC,CAAC;IAClC,GAAG,CAAC,OAAO,GAAG,IAAI,CAAC;IACnB,GAAG,CAAC,KAAK,GAAG,uBAAuB,CAAC,QAAQ,CAAC;IAC7C,KAAK,MAAM,OAAO,IAAI,KAAK,CAAC,WAAW;QAAE,2BAA2B,CAAC,QAAQ,EAAE,OAAO,EAAE,GAAG,EAAE,MAAM,CAAC,CAAC;AACvG,CAAC;AAED,SAAS,6BAA6B,CACpC,QAAiC,EACjC,GAA2B,EAC3B,KAA8B,EAC9B,KAAc;IAEd,MAAM,OAAO,GAAI,QAA+C,CAAC,iCAAiC,CAAC,CAAC;IACpG,IAAI,OAAO,CAAC,QAAQ,CAAC,GAAG,CAAC,GAAG,CAAC,KAAK,KAAK;QAAE,OAAO;IAChD,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;IAC7B,gGAAgG;IAChG,IAAI,KAAK,CAAC,UAAU,CAAC,MAAM,CAAC,OAAO;QAAE,OAAO;IAC5C,GAAG,CAAC,OAAO,GAAG,0BAA0B,CAAC,KAAK,CAAC,CAAC;IAChD,GAAG,CAAC,KAAK,GAAG,uBAAuB,CAAC,MAAM,CAAC;IAC3C,KAAK,MAAM,OAAO,IAAI,KAAK,CAAC,WAAW;QAAE,wBAAwB,CAAC,QAAQ,EAAE,OAAO,EAAE,GAAG,EAAE,KAAK,CAAC,CAAC;AACnG,CAAC;AAED,SAAS,2BAA2B,CAClC,QAA2C,EAC3C,OAAgB,EAChB,GAA2B,EAC3B,MAAqB;IAErB,IAAI,OAAO,CAAC,SAAS,KAAK,IAAI;QAAE,OAAO;IACvC,IAAI,OAAO,CAAC,MAAM,KAAK,MAAM;QAAE,OAAO;IACtC,OAAO,CAAC,MAAM,GAAG,MAAM,CAAC;IACxB,OAAO,CAAC,OAAO,GAAG,CAAC,OAAO,CAAC,OAAO,GAAG,CAAC,CAAC,KAAK,CAAC,CAAC;IAC9C,wBAAwB,CAAC,QAAQ,EAAE,OAAO,EAAE,GAAG,EAAE,IAAI,CAAC,CAAC;AACzD,CAAC;AAED,SAAS,wBAAwB,CAC/B,QAA2C,EAC3C,OAAgB,EAChB,GAA2B,EAC3B,QAAiB;IAEjB,MAAM,OAAO,GAAI,QAA+C,CAAC,iCAAiC,CAAC,CAAC,OAAO,CAAC;IAC5G,IAAI,OAAO,KAAK,IAAI;QAAE,OAAO;IAC7B,MAAM,KAAK,GAAG,EAAE,GAAG,EAAE,OAAO,EAAE,CAAC;IAC/B,UAAU,CAAC,QAAQ,CAAC,CAAC,CAAC,OAAO,CAAC,kBAAkB,CAAC,CAAC,CAAC,OAAO,CAAC,gBAAgB,EAAE,KAAK,CAAC,CAAC;AACtF,CAAC;AAED,SAAS,yBAAyB,CAChC,QAAiC,EACjC,OAAgE,EAChE,OAAyD;IAEzD,MAAM,OAAO,GAAI,QAA+C,CAAC,iCAAiC,CAAC,CAAC;IACpG,KAAK,MAAM,CAAC,GAAG,EAAE,WAAW,CAAC,IAAI,OAAO,EAAE,CAAC;QACzC,MAAM,QAAQ,GAAG,OAAO,CAAC,QAAQ,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;QAC3C,IAAI,QAAQ,KAAK,SAAS,EAAE,CAAC;YAC3B,GAAG,CAAC,OAAO,GAAG,IAAI,CAAC;YACnB,GAAG,CAAC,KAAK,GAAG,uBAAuB,CAAC,QAAQ,CAAC;YAC7C,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,WAAW,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;gBAC5C,2BAA2B,CAAC,QAAQ,EAAE,WAAW,CAAC,CAAC,CAAC,EAAE,GAAG,EAAE,QAAQ,CAAC,CAAC;YACvE,CAAC;YACD,SAAS;QACX,CAAC;QACD,IAAI,OAAO,CAAC,QAAQ,CAAC,GAAG,CAAC,GAAG,CAAC;YAAE,SAAS;QACxC,IAAI,GAAG,CAAC,KAAK,KAAK,uBAAuB,CAAC,QAAQ;YAAE,GAAG,CAAC,KAAK,GAAG,uBAAuB,CAAC,UAAU,CAAC;QACnG,IAAI,GAAG,CAAC,KAAK,KAAK,uBAAuB,CAAC,UAAU;YAAE,SAAS;QAC/D,GAAG,CAAC,OAAO,GAAG,IAAI,CAAC;QACnB,GAAG,CAAC,KAAK,GAAG,uBAAuB,CAAC,OAAO,CAAC;QAC5C,MAAM,UAAU,GAAG,IAAI,eAAe,EAAE,CAAC;QACzC,IAAI,QAAQ,GAAG,CAAC,CAAC;QACjB,IAAI,OAAO,EAAE,QAAQ,KAAK,SAAS,EAAE,CAAC;YACpC,QAAQ,GAAG,MAAM,CAAC,iBAAiB,CAAC;YACpC,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,WAAW,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;gBAC5C,QAAQ,GAAG,IAAI,CAAC,GAAG,CAAC,QAAQ,EAAE,OAAO,CAAC,QAAQ,CAAC,WAAW,CAAC,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC,CAAC;YACvE,CAAC;QACH,CAAC;QACD,MAAM,MAAM,GAAG,iBAAiB,CAAuB,OAAO,CAAC,MAAM,EAAE;YACrE,IAAI,EAAE,CAAC,YAAY,EAAE,EAAE;gBACrB,uFAAuF;gBACvF,IAAI,YAAY,CAAC,OAAO;oBAAE,UAAU,CAAC,KAAK,CAAC,YAAY,CAAC,MAAM,CAAC,CAAC;;oBAC3D,YAAY,CAAC,gBAAgB,CAAC,OAAO,EAAE,GAAG,EAAE,CAAC,UAAU,CAAC,KAAK,CAAC,YAAY,CAAC,MAAM,CAAC,EAAE,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC;gBACzG,OAAO,gCAAgC,CAAC,QAAQ,EAAE,GAAG,EAAE,UAAU,CAAC,MAAM,CAAC,CAAC;YAC5E,CAAC;YACD,QAAQ;SACT,CAAC,CAAC;QACH,MAAM,KAAK,GAA4B;YACrC,UAAU;YACV,OAAO,EAAE,aAAa;YACtB,WAAW,EAAE,IAAI,GAAG,CAAC,WAAW,CAAC;SAClC,CAAC;QACF,KAAK,CAAC,OAAO,GAAG,MAAM,CAAC,OAAO,CAAC,IAAI,CACjC,CAAC,MAAM,EAAE,EAAE,CAAC,+BAA+B,CAAC,QAAQ,EAAE,GAAG,EAAE,KAAK,EAAE,MAAM,CAAC,EACzE,CAAC,KAAK,EAAE,EAAE,CAAC,6BAA6B,CAAC,QAAQ,EAAE,GAAG,EAAE,KAAK,EAAE,KAAK,CAAC,CACtE,CAAC;QACF,OAAO,CAAC,QAAQ,CAAC,GAAG,CAAC,GAAG,EAAE,KAAK,CAAC,CAAC;IACnC,CAAC;AACH,CAAC;AAED,MAAM,aAAa,GAAkB,OAAO,CAAC,OAAO,EAAE,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"shadedScene3DMaterialTextures.d.ts","sourceRoot":"","sources":["../src/shadedScene3DMaterialTextures.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,8BAA8B,EAAkB,MAAM,0BAA0B,CAAC;AAqB/F,wBAAgB,qCAAqC,CAAC,QAAQ,EAAE,8BAA8B,GAAG,IAAI,CAOpG"}
1
+ {"version":3,"file":"shadedScene3DMaterialTextures.d.ts","sourceRoot":"","sources":["../src/shadedScene3DMaterialTextures.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,8BAA8B,EAAkB,MAAM,0BAA0B,CAAC;AAoB/F,wBAAgB,qCAAqC,CAAC,QAAQ,EAAE,8BAA8B,GAAG,IAAI,CAOpG"}
@@ -3,14 +3,13 @@ import { registerScene3DMaterialTextures } from './sceneMaterialTextureRegistry'
3
3
  // Lists the ShadedMaterial base maps. Registered separately from the surface-material listers'
4
4
  // PBR/unlit set so an app that never uses the shaded base pays nothing for it.
5
5
  //
6
- // Registering it is an optimization, not a prerequisite: resolution falls back to every resource-backed
7
- // texture when a material kind has no lister (see getScene3DResourceTextures), so the cost of omitting
8
- // it is a texture fetched that no mesh-attached material needed not an unresolved map. It IS a
9
- // prerequisite for revealScene3DResourcesOnResolve, which needs texture→owning-node and has no other
10
- // way to get it; without the lister a ShadedMaterial node is simply never faded in.
6
+ // Registration is a prerequisite for revealScene3DResourcesOnResolve to wait for these maps. Without the
7
+ // lister, an all-unlisted mesh keeps its starting alpha and gets no fade. A mixed mesh with a listed
8
+ // material carrying pending textures is hidden, but it can reveal when only those listed textures settle
9
+ // while a ShadedMaterial map is still pending, so the shaded map may pop in later.
11
10
  //
12
- // `getScene3DRequirements` reports this registration for every material kind in a document that carries
13
- // image resources, which is how a caller finds it without knowing the registry exists.
11
+ // The requirement-set successor is documented in agents/registration-lifecycle.md; see its status header
12
+ // for the program authorization this registration builds under.
14
13
  //
15
14
  // The base maps only. A modifier in `material.modifiers` may carry its own textures (AnimatedNormal,
16
15
  // VertexDisplace, Dissolve, Emissive), and those need a per-modifier lister registry of their own — the
@@ -1 +1 @@
1
- {"version":3,"file":"shadedScene3DMaterialTextures.js","sourceRoot":"","sources":["../src/shadedScene3DMaterialTextures.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,kBAAkB,EAAE,MAAM,0BAA0B,CAAC;AAE9D,OAAO,EAAE,+BAA+B,EAAE,MAAM,gCAAgC,CAAC;AAEjF,+FAA+F;AAC/F,+EAA+E;AAC/E,EAAE;AACF,wGAAwG;AACxG,uGAAuG;AACvG,iGAAiG;AACjG,qGAAqG;AACrG,oFAAoF;AACpF,EAAE;AACF,wGAAwG;AACxG,uFAAuF;AACvF,EAAE;AACF,qGAAqG;AACrG,wGAAwG;AACxG,oGAAoG;AACpG,iDAAiD;AACjD,MAAM,UAAU,qCAAqC,CAAC,QAAwC;IAC5F,+BAA+B,CAAC,QAAQ,EAAE,kBAAkB,EAAE,CAAC,QAAQ,EAAE,GAAG,EAAQ,EAAE;QACpF,MAAM,MAAM,GAAG,QAAoC,CAAC;QACpD,IAAI,MAAM,CAAC,UAAU,KAAK,IAAI;YAAE,GAAG,CAAC,IAAI,CAAC,MAAM,CAAC,UAAU,CAAC,CAAC;QAC5D,IAAI,MAAM,CAAC,SAAS,KAAK,IAAI;YAAE,GAAG,CAAC,IAAI,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC;QAC1D,IAAI,MAAM,CAAC,WAAW,KAAK,IAAI;YAAE,GAAG,CAAC,IAAI,CAAC,MAAM,CAAC,WAAW,CAAC,CAAC;IAChE,CAAC,CAAC,CAAC;AACL,CAAC"}
1
+ {"version":3,"file":"shadedScene3DMaterialTextures.js","sourceRoot":"","sources":["../src/shadedScene3DMaterialTextures.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,kBAAkB,EAAE,MAAM,0BAA0B,CAAC;AAE9D,OAAO,EAAE,+BAA+B,EAAE,MAAM,gCAAgC,CAAC;AAEjF,+FAA+F;AAC/F,+EAA+E;AAC/E,EAAE;AACF,yGAAyG;AACzG,qGAAqG;AACrG,yGAAyG;AACzG,mFAAmF;AACnF,EAAE;AACF,yGAAyG;AACzG,gEAAgE;AAChE,EAAE;AACF,qGAAqG;AACrG,wGAAwG;AACxG,oGAAoG;AACpG,iDAAiD;AACjD,MAAM,UAAU,qCAAqC,CAAC,QAAwC;IAC5F,+BAA+B,CAAC,QAAQ,EAAE,kBAAkB,EAAE,CAAC,QAAQ,EAAE,GAAG,EAAQ,EAAE;QACpF,MAAM,MAAM,GAAG,QAAoC,CAAC;QACpD,IAAI,MAAM,CAAC,UAAU,KAAK,IAAI;YAAE,GAAG,CAAC,IAAI,CAAC,MAAM,CAAC,UAAU,CAAC,CAAC;QAC5D,IAAI,MAAM,CAAC,SAAS,KAAK,IAAI;YAAE,GAAG,CAAC,IAAI,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC;QAC1D,IAAI,MAAM,CAAC,WAAW,KAAK,IAAI;YAAE,GAAG,CAAC,IAAI,CAAC,MAAM,CAAC,WAAW,CAAC,CAAC;IAChE,CAAC,CAAC,CAAC;AACL,CAAC"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@flighthq/scene3d-resources",
3
- "version": "0.3.0",
3
+ "version": "0.3.1-next.1041.35b950c",
4
4
  "author": "Joshua Granick and other contributors",
5
5
  "license": "MIT",
6
6
  "repository": {
@@ -38,18 +38,18 @@
38
38
  "clean:dist": "tsx ../../scripts/clean-package-dist.ts"
39
39
  },
40
40
  "dependencies": {
41
- "@flighthq/entity": "0.3.0",
42
- "@flighthq/image": "0.3.0",
43
- "@flighthq/loader": "0.3.0",
44
- "@flighthq/log": "0.3.0",
45
- "@flighthq/net": "0.3.0",
46
- "@flighthq/node": "0.3.0",
47
- "@flighthq/scene3d": "0.3.0",
48
- "@flighthq/scene3d-formats": "0.3.0",
49
- "@flighthq/signals": "0.3.0",
50
- "@flighthq/texture": "0.3.0",
51
- "@flighthq/tween": "0.3.0",
52
- "@flighthq/types": "0.3.0"
41
+ "@flighthq/entity": "0.3.1-next.1041.35b950c",
42
+ "@flighthq/image": "0.3.1-next.1041.35b950c",
43
+ "@flighthq/loader": "0.3.1-next.1041.35b950c",
44
+ "@flighthq/log": "0.3.1-next.1041.35b950c",
45
+ "@flighthq/net": "0.3.1-next.1041.35b950c",
46
+ "@flighthq/node": "0.3.1-next.1041.35b950c",
47
+ "@flighthq/scene3d": "0.3.1-next.1041.35b950c",
48
+ "@flighthq/scene3d-formats": "0.3.1-next.1041.35b950c",
49
+ "@flighthq/signals": "0.3.1-next.1041.35b950c",
50
+ "@flighthq/texture": "0.3.1-next.1041.35b950c",
51
+ "@flighthq/tween": "0.3.1-next.1041.35b950c",
52
+ "@flighthq/types": "0.3.1-next.1041.35b950c"
53
53
  },
54
54
  "devDependencies": {
55
55
  "@flighthq/materials": "*",
@@ -3,14 +3,27 @@ import { createBoxMeshGeometry } from '@flighthq/mesh/contract';
3
3
  import { addNodeChild } from '@flighthq/node/contract';
4
4
  import { createMesh, createScene3D, createScene3DKindUsage, getScene3DKindUsage } from '@flighthq/scene3d/contract';
5
5
  import { createShadedMaterial } from '@flighthq/shading/contract';
6
- import type { Material, SceneCoverageEntry, Scene3DKindUsage } from '@flighthq/types/contract';
7
- import { RenderRegistry, SceneCoverage } from '@flighthq/types/contract';
6
+ import type { Material, Scene3DKindUsage, SceneCoverageCatalog, SceneCoverageEntry } from '@flighthq/types/contract';
7
+ import { RenderRegistry, RequirementFacet, SceneCoverage } from '@flighthq/types/contract';
8
8
  import { describe, expect, it } from 'vitest';
9
9
 
10
10
  import { explainScene3DResourceCoverage, hasScene3DResourceCoverage } from './explainScene3DResourceCoverage';
11
11
  import { createBuiltInScene3DResourceResolver, createScene3DResourceResolver } from './sceneResourceResolver';
12
12
  import { registerShadedScene3DMaterialTextures } from './shadedScene3DMaterialTextures';
13
13
 
14
+ const coverageCatalog: SceneCoverageCatalog = [
15
+ {
16
+ kind: 'UnlitMaterial',
17
+ registrations: [{ module: '@flighthq/scene3d-resources', registrar: 'registerUnlitScene3DMaterialTextures' }],
18
+ registry: RenderRegistry.MaterialTextureLister,
19
+ },
20
+ {
21
+ kind: 'ShadedMaterial',
22
+ registrations: [{ module: '@flighthq/scene3d-resources', registrar: 'registerShadedScene3DMaterialTextures' }],
23
+ registry: RenderRegistry.MaterialTextureLister,
24
+ },
25
+ ];
26
+
14
27
  function usageOf(...materials: Material[]): Scene3DKindUsage {
15
28
  const scene = createScene3D();
16
29
  for (const material of materials) {
@@ -21,17 +34,28 @@ function usageOf(...materials: Material[]): Scene3DKindUsage {
21
34
  return usage;
22
35
  }
23
36
 
24
- function gaps(resolver: Parameters<typeof explainScene3DResourceCoverage>[1], usage: Scene3DKindUsage) {
37
+ function gaps(
38
+ resolver: Parameters<typeof explainScene3DResourceCoverage>[1],
39
+ usage: Scene3DKindUsage,
40
+ catalog: SceneCoverageCatalog = coverageCatalog,
41
+ ) {
25
42
  const out: SceneCoverageEntry[] = [];
26
- explainScene3DResourceCoverage(out, resolver, usage);
43
+ explainScene3DResourceCoverage(out, resolver, usage, catalog);
27
44
  return out;
28
45
  }
29
46
 
30
47
  describe('explainScene3DResourceCoverage', () => {
31
- it('reports a bare resolver as missing every material kind, since its registry starts empty', () => {
48
+ it('reports a bare resolver with the call that registers the material lister', () => {
32
49
  const found = gaps(createScene3DResourceResolver(), usageOf(createUnlitMaterial()));
33
50
  expect(found).toEqual([
34
- { coverage: SceneCoverage.Missing, kind: 'UnlitMaterial', registry: RenderRegistry.MaterialTextureLister },
51
+ {
52
+ coverage: SceneCoverage.Unregistered,
53
+ facet: RequirementFacet.SceneMaterialKind,
54
+ kind: 'UnlitMaterial',
55
+ module: '@flighthq/scene3d-resources',
56
+ registrar: 'registerUnlitScene3DMaterialTextures',
57
+ registry: RenderRegistry.MaterialTextureLister,
58
+ },
35
59
  ]);
36
60
  });
37
61
 
@@ -39,17 +63,25 @@ describe('explainScene3DResourceCoverage', () => {
39
63
  // The manifest lists every requirement, so a caller can render a checklist and tell "covered" from
40
64
  // "never asked about". Omitting covered kinds would make those two indistinguishable.
41
65
  expect(gaps(createBuiltInScene3DResourceResolver(), usageOf(createUnlitMaterial()))).toEqual([
42
- { coverage: SceneCoverage.Satisfied, kind: 'UnlitMaterial', registry: RenderRegistry.MaterialTextureLister },
66
+ {
67
+ coverage: SceneCoverage.Satisfied,
68
+ facet: RequirementFacet.SceneMaterialKind,
69
+ kind: 'UnlitMaterial',
70
+ registry: RenderRegistry.MaterialTextureLister,
71
+ },
43
72
  ]);
44
73
  });
45
74
 
46
75
  it('reports ShadedMaterial against the built-in assembly, which does not wire its lister', () => {
47
- // The gap this query exists to surface: shading ships registerShadedScene3DMaterialTextures, but
76
+ // The opt-in boundary this query makes explicit: shading ships registerShadedScene3DMaterialTextures, but
48
77
  // createBuiltInScene3DResourceResolver covers only the surface-PBR families, so an AWD2 document
49
78
  // loaded through the built-in assembly has no lister for its materials.
50
79
  expect(gaps(createBuiltInScene3DResourceResolver(), usageOf(createShadedMaterial()))).toContainEqual({
51
- coverage: SceneCoverage.Missing,
80
+ coverage: SceneCoverage.Unregistered,
81
+ facet: RequirementFacet.SceneMaterialKind,
52
82
  kind: 'ShadedMaterial',
83
+ module: '@flighthq/scene3d-resources',
84
+ registrar: 'registerShadedScene3DMaterialTextures',
53
85
  registry: RenderRegistry.MaterialTextureLister,
54
86
  });
55
87
  });
@@ -58,14 +90,20 @@ describe('explainScene3DResourceCoverage', () => {
58
90
  const resolver = createBuiltInScene3DResourceResolver();
59
91
  registerShadedScene3DMaterialTextures(resolver.registry);
60
92
  expect(gaps(resolver, usageOf(createShadedMaterial()))).toEqual([
61
- { coverage: SceneCoverage.Satisfied, kind: 'ShadedMaterial', registry: RenderRegistry.MaterialTextureLister },
93
+ {
94
+ coverage: SceneCoverage.Satisfied,
95
+ facet: RequirementFacet.SceneMaterialKind,
96
+ kind: 'ShadedMaterial',
97
+ registry: RenderRegistry.MaterialTextureLister,
98
+ },
62
99
  ]);
63
100
  });
64
101
 
65
102
  it('reports a family that ships no lister at all, so the omission is visible rather than inferred', () => {
66
103
  // BlinnPhongMaterial carries four texture slots and has no lister anywhere in the SDK.
67
104
  expect(gaps(createBuiltInScene3DResourceResolver(), usageOf(createBlinnPhongMaterial()))).toContainEqual({
68
- coverage: SceneCoverage.Missing,
105
+ coverage: SceneCoverage.Unavailable,
106
+ facet: RequirementFacet.SceneMaterialKind,
69
107
  kind: 'BlinnPhongMaterial',
70
108
  registry: RenderRegistry.MaterialTextureLister,
71
109
  });
@@ -75,9 +113,9 @@ describe('explainScene3DResourceCoverage', () => {
75
113
  const resolver = createScene3DResourceResolver();
76
114
  const usage = usageOf(createUnlitMaterial());
77
115
  const out: SceneCoverageEntry[] = [];
78
- explainScene3DResourceCoverage(out, resolver, usage);
116
+ explainScene3DResourceCoverage(out, resolver, usage, coverageCatalog);
79
117
  const first = out.length;
80
- explainScene3DResourceCoverage(out, resolver, usage);
118
+ explainScene3DResourceCoverage(out, resolver, usage, coverageCatalog);
81
119
  expect(out).toHaveLength(first);
82
120
  });
83
121
  });
@@ -91,7 +129,7 @@ describe('hasScene3DResourceCoverage', () => {
91
129
  const resolver = createBuiltInScene3DResourceResolver();
92
130
  const usage = usageOf(createUnlitMaterial(), createShadedMaterial());
93
131
  const out: SceneCoverageEntry[] = [];
94
- explainScene3DResourceCoverage(out, resolver, usage);
132
+ explainScene3DResourceCoverage(out, resolver, usage, coverageCatalog);
95
133
  expect(hasScene3DResourceCoverage(resolver, usage)).toBe(out.length === 0);
96
134
  });
97
135
 
@@ -101,7 +139,7 @@ describe('hasScene3DResourceCoverage', () => {
101
139
  const resolver = createBuiltInScene3DResourceResolver();
102
140
  const usage = usageOf(createUnlitMaterial());
103
141
  const out: SceneCoverageEntry[] = [];
104
- explainScene3DResourceCoverage(out, resolver, usage);
142
+ explainScene3DResourceCoverage(out, resolver, usage, coverageCatalog);
105
143
  expect(out.length).toBeGreaterThan(0);
106
144
  expect(out.every((e) => e.coverage === SceneCoverage.Satisfied)).toBe(true);
107
145
  expect(hasScene3DResourceCoverage(resolver, usage)).toBe(true);
@@ -11,6 +11,7 @@ import { getScene3DResourceTextures, getScene3DTextureResourceReference } from '
11
11
 
12
12
  function embeddedRef(state: ResourceResolutionState = ResourceResolutionState.Unresolved): ImageResourceReference {
13
13
  return {
14
+ alphaType: 'straight',
14
15
  bytes: new Uint8Array([1, 2, 3]),
15
16
  failure: null,
16
17
  kind: ImageResourceReferenceKind.Embedded,
@@ -21,12 +21,12 @@ import type * as Scene3DResourceResolverModule from './sceneResourceResolver';
21
21
  import type * as Scene3DResourceSignalsModule from './sceneResourceSignals';
22
22
 
23
23
  const fakeImage = { height: 2, kind: ImageTextureSourceKind, width: 2 } as unknown as Image;
24
- type LoadImageResourceFromBytes = typeof ImageModule.loadImageResourceFromBytes;
24
+ type ResolveImageResourceReference = typeof ImageModule.resolveImageResourceReference;
25
25
 
26
26
  let createBuiltInScene3DResourceResolver: typeof Scene3DResourceResolverModule.createBuiltInScene3DResourceResolver;
27
27
  let disposeScene3DResourceResolver: typeof Scene3DResourceResolverModule.disposeScene3DResourceResolver;
28
28
  let enableScene3DResourceSignals: typeof Scene3DResourceSignalsModule.enableScene3DResourceSignals;
29
- let loadFromBytes: Mock<LoadImageResourceFromBytes>;
29
+ let resolveReference: Mock<ResolveImageResourceReference>;
30
30
  let resolveOneScene3DResourceTexture: typeof ResolveScene3DResourcesModule.resolveOneScene3DResourceTexture;
31
31
  let resolveScene3DResources: typeof ResolveScene3DResourcesModule.resolveScene3DResources;
32
32
  let updateScene3DResourceStreaming: typeof ResolveScene3DResourcesModule.updateScene3DResourceStreaming;
@@ -37,6 +37,7 @@ let sceneResources: ImageResourceReference[] = [];
37
37
  function embeddedRef(mimeType: string | null = 'image/png'): ImageResourceReference {
38
38
  const ref: ImageResourceReference = {
39
39
  bytes: new Uint8Array([9, 9]),
40
+ alphaType: 'straight',
40
41
  failure: null,
41
42
  kind: ImageResourceReferenceKind.Embedded,
42
43
  mimeType,
@@ -86,13 +87,12 @@ async function settle(resolver: Scene3DResourceResolver): Promise<void> {
86
87
 
87
88
  beforeAll(async () => {
88
89
  vi.resetModules();
89
- loadFromBytes = vi.fn<LoadImageResourceFromBytes>();
90
- // Override only the two loaders; the rest of the module stays real, so growing @flighthq/image cannot
90
+ resolveReference = vi.fn<ResolveImageResourceReference>();
91
+ // Override only the resource atom; the rest of the module stays real, so growing @flighthq/image cannot
91
92
  // silently blank out a code path under test.
92
93
  vi.doMock('@flighthq/image/contract', async (importOriginal) => ({
93
94
  ...(await importOriginal<typeof ImageModule>()),
94
- loadImageResourceFromBytes: loadFromBytes,
95
- loadImageResourceFromUrl: vi.fn(),
95
+ resolveImageResourceReference: resolveReference,
96
96
  }));
97
97
  ({ resolveOneScene3DResourceTexture, resolveScene3DResources, updateScene3DResourceStreaming } =
98
98
  await import('./resolveScene3DResources'));
@@ -107,31 +107,36 @@ afterAll(() => {
107
107
  });
108
108
 
109
109
  afterEach(() => {
110
- loadFromBytes.mockReset();
110
+ resolveReference.mockReset();
111
111
  });
112
112
 
113
113
  describe('resolveOneScene3DResourceTexture', () => {
114
114
  it('decodes embedded bytes through @flighthq/image', async () => {
115
- loadFromBytes.mockResolvedValue(fakeImage);
115
+ resolveReference.mockResolvedValue(fakeImage);
116
116
  const resolver = createBuiltInScene3DResourceResolver();
117
117
  const ref = embeddedRef('image/jpeg');
118
118
  const signal = new AbortController().signal;
119
119
  const result = await resolveOneScene3DResourceTexture(resolver, ref, signal);
120
- expect(loadFromBytes).toHaveBeenCalledWith((ref as { bytes: Uint8Array }).bytes, 'image/jpeg', signal);
120
+ expect(resolveReference).toHaveBeenCalledWith(ref, resolver.fetch, signal);
121
121
  expect(result).toBe(fakeImage);
122
122
  disposeScene3DResourceResolver(resolver);
123
123
  });
124
124
 
125
- it('passes undefined for a null embedded mimeType', async () => {
126
- loadFromBytes.mockResolvedValue(fakeImage);
125
+ it('passes the complete plain embedded reference to the shared resource atom', async () => {
126
+ resolveReference.mockResolvedValue(fakeImage);
127
127
  const resolver = createBuiltInScene3DResourceResolver();
128
- await resolveOneScene3DResourceTexture(resolver, embeddedRef(null), new AbortController().signal);
129
- expect(loadFromBytes).toHaveBeenCalledWith(expect.anything(), undefined, expect.anything());
128
+ const ref = embeddedRef(null);
129
+ const signal = new AbortController().signal;
130
+ await resolveOneScene3DResourceTexture(resolver, ref, signal);
131
+ expect(resolveReference).toHaveBeenCalledWith(ref, resolver.fetch, signal);
130
132
  disposeScene3DResourceResolver(resolver);
131
133
  });
132
134
 
133
135
  it('routes external refs through the resolver fetch seam', async () => {
134
136
  const fetch = vi.fn(async () => fakeImage);
137
+ resolveReference.mockImplementation((ref, resolveFetch, signal) =>
138
+ ref.kind === ImageResourceReferenceKind.External ? resolveFetch(ref, signal) : Promise.resolve(null),
139
+ );
135
140
  const resolver = createBuiltInScene3DResourceResolver({ fetch });
136
141
  const ref = externalRef();
137
142
  const signal = new AbortController().signal;
@@ -145,8 +150,8 @@ describe('resolveOneScene3DResourceTexture', () => {
145
150
  describe('resolveScene3DResources', () => {
146
151
  it('does not cancel acquisition owned by a streaming update', async () => {
147
152
  let loadSignal: AbortSignal | undefined;
148
- loadFromBytes.mockImplementation(
149
- (_bytes, _mime, signal) =>
153
+ resolveReference.mockImplementation(
154
+ (_ref, _fetch, signal) =>
150
155
  new Promise<Image>((_resolve, reject) => {
151
156
  loadSignal = signal;
152
157
  signal?.addEventListener('abort', () => reject(signal.reason));
@@ -168,7 +173,7 @@ describe('resolveScene3DResources', () => {
168
173
  });
169
174
 
170
175
  it('returns the selected unresolved working set without starting acquisition', () => {
171
- loadFromBytes.mockResolvedValue(fakeImage);
176
+ resolveReference.mockResolvedValue(fakeImage);
172
177
  const ref = embeddedRef();
173
178
  const a = createTexture({ resource: ref });
174
179
  const b = createTexture({ resource: ref });
@@ -181,7 +186,7 @@ describe('resolveScene3DResources', () => {
181
186
  expect(resources.resolved).toEqual([]);
182
187
  expect(resources.unresolved).toEqual([{ ref, textures: [a, b] }]);
183
188
  expect(ref.state).toBe(ResourceResolutionState.Unresolved);
184
- expect(loadFromBytes).not.toHaveBeenCalled();
189
+ expect(resolveReference).not.toHaveBeenCalled();
185
190
  disposeScene3DResourceResolver(resolver);
186
191
  });
187
192
 
@@ -197,7 +202,7 @@ describe('resolveScene3DResources', () => {
197
202
  const resources = resolveScene3DResources(scene, resolver);
198
203
 
199
204
  expect(resources.unresolved).toEqual([]);
200
- expect(resources.resolved).toEqual([{ image: fakeImage, ref, textures: [a, b] }]);
205
+ expect(resources.resolved).toEqual([{ ref, source: fakeImage, textures: [a, b] }]);
201
206
  expect(getTextureSource(b)).toBe(fakeImage);
202
207
  expect(ref.state).toBe(ResourceResolutionState.Resolved);
203
208
  disposeScene3DResourceResolver(resolver);
@@ -206,7 +211,7 @@ describe('resolveScene3DResources', () => {
206
211
 
207
212
  describe('updateScene3DResourceStreaming', () => {
208
213
  it('resolves every pending texture, binding the image and advancing state', async () => {
209
- loadFromBytes.mockResolvedValue(fakeImage);
214
+ resolveReference.mockResolvedValue(fakeImage);
210
215
  const a = pendingTexture();
211
216
  const b = pendingTexture();
212
217
  const scene = meshScene3D(a, b);
@@ -224,7 +229,7 @@ describe('updateScene3DResourceStreaming', () => {
224
229
  });
225
230
 
226
231
  it('fetches and decodes one shared resource once, then binds every subscribed texture', async () => {
227
- loadFromBytes.mockResolvedValue(fakeImage);
232
+ resolveReference.mockResolvedValue(fakeImage);
228
233
  const ref = embeddedRef();
229
234
  const a = createTexture({ resource: ref });
230
235
  const b = createTexture({ resource: ref });
@@ -234,7 +239,7 @@ describe('updateScene3DResourceStreaming', () => {
234
239
  updateScene3DResourceStreaming(scene, resolver);
235
240
  await settle(resolver);
236
241
 
237
- expect(loadFromBytes).toHaveBeenCalledTimes(1);
242
+ expect(resolveReference).toHaveBeenCalledTimes(1);
238
243
  expect(getTextureSource(a)).toBe(fakeImage);
239
244
  expect(getTextureSource(b)).toBe(fakeImage);
240
245
  expect(ref.state).toBe(ResourceResolutionState.Resolved);
@@ -243,8 +248,8 @@ describe('updateScene3DResourceStreaming', () => {
243
248
 
244
249
  it('keeps a shared load alive until its final subscriber leaves the working set', async () => {
245
250
  let loadSignal: AbortSignal | undefined;
246
- loadFromBytes.mockImplementation(
247
- (_bytes, _mime, signal) =>
251
+ resolveReference.mockImplementation(
252
+ (_ref, _fetch, signal) =>
248
253
  new Promise<Image>((_resolve, reject) => {
249
254
  loadSignal = signal;
250
255
  signal?.addEventListener('abort', () => reject(signal.reason));
@@ -269,7 +274,7 @@ describe('updateScene3DResourceStreaming', () => {
269
274
  });
270
275
 
271
276
  it('binds a later subscriber from the resolved resource cache without decoding again', async () => {
272
- loadFromBytes.mockResolvedValue(fakeImage);
277
+ resolveReference.mockResolvedValue(fakeImage);
273
278
  const ref = embeddedRef();
274
279
  const a = createTexture({ resource: ref });
275
280
  const b = createTexture({ resource: ref });
@@ -283,12 +288,12 @@ describe('updateScene3DResourceStreaming', () => {
283
288
 
284
289
  updateScene3DResourceStreaming(scene, resolver, { select: (texture) => texture === b });
285
290
  expect(getTextureSource(b)).toBe(fakeImage);
286
- expect(loadFromBytes).toHaveBeenCalledTimes(1);
291
+ expect(resolveReference).toHaveBeenCalledTimes(1);
287
292
  disposeScene3DResourceResolver(resolver);
288
293
  });
289
294
 
290
295
  it('limits the working set to textures the select predicate accepts', async () => {
291
- loadFromBytes.mockResolvedValue(fakeImage);
296
+ resolveReference.mockResolvedValue(fakeImage);
292
297
  const wanted = pendingTexture();
293
298
  const skipped = pendingTexture();
294
299
  const scene = meshScene3D(wanted, skipped);
@@ -304,6 +309,19 @@ describe('updateScene3DResourceStreaming', () => {
304
309
  });
305
310
 
306
311
  it('fails a texture whose external fetch returns null', async () => {
312
+ resolveReference.mockImplementation(async (ref, fetch, signal) => {
313
+ if (ref.kind !== ImageResourceReferenceKind.External) return null;
314
+ const source = await fetch(ref, signal);
315
+ if (source === null) {
316
+ ref.failure = {
317
+ kind: ImageResourceFailureKind.Unavailable,
318
+ message: 'Image resource unavailable',
319
+ name: null,
320
+ };
321
+ ref.state = ResourceResolutionState.Failed;
322
+ }
323
+ return source;
324
+ });
307
325
  const texture = createTexture({ resource: externalRef() });
308
326
  const scene = meshScene3D(texture);
309
327
  const resolver = createBuiltInScene3DResourceResolver({ fetch: async () => null });
@@ -315,14 +333,14 @@ describe('updateScene3DResourceStreaming', () => {
315
333
  expect(resourceOf(texture)?.state).toBe(ResourceResolutionState.Failed);
316
334
  expect(resourceOf(texture)?.failure).toEqual({
317
335
  kind: ImageResourceFailureKind.Unavailable,
318
- message: 'Image resource resolution returned no image',
336
+ message: 'Image resource unavailable',
319
337
  name: null,
320
338
  });
321
339
  disposeScene3DResourceResolver(resolver);
322
340
  });
323
341
 
324
342
  it('fails a texture whose decode throws', async () => {
325
- loadFromBytes.mockRejectedValue(new Error('bad image'));
343
+ resolveReference.mockRejectedValue(new Error('bad image'));
326
344
  const texture = pendingTexture();
327
345
  const scene = meshScene3D(texture);
328
346
  const resolver = createBuiltInScene3DResourceResolver();
@@ -342,8 +360,8 @@ describe('updateScene3DResourceStreaming', () => {
342
360
  it('cancels and reverts a load dropped from the working set, then re-requests on re-entry', async () => {
343
361
  const loadSignals: AbortSignal[] = [];
344
362
  // A load that hangs until its signal aborts, so we can drop it mid-flight.
345
- loadFromBytes.mockImplementation(
346
- (_bytes, _mime, signal) =>
363
+ resolveReference.mockImplementation(
364
+ (_ref, _fetch, signal) =>
347
365
  new Promise<Image>((_resolve, reject) => {
348
366
  if (signal !== undefined) loadSignals.push(signal);
349
367
  signal?.addEventListener('abort', () => reject(signal.reason));
@@ -372,21 +390,21 @@ describe('updateScene3DResourceStreaming', () => {
372
390
  });
373
391
 
374
392
  it('does not re-request a texture already in flight', async () => {
375
- loadFromBytes.mockImplementation(() => new Promise<Image>(() => {}));
393
+ resolveReference.mockImplementation(() => new Promise<Image>(() => {}));
376
394
  const texture = pendingTexture();
377
395
  const scene = meshScene3D(texture);
378
396
  const resolver = createBuiltInScene3DResourceResolver();
379
397
 
380
398
  updateScene3DResourceStreaming(scene, resolver);
381
- await vi.waitFor(() => expect(loadFromBytes).toHaveBeenCalledTimes(1));
399
+ await vi.waitFor(() => expect(resolveReference).toHaveBeenCalledTimes(1));
382
400
  updateScene3DResourceStreaming(scene, resolver);
383
- expect(loadFromBytes).toHaveBeenCalledTimes(1);
401
+ expect(resolveReference).toHaveBeenCalledTimes(1);
384
402
 
385
403
  disposeScene3DResourceResolver(resolver);
386
404
  });
387
405
 
388
406
  it('emits onResourceResolved when signals are enabled', async () => {
389
- loadFromBytes.mockResolvedValue(fakeImage);
407
+ resolveReference.mockResolvedValue(fakeImage);
390
408
  const texture = pendingTexture();
391
409
  const scene = meshScene3D(texture);
392
410
  const resolver = createBuiltInScene3DResourceResolver();
@@ -405,7 +423,7 @@ describe('updateScene3DResourceStreaming', () => {
405
423
  });
406
424
 
407
425
  it('emits onResourceFailed when a decode throws', async () => {
408
- loadFromBytes.mockRejectedValue(new Error('bad image'));
426
+ resolveReference.mockRejectedValue(new Error('bad image'));
409
427
  const texture = pendingTexture();
410
428
  const scene = meshScene3D(texture);
411
429
  const resolver = createBuiltInScene3DResourceResolver();
@@ -2,6 +2,7 @@ import { createStandardPbrMaterial } from '@flighthq/materials/contract';
2
2
  import { createBoxMeshGeometry } from '@flighthq/mesh/contract';
3
3
  import { addNodeChild } from '@flighthq/node/contract';
4
4
  import { createMesh, createScene3D } from '@flighthq/scene3d/contract';
5
+ import { createShadedMaterial } from '@flighthq/shading/contract';
5
6
  import { emitSignal } from '@flighthq/signals/contract';
6
7
  import { createTexture } from '@flighthq/texture/contract';
7
8
  import { createTweenManager, hasTweensOf, updateTweens } from '@flighthq/tween/contract';
@@ -23,6 +24,7 @@ const testResources: EmbeddedImageResourceReference[] = [];
23
24
 
24
25
  function pendingRef(): EmbeddedImageResourceReference {
25
26
  const ref: EmbeddedImageResourceReference = {
27
+ alphaType: 'straight',
26
28
  bytes: new Uint8Array([0x89, 0x50, 0x4e, 0x47]),
27
29
  failure: null,
28
30
  kind: 'Embedded',
@@ -141,6 +143,52 @@ describe('revealScene3DResourcesOnResolve', () => {
141
143
  expect(mesh.alpha).toBe(1);
142
144
  });
143
145
 
146
+ it('leaves an all-unlisted mesh unchanged and installs no fade', () => {
147
+ const diffuseMap = createTexture({ resource: pendingRef() });
148
+ const mesh = createMesh(createBoxMeshGeometry(), [createShadedMaterial({ diffuseMap })]);
149
+ mesh.alpha = 0.6;
150
+ const scene = createScene3D();
151
+ configureResources(scene);
152
+ addNodeChild(scene.root, mesh);
153
+ const resolver = createBuiltInScene3DResourceResolver();
154
+ const manager = createTweenManager();
155
+
156
+ revealScene3DResourcesOnResolve(resolver, scene, manager, { fadeSeconds: 0.5 });
157
+ expect(mesh.alpha).toBeCloseTo(0.6);
158
+
159
+ emitSignal(enableScene3DResourceSignals(resolver).onResourceResolved, {
160
+ ref: resourceOf(diffuseMap),
161
+ texture: diffuseMap,
162
+ });
163
+ expect(hasTweensOf(manager, mesh)).toBe(false);
164
+ });
165
+
166
+ it('reveals a mixed mesh after its listed textures settle without waiting for an unlisted sibling', () => {
167
+ const shadedMap = createTexture({ resource: pendingRef() });
168
+ const pbrMap = createTexture({ resource: pendingRef() });
169
+ const mesh = createMesh(createBoxMeshGeometry(), [
170
+ createShadedMaterial({ diffuseMap: shadedMap }),
171
+ createStandardPbrMaterial({ baseColorMap: pbrMap }),
172
+ ]);
173
+ const scene = createScene3D();
174
+ configureResources(scene);
175
+ addNodeChild(scene.root, mesh);
176
+ const resolver = createBuiltInScene3DResourceResolver();
177
+ const manager = createTweenManager();
178
+
179
+ revealScene3DResourcesOnResolve(resolver, scene, manager, { fadeSeconds: 0.5 });
180
+ expect(mesh.alpha).toBe(0);
181
+
182
+ emitSignal(enableScene3DResourceSignals(resolver).onResourceResolved, {
183
+ ref: resourceOf(pbrMap),
184
+ texture: pbrMap,
185
+ });
186
+ expect(hasTweensOf(manager, mesh)).toBe(true);
187
+ updateTweens(manager, 0.5);
188
+ expect(mesh.alpha).toBeCloseTo(1);
189
+ expect(resourceOf(shadedMap).state).toBe(ResourceResolutionState.Unresolved);
190
+ });
191
+
144
192
  it('reveals every owner of one shared texture when that texture settles', () => {
145
193
  const texture = createTexture({ resource: pendingRef() });
146
194
  const a = createMesh(createBoxMeshGeometry(), [createStandardPbrMaterial({ baseColorMap: texture })]);
@@ -61,6 +61,7 @@ describe('disposeScene3DResourceResolver', () => {
61
61
  const resolver = createScene3DResourceResolver();
62
62
  const controller = new AbortController();
63
63
  const ref = {
64
+ alphaType: 'straight',
64
65
  bytes: new Uint8Array(0),
65
66
  failure: null,
66
67
  kind: ImageResourceReferenceKind.Embedded,
@@ -11,6 +11,7 @@ import {
11
11
  } from './sceneResourceSignals';
12
12
 
13
13
  const ref: ImageResourceReference = {
14
+ alphaType: 'straight',
14
15
  bytes: new Uint8Array(),
15
16
  failure: null,
16
17
  kind: ImageResourceReferenceKind.Embedded,