@plasius/gpu-shared 0.1.3 → 0.1.6
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +35 -1
- package/dist/chunk-OTCJ3VOK.js +35 -0
- package/dist/chunk-OTCJ3VOK.js.map +1 -0
- package/dist/{chunk-UUJLYYQS.js → chunk-QBMXJ3V2.js} +42 -15
- package/dist/chunk-QBMXJ3V2.js.map +1 -0
- package/dist/{gltf-loader-4FNTT63R.js → gltf-loader-LKALCZAV.js} +2 -2
- package/dist/index.cjs +605 -181
- package/dist/index.cjs.map +1 -1
- package/dist/index.js +5 -5
- package/dist/index.js.map +1 -1
- package/dist/{showcase-runtime-V72XV55N.js → showcase-runtime-JZIYGQAU.js} +533 -167
- package/dist/{showcase-runtime-V72XV55N.js.map → showcase-runtime-JZIYGQAU.js.map} +1 -1
- package/package.json +2 -2
- package/src/asset-url.js +37 -0
- package/src/gltf-loader.js +36 -1
- package/src/index.d.ts +4 -0
- package/src/index.js +2 -4
- package/src/showcase-runtime.js +619 -166
- package/dist/chunk-UUJLYYQS.js.map +0 -1
- /package/dist/{gltf-loader-4FNTT63R.js.map → gltf-loader-LKALCZAV.js.map} +0 -0
package/CHANGELOG.md
CHANGED
|
@@ -4,6 +4,36 @@ All notable changes to this project will be documented in this file.
|
|
|
4
4
|
|
|
5
5
|
## [Unreleased]
|
|
6
6
|
|
|
7
|
+
- **Added**
|
|
8
|
+
- (placeholder)
|
|
9
|
+
|
|
10
|
+
- **Changed**
|
|
11
|
+
- (placeholder)
|
|
12
|
+
|
|
13
|
+
- **Fixed**
|
|
14
|
+
- (placeholder)
|
|
15
|
+
|
|
16
|
+
- **Security**
|
|
17
|
+
- (placeholder)
|
|
18
|
+
|
|
19
|
+
## [0.1.6] - 2026-04-02
|
|
20
|
+
|
|
21
|
+
- **Added**
|
|
22
|
+
- (placeholder)
|
|
23
|
+
|
|
24
|
+
- **Changed**
|
|
25
|
+
- (placeholder)
|
|
26
|
+
|
|
27
|
+
- **Fixed**
|
|
28
|
+
- Shared asset and glTF buffer loading now resolve reliably in browser consumers
|
|
29
|
+
when the initial request URL is relative, using the fetched response URL as
|
|
30
|
+
the stable base for nested asset requests.
|
|
31
|
+
|
|
32
|
+
- **Security**
|
|
33
|
+
- (placeholder)
|
|
34
|
+
|
|
35
|
+
## [0.1.4] - 2026-03-26
|
|
36
|
+
|
|
7
37
|
- **Added**
|
|
8
38
|
- (placeholder)
|
|
9
39
|
|
|
@@ -30,7 +60,9 @@ All notable changes to this project will be documented in this file.
|
|
|
30
60
|
- README usage now documents the shared teardown contract for public consumers.
|
|
31
61
|
|
|
32
62
|
- **Fixed**
|
|
33
|
-
-
|
|
63
|
+
- Shared brigantine asset resolution now falls back to an inline browser-safe
|
|
64
|
+
data URL when a consuming bundler does not provide a valid module base URL,
|
|
65
|
+
preventing `Invalid URL` crashes in hosted GPU demo catalogs.
|
|
34
66
|
|
|
35
67
|
- **Security**
|
|
36
68
|
- (placeholder)
|
|
@@ -85,3 +117,5 @@ All notable changes to this project will be documented in this file.
|
|
|
85
117
|
[0.1.1]: https://github.com/Plasius-LTD/gpu-shared/releases/tag/v0.1.1
|
|
86
118
|
[0.1.2]: https://github.com/Plasius-LTD/gpu-shared/releases/tag/v0.1.2
|
|
87
119
|
[0.1.3]: https://github.com/Plasius-LTD/gpu-shared/releases/tag/v0.1.3
|
|
120
|
+
[0.1.4]: https://github.com/Plasius-LTD/gpu-shared/releases/tag/v0.1.4
|
|
121
|
+
[0.1.6]: https://github.com/Plasius-LTD/gpu-shared/releases/tag/v0.1.6
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
// src/asset-url.js
|
|
2
|
+
var INLINE_BRIGANTINE_GLTF_URL = "data:application/json;base64,ewogICJhc3NldCI6IHsKICAgICJ2ZXJzaW9uIjogIjIuMCIsCiAgICAiZ2VuZXJhdG9yIjogIlBsYXNpdXMgZGVtbyBhc3NldCBnZW5lcmF0b3IiCiAgfSwKICAic2NlbmUiOiAwLAogICJzY2VuZXMiOiBbCiAgICB7CiAgICAgICJub2RlcyI6IFswXQogICAgfQogIF0sCiAgIm5vZGVzIjogWwogICAgewogICAgICAibWVzaCI6IDAsCiAgICAgICJuYW1lIjogImJyaWdhbnRpbmUiLAogICAgICAiZXh0cmFzIjogewogICAgICAgICJwaHlzaWNzIjogewogICAgICAgICAgInNoYXBlIjogImJveCIsCiAgICAgICAgICAiaGFsZkV4dGVudHMiOiBbMS4zNSwgMC45NSwgMy45XSwKICAgICAgICAgICJtYXNzIjogMzIwMCwKICAgICAgICAgICJyZXN0aXR1dGlvbiI6IDAuMjIsCiAgICAgICAgICAibGluZWFyRGFtcGluZyI6IDAuMDQsCiAgICAgICAgICAiYW5ndWxhckRhbXBpbmciOiAwLjA4LAogICAgICAgICAgIndhdGVybGluZSI6IDAuNDIKICAgICAgICB9CiAgICAgIH0KICAgIH0KICBdLAogICJtZXNoZXMiOiBbCiAgICB7CiAgICAgICJuYW1lIjogImJyaWdhbnRpbmUtaHVsbCIsCiAgICAgICJwcmltaXRpdmVzIjogWwogICAgICAgIHsKICAgICAgICAgICJhdHRyaWJ1dGVzIjogewogICAgICAgICAgICAiUE9TSVRJT04iOiAwCiAgICAgICAgICB9LAogICAgICAgICAgImluZGljZXMiOiAxLAogICAgICAgICAgIm1hdGVyaWFsIjogMAogICAgICAgIH0KICAgICAgXQogICAgfQogIF0sCiAgIm1hdGVyaWFscyI6IFsKICAgIHsKICAgICAgIm5hbWUiOiAicGFpbnRlZC1odWxsIiwKICAgICAgInBick1ldGFsbGljUm91Z2huZXNzIjogewogICAgICAgICJiYXNlQ29sb3JGYWN0b3IiOiBbMC41NiwgMC4zMywgMC4yMiwgMV0sCiAgICAgICAgIm1ldGFsbGljRmFjdG9yIjogMC4wOCwKICAgICAgICAicm91Z2huZXNzRmFjdG9yIjogMC45MgogICAgICB9CiAgICB9CiAgXSwKICAiYnVmZmVycyI6IFsKICAgIHsKICAgICAgInVyaSI6ICJkYXRhOmFwcGxpY2F0aW9uL29jdGV0LXN0cmVhbTtiYXNlNjQsbXBtWnZ3QUFBTC9OekV6QW1wbVpQd0FBQUwvTnpFekF6Y3lzdnpNenM3NHpNN08vemN5c1B6TXpzNzR6TTdPL0FBQ2d2ODNNVEwzTnpNdy9BQUNnUDgzTVRMM056TXcvQUFBQUFPeFJPTDR6TTROQUFBQUFBR1ptNWo0QUFIQkFNek56dnpNenN6NmFtUm5BTXpOelB6TXpzejZhbVJuQXpjeE12ejBLMXo3TnpFdy96Y3hNUHowSzF6N056RXcvQUFBQUFETXpjejltWm1hL0FBQUNBQU1BQUFBREFBRUFBZ0FFQUFVQUFnQUZBQU1BQkFBSEFBVUFCQUFHQUFjQUJRQUhBQVlBQUFBQkFBa0FBQUFKQUFnQUNBQUpBQXdBQWdBSUFBd0FBd0FNQUFrQUFnQU1BQW9BQXdBTEFBd0FBZ0FLQUFRQUF3QUZBQXNBQ2dBTUFBc0FBQUFJQUFJQUFRQURBQWtBQkFBS0FBWUFCUUFHQUFzQUFnQUtBQXNBQWdBTEFBTUEiLAogICAgICAiYnl0ZUxlbmd0aCI6IDI5NAogICAgfQogIF0sCiAgImJ1ZmZlclZpZXdzIjogWwogICAgewogICAgICAiYnVmZmVyIjogMCwKICAgICAgImJ5dGVPZmZzZXQiOiAwLAogICAgICAiYnl0ZUxlbmd0aCI6IDE1NiwKICAgICAgInRhcmdldCI6IDM0OTYyCiAgICB9LAogICAgewogICAgICAiYnVmZmVyIjogMCwKICAgICAgImJ5dGVPZmZzZXQiOiAxNTYsCiAgICAgICJieXRlTGVuZ3RoIjogMTM4LAogICAgICAidGFyZ2V0IjogMzQ5NjMKICAgIH0KICBdLAogICJhY2Nlc3NvcnMiOiBbCiAgICB7CiAgICAgICJidWZmZXJWaWV3IjogMCwKICAgICAgImJ5dGVPZmZzZXQiOiAwLAogICAgICAiY29tcG9uZW50VHlwZSI6IDUxMjYsCiAgICAgICJjb3VudCI6IDEzLAogICAgICAidHlwZSI6ICJWRUMzIiwKICAgICAgIm1pbiI6IFstMS4zNSwgLTAuNSwgLTMuMl0sCiAgICAgICJtYXgiOiBbMS4zNSwgMC45NSwgNC4xXQogICAgfSwKICAgIHsKICAgICAgImJ1ZmZlclZpZXciOiAxLAogICAgICAiYnl0ZU9mZnNldCI6IDAsCiAgICAgICJjb21wb25lbnRUeXBlIjogNTEyMywKICAgICAgImNvdW50IjogNjksCiAgICAgICJ0eXBlIjogIlNDQUxBUiIsCiAgICAgICJtYXgiOiBbMTJdLAogICAgICAibWluIjogWzBdCiAgICB9CiAgXQp9Cg==";
|
|
3
|
+
function createInlineShowcaseAssetUrl() {
|
|
4
|
+
return new URL(INLINE_BRIGANTINE_GLTF_URL);
|
|
5
|
+
}
|
|
6
|
+
function getBrowserBaseUrl() {
|
|
7
|
+
if (typeof document !== "undefined" && typeof document.baseURI === "string" && document.baseURI.length > 0) {
|
|
8
|
+
return document.baseURI;
|
|
9
|
+
}
|
|
10
|
+
if (typeof window !== "undefined" && typeof window.location?.href === "string" && window.location.href.length > 0) {
|
|
11
|
+
return window.location.href;
|
|
12
|
+
}
|
|
13
|
+
return null;
|
|
14
|
+
}
|
|
15
|
+
function resolveShowcaseAssetUrl(baseUrl = import.meta.url) {
|
|
16
|
+
try {
|
|
17
|
+
return new URL("../assets/brigantine.gltf", baseUrl);
|
|
18
|
+
} catch {
|
|
19
|
+
const browserBaseUrl = getBrowserBaseUrl();
|
|
20
|
+
if (browserBaseUrl) {
|
|
21
|
+
try {
|
|
22
|
+
const normalizedBaseUrl = new URL(baseUrl, browserBaseUrl);
|
|
23
|
+
return new URL("../assets/brigantine.gltf", normalizedBaseUrl);
|
|
24
|
+
} catch {
|
|
25
|
+
return createInlineShowcaseAssetUrl();
|
|
26
|
+
}
|
|
27
|
+
}
|
|
28
|
+
return createInlineShowcaseAssetUrl();
|
|
29
|
+
}
|
|
30
|
+
}
|
|
31
|
+
|
|
32
|
+
export {
|
|
33
|
+
resolveShowcaseAssetUrl
|
|
34
|
+
};
|
|
35
|
+
//# sourceMappingURL=chunk-OTCJ3VOK.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/asset-url.js"],"sourcesContent":["const INLINE_BRIGANTINE_GLTF_URL =\n \"data:application/json;base64,ewogICJhc3NldCI6IHsKICAgICJ2ZXJzaW9uIjogIjIuMCIsCiAgICAiZ2VuZXJhdG9yIjogIlBsYXNpdXMgZGVtbyBhc3NldCBnZW5lcmF0b3IiCiAgfSwKICAic2NlbmUiOiAwLAogICJzY2VuZXMiOiBbCiAgICB7CiAgICAgICJub2RlcyI6IFswXQogICAgfQogIF0sCiAgIm5vZGVzIjogWwogICAgewogICAgICAibWVzaCI6IDAsCiAgICAgICJuYW1lIjogImJyaWdhbnRpbmUiLAogICAgICAiZXh0cmFzIjogewogICAgICAgICJwaHlzaWNzIjogewogICAgICAgICAgInNoYXBlIjogImJveCIsCiAgICAgICAgICAiaGFsZkV4dGVudHMiOiBbMS4zNSwgMC45NSwgMy45XSwKICAgICAgICAgICJtYXNzIjogMzIwMCwKICAgICAgICAgICJyZXN0aXR1dGlvbiI6IDAuMjIsCiAgICAgICAgICAibGluZWFyRGFtcGluZyI6IDAuMDQsCiAgICAgICAgICAiYW5ndWxhckRhbXBpbmciOiAwLjA4LAogICAgICAgICAgIndhdGVybGluZSI6IDAuNDIKICAgICAgICB9CiAgICAgIH0KICAgIH0KICBdLAogICJtZXNoZXMiOiBbCiAgICB7CiAgICAgICJuYW1lIjogImJyaWdhbnRpbmUtaHVsbCIsCiAgICAgICJwcmltaXRpdmVzIjogWwogICAgICAgIHsKICAgICAgICAgICJhdHRyaWJ1dGVzIjogewogICAgICAgICAgICAiUE9TSVRJT04iOiAwCiAgICAgICAgICB9LAogICAgICAgICAgImluZGljZXMiOiAxLAogICAgICAgICAgIm1hdGVyaWFsIjogMAogICAgICAgIH0KICAgICAgXQogICAgfQogIF0sCiAgIm1hdGVyaWFscyI6IFsKICAgIHsKICAgICAgIm5hbWUiOiAicGFpbnRlZC1odWxsIiwKICAgICAgInBick1ldGFsbGljUm91Z2huZXNzIjogewogICAgICAgICJiYXNlQ29sb3JGYWN0b3IiOiBbMC41NiwgMC4zMywgMC4yMiwgMV0sCiAgICAgICAgIm1ldGFsbGljRmFjdG9yIjogMC4wOCwKICAgICAgICAicm91Z2huZXNzRmFjdG9yIjogMC45MgogICAgICB9CiAgICB9CiAgXSwKICAiYnVmZmVycyI6IFsKICAgIHsKICAgICAgInVyaSI6ICJkYXRhOmFwcGxpY2F0aW9uL29jdGV0LXN0cmVhbTtiYXNlNjQsbXBtWnZ3QUFBTC9OekV6QW1wbVpQd0FBQUwvTnpFekF6Y3lzdnpNenM3NHpNN08vemN5c1B6TXpzNzR6TTdPL0FBQ2d2ODNNVEwzTnpNdy9BQUNnUDgzTVRMM056TXcvQUFBQUFPeFJPTDR6TTROQUFBQUFBR1ptNWo0QUFIQkFNek56dnpNenN6NmFtUm5BTXpOelB6TXpzejZhbVJuQXpjeE12ejBLMXo3TnpFdy96Y3hNUHowSzF6N056RXcvQUFBQUFETXpjejltWm1hL0FBQUNBQU1BQUFBREFBRUFBZ0FFQUFVQUFnQUZBQU1BQkFBSEFBVUFCQUFHQUFjQUJRQUhBQVlBQUFBQkFBa0FBQUFKQUFnQUNBQUpBQXdBQWdBSUFBd0FBd0FNQUFrQUFnQU1BQW9BQXdBTEFBd0FBZ0FLQUFRQUF3QUZBQXNBQ2dBTUFBc0FBQUFJQUFJQUFRQURBQWtBQkFBS0FBWUFCUUFHQUFzQUFnQUtBQXNBQWdBTEFBTUEiLAogICAgICAiYnl0ZUxlbmd0aCI6IDI5NAogICAgfQogIF0sCiAgImJ1ZmZlclZpZXdzIjogWwogICAgewogICAgICAiYnVmZmVyIjogMCwKICAgICAgImJ5dGVPZmZzZXQiOiAwLAogICAgICAiYnl0ZUxlbmd0aCI6IDE1NiwKICAgICAgInRhcmdldCI6IDM0OTYyCiAgICB9LAogICAgewogICAgICAiYnVmZmVyIjogMCwKICAgICAgImJ5dGVPZmZzZXQiOiAxNTYsCiAgICAgICJieXRlTGVuZ3RoIjogMTM4LAogICAgICAidGFyZ2V0IjogMzQ5NjMKICAgIH0KICBdLAogICJhY2Nlc3NvcnMiOiBbCiAgICB7CiAgICAgICJidWZmZXJWaWV3IjogMCwKICAgICAgImJ5dGVPZmZzZXQiOiAwLAogICAgICAiY29tcG9uZW50VHlwZSI6IDUxMjYsCiAgICAgICJjb3VudCI6IDEzLAogICAgICAidHlwZSI6ICJWRUMzIiwKICAgICAgIm1pbiI6IFstMS4zNSwgLTAuNSwgLTMuMl0sCiAgICAgICJtYXgiOiBbMS4zNSwgMC45NSwgNC4xXQogICAgfSwKICAgIHsKICAgICAgImJ1ZmZlclZpZXciOiAxLAogICAgICAiYnl0ZU9mZnNldCI6IDAsCiAgICAgICJjb21wb25lbnRUeXBlIjogNTEyMywKICAgICAgImNvdW50IjogNjksCiAgICAgICJ0eXBlIjogIlNDQUxBUiIsCiAgICAgICJtYXgiOiBbMTJdLAogICAgICAibWluIjogWzBdCiAgICB9CiAgXQp9Cg==\";\n\nfunction createInlineShowcaseAssetUrl() {\n return new URL(INLINE_BRIGANTINE_GLTF_URL);\n}\n\nfunction getBrowserBaseUrl() {\n if (typeof document !== \"undefined\" && typeof document.baseURI === \"string\" && document.baseURI.length > 0) {\n return document.baseURI;\n }\n if (\n typeof window !== \"undefined\" &&\n typeof window.location?.href === \"string\" &&\n window.location.href.length > 0\n ) {\n return window.location.href;\n }\n return null;\n}\n\nexport function resolveShowcaseAssetUrl(baseUrl = import.meta.url) {\n try {\n return new URL(\"../assets/brigantine.gltf\", baseUrl);\n } catch {\n const browserBaseUrl = getBrowserBaseUrl();\n if (browserBaseUrl) {\n try {\n const normalizedBaseUrl = new URL(baseUrl, browserBaseUrl);\n return new URL(\"../assets/brigantine.gltf\", normalizedBaseUrl);\n } catch {\n return createInlineShowcaseAssetUrl();\n }\n }\n return createInlineShowcaseAssetUrl();\n }\n}\n"],"mappings":";AAAA,IAAM,6BACJ;AAEF,SAAS,+BAA+B;AACtC,SAAO,IAAI,IAAI,0BAA0B;AAC3C;AAEA,SAAS,oBAAoB;AAC3B,MAAI,OAAO,aAAa,eAAe,OAAO,SAAS,YAAY,YAAY,SAAS,QAAQ,SAAS,GAAG;AAC1G,WAAO,SAAS;AAAA,EAClB;AACA,MACE,OAAO,WAAW,eAClB,OAAO,OAAO,UAAU,SAAS,YACjC,OAAO,SAAS,KAAK,SAAS,GAC9B;AACA,WAAO,OAAO,SAAS;AAAA,EACzB;AACA,SAAO;AACT;AAEO,SAAS,wBAAwB,UAAU,YAAY,KAAK;AACjE,MAAI;AACF,WAAO,IAAI,IAAI,6BAA6B,OAAO;AAAA,EACrD,QAAQ;AACN,UAAM,iBAAiB,kBAAkB;AACzC,QAAI,gBAAgB;AAClB,UAAI;AACF,cAAM,oBAAoB,IAAI,IAAI,SAAS,cAAc;AACzD,eAAO,IAAI,IAAI,6BAA6B,iBAAiB;AAAA,MAC/D,QAAQ;AACN,eAAO,6BAA6B;AAAA,MACtC;AAAA,IACF;AACA,WAAO,6BAA6B;AAAA,EACtC;AACF;","names":[]}
|
|
@@ -37,17 +37,17 @@ function getTypeSize(type) {
|
|
|
37
37
|
throw new Error(`Unsupported glTF accessor type: ${type}`);
|
|
38
38
|
}
|
|
39
39
|
}
|
|
40
|
-
function readAccessor(
|
|
41
|
-
const accessor =
|
|
42
|
-
const bufferView =
|
|
40
|
+
function readAccessor(document2, accessorIndex, buffers) {
|
|
41
|
+
const accessor = document2.accessors[accessorIndex];
|
|
42
|
+
const bufferView = document2.bufferViews[accessor.bufferView];
|
|
43
43
|
const buffer = buffers[bufferView.buffer];
|
|
44
44
|
const componentCount = getTypeSize(accessor.type);
|
|
45
45
|
const byteOffset = (bufferView.byteOffset ?? 0) + (accessor.byteOffset ?? 0);
|
|
46
46
|
const valueCount = accessor.count * componentCount;
|
|
47
47
|
return getComponentArray(accessor.componentType, buffer, byteOffset, valueCount);
|
|
48
48
|
}
|
|
49
|
-
function getMaterialColor(
|
|
50
|
-
const material =
|
|
49
|
+
function getMaterialColor(document2, primitive) {
|
|
50
|
+
const material = document2.materials?.[primitive.material] ?? null;
|
|
51
51
|
const factor = material?.pbrMetallicRoughness?.baseColorFactor ?? [0.56, 0.33, 0.22, 1];
|
|
52
52
|
return {
|
|
53
53
|
r: factor[0],
|
|
@@ -69,42 +69,69 @@ function computeBounds(positions) {
|
|
|
69
69
|
}
|
|
70
70
|
return { min, max };
|
|
71
71
|
}
|
|
72
|
+
function resolveBrowserRequestBaseUrl() {
|
|
73
|
+
if (typeof document !== "undefined" && typeof document.baseURI === "string" && document.baseURI.length > 0) {
|
|
74
|
+
return document.baseURI;
|
|
75
|
+
}
|
|
76
|
+
if (typeof window !== "undefined" && typeof window.location?.href === "string" && window.location.href.length > 0) {
|
|
77
|
+
return window.location.href;
|
|
78
|
+
}
|
|
79
|
+
return null;
|
|
80
|
+
}
|
|
81
|
+
function resolveFetchBaseUrl(requestUrl, responseUrl) {
|
|
82
|
+
if (typeof responseUrl === "string" && responseUrl.length > 0) {
|
|
83
|
+
try {
|
|
84
|
+
return new URL(responseUrl);
|
|
85
|
+
} catch {
|
|
86
|
+
}
|
|
87
|
+
}
|
|
88
|
+
try {
|
|
89
|
+
return new URL(requestUrl);
|
|
90
|
+
} catch {
|
|
91
|
+
const browserBaseUrl = resolveBrowserRequestBaseUrl();
|
|
92
|
+
if (browserBaseUrl) {
|
|
93
|
+
return new URL(requestUrl, browserBaseUrl);
|
|
94
|
+
}
|
|
95
|
+
throw new Error(`Unable to resolve a stable base URL for glTF asset loading: ${String(requestUrl)}`);
|
|
96
|
+
}
|
|
97
|
+
}
|
|
72
98
|
async function loadGltfModel(url) {
|
|
73
99
|
const response = await fetch(url);
|
|
74
100
|
if (!response.ok) {
|
|
75
101
|
throw new Error(`Failed to load glTF asset: ${response.status} ${response.statusText}`);
|
|
76
102
|
}
|
|
77
|
-
const
|
|
103
|
+
const document2 = await response.json();
|
|
104
|
+
const baseUrl = resolveFetchBaseUrl(url, response.url);
|
|
78
105
|
const buffers = await Promise.all(
|
|
79
|
-
(
|
|
106
|
+
(document2.buffers ?? []).map(async (buffer) => {
|
|
80
107
|
if (typeof buffer.uri !== "string") {
|
|
81
108
|
throw new Error("glTF buffer URI is required for demo asset loading.");
|
|
82
109
|
}
|
|
83
110
|
if (buffer.uri.startsWith("data:")) {
|
|
84
111
|
return decodeDataUri(buffer.uri);
|
|
85
112
|
}
|
|
86
|
-
const nested = await fetch(new URL(buffer.uri,
|
|
113
|
+
const nested = await fetch(new URL(buffer.uri, baseUrl));
|
|
87
114
|
if (!nested.ok) {
|
|
88
115
|
throw new Error(`Failed to load glTF buffer: ${nested.status} ${nested.statusText}`);
|
|
89
116
|
}
|
|
90
117
|
return nested.arrayBuffer();
|
|
91
118
|
})
|
|
92
119
|
);
|
|
93
|
-
const scene =
|
|
120
|
+
const scene = document2.scenes?.[document2.scene ?? 0];
|
|
94
121
|
if (!scene || !Array.isArray(scene.nodes) || scene.nodes.length === 0) {
|
|
95
122
|
throw new Error("glTF demo asset must expose a default scene with at least one node.");
|
|
96
123
|
}
|
|
97
|
-
const node =
|
|
98
|
-
const mesh =
|
|
124
|
+
const node = document2.nodes[scene.nodes[0]];
|
|
125
|
+
const mesh = document2.meshes[node.mesh];
|
|
99
126
|
const primitive = mesh.primitives[0];
|
|
100
|
-
const positions = Array.from(readAccessor(
|
|
101
|
-
const indices = Array.from(readAccessor(
|
|
127
|
+
const positions = Array.from(readAccessor(document2, primitive.attributes.POSITION, buffers));
|
|
128
|
+
const indices = Array.from(readAccessor(document2, primitive.indices, buffers));
|
|
102
129
|
return Object.freeze({
|
|
103
130
|
name: node.name ?? mesh.name ?? "gltf-model",
|
|
104
131
|
positions,
|
|
105
132
|
indices,
|
|
106
133
|
bounds: computeBounds(positions),
|
|
107
|
-
color: getMaterialColor(
|
|
134
|
+
color: getMaterialColor(document2, primitive),
|
|
108
135
|
physics: Object.freeze({ ...node.extras?.physics ?? {} })
|
|
109
136
|
});
|
|
110
137
|
}
|
|
@@ -112,4 +139,4 @@ async function loadGltfModel(url) {
|
|
|
112
139
|
export {
|
|
113
140
|
loadGltfModel
|
|
114
141
|
};
|
|
115
|
-
//# sourceMappingURL=chunk-
|
|
142
|
+
//# sourceMappingURL=chunk-QBMXJ3V2.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/gltf-loader.js"],"sourcesContent":["function decodeDataUri(uri) {\n const match = /^data:.*?;base64,(.+)$/i.exec(uri);\n if (!match) {\n throw new Error(`Unsupported glTF buffer URI: ${uri.slice(0, 48)}`);\n }\n\n const binary = atob(match[1]);\n const bytes = new Uint8Array(binary.length);\n for (let index = 0; index < binary.length; index += 1) {\n bytes[index] = binary.charCodeAt(index);\n }\n return bytes.buffer;\n}\n\nfunction getComponentArray(componentType, buffer, byteOffset, count) {\n switch (componentType) {\n case 5123:\n return new Uint16Array(buffer, byteOffset, count);\n case 5125:\n return new Uint32Array(buffer, byteOffset, count);\n case 5126:\n return new Float32Array(buffer, byteOffset, count);\n default:\n throw new Error(`Unsupported glTF componentType: ${componentType}`);\n }\n}\n\nfunction getTypeSize(type) {\n switch (type) {\n case \"SCALAR\":\n return 1;\n case \"VEC2\":\n return 2;\n case \"VEC3\":\n return 3;\n case \"VEC4\":\n return 4;\n default:\n throw new Error(`Unsupported glTF accessor type: ${type}`);\n }\n}\n\nfunction readAccessor(document, accessorIndex, buffers) {\n const accessor = document.accessors[accessorIndex];\n const bufferView = document.bufferViews[accessor.bufferView];\n const buffer = buffers[bufferView.buffer];\n const componentCount = getTypeSize(accessor.type);\n const byteOffset = (bufferView.byteOffset ?? 0) + (accessor.byteOffset ?? 0);\n const valueCount = accessor.count * componentCount;\n return getComponentArray(accessor.componentType, buffer, byteOffset, valueCount);\n}\n\nfunction getMaterialColor(document, primitive) {\n const material = document.materials?.[primitive.material] ?? null;\n const factor =\n material?.pbrMetallicRoughness?.baseColorFactor ?? [0.56, 0.33, 0.22, 1];\n return {\n r: factor[0],\n g: factor[1],\n b: factor[2],\n a: factor[3] ?? 1,\n };\n}\n\nfunction computeBounds(positions) {\n const min = [Number.POSITIVE_INFINITY, Number.POSITIVE_INFINITY, Number.POSITIVE_INFINITY];\n const max = [Number.NEGATIVE_INFINITY, Number.NEGATIVE_INFINITY, Number.NEGATIVE_INFINITY];\n for (let index = 0; index < positions.length; index += 3) {\n min[0] = Math.min(min[0], positions[index]);\n min[1] = Math.min(min[1], positions[index + 1]);\n min[2] = Math.min(min[2], positions[index + 2]);\n max[0] = Math.max(max[0], positions[index]);\n max[1] = Math.max(max[1], positions[index + 1]);\n max[2] = Math.max(max[2], positions[index + 2]);\n }\n return { min, max };\n}\n\nfunction resolveBrowserRequestBaseUrl() {\n if (typeof document !== \"undefined\" && typeof document.baseURI === \"string\" && document.baseURI.length > 0) {\n return document.baseURI;\n }\n if (\n typeof window !== \"undefined\" &&\n typeof window.location?.href === \"string\" &&\n window.location.href.length > 0\n ) {\n return window.location.href;\n }\n return null;\n}\n\nfunction resolveFetchBaseUrl(requestUrl, responseUrl) {\n if (typeof responseUrl === \"string\" && responseUrl.length > 0) {\n try {\n return new URL(responseUrl);\n } catch {\n // Keep trying the other candidates when an environment reports a malformed response URL.\n }\n }\n\n try {\n return new URL(requestUrl);\n } catch {\n const browserBaseUrl = resolveBrowserRequestBaseUrl();\n if (browserBaseUrl) {\n return new URL(requestUrl, browserBaseUrl);\n }\n throw new Error(`Unable to resolve a stable base URL for glTF asset loading: ${String(requestUrl)}`);\n }\n}\n\nexport async function loadGltfModel(url) {\n const response = await fetch(url);\n if (!response.ok) {\n throw new Error(`Failed to load glTF asset: ${response.status} ${response.statusText}`);\n }\n\n const document = await response.json();\n const baseUrl = resolveFetchBaseUrl(url, response.url);\n const buffers = await Promise.all(\n (document.buffers ?? []).map(async (buffer) => {\n if (typeof buffer.uri !== \"string\") {\n throw new Error(\"glTF buffer URI is required for demo asset loading.\");\n }\n if (buffer.uri.startsWith(\"data:\")) {\n return decodeDataUri(buffer.uri);\n }\n const nested = await fetch(new URL(buffer.uri, baseUrl));\n if (!nested.ok) {\n throw new Error(`Failed to load glTF buffer: ${nested.status} ${nested.statusText}`);\n }\n return nested.arrayBuffer();\n })\n );\n\n const scene = document.scenes?.[document.scene ?? 0];\n if (!scene || !Array.isArray(scene.nodes) || scene.nodes.length === 0) {\n throw new Error(\"glTF demo asset must expose a default scene with at least one node.\");\n }\n\n const node = document.nodes[scene.nodes[0]];\n const mesh = document.meshes[node.mesh];\n const primitive = mesh.primitives[0];\n const positions = Array.from(readAccessor(document, primitive.attributes.POSITION, buffers));\n const indices = Array.from(readAccessor(document, primitive.indices, buffers));\n\n return Object.freeze({\n name: node.name ?? mesh.name ?? \"gltf-model\",\n positions,\n indices,\n bounds: computeBounds(positions),\n color: getMaterialColor(document, primitive),\n physics: Object.freeze({ ...(node.extras?.physics ?? {}) }),\n });\n}\n"],"mappings":"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","names":["document"]}
|