@plasius/gpu-shared 0.1.11 → 0.1.13

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.
Files changed (41) hide show
  1. package/CHANGELOG.md +36 -3
  2. package/README.md +55 -1
  3. package/assets/brigantine.gltf +549 -24
  4. package/assets/cutter.gltf +538 -0
  5. package/assets/harbor-dock.gltf +680 -0
  6. package/assets/lighthouse.gltf +604 -0
  7. package/dist/chunk-2FIFSBB4.js +74 -0
  8. package/dist/chunk-2FIFSBB4.js.map +1 -0
  9. package/dist/chunk-DABW627O.js +113 -0
  10. package/dist/chunk-DABW627O.js.map +1 -0
  11. package/dist/chunk-DQX4DXBR.js +369 -0
  12. package/dist/chunk-DQX4DXBR.js.map +1 -0
  13. package/dist/chunk-NCPJWLX3.js +17 -0
  14. package/dist/chunk-NCPJWLX3.js.map +1 -0
  15. package/dist/gltf-loader-WAM23F37.js +9 -0
  16. package/dist/index.cjs +1255 -279
  17. package/dist/index.cjs.map +1 -1
  18. package/dist/index.js +19 -6
  19. package/dist/index.js.map +1 -1
  20. package/dist/showcase-inline-assets-B7U7VX5H.js +7 -0
  21. package/dist/{showcase-runtime-2ZNPKD7D.js → showcase-runtime-PN7N3FZY.js} +808 -237
  22. package/dist/showcase-runtime-PN7N3FZY.js.map +1 -0
  23. package/package.json +15 -1
  24. package/src/asset-url.js +62 -11
  25. package/src/feature-flags.js +1 -0
  26. package/src/gltf-loader.js +322 -32
  27. package/src/i18n.js +71 -0
  28. package/src/index.d.ts +115 -1
  29. package/src/index.js +9 -1
  30. package/src/showcase-inline-assets.js +3 -0
  31. package/src/showcase-runtime.js +912 -188
  32. package/src/translations/en-GB.js +55 -0
  33. package/dist/chunk-DGUM43GV.js +0 -11
  34. package/dist/chunk-OTCJ3VOK.js +0 -35
  35. package/dist/chunk-OTCJ3VOK.js.map +0 -1
  36. package/dist/chunk-QBMXJ3V2.js +0 -142
  37. package/dist/chunk-QBMXJ3V2.js.map +0 -1
  38. package/dist/gltf-loader-LKALCZAV.js +0 -8
  39. package/dist/showcase-runtime-2ZNPKD7D.js.map +0 -1
  40. /package/dist/{chunk-DGUM43GV.js.map → gltf-loader-WAM23F37.js.map} +0 -0
  41. /package/dist/{gltf-loader-LKALCZAV.js.map → showcase-inline-assets-B7U7VX5H.js.map} +0 -0
@@ -0,0 +1,55 @@
1
+ export const gpuSharedEnGbTranslations = Object.freeze({
2
+ "gpuShared.showcase.title": "Flag by the Sea",
3
+ "gpuShared.showcase.subtitle":
4
+ "Shared 3D validation scene using GLTF ships, cloth, fluid continuity, adaptive performance, and telemetry.",
5
+ "gpuShared.showcase.status.booting": "Booting 3D scene...",
6
+ "gpuShared.showcase.status.live": "3D scene live - {fps} FPS",
7
+ "gpuShared.showcase.details.booting":
8
+ "Preparing a moonlit harbor scene, GLTF hull data, cloth and fluid continuity plans, and adaptive quality metadata.",
9
+ "gpuShared.showcase.details.physics":
10
+ "Stable world snapshots are emitted from {snapshotStageId} after the authoritative solver; the heavier hull now carries momentum through mass-aware collision impulses while cloth and fluid remain downstream.",
11
+ "gpuShared.showcase.details.realistic":
12
+ "Moonlit GLTF ships now mix a brigantine and a cutter against modeled harbor assets; cloth, fluid, and ship-local lighting stay continuous while the governor pressure is {pressureLevel}.",
13
+ "gpuShared.showcase.details.legacy":
14
+ "Moonlit GLTF ships use the legacy brigantine and placeholder harbor blocks while cloth, fluid, and ship-local lighting stay continuous while the governor pressure is {pressureLevel}.",
15
+ "gpuShared.showcase.action.pause": "Pause",
16
+ "gpuShared.showcase.action.resume": "Resume",
17
+ "gpuShared.showcase.control.stressMode": "Stress mode",
18
+ "gpuShared.showcase.control.focus": "Focus",
19
+ "gpuShared.showcase.focus.integrated": "integrated",
20
+ "gpuShared.showcase.focus.lighting": "lighting",
21
+ "gpuShared.showcase.focus.cloth": "cloth",
22
+ "gpuShared.showcase.focus.fluid": "fluid",
23
+ "gpuShared.showcase.focus.physics": "physics",
24
+ "gpuShared.showcase.focus.performance": "performance",
25
+ "gpuShared.showcase.focus.debug": "debug",
26
+ "gpuShared.showcase.legend.title": "Scene",
27
+ "gpuShared.showcase.legend.shipMetadata":
28
+ "GLTF ships carry hull mass and damping metadata.",
29
+ "gpuShared.showcase.legend.lighting":
30
+ "Lanterns and torches warm the moonlit harbor.",
31
+ "gpuShared.showcase.legend.collisions":
32
+ "Mass-aware collisions stay authoritative near the camera.",
33
+ "gpuShared.showcase.section.sceneState": "Scene State",
34
+ "gpuShared.showcase.section.qualityBudgets": "Quality + Budgets",
35
+ "gpuShared.showcase.section.debugTelemetry": "Debug Telemetry",
36
+ "gpuShared.showcase.section.notes": "Notes",
37
+ "gpuShared.showcase.note.assetLoading":
38
+ "Ships are loaded from a GLTF asset and carry mass, damping, restitution, and hull extents from node extras.",
39
+ "gpuShared.showcase.note.moonlight":
40
+ "Moonlight sets the cold ambient read while deck lanterns and harbor torches provide warm local contrast.",
41
+ "gpuShared.showcase.note.continuity":
42
+ "Cloth and fluid continuity stay coherent across near, mid, far, and horizon bands even in the darker night palette.",
43
+ "gpuShared.showcase.note.performance":
44
+ "Performance pressure reduces visual detail before mass-weighted authoritative collision motion is touched.",
45
+ "gpuShared.showcase.note.physicsSnapshots":
46
+ "Stable world snapshots are taken after the authoritative rigid-body commit and before visual follow-up work.",
47
+ "gpuShared.showcase.note.physicsCollisions":
48
+ "The ships collide with mass-weighted impulses and positional correction, so the heavier hull keeps more of its line.",
49
+ "gpuShared.showcase.note.physicsLighting":
50
+ "Moonlight keeps the overall read legible while lanterns and torches make collision moments easy to track against the water.",
51
+ "gpuShared.debug.adapter.showcase": "3D showcase",
52
+ "gpuShared.debug.allocation.mainColorBuffer": "Main color buffer",
53
+ "gpuShared.debug.allocation.shadowImpressionAtlas": "Shadow impression atlas",
54
+ });
55
+
@@ -1,11 +0,0 @@
1
- var __require = /* @__PURE__ */ ((x) => typeof require !== "undefined" ? require : typeof Proxy !== "undefined" ? new Proxy(x, {
2
- get: (a, b) => (typeof require !== "undefined" ? require : a)[b]
3
- }) : x)(function(x) {
4
- if (typeof require !== "undefined") return require.apply(this, arguments);
5
- throw Error('Dynamic require of "' + x + '" is not supported');
6
- });
7
-
8
- export {
9
- __require
10
- };
11
- //# sourceMappingURL=chunk-DGUM43GV.js.map
@@ -1,35 +0,0 @@
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
@@ -1 +0,0 @@
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":[]}
@@ -1,142 +0,0 @@
1
- // src/gltf-loader.js
2
- function decodeDataUri(uri) {
3
- const match = /^data:.*?;base64,(.+)$/i.exec(uri);
4
- if (!match) {
5
- throw new Error(`Unsupported glTF buffer URI: ${uri.slice(0, 48)}`);
6
- }
7
- const binary = atob(match[1]);
8
- const bytes = new Uint8Array(binary.length);
9
- for (let index = 0; index < binary.length; index += 1) {
10
- bytes[index] = binary.charCodeAt(index);
11
- }
12
- return bytes.buffer;
13
- }
14
- function getComponentArray(componentType, buffer, byteOffset, count) {
15
- switch (componentType) {
16
- case 5123:
17
- return new Uint16Array(buffer, byteOffset, count);
18
- case 5125:
19
- return new Uint32Array(buffer, byteOffset, count);
20
- case 5126:
21
- return new Float32Array(buffer, byteOffset, count);
22
- default:
23
- throw new Error(`Unsupported glTF componentType: ${componentType}`);
24
- }
25
- }
26
- function getTypeSize(type) {
27
- switch (type) {
28
- case "SCALAR":
29
- return 1;
30
- case "VEC2":
31
- return 2;
32
- case "VEC3":
33
- return 3;
34
- case "VEC4":
35
- return 4;
36
- default:
37
- throw new Error(`Unsupported glTF accessor type: ${type}`);
38
- }
39
- }
40
- function readAccessor(document2, accessorIndex, buffers) {
41
- const accessor = document2.accessors[accessorIndex];
42
- const bufferView = document2.bufferViews[accessor.bufferView];
43
- const buffer = buffers[bufferView.buffer];
44
- const componentCount = getTypeSize(accessor.type);
45
- const byteOffset = (bufferView.byteOffset ?? 0) + (accessor.byteOffset ?? 0);
46
- const valueCount = accessor.count * componentCount;
47
- return getComponentArray(accessor.componentType, buffer, byteOffset, valueCount);
48
- }
49
- function getMaterialColor(document2, primitive) {
50
- const material = document2.materials?.[primitive.material] ?? null;
51
- const factor = material?.pbrMetallicRoughness?.baseColorFactor ?? [0.56, 0.33, 0.22, 1];
52
- return {
53
- r: factor[0],
54
- g: factor[1],
55
- b: factor[2],
56
- a: factor[3] ?? 1
57
- };
58
- }
59
- function computeBounds(positions) {
60
- const min = [Number.POSITIVE_INFINITY, Number.POSITIVE_INFINITY, Number.POSITIVE_INFINITY];
61
- const max = [Number.NEGATIVE_INFINITY, Number.NEGATIVE_INFINITY, Number.NEGATIVE_INFINITY];
62
- for (let index = 0; index < positions.length; index += 3) {
63
- min[0] = Math.min(min[0], positions[index]);
64
- min[1] = Math.min(min[1], positions[index + 1]);
65
- min[2] = Math.min(min[2], positions[index + 2]);
66
- max[0] = Math.max(max[0], positions[index]);
67
- max[1] = Math.max(max[1], positions[index + 1]);
68
- max[2] = Math.max(max[2], positions[index + 2]);
69
- }
70
- return { min, max };
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
- }
98
- async function loadGltfModel(url) {
99
- const response = await fetch(url);
100
- if (!response.ok) {
101
- throw new Error(`Failed to load glTF asset: ${response.status} ${response.statusText}`);
102
- }
103
- const document2 = await response.json();
104
- const baseUrl = resolveFetchBaseUrl(url, response.url);
105
- const buffers = await Promise.all(
106
- (document2.buffers ?? []).map(async (buffer) => {
107
- if (typeof buffer.uri !== "string") {
108
- throw new Error("glTF buffer URI is required for demo asset loading.");
109
- }
110
- if (buffer.uri.startsWith("data:")) {
111
- return decodeDataUri(buffer.uri);
112
- }
113
- const nested = await fetch(new URL(buffer.uri, baseUrl));
114
- if (!nested.ok) {
115
- throw new Error(`Failed to load glTF buffer: ${nested.status} ${nested.statusText}`);
116
- }
117
- return nested.arrayBuffer();
118
- })
119
- );
120
- const scene = document2.scenes?.[document2.scene ?? 0];
121
- if (!scene || !Array.isArray(scene.nodes) || scene.nodes.length === 0) {
122
- throw new Error("glTF demo asset must expose a default scene with at least one node.");
123
- }
124
- const node = document2.nodes[scene.nodes[0]];
125
- const mesh = document2.meshes[node.mesh];
126
- const primitive = mesh.primitives[0];
127
- const positions = Array.from(readAccessor(document2, primitive.attributes.POSITION, buffers));
128
- const indices = Array.from(readAccessor(document2, primitive.indices, buffers));
129
- return Object.freeze({
130
- name: node.name ?? mesh.name ?? "gltf-model",
131
- positions,
132
- indices,
133
- bounds: computeBounds(positions),
134
- color: getMaterialColor(document2, primitive),
135
- physics: Object.freeze({ ...node.extras?.physics ?? {} })
136
- });
137
- }
138
-
139
- export {
140
- loadGltfModel
141
- };
142
- //# sourceMappingURL=chunk-QBMXJ3V2.js.map
@@ -1 +0,0 @@
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"]}
@@ -1,8 +0,0 @@
1
- import {
2
- loadGltfModel
3
- } from "./chunk-QBMXJ3V2.js";
4
- import "./chunk-DGUM43GV.js";
5
- export {
6
- loadGltfModel
7
- };
8
- //# sourceMappingURL=gltf-loader-LKALCZAV.js.map