@adobe/data-gpu 0.9.69
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/CLAUDE.md +98 -0
- package/LICENSE +21 -0
- package/dist/core/core-plugin.d.ts +44 -0
- package/dist/core/core-plugin.js +90 -0
- package/dist/core/core-plugin.js.map +1 -0
- package/dist/core/frame-time/frame-time-plugin.d.ts +25 -0
- package/dist/core/frame-time/frame-time-plugin.js +41 -0
- package/dist/core/frame-time/frame-time-plugin.js.map +1 -0
- package/dist/core/frame-time/frame-time.d.ts +18 -0
- package/dist/core/frame-time/frame-time.js +3 -0
- package/dist/core/frame-time/frame-time.js.map +1 -0
- package/dist/core/frame-time/public.d.ts +1 -0
- package/dist/core/frame-time/public.js +3 -0
- package/dist/core/frame-time/public.js.map +1 -0
- package/dist/graphics/animation/animation-data-plugin.d.ts +216 -0
- package/dist/graphics/animation/animation-data-plugin.js +110 -0
- package/dist/graphics/animation/animation-data-plugin.js.map +1 -0
- package/dist/graphics/animation/animation-plugin.d.ts +214 -0
- package/dist/graphics/animation/animation-plugin.js +26 -0
- package/dist/graphics/animation/animation-plugin.js.map +1 -0
- package/dist/graphics/animation/animation-plugin.test.d.ts +1 -0
- package/dist/graphics/animation/animation-plugin.test.js +142 -0
- package/dist/graphics/animation/animation-plugin.test.js.map +1 -0
- package/dist/graphics/animation/animation-track/animation-track.d.ts +13 -0
- package/dist/graphics/animation/animation-track/animation-track.js +3 -0
- package/dist/graphics/animation/animation-track/animation-track.js.map +1 -0
- package/dist/graphics/animation/animation-track/componentwise-lerp.d.ts +7 -0
- package/dist/graphics/animation/animation-track/componentwise-lerp.js +22 -0
- package/dist/graphics/animation/animation-track/componentwise-lerp.js.map +1 -0
- package/dist/graphics/animation/animation-track/interpolate.d.ts +8 -0
- package/dist/graphics/animation/animation-track/interpolate.js +18 -0
- package/dist/graphics/animation/animation-track/interpolate.js.map +1 -0
- package/dist/graphics/animation/animation-track/public.d.ts +1 -0
- package/dist/graphics/animation/animation-track/public.js +3 -0
- package/dist/graphics/animation/animation-track/public.js.map +1 -0
- package/dist/graphics/animation/animation-track/sample.d.ts +7 -0
- package/dist/graphics/animation/animation-track/sample.js +44 -0
- package/dist/graphics/animation/animation-track/sample.js.map +1 -0
- package/dist/graphics/animation/interpolation-mode/interpolation-mode.d.ts +4 -0
- package/dist/graphics/animation/interpolation-mode/interpolation-mode.js +3 -0
- package/dist/graphics/animation/interpolation-mode/interpolation-mode.js.map +1 -0
- package/dist/graphics/animation/interpolation-mode/public.d.ts +1 -0
- package/dist/graphics/animation/interpolation-mode/public.js +3 -0
- package/dist/graphics/animation/interpolation-mode/public.js.map +1 -0
- package/dist/graphics/animation/interpolation-mode/schema.d.ts +4 -0
- package/dist/graphics/animation/interpolation-mode/schema.js +3 -0
- package/dist/graphics/animation/interpolation-mode/schema.js.map +1 -0
- package/dist/graphics/camera/camera-plugin.d.ts +112 -0
- package/dist/graphics/camera/camera-plugin.js +36 -0
- package/dist/graphics/camera/camera-plugin.js.map +1 -0
- package/dist/graphics/camera/camera.d.ts +4 -0
- package/dist/graphics/camera/camera.js +3 -0
- package/dist/graphics/camera/camera.js.map +1 -0
- package/dist/graphics/camera/orbit/attach-orbit-drag.d.ts +31 -0
- package/dist/graphics/camera/orbit/attach-orbit-drag.js +44 -0
- package/dist/graphics/camera/orbit/attach-orbit-drag.js.map +1 -0
- package/dist/graphics/camera/orbit/orbit-data-plugin.d.ts +290 -0
- package/dist/graphics/camera/orbit/orbit-data-plugin.js +42 -0
- package/dist/graphics/camera/orbit/orbit-data-plugin.js.map +1 -0
- package/dist/graphics/camera/orbit/orbit-plugin.d.ts +281 -0
- package/dist/graphics/camera/orbit/orbit-plugin.js +12 -0
- package/dist/graphics/camera/orbit/orbit-plugin.js.map +1 -0
- package/dist/graphics/camera/orbit/orbit-system-plugin.d.ts +292 -0
- package/dist/graphics/camera/orbit/orbit-system-plugin.js +71 -0
- package/dist/graphics/camera/orbit/orbit-system-plugin.js.map +1 -0
- package/dist/graphics/camera/orbit/orbit.d.ts +32 -0
- package/dist/graphics/camera/orbit/orbit.js +3 -0
- package/dist/graphics/camera/orbit/orbit.js.map +1 -0
- package/dist/graphics/camera/orbit/public.d.ts +5 -0
- package/dist/graphics/camera/orbit/public.js +6 -0
- package/dist/graphics/camera/orbit/public.js.map +1 -0
- package/dist/graphics/camera/public.d.ts +4 -0
- package/dist/graphics/camera/public.js +6 -0
- package/dist/graphics/camera/public.js.map +1 -0
- package/dist/graphics/camera/schema.d.ts +65 -0
- package/dist/graphics/camera/schema.js +19 -0
- package/dist/graphics/camera/schema.js.map +1 -0
- package/dist/graphics/camera/screen-to-world-ray.d.ts +10 -0
- package/dist/graphics/camera/screen-to-world-ray.js +31 -0
- package/dist/graphics/camera/screen-to-world-ray.js.map +1 -0
- package/dist/graphics/camera/to-view-projection.d.ts +3 -0
- package/dist/graphics/camera/to-view-projection.js +23 -0
- package/dist/graphics/camera/to-view-projection.js.map +1 -0
- package/dist/graphics/graphics-plugin.d.ts +121 -0
- package/dist/graphics/graphics-plugin.js +106 -0
- package/dist/graphics/graphics-plugin.js.map +1 -0
- package/dist/graphics/picking/pick-hit.d.ts +10 -0
- package/dist/graphics/picking/pick-hit.js +3 -0
- package/dist/graphics/picking/pick-hit.js.map +1 -0
- package/dist/graphics/picking/picking-plugin.d.ts +3819 -0
- package/dist/graphics/picking/picking-plugin.js +88 -0
- package/dist/graphics/picking/picking-plugin.js.map +1 -0
- package/dist/graphics/rendering/bone-collider-plugin.d.ts +1619 -0
- package/dist/graphics/rendering/bone-collider-plugin.js +207 -0
- package/dist/graphics/rendering/bone-collider-plugin.js.map +1 -0
- package/dist/graphics/rendering/display-transform-plugin.d.ts +52 -0
- package/dist/graphics/rendering/display-transform-plugin.js +25 -0
- package/dist/graphics/rendering/display-transform-plugin.js.map +1 -0
- package/dist/graphics/rendering/ibl-render/brdf.wgsl.d.ts +2 -0
- package/dist/graphics/rendering/ibl-render/brdf.wgsl.js +42 -0
- package/dist/graphics/rendering/ibl-render/brdf.wgsl.js.map +1 -0
- package/dist/graphics/rendering/ibl-render/ibl/brdf-lut.d.ts +1 -0
- package/dist/graphics/rendering/ibl-render/ibl/brdf-lut.js +91 -0
- package/dist/graphics/rendering/ibl-render/ibl/brdf-lut.js.map +1 -0
- package/dist/graphics/rendering/ibl-render/ibl/build-ibl-resources.d.ts +24 -0
- package/dist/graphics/rendering/ibl-render/ibl/build-ibl-resources.js +34 -0
- package/dist/graphics/rendering/ibl-render/ibl/build-ibl-resources.js.map +1 -0
- package/dist/graphics/rendering/ibl-render/ibl/create-cubemap.d.ts +1 -0
- package/dist/graphics/rendering/ibl-render/ibl/create-cubemap.js +12 -0
- package/dist/graphics/rendering/ibl-render/ibl/create-cubemap.js.map +1 -0
- package/dist/graphics/rendering/ibl-render/ibl/cube-face-view.d.ts +1 -0
- package/dist/graphics/rendering/ibl-render/ibl/cube-face-view.js +11 -0
- package/dist/graphics/rendering/ibl-render/ibl/cube-face-view.js.map +1 -0
- package/dist/graphics/rendering/ibl-render/ibl/cubemap-sample-view.d.ts +1 -0
- package/dist/graphics/rendering/ibl-render/ibl/cubemap-sample-view.js +9 -0
- package/dist/graphics/rendering/ibl-render/ibl/cubemap-sample-view.js.map +1 -0
- package/dist/graphics/rendering/ibl-render/ibl/environment.d.ts +8 -0
- package/dist/graphics/rendering/ibl-render/ibl/environment.js +170 -0
- package/dist/graphics/rendering/ibl-render/ibl/environment.js.map +1 -0
- package/dist/graphics/rendering/ibl-render/ibl/float-to-half.d.ts +2 -0
- package/dist/graphics/rendering/ibl-render/ibl/float-to-half.js +32 -0
- package/dist/graphics/rendering/ibl-render/ibl/float-to-half.js.map +1 -0
- package/dist/graphics/rendering/ibl-render/ibl/ibl-math.wgsl.d.ts +2 -0
- package/dist/graphics/rendering/ibl-render/ibl/ibl-math.wgsl.js +59 -0
- package/dist/graphics/rendering/ibl-render/ibl/ibl-math.wgsl.js.map +1 -0
- package/dist/graphics/rendering/ibl-render/ibl/irradiance.d.ts +1 -0
- package/dist/graphics/rendering/ibl-render/ibl/irradiance.js +94 -0
- package/dist/graphics/rendering/ibl-render/ibl/irradiance.js.map +1 -0
- package/dist/graphics/rendering/ibl-render/ibl/parse-hdr.d.ts +6 -0
- package/dist/graphics/rendering/ibl-render/ibl/parse-hdr.js +106 -0
- package/dist/graphics/rendering/ibl-render/ibl/parse-hdr.js.map +1 -0
- package/dist/graphics/rendering/ibl-render/ibl/prefilter.d.ts +5 -0
- package/dist/graphics/rendering/ibl-render/ibl/prefilter.js +103 -0
- package/dist/graphics/rendering/ibl-render/ibl/prefilter.js.map +1 -0
- package/dist/graphics/rendering/ibl-render/ibl/render-helpers.d.ts +4 -0
- package/dist/graphics/rendering/ibl-render/ibl/render-helpers.js +16 -0
- package/dist/graphics/rendering/ibl-render/ibl/render-helpers.js.map +1 -0
- package/dist/graphics/rendering/ibl-render/ibl-render-plugin.d.ts +1028 -0
- package/dist/graphics/rendering/ibl-render/ibl-render-plugin.js +409 -0
- package/dist/graphics/rendering/ibl-render/ibl-render-plugin.js.map +1 -0
- package/dist/graphics/rendering/ibl-render/ibl-shader.wgsl.d.ts +8 -0
- package/dist/graphics/rendering/ibl-render/ibl-shader.wgsl.js +173 -0
- package/dist/graphics/rendering/ibl-render/ibl-shader.wgsl.js.map +1 -0
- package/dist/graphics/rendering/ibl-render/skybox-shader.wgsl.d.ts +2 -0
- package/dist/graphics/rendering/ibl-render/skybox-shader.wgsl.js +50 -0
- package/dist/graphics/rendering/ibl-render/skybox-shader.wgsl.js.map +1 -0
- package/dist/graphics/rendering/interpolation-plugin.d.ts +485 -0
- package/dist/graphics/rendering/interpolation-plugin.js +98 -0
- package/dist/graphics/rendering/interpolation-plugin.js.map +1 -0
- package/dist/graphics/rendering/interpolation.test.d.ts +1 -0
- package/dist/graphics/rendering/interpolation.test.js +38 -0
- package/dist/graphics/rendering/interpolation.test.js.map +1 -0
- package/dist/graphics/rendering/jolt-ragdoll-plugin.d.ts +1628 -0
- package/dist/graphics/rendering/jolt-ragdoll-plugin.js +218 -0
- package/dist/graphics/rendering/jolt-ragdoll-plugin.js.map +1 -0
- package/dist/graphics/rendering/material-gpu/material-arrays.d.ts +47 -0
- package/dist/graphics/rendering/material-gpu/material-arrays.js +83 -0
- package/dist/graphics/rendering/material-gpu/material-arrays.js.map +1 -0
- package/dist/graphics/rendering/material-gpu/material-bind-group.d.ts +9 -0
- package/dist/graphics/rendering/material-gpu/material-bind-group.js +52 -0
- package/dist/graphics/rendering/material-gpu/material-bind-group.js.map +1 -0
- package/dist/graphics/rendering/material-gpu/material-gpu-plugin.d.ts +259 -0
- package/dist/graphics/rendering/material-gpu/material-gpu-plugin.js +90 -0
- package/dist/graphics/rendering/material-gpu/material-gpu-plugin.js.map +1 -0
- package/dist/graphics/rendering/model-collider-plugin.d.ts +1232 -0
- package/dist/graphics/rendering/model-collider-plugin.js +81 -0
- package/dist/graphics/rendering/model-collider-plugin.js.map +1 -0
- package/dist/graphics/rendering/pbr-core-plugin.d.ts +75 -0
- package/dist/graphics/rendering/pbr-core-plugin.js +39 -0
- package/dist/graphics/rendering/pbr-core-plugin.js.map +1 -0
- package/dist/graphics/rendering/pbr-render/pbr-array-shader.wgsl.d.ts +10 -0
- package/dist/graphics/rendering/pbr-render/pbr-array-shader.wgsl.js +145 -0
- package/dist/graphics/rendering/pbr-render/pbr-array-shader.wgsl.js.map +1 -0
- package/dist/graphics/rendering/pbr-render/pbr-render-plugin.d.ts +1266 -0
- package/dist/graphics/rendering/pbr-render/pbr-render-plugin.js +254 -0
- package/dist/graphics/rendering/pbr-render/pbr-render-plugin.js.map +1 -0
- package/dist/graphics/rendering/pbr-render/physics-bridge-plugin.d.ts +1004 -0
- package/dist/graphics/rendering/pbr-render/physics-bridge-plugin.js +116 -0
- package/dist/graphics/rendering/pbr-render/physics-bridge-plugin.js.map +1 -0
- package/dist/graphics/rendering/ragdoll-trigger-plugin.d.ts +31 -0
- package/dist/graphics/rendering/ragdoll-trigger-plugin.js +20 -0
- package/dist/graphics/rendering/ragdoll-trigger-plugin.js.map +1 -0
- package/dist/graphics/rendering/rendering-plugin.d.ts +1 -0
- package/dist/graphics/rendering/rendering-plugin.js +3 -0
- package/dist/graphics/rendering/rendering-plugin.js.map +1 -0
- package/dist/graphics/rendering/skinning/skinning-attributes/layout.d.ts +2 -0
- package/dist/graphics/rendering/skinning/skinning-attributes/layout.js +18 -0
- package/dist/graphics/rendering/skinning/skinning-attributes/layout.js.map +1 -0
- package/dist/graphics/rendering/skinning/skinning-attributes/public.d.ts +1 -0
- package/dist/graphics/rendering/skinning/skinning-attributes/public.js +3 -0
- package/dist/graphics/rendering/skinning/skinning-attributes/public.js.map +1 -0
- package/dist/graphics/rendering/skinning/skinning-attributes/skinning-attributes.d.ts +1 -0
- package/dist/graphics/rendering/skinning/skinning-attributes/skinning-attributes.js +3 -0
- package/dist/graphics/rendering/skinning/skinning-attributes/skinning-attributes.js.map +1 -0
- package/dist/graphics/rendering/skinning/skinning-plugin.d.ts +1212 -0
- package/dist/graphics/rendering/skinning/skinning-plugin.js +207 -0
- package/dist/graphics/rendering/skinning/skinning-plugin.js.map +1 -0
- package/dist/graphics/rendering/standard-vertex/layout.d.ts +2 -0
- package/dist/graphics/rendering/standard-vertex/layout.js +16 -0
- package/dist/graphics/rendering/standard-vertex/layout.js.map +1 -0
- package/dist/graphics/rendering/standard-vertex/public.d.ts +2 -0
- package/dist/graphics/rendering/standard-vertex/public.js +4 -0
- package/dist/graphics/rendering/standard-vertex/public.js.map +1 -0
- package/dist/graphics/rendering/standard-vertex/schema.d.ts +52 -0
- package/dist/graphics/rendering/standard-vertex/schema.js +15 -0
- package/dist/graphics/rendering/standard-vertex/schema.js.map +1 -0
- package/dist/graphics/rendering/standard-vertex/standard-vertex.d.ts +4 -0
- package/dist/graphics/rendering/standard-vertex/standard-vertex.js +3 -0
- package/dist/graphics/rendering/standard-vertex/standard-vertex.js.map +1 -0
- package/dist/graphics/rendering/visible-material/color-material-options.d.ts +7 -0
- package/dist/graphics/rendering/visible-material/color-material-options.js +3 -0
- package/dist/graphics/rendering/visible-material/color-material-options.js.map +1 -0
- package/dist/graphics/rendering/visible-material/create-bind-group-layout.d.ts +8 -0
- package/dist/graphics/rendering/visible-material/create-bind-group-layout.js +35 -0
- package/dist/graphics/rendering/visible-material/create-bind-group-layout.js.map +1 -0
- package/dist/graphics/rendering/visible-material/create-color-bind-group.d.ts +10 -0
- package/dist/graphics/rendering/visible-material/create-color-bind-group.js +26 -0
- package/dist/graphics/rendering/visible-material/create-color-bind-group.js.map +1 -0
- package/dist/graphics/rendering/visible-material/public.d.ts +4 -0
- package/dist/graphics/rendering/visible-material/public.js +5 -0
- package/dist/graphics/rendering/visible-material/public.js.map +1 -0
- package/dist/graphics/rendering/visible-material/schema.d.ts +49 -0
- package/dist/graphics/rendering/visible-material/schema.js +23 -0
- package/dist/graphics/rendering/visible-material/schema.js.map +1 -0
- package/dist/graphics/rendering/visible-material/visible-material.d.ts +4 -0
- package/dist/graphics/rendering/visible-material/visible-material.js +3 -0
- package/dist/graphics/rendering/visible-material/visible-material.js.map +1 -0
- package/dist/graphics/scene/light/light-plugin.d.ts +30 -0
- package/dist/graphics/scene/light/light-plugin.js +35 -0
- package/dist/graphics/scene/light/light-plugin.js.map +1 -0
- package/dist/graphics/scene/light/light.d.ts +14 -0
- package/dist/graphics/scene/light/light.js +3 -0
- package/dist/graphics/scene/light/light.js.map +1 -0
- package/dist/graphics/scene/light/public.d.ts +1 -0
- package/dist/graphics/scene/light/public.js +2 -0
- package/dist/graphics/scene/light/public.js.map +1 -0
- package/dist/graphics/scene/model/geometry/geometry.d.ts +9 -0
- package/dist/graphics/scene/model/geometry/geometry.js +3 -0
- package/dist/graphics/scene/model/geometry/geometry.js.map +1 -0
- package/dist/graphics/scene/model/geometry/public.d.ts +1 -0
- package/dist/graphics/scene/model/geometry/public.js +3 -0
- package/dist/graphics/scene/model/geometry/public.js.map +1 -0
- package/dist/graphics/scene/model/gltf/accessor-view.d.ts +9 -0
- package/dist/graphics/scene/model/gltf/accessor-view.js +44 -0
- package/dist/graphics/scene/model/gltf/accessor-view.js.map +1 -0
- package/dist/graphics/scene/model/gltf/build-material-bind-group.d.ts +22 -0
- package/dist/graphics/scene/model/gltf/build-material-bind-group.js +75 -0
- package/dist/graphics/scene/model/gltf/build-material-bind-group.js.map +1 -0
- package/dist/graphics/scene/model/gltf/compute-world-matrices.d.ts +7 -0
- package/dist/graphics/scene/model/gltf/compute-world-matrices.js +38 -0
- package/dist/graphics/scene/model/gltf/compute-world-matrices.js.map +1 -0
- package/dist/graphics/scene/model/gltf/create-color-material.d.ts +3 -0
- package/dist/graphics/scene/model/gltf/create-color-material.js +34 -0
- package/dist/graphics/scene/model/gltf/create-color-material.js.map +1 -0
- package/dist/graphics/scene/model/gltf/decode-images.d.ts +12 -0
- package/dist/graphics/scene/model/gltf/decode-images.js +68 -0
- package/dist/graphics/scene/model/gltf/decode-images.js.map +1 -0
- package/dist/graphics/scene/model/gltf/gltf-schema.d.ts +152 -0
- package/dist/graphics/scene/model/gltf/gltf-schema.js +20 -0
- package/dist/graphics/scene/model/gltf/gltf-schema.js.map +1 -0
- package/dist/graphics/scene/model/gltf/load-gltf-model.d.ts +42 -0
- package/dist/graphics/scene/model/gltf/load-gltf-model.js +175 -0
- package/dist/graphics/scene/model/gltf/load-gltf-model.js.map +1 -0
- package/dist/graphics/scene/model/gltf/pack-vertex-buffer.d.ts +21 -0
- package/dist/graphics/scene/model/gltf/pack-vertex-buffer.js +106 -0
- package/dist/graphics/scene/model/gltf/pack-vertex-buffer.js.map +1 -0
- package/dist/graphics/scene/model/gltf/parse-animations.d.ts +18 -0
- package/dist/graphics/scene/model/gltf/parse-animations.js +51 -0
- package/dist/graphics/scene/model/gltf/parse-animations.js.map +1 -0
- package/dist/graphics/scene/model/gltf/parse-glb.d.ts +6 -0
- package/dist/graphics/scene/model/gltf/parse-glb.js +40 -0
- package/dist/graphics/scene/model/gltf/parse-glb.js.map +1 -0
- package/dist/graphics/scene/model/gltf/parse-skin.d.ts +19 -0
- package/dist/graphics/scene/model/gltf/parse-skin.js +43 -0
- package/dist/graphics/scene/model/gltf/parse-skin.js.map +1 -0
- package/dist/graphics/scene/model/model-loader-plugin.d.ts +922 -0
- package/dist/graphics/scene/model/model-loader-plugin.js +120 -0
- package/dist/graphics/scene/model/model-loader-plugin.js.map +1 -0
- package/dist/graphics/scene/model/model-plugin.d.ts +352 -0
- package/dist/graphics/scene/model/model-plugin.js +39 -0
- package/dist/graphics/scene/model/model-plugin.js.map +1 -0
- package/dist/graphics/scene/model/model.d.ts +11 -0
- package/dist/graphics/scene/model/model.js +3 -0
- package/dist/graphics/scene/model/model.js.map +1 -0
- package/dist/graphics/scene/model/public.d.ts +1 -0
- package/dist/graphics/scene/model/public.js +2 -0
- package/dist/graphics/scene/model/public.js.map +1 -0
- package/dist/graphics/scene/model/shape/convex-hull.d.ts +36 -0
- package/dist/graphics/scene/model/shape/convex-hull.js +152 -0
- package/dist/graphics/scene/model/shape/convex-hull.js.map +1 -0
- package/dist/graphics/scene/model/shape/convex-hull.test.d.ts +1 -0
- package/dist/graphics/scene/model/shape/convex-hull.test.js +78 -0
- package/dist/graphics/scene/model/shape/convex-hull.test.js.map +1 -0
- package/dist/graphics/scene/model/shape/shape-geometry-plugin.d.ts +631 -0
- package/dist/graphics/scene/model/shape/shape-geometry-plugin.js +61 -0
- package/dist/graphics/scene/model/shape/shape-geometry-plugin.js.map +1 -0
- package/dist/graphics/scene/model/shape/shape-mesh.d.ts +34 -0
- package/dist/graphics/scene/model/shape/shape-mesh.js +142 -0
- package/dist/graphics/scene/model/shape/shape-mesh.js.map +1 -0
- package/dist/graphics/scene/model/shape/upload-shape-mesh.d.ts +9 -0
- package/dist/graphics/scene/model/shape/upload-shape-mesh.js +12 -0
- package/dist/graphics/scene/model/shape/upload-shape-mesh.js.map +1 -0
- package/dist/graphics/scene/model/world-bounds-plugin.d.ts +909 -0
- package/dist/graphics/scene/model/world-bounds-plugin.js +93 -0
- package/dist/graphics/scene/model/world-bounds-plugin.js.map +1 -0
- package/dist/graphics/scene/node/node-data-plugin.d.ts +113 -0
- package/dist/graphics/scene/node/node-data-plugin.js +27 -0
- package/dist/graphics/scene/node/node-data-plugin.js.map +1 -0
- package/dist/graphics/scene/node/node-plugin.d.ts +102 -0
- package/dist/graphics/scene/node/node-plugin.js +12 -0
- package/dist/graphics/scene/node/node-plugin.js.map +1 -0
- package/dist/graphics/scene/node/node.d.ts +19 -0
- package/dist/graphics/scene/node/node.js +3 -0
- package/dist/graphics/scene/node/node.js.map +1 -0
- package/dist/graphics/scene/node/public.d.ts +1 -0
- package/dist/graphics/scene/node/public.js +2 -0
- package/dist/graphics/scene/node/public.js.map +1 -0
- package/dist/graphics/scene/node/transform-plugin.d.ts +123 -0
- package/dist/graphics/scene/node/transform-plugin.js +65 -0
- package/dist/graphics/scene/node/transform-plugin.js.map +1 -0
- package/dist/graphics/scene/scene-plugin.d.ts +461 -0
- package/dist/graphics/scene/scene-plugin.js +19 -0
- package/dist/graphics/scene/scene-plugin.js.map +1 -0
- package/dist/graphics/scene/scene-uniforms/create-bind-group-layout.d.ts +7 -0
- package/dist/graphics/scene/scene-uniforms/create-bind-group-layout.js +19 -0
- package/dist/graphics/scene/scene-uniforms/create-bind-group-layout.js.map +1 -0
- package/dist/graphics/scene/scene-uniforms/public.d.ts +3 -0
- package/dist/graphics/scene/scene-uniforms/public.js +5 -0
- package/dist/graphics/scene/scene-uniforms/public.js.map +1 -0
- package/dist/graphics/scene/scene-uniforms/scene-uniforms-plugin.d.ts +137 -0
- package/dist/graphics/scene/scene-uniforms/scene-uniforms-plugin.js +59 -0
- package/dist/graphics/scene/scene-uniforms/scene-uniforms-plugin.js.map +1 -0
- package/dist/graphics/scene/scene-uniforms/scene-uniforms.d.ts +11 -0
- package/dist/graphics/scene/scene-uniforms/scene-uniforms.js +3 -0
- package/dist/graphics/scene/scene-uniforms/scene-uniforms.js.map +1 -0
- package/dist/graphics/scene/scene-uniforms/schema.d.ts +56 -0
- package/dist/graphics/scene/scene-uniforms/schema.js +15 -0
- package/dist/graphics/scene/scene-uniforms/schema.js.map +1 -0
- package/dist/index.d.ts +53 -0
- package/dist/index.js +56 -0
- package/dist/index.js.map +1 -0
- package/dist/material/material-plugin.d.ts +221 -0
- package/dist/material/material-plugin.js +60 -0
- package/dist/material/material-plugin.js.map +1 -0
- package/dist/material/material.d.ts +31 -0
- package/dist/material/material.js +3 -0
- package/dist/material/material.js.map +1 -0
- package/dist/material/public.d.ts +2 -0
- package/dist/material/public.js +4 -0
- package/dist/material/public.js.map +1 -0
- package/dist/material/standard-materials.d.ts +3 -0
- package/dist/material/standard-materials.js +35 -0
- package/dist/material/standard-materials.js.map +1 -0
- package/dist/physics/body/body-type/body-type.d.ts +10 -0
- package/dist/physics/body/body-type/body-type.js +3 -0
- package/dist/physics/body/body-type/body-type.js.map +1 -0
- package/dist/physics/body/body-type/is-dynamic.d.ts +3 -0
- package/dist/physics/body/body-type/is-dynamic.js +6 -0
- package/dist/physics/body/body-type/is-dynamic.js.map +1 -0
- package/dist/physics/body/body-type/public.d.ts +2 -0
- package/dist/physics/body/body-type/public.js +4 -0
- package/dist/physics/body/body-type/public.js.map +1 -0
- package/dist/physics/body/body-type/schema.d.ts +4 -0
- package/dist/physics/body/body-type/schema.js +3 -0
- package/dist/physics/body/body-type/schema.js.map +1 -0
- package/dist/physics/body/collider-mesh.d.ts +11 -0
- package/dist/physics/body/collider-mesh.js +3 -0
- package/dist/physics/body/collider-mesh.js.map +1 -0
- package/dist/physics/body/collider-shape/collider-shape.d.ts +15 -0
- package/dist/physics/body/collider-shape/collider-shape.js +3 -0
- package/dist/physics/body/collider-shape/collider-shape.js.map +1 -0
- package/dist/physics/body/collider-shape/list.d.ts +3 -0
- package/dist/physics/body/collider-shape/list.js +5 -0
- package/dist/physics/body/collider-shape/list.js.map +1 -0
- package/dist/physics/body/collider-shape/mass-properties.d.ts +10 -0
- package/dist/physics/body/collider-shape/mass-properties.js +48 -0
- package/dist/physics/body/collider-shape/mass-properties.js.map +1 -0
- package/dist/physics/body/collider-shape/public.d.ts +4 -0
- package/dist/physics/body/collider-shape/public.js +6 -0
- package/dist/physics/body/collider-shape/public.js.map +1 -0
- package/dist/physics/body/collider-shape/schema.d.ts +4 -0
- package/dist/physics/body/collider-shape/schema.js +3 -0
- package/dist/physics/body/collider-shape/schema.js.map +1 -0
- package/dist/physics/body/collider-shape/to-index.d.ts +3 -0
- package/dist/physics/body/collider-shape/to-index.js +6 -0
- package/dist/physics/body/collider-shape/to-index.js.map +1 -0
- package/dist/physics/body/rigid-body.d.ts +23 -0
- package/dist/physics/body/rigid-body.js +3 -0
- package/dist/physics/body/rigid-body.js.map +1 -0
- package/dist/physics/body/static-collider.d.ts +25 -0
- package/dist/physics/body/static-collider.js +3 -0
- package/dist/physics/body/static-collider.js.map +1 -0
- package/dist/physics/joint/joint-plugin.d.ts +88 -0
- package/dist/physics/joint/joint-plugin.js +32 -0
- package/dist/physics/joint/joint-plugin.js.map +1 -0
- package/dist/physics/joint/joint-type/joint-type.d.ts +15 -0
- package/dist/physics/joint/joint-type/joint-type.js +3 -0
- package/dist/physics/joint/joint-type/joint-type.js.map +1 -0
- package/dist/physics/joint/joint-type/public.d.ts +1 -0
- package/dist/physics/joint/joint-type/public.js +3 -0
- package/dist/physics/joint/joint-type/public.js.map +1 -0
- package/dist/physics/joint/joint-type/schema.d.ts +4 -0
- package/dist/physics/joint/joint-type/schema.js +3 -0
- package/dist/physics/joint/joint-type/schema.js.map +1 -0
- package/dist/physics/joint/joint.d.ts +24 -0
- package/dist/physics/joint/joint.js +3 -0
- package/dist/physics/joint/joint.js.map +1 -0
- package/dist/physics/physics-clock-plugin.d.ts +86 -0
- package/dist/physics/physics-clock-plugin.js +37 -0
- package/dist/physics/physics-clock-plugin.js.map +1 -0
- package/dist/physics/physics-clock.test.d.ts +1 -0
- package/dist/physics/physics-clock.test.js +45 -0
- package/dist/physics/physics-clock.test.js.map +1 -0
- package/dist/physics/physics-data-plugin.d.ts +348 -0
- package/dist/physics/physics-data-plugin.js +71 -0
- package/dist/physics/physics-data-plugin.js.map +1 -0
- package/dist/physics/ragdoll/fit-bone-capsules.d.ts +39 -0
- package/dist/physics/ragdoll/fit-bone-capsules.js +87 -0
- package/dist/physics/ragdoll/fit-bone-capsules.js.map +1 -0
- package/dist/physics/ragdoll/fit-bone-capsules.test.d.ts +1 -0
- package/dist/physics/ragdoll/fit-bone-capsules.test.js +67 -0
- package/dist/physics/ragdoll/fit-bone-capsules.test.js.map +1 -0
- package/dist/physics/solvers/jolt-solver-plugin.d.ts +465 -0
- package/dist/physics/solvers/jolt-solver-plugin.js +440 -0
- package/dist/physics/solvers/jolt-solver-plugin.js.map +1 -0
- package/dist/physics/solvers/rapier-jolt.benchmark.test.d.ts +1 -0
- package/dist/physics/solvers/rapier-jolt.benchmark.test.js +35 -0
- package/dist/physics/solvers/rapier-jolt.benchmark.test.js.map +1 -0
- package/dist/physics/solvers/rapier-solver-plugin.d.ts +444 -0
- package/dist/physics/solvers/rapier-solver-plugin.js +284 -0
- package/dist/physics/solvers/rapier-solver-plugin.js.map +1 -0
- package/dist/physics/solvers/solver-benchmark.d.ts +45 -0
- package/dist/physics/solvers/solver-benchmark.js +115 -0
- package/dist/physics/solvers/solver-benchmark.js.map +1 -0
- package/package.json +34 -0
- package/src/core/core-plugin.ts +92 -0
- package/src/core/frame-time/frame-time-plugin.ts +44 -0
- package/src/core/frame-time/frame-time.ts +21 -0
- package/src/core/frame-time/public.ts +3 -0
- package/src/graphics/animation/animation-data-plugin.ts +119 -0
- package/src/graphics/animation/animation-plugin.test.ts +161 -0
- package/src/graphics/animation/animation-plugin.ts +26 -0
- package/src/graphics/animation/animation-track/animation-track.ts +17 -0
- package/src/graphics/animation/animation-track/componentwise-lerp.ts +24 -0
- package/src/graphics/animation/animation-track/interpolate.ts +24 -0
- package/src/graphics/animation/animation-track/public.ts +3 -0
- package/src/graphics/animation/animation-track/sample.ts +48 -0
- package/src/graphics/animation/interpolation-mode/interpolation-mode.ts +8 -0
- package/src/graphics/animation/interpolation-mode/public.ts +3 -0
- package/src/graphics/animation/interpolation-mode/schema.ts +5 -0
- package/src/graphics/camera/camera-plugin.ts +37 -0
- package/src/graphics/camera/camera.ts +8 -0
- package/src/graphics/camera/orbit/attach-orbit-drag.ts +62 -0
- package/src/graphics/camera/orbit/orbit-data-plugin.ts +44 -0
- package/src/graphics/camera/orbit/orbit-plugin.ts +13 -0
- package/src/graphics/camera/orbit/orbit-system-plugin.ts +74 -0
- package/src/graphics/camera/orbit/orbit.ts +36 -0
- package/src/graphics/camera/orbit/public.ts +7 -0
- package/src/graphics/camera/public.ts +6 -0
- package/src/graphics/camera/schema.ts +21 -0
- package/src/graphics/camera/screen-to-world-ray.ts +47 -0
- package/src/graphics/camera/to-view-projection.ts +29 -0
- package/src/graphics/graphics-plugin.ts +108 -0
- package/src/graphics/picking/pick-hit.ts +13 -0
- package/src/graphics/picking/picking-plugin.ts +101 -0
- package/src/graphics/plugins.md +120 -0
- package/src/graphics/rendering/bone-collider-plugin.ts +182 -0
- package/src/graphics/rendering/display-transform-plugin.ts +26 -0
- package/src/graphics/rendering/ibl-render/brdf.wgsl.ts +43 -0
- package/src/graphics/rendering/ibl-render/ibl/brdf-lut.ts +101 -0
- package/src/graphics/rendering/ibl-render/ibl/build-ibl-resources.ts +57 -0
- package/src/graphics/rendering/ibl-render/ibl/create-cubemap.ts +17 -0
- package/src/graphics/rendering/ibl-render/ibl/cube-face-view.ts +11 -0
- package/src/graphics/rendering/ibl-render/ibl/cubemap-sample-view.ts +9 -0
- package/src/graphics/rendering/ibl-render/ibl/environment.ts +190 -0
- package/src/graphics/rendering/ibl-render/ibl/float-to-half.ts +35 -0
- package/src/graphics/rendering/ibl-render/ibl/ibl-math.wgsl.ts +60 -0
- package/src/graphics/rendering/ibl-render/ibl/irradiance.ts +105 -0
- package/src/graphics/rendering/ibl-render/ibl/parse-hdr.ts +108 -0
- package/src/graphics/rendering/ibl-render/ibl/prefilter.ts +121 -0
- package/src/graphics/rendering/ibl-render/ibl/render-helpers.ts +17 -0
- package/src/graphics/rendering/ibl-render/ibl-render-plugin.ts +415 -0
- package/src/graphics/rendering/ibl-render/ibl-shader.wgsl.ts +185 -0
- package/src/graphics/rendering/ibl-render/skybox-shader.wgsl.ts +51 -0
- package/src/graphics/rendering/interpolation-plugin.ts +97 -0
- package/src/graphics/rendering/interpolation.test.ts +52 -0
- package/src/graphics/rendering/jolt-ragdoll-plugin.ts +174 -0
- package/src/graphics/rendering/material-gpu/material-arrays.ts +113 -0
- package/src/graphics/rendering/material-gpu/material-bind-group.ts +61 -0
- package/src/graphics/rendering/material-gpu/material-gpu-plugin.ts +95 -0
- package/src/graphics/rendering/model-collider-plugin.ts +77 -0
- package/src/graphics/rendering/pbr-core-plugin.ts +40 -0
- package/src/graphics/rendering/pbr-render/pbr-array-shader.wgsl.ts +146 -0
- package/src/graphics/rendering/pbr-render/pbr-render-plugin.ts +247 -0
- package/src/graphics/rendering/pbr-render/physics-bridge-plugin.ts +106 -0
- package/src/graphics/rendering/ragdoll-trigger-plugin.ts +21 -0
- package/src/graphics/rendering/rendering-plugin.ts +3 -0
- package/src/graphics/rendering/skinning/skinning-attributes/layout.ts +20 -0
- package/src/graphics/rendering/skinning/skinning-attributes/public.ts +3 -0
- package/src/graphics/rendering/skinning/skinning-attributes/skinning-attributes.ts +3 -0
- package/src/graphics/rendering/skinning/skinning-plugin.ts +213 -0
- package/src/graphics/rendering/standard-vertex/layout.ts +19 -0
- package/src/graphics/rendering/standard-vertex/public.ts +4 -0
- package/src/graphics/rendering/standard-vertex/schema.ts +17 -0
- package/src/graphics/rendering/standard-vertex/standard-vertex.ts +8 -0
- package/src/graphics/rendering/visible-material/color-material-options.ts +10 -0
- package/src/graphics/rendering/visible-material/create-bind-group-layout.ts +35 -0
- package/src/graphics/rendering/visible-material/create-color-bind-group.ts +40 -0
- package/src/graphics/rendering/visible-material/public.ts +6 -0
- package/src/graphics/rendering/visible-material/schema.ts +25 -0
- package/src/graphics/rendering/visible-material/visible-material.ts +8 -0
- package/src/graphics/scene/light/light-plugin.ts +37 -0
- package/src/graphics/scene/light/light.ts +18 -0
- package/src/graphics/scene/light/public.ts +1 -0
- package/src/graphics/scene/model/geometry/geometry.ts +12 -0
- package/src/graphics/scene/model/geometry/public.ts +4 -0
- package/src/graphics/scene/model/gltf/accessor-view.ts +53 -0
- package/src/graphics/scene/model/gltf/build-material-bind-group.ts +110 -0
- package/src/graphics/scene/model/gltf/compute-world-matrices.ts +43 -0
- package/src/graphics/scene/model/gltf/create-color-material.ts +47 -0
- package/src/graphics/scene/model/gltf/decode-images.ts +93 -0
- package/src/graphics/scene/model/gltf/gltf-schema.ts +161 -0
- package/src/graphics/scene/model/gltf/load-gltf-model.ts +220 -0
- package/src/graphics/scene/model/gltf/pack-vertex-buffer.ts +116 -0
- package/src/graphics/scene/model/gltf/parse-animations.ts +66 -0
- package/src/graphics/scene/model/gltf/parse-glb.ts +51 -0
- package/src/graphics/scene/model/gltf/parse-skin.ts +67 -0
- package/src/graphics/scene/model/model-loader-plugin.ts +131 -0
- package/src/graphics/scene/model/model-plugin.ts +46 -0
- package/src/graphics/scene/model/model.ts +15 -0
- package/src/graphics/scene/model/public.ts +1 -0
- package/src/graphics/scene/model/shape/convex-hull.test.ts +72 -0
- package/src/graphics/scene/model/shape/convex-hull.ts +141 -0
- package/src/graphics/scene/model/shape/shape-geometry-plugin.ts +61 -0
- package/src/graphics/scene/model/shape/shape-mesh.ts +150 -0
- package/src/graphics/scene/model/shape/upload-shape-mesh.ts +14 -0
- package/src/graphics/scene/model/world-bounds-plugin.ts +88 -0
- package/src/graphics/scene/node/node-data-plugin.ts +28 -0
- package/src/graphics/scene/node/node-plugin.ts +13 -0
- package/src/graphics/scene/node/node.ts +23 -0
- package/src/graphics/scene/node/public.ts +1 -0
- package/src/graphics/scene/node/transform-plugin.ts +72 -0
- package/src/graphics/scene/scene-plugin.ts +20 -0
- package/src/graphics/scene/scene-uniforms/create-bind-group-layout.ts +19 -0
- package/src/graphics/scene/scene-uniforms/public.ts +5 -0
- package/src/graphics/scene/scene-uniforms/scene-uniforms-plugin.ts +64 -0
- package/src/graphics/scene/scene-uniforms/scene-uniforms.ts +15 -0
- package/src/graphics/scene/scene-uniforms/schema.ts +17 -0
- package/src/index.ts +72 -0
- package/src/material/material-plugin.ts +61 -0
- package/src/material/material.ts +38 -0
- package/src/material/public.ts +4 -0
- package/src/material/standard-materials.ts +43 -0
- package/src/physics/README.md +71 -0
- package/src/physics/body/body-type/body-type.ts +14 -0
- package/src/physics/body/body-type/is-dynamic.ts +8 -0
- package/src/physics/body/body-type/public.ts +4 -0
- package/src/physics/body/body-type/schema.ts +5 -0
- package/src/physics/body/collider-mesh.ts +13 -0
- package/src/physics/body/collider-shape/collider-shape.ts +19 -0
- package/src/physics/body/collider-shape/list.ts +7 -0
- package/src/physics/body/collider-shape/mass-properties.ts +47 -0
- package/src/physics/body/collider-shape/public.ts +6 -0
- package/src/physics/body/collider-shape/schema.ts +5 -0
- package/src/physics/body/collider-shape/to-index.ts +8 -0
- package/src/physics/body/rigid-body.ts +26 -0
- package/src/physics/body/static-collider.ts +28 -0
- package/src/physics/joint/joint-plugin.ts +33 -0
- package/src/physics/joint/joint-type/joint-type.ts +19 -0
- package/src/physics/joint/joint-type/public.ts +3 -0
- package/src/physics/joint/joint-type/schema.ts +5 -0
- package/src/physics/joint/joint.ts +27 -0
- package/src/physics/physics-clock-plugin.ts +61 -0
- package/src/physics/physics-clock.test.ts +55 -0
- package/src/physics/physics-data-plugin.ts +73 -0
- package/src/physics/ragdoll/fit-bone-capsules.test.ts +66 -0
- package/src/physics/ragdoll/fit-bone-capsules.ts +106 -0
- package/src/physics/solvers/README.md +63 -0
- package/src/physics/solvers/jolt-solver-plugin.ts +382 -0
- package/src/physics/solvers/rapier-jolt.benchmark.test.ts +39 -0
- package/src/physics/solvers/rapier-solver-plugin.ts +251 -0
- package/src/physics/solvers/solver-benchmark.ts +172 -0
- package/tsconfig.json +25 -0
- package/tsconfig.tsbuildinfo +1 -0
|
@@ -0,0 +1,110 @@
|
|
|
1
|
+
// © 2026 Adobe. MIT License. See /LICENSE for details.
|
|
2
|
+
|
|
3
|
+
import { createStructBuffer, copyToGPUBuffer, getStructLayout, type TypedBuffer } from "@adobe/data/typed-buffer";
|
|
4
|
+
import { schema as visibleMaterialSchema } from "../../../rendering/visible-material/schema.js";
|
|
5
|
+
import type { VisibleMaterial } from "../../../rendering/visible-material/visible-material.js";
|
|
6
|
+
import type { GltfAsset, GltfMaterial } from "./gltf-schema.js";
|
|
7
|
+
|
|
8
|
+
const layout = getStructLayout(visibleMaterialSchema);
|
|
9
|
+
|
|
10
|
+
export interface MaterialTextures {
|
|
11
|
+
baseColor: GPUTextureView;
|
|
12
|
+
metallicRoughness: GPUTextureView;
|
|
13
|
+
normal: GPUTextureView;
|
|
14
|
+
occlusion: GPUTextureView;
|
|
15
|
+
emissive: GPUTextureView;
|
|
16
|
+
}
|
|
17
|
+
|
|
18
|
+
export interface FallbackViews {
|
|
19
|
+
white: GPUTextureView;
|
|
20
|
+
black: GPUTextureView;
|
|
21
|
+
flatNormal: GPUTextureView;
|
|
22
|
+
}
|
|
23
|
+
|
|
24
|
+
function defaultMaterial(): VisibleMaterial {
|
|
25
|
+
return {
|
|
26
|
+
baseColorFactor: [1, 1, 1, 1],
|
|
27
|
+
emissiveFactor: [0, 0, 0],
|
|
28
|
+
metallicFactor: 1,
|
|
29
|
+
roughnessFactor: 1,
|
|
30
|
+
normalScale: 1,
|
|
31
|
+
occlusionStrength: 1,
|
|
32
|
+
};
|
|
33
|
+
}
|
|
34
|
+
|
|
35
|
+
function gltfToVisibleMaterial(m: GltfMaterial): VisibleMaterial {
|
|
36
|
+
const pbr = m.pbrMetallicRoughness;
|
|
37
|
+
return {
|
|
38
|
+
baseColorFactor: pbr?.baseColorFactor ?? [1, 1, 1, 1],
|
|
39
|
+
emissiveFactor: m.emissiveFactor ?? [0, 0, 0],
|
|
40
|
+
metallicFactor: pbr?.metallicFactor ?? 1,
|
|
41
|
+
roughnessFactor: pbr?.roughnessFactor ?? 1,
|
|
42
|
+
normalScale: m.normalTexture?.scale ?? 1,
|
|
43
|
+
occlusionStrength: m.occlusionTexture?.strength ?? 1,
|
|
44
|
+
};
|
|
45
|
+
}
|
|
46
|
+
|
|
47
|
+
function viewFor(
|
|
48
|
+
textures: GPUTexture[],
|
|
49
|
+
gltf: GltfAsset,
|
|
50
|
+
textureIndex: number | undefined,
|
|
51
|
+
fallback: GPUTextureView,
|
|
52
|
+
): GPUTextureView {
|
|
53
|
+
if (textureIndex === undefined) return fallback;
|
|
54
|
+
const tex = gltf.textures?.[textureIndex];
|
|
55
|
+
if (!tex || tex.source === undefined) return fallback;
|
|
56
|
+
const gpuTexture = textures[tex.source];
|
|
57
|
+
if (!gpuTexture) return fallback;
|
|
58
|
+
return gpuTexture.createView();
|
|
59
|
+
}
|
|
60
|
+
|
|
61
|
+
/**
|
|
62
|
+
* Builds the per-primitive material bind group: a small uniform buffer holding
|
|
63
|
+
* the PBR factors plus the five sampled textures and a shared sampler.
|
|
64
|
+
*
|
|
65
|
+
* Missing textures fall back to neutral 1x1 textures so the shader always has
|
|
66
|
+
* a valid binding (white for baseColor/occlusion, black for emissive, flat
|
|
67
|
+
* (0.5, 0.5, 1) for the normal map).
|
|
68
|
+
*/
|
|
69
|
+
export function buildMaterialBindGroup(
|
|
70
|
+
device: GPUDevice,
|
|
71
|
+
gltf: GltfAsset,
|
|
72
|
+
sourceTextures: GPUTexture[],
|
|
73
|
+
fallback: FallbackViews,
|
|
74
|
+
sampler: GPUSampler,
|
|
75
|
+
layoutGpu: GPUBindGroupLayout,
|
|
76
|
+
materialIndex: number | undefined,
|
|
77
|
+
): GPUBindGroup {
|
|
78
|
+
const material = materialIndex !== undefined && gltf.materials?.[materialIndex]
|
|
79
|
+
? gltfToVisibleMaterial(gltf.materials[materialIndex])
|
|
80
|
+
: defaultMaterial();
|
|
81
|
+
const gltfMat = materialIndex !== undefined ? gltf.materials?.[materialIndex] : undefined;
|
|
82
|
+
|
|
83
|
+
const structBuffer: TypedBuffer<VisibleMaterial> = createStructBuffer(visibleMaterialSchema, layout.size);
|
|
84
|
+
structBuffer.set(0, material);
|
|
85
|
+
|
|
86
|
+
let uniformBuffer = device.createBuffer({
|
|
87
|
+
size: layout.size,
|
|
88
|
+
usage: GPUBufferUsage.UNIFORM | GPUBufferUsage.COPY_DST,
|
|
89
|
+
});
|
|
90
|
+
uniformBuffer = copyToGPUBuffer(structBuffer, device, uniformBuffer);
|
|
91
|
+
|
|
92
|
+
const baseColorView = viewFor(sourceTextures, gltf, gltfMat?.pbrMetallicRoughness?.baseColorTexture?.index, fallback.white);
|
|
93
|
+
const mrView = viewFor(sourceTextures, gltf, gltfMat?.pbrMetallicRoughness?.metallicRoughnessTexture?.index, fallback.white);
|
|
94
|
+
const normalView = viewFor(sourceTextures, gltf, gltfMat?.normalTexture?.index, fallback.flatNormal);
|
|
95
|
+
const occlusionView = viewFor(sourceTextures, gltf, gltfMat?.occlusionTexture?.index, fallback.white);
|
|
96
|
+
const emissiveView = viewFor(sourceTextures, gltf, gltfMat?.emissiveTexture?.index, fallback.black);
|
|
97
|
+
|
|
98
|
+
return device.createBindGroup({
|
|
99
|
+
layout: layoutGpu,
|
|
100
|
+
entries: [
|
|
101
|
+
{ binding: 0, resource: { buffer: uniformBuffer } },
|
|
102
|
+
{ binding: 1, resource: baseColorView },
|
|
103
|
+
{ binding: 2, resource: mrView },
|
|
104
|
+
{ binding: 3, resource: normalView },
|
|
105
|
+
{ binding: 4, resource: occlusionView },
|
|
106
|
+
{ binding: 5, resource: emissiveView },
|
|
107
|
+
{ binding: 6, resource: sampler },
|
|
108
|
+
],
|
|
109
|
+
});
|
|
110
|
+
}
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
// © 2026 Adobe. MIT License. See /LICENSE for details.
|
|
2
|
+
|
|
3
|
+
import { Mat4x4, Quat } from "@adobe/data/math";
|
|
4
|
+
import type { GltfAsset, GltfNode } from "./gltf-schema.js";
|
|
5
|
+
|
|
6
|
+
function localMatrix(node: GltfNode): Mat4x4 {
|
|
7
|
+
if (node.matrix && node.matrix.length === 16) {
|
|
8
|
+
// glTF spec guarantees a column-major 16-element float array when present.
|
|
9
|
+
return node.matrix as unknown as Mat4x4;
|
|
10
|
+
}
|
|
11
|
+
const t = node.translation ?? [0, 0, 0];
|
|
12
|
+
const r = node.rotation ?? [0, 0, 0, 1];
|
|
13
|
+
const s = node.scale ?? [1, 1, 1];
|
|
14
|
+
const T = Mat4x4.translation(t[0], t[1], t[2]);
|
|
15
|
+
// glTF rotation is a unit quaternion [x, y, z, w].
|
|
16
|
+
const R = Quat.toMat4(r as Quat);
|
|
17
|
+
const S = Mat4x4.scaling(s[0], s[1], s[2]);
|
|
18
|
+
return Mat4x4.multiply(Mat4x4.multiply(T, R), S);
|
|
19
|
+
}
|
|
20
|
+
|
|
21
|
+
/**
|
|
22
|
+
* Walks the scene graph and returns a world matrix for every node index.
|
|
23
|
+
* Nodes not reachable from a scene root get the identity matrix.
|
|
24
|
+
*/
|
|
25
|
+
export function computeWorldMatrices(gltf: GltfAsset): Mat4x4[] {
|
|
26
|
+
const result: Mat4x4[] = new Array((gltf.nodes ?? []).length).fill(Mat4x4.identity);
|
|
27
|
+
|
|
28
|
+
const visit = (nodeIdx: number, parent: Mat4x4): void => {
|
|
29
|
+
const node = gltf.nodes![nodeIdx];
|
|
30
|
+
const world = Mat4x4.multiply(parent, localMatrix(node));
|
|
31
|
+
result[nodeIdx] = world;
|
|
32
|
+
for (const child of node.children ?? []) {
|
|
33
|
+
visit(child, world);
|
|
34
|
+
}
|
|
35
|
+
};
|
|
36
|
+
|
|
37
|
+
const sceneIdx = gltf.scene ?? 0;
|
|
38
|
+
const roots = gltf.scenes?.[sceneIdx]?.nodes ?? [];
|
|
39
|
+
for (const r of roots) {
|
|
40
|
+
visit(r, Mat4x4.identity);
|
|
41
|
+
}
|
|
42
|
+
return result;
|
|
43
|
+
}
|
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
// © 2026 Adobe. MIT License. See /LICENSE for details.
|
|
2
|
+
|
|
3
|
+
import { createStructBuffer, copyToGPUBuffer, getStructLayout } from "@adobe/data/typed-buffer";
|
|
4
|
+
import { schema as visibleMaterialSchema } from "../../../rendering/visible-material/schema.js";
|
|
5
|
+
import type { VisibleMaterial } from "../../../rendering/visible-material/visible-material.js";
|
|
6
|
+
import type { ColorMaterialOptions } from "../../../rendering/visible-material/color-material-options.js";
|
|
7
|
+
import type { FallbackViews } from "./build-material-bind-group.js";
|
|
8
|
+
|
|
9
|
+
const layout = getStructLayout(visibleMaterialSchema);
|
|
10
|
+
|
|
11
|
+
export function createColorMaterial(
|
|
12
|
+
device: GPUDevice,
|
|
13
|
+
bindGroupLayout: GPUBindGroupLayout,
|
|
14
|
+
sampler: GPUSampler,
|
|
15
|
+
fallback: FallbackViews,
|
|
16
|
+
options: ColorMaterialOptions,
|
|
17
|
+
): GPUBindGroup {
|
|
18
|
+
const material: VisibleMaterial = {
|
|
19
|
+
baseColorFactor: options.color,
|
|
20
|
+
emissiveFactor: options.emissive ?? [0, 0, 0],
|
|
21
|
+
metallicFactor: options.metallic ?? 0,
|
|
22
|
+
roughnessFactor: options.roughness ?? 0.8,
|
|
23
|
+
normalScale: 1,
|
|
24
|
+
occlusionStrength: 1,
|
|
25
|
+
};
|
|
26
|
+
|
|
27
|
+
const structBuffer = createStructBuffer(visibleMaterialSchema, layout.size);
|
|
28
|
+
structBuffer.set(0, material);
|
|
29
|
+
let uniformBuffer = device.createBuffer({
|
|
30
|
+
size: layout.size,
|
|
31
|
+
usage: GPUBufferUsage.UNIFORM | GPUBufferUsage.COPY_DST,
|
|
32
|
+
});
|
|
33
|
+
uniformBuffer = copyToGPUBuffer(structBuffer, device, uniformBuffer);
|
|
34
|
+
|
|
35
|
+
return device.createBindGroup({
|
|
36
|
+
layout: bindGroupLayout,
|
|
37
|
+
entries: [
|
|
38
|
+
{ binding: 0, resource: { buffer: uniformBuffer } },
|
|
39
|
+
{ binding: 1, resource: fallback.white },
|
|
40
|
+
{ binding: 2, resource: fallback.white },
|
|
41
|
+
{ binding: 3, resource: fallback.flatNormal },
|
|
42
|
+
{ binding: 4, resource: fallback.white },
|
|
43
|
+
{ binding: 5, resource: fallback.white },
|
|
44
|
+
{ binding: 6, resource: sampler },
|
|
45
|
+
],
|
|
46
|
+
});
|
|
47
|
+
}
|
|
@@ -0,0 +1,93 @@
|
|
|
1
|
+
// © 2026 Adobe. MIT License. See /LICENSE for details.
|
|
2
|
+
|
|
3
|
+
import { readImageBytes } from "./accessor-view.js";
|
|
4
|
+
import type { GltfAsset } from "./gltf-schema.js";
|
|
5
|
+
|
|
6
|
+
/**
|
|
7
|
+
* Categorizes each image index as either "color" (sRGB) or "data" (linear).
|
|
8
|
+
* glTF spec: baseColor and emissive textures are in sRGB color space; normal,
|
|
9
|
+
* metallic-roughness, and occlusion textures are in linear color space.
|
|
10
|
+
*
|
|
11
|
+
* When an image is referenced from both kinds of slot, "color" wins because
|
|
12
|
+
* losing precision in a data texture is more visible than gamma drift in a
|
|
13
|
+
* color one.
|
|
14
|
+
*/
|
|
15
|
+
function categorizeImages(gltf: GltfAsset): ("color" | "data")[] {
|
|
16
|
+
const out: ("color" | "data")[] = new Array((gltf.images ?? []).length).fill("data");
|
|
17
|
+
|
|
18
|
+
const markColor = (textureIndex: number | undefined): void => {
|
|
19
|
+
if (textureIndex === undefined) return;
|
|
20
|
+
const t = gltf.textures?.[textureIndex];
|
|
21
|
+
if (t?.source !== undefined) out[t.source] = "color";
|
|
22
|
+
};
|
|
23
|
+
|
|
24
|
+
for (const mat of gltf.materials ?? []) {
|
|
25
|
+
markColor(mat.pbrMetallicRoughness?.baseColorTexture?.index);
|
|
26
|
+
markColor(mat.emissiveTexture?.index);
|
|
27
|
+
}
|
|
28
|
+
|
|
29
|
+
return out;
|
|
30
|
+
}
|
|
31
|
+
|
|
32
|
+
async function decodeOne(
|
|
33
|
+
device: GPUDevice,
|
|
34
|
+
bytes: Uint8Array,
|
|
35
|
+
mimeType: string | undefined,
|
|
36
|
+
colorSpace: "color" | "data",
|
|
37
|
+
): Promise<GPUTexture> {
|
|
38
|
+
const blob = new Blob([bytes], { type: mimeType ?? "image/png" });
|
|
39
|
+
const bitmap = await createImageBitmap(blob, { colorSpaceConversion: "none" });
|
|
40
|
+
const format: GPUTextureFormat = colorSpace === "color" ? "rgba8unorm-srgb" : "rgba8unorm";
|
|
41
|
+
const texture = device.createTexture({
|
|
42
|
+
size: [bitmap.width, bitmap.height, 1],
|
|
43
|
+
format,
|
|
44
|
+
usage: GPUTextureUsage.TEXTURE_BINDING | GPUTextureUsage.COPY_DST | GPUTextureUsage.RENDER_ATTACHMENT,
|
|
45
|
+
});
|
|
46
|
+
device.queue.copyExternalImageToTexture(
|
|
47
|
+
{ source: bitmap },
|
|
48
|
+
{ texture },
|
|
49
|
+
[bitmap.width, bitmap.height, 1],
|
|
50
|
+
);
|
|
51
|
+
bitmap.close();
|
|
52
|
+
return texture;
|
|
53
|
+
}
|
|
54
|
+
|
|
55
|
+
export async function decodeAllImages(
|
|
56
|
+
device: GPUDevice,
|
|
57
|
+
gltf: GltfAsset,
|
|
58
|
+
bin: ArrayBuffer,
|
|
59
|
+
): Promise<GPUTexture[]> {
|
|
60
|
+
const kinds = categorizeImages(gltf);
|
|
61
|
+
return Promise.all(
|
|
62
|
+
(gltf.images ?? []).map((image, idx) => {
|
|
63
|
+
const bytes = readImageBytes(gltf, bin, idx);
|
|
64
|
+
return decodeOne(device, bytes, image.mimeType, kinds[idx]);
|
|
65
|
+
}),
|
|
66
|
+
);
|
|
67
|
+
}
|
|
68
|
+
|
|
69
|
+
/**
|
|
70
|
+
* Creates 1x1 fallback textures that the renderer can bind when a material
|
|
71
|
+
* doesn't supply a particular slot. Avoids "if texture exists" branches in
|
|
72
|
+
* the shader.
|
|
73
|
+
*/
|
|
74
|
+
export function createFallbackTextures(device: GPUDevice): {
|
|
75
|
+
white: GPUTextureView;
|
|
76
|
+
black: GPUTextureView;
|
|
77
|
+
flatNormal: GPUTextureView;
|
|
78
|
+
} {
|
|
79
|
+
const make = (pixel: Uint8Array, format: GPUTextureFormat): GPUTextureView => {
|
|
80
|
+
const tex = device.createTexture({
|
|
81
|
+
size: [1, 1, 1],
|
|
82
|
+
format,
|
|
83
|
+
usage: GPUTextureUsage.TEXTURE_BINDING | GPUTextureUsage.COPY_DST,
|
|
84
|
+
});
|
|
85
|
+
device.queue.writeTexture({ texture: tex }, pixel, { bytesPerRow: 4 }, [1, 1, 1]);
|
|
86
|
+
return tex.createView();
|
|
87
|
+
};
|
|
88
|
+
return {
|
|
89
|
+
white: make(new Uint8Array([255, 255, 255, 255]), "rgba8unorm-srgb"),
|
|
90
|
+
black: make(new Uint8Array([0, 0, 0, 255]), "rgba8unorm-srgb"),
|
|
91
|
+
flatNormal: make(new Uint8Array([128, 128, 255, 255]), "rgba8unorm"),
|
|
92
|
+
};
|
|
93
|
+
}
|
|
@@ -0,0 +1,161 @@
|
|
|
1
|
+
// © 2026 Adobe. MIT License. See /LICENSE for details.
|
|
2
|
+
|
|
3
|
+
// Minimal subset of glTF 2.0 schema fields we actually consume.
|
|
4
|
+
// Spec: https://registry.khronos.org/glTF/specs/2.0/glTF-2.0.html
|
|
5
|
+
|
|
6
|
+
export interface GltfAsset {
|
|
7
|
+
asset: { version: string };
|
|
8
|
+
scene?: number;
|
|
9
|
+
scenes?: GltfScene[];
|
|
10
|
+
nodes?: GltfNode[];
|
|
11
|
+
meshes?: GltfMesh[];
|
|
12
|
+
skins?: GltfSkin[];
|
|
13
|
+
materials?: GltfMaterial[];
|
|
14
|
+
textures?: GltfTexture[];
|
|
15
|
+
images?: GltfImage[];
|
|
16
|
+
samplers?: GltfSampler[];
|
|
17
|
+
accessors?: GltfAccessor[];
|
|
18
|
+
bufferViews?: GltfBufferView[];
|
|
19
|
+
buffers?: GltfBuffer[];
|
|
20
|
+
animations?: GltfAnimation[];
|
|
21
|
+
}
|
|
22
|
+
|
|
23
|
+
export interface GltfAnimation {
|
|
24
|
+
name?: string;
|
|
25
|
+
channels: GltfAnimationChannel[];
|
|
26
|
+
samplers: GltfAnimationSampler[];
|
|
27
|
+
}
|
|
28
|
+
|
|
29
|
+
export interface GltfAnimationChannel {
|
|
30
|
+
sampler: number;
|
|
31
|
+
target: { node: number; path: "translation" | "rotation" | "scale" | "weights" };
|
|
32
|
+
}
|
|
33
|
+
|
|
34
|
+
export interface GltfAnimationSampler {
|
|
35
|
+
input: number; // accessor → keyframe times (Float32Array)
|
|
36
|
+
output: number; // accessor → keyframe values
|
|
37
|
+
interpolation?: "LINEAR" | "STEP" | "CUBICSPLINE";
|
|
38
|
+
}
|
|
39
|
+
|
|
40
|
+
export interface GltfScene {
|
|
41
|
+
nodes?: number[];
|
|
42
|
+
}
|
|
43
|
+
|
|
44
|
+
export interface GltfNode {
|
|
45
|
+
name?: string;
|
|
46
|
+
mesh?: number;
|
|
47
|
+
skin?: number;
|
|
48
|
+
children?: number[];
|
|
49
|
+
translation?: [number, number, number];
|
|
50
|
+
rotation?: [number, number, number, number];
|
|
51
|
+
scale?: [number, number, number];
|
|
52
|
+
matrix?: number[];
|
|
53
|
+
}
|
|
54
|
+
|
|
55
|
+
export interface GltfMesh {
|
|
56
|
+
name?: string;
|
|
57
|
+
primitives: GltfPrimitive[];
|
|
58
|
+
}
|
|
59
|
+
|
|
60
|
+
export interface GltfPrimitive {
|
|
61
|
+
attributes: {
|
|
62
|
+
POSITION: number;
|
|
63
|
+
NORMAL?: number;
|
|
64
|
+
TANGENT?: number;
|
|
65
|
+
TEXCOORD_0?: number;
|
|
66
|
+
JOINTS_0?: number;
|
|
67
|
+
WEIGHTS_0?: number;
|
|
68
|
+
[key: string]: number | undefined;
|
|
69
|
+
};
|
|
70
|
+
indices?: number;
|
|
71
|
+
material?: number;
|
|
72
|
+
mode?: number; // default 4 (triangles)
|
|
73
|
+
}
|
|
74
|
+
|
|
75
|
+
export interface GltfSkin {
|
|
76
|
+
name?: string;
|
|
77
|
+
inverseBindMatrices?: number; // accessor index → array of mat4
|
|
78
|
+
skeleton?: number; // root joint node index
|
|
79
|
+
joints: number[]; // ordered list of node indices that are joints
|
|
80
|
+
}
|
|
81
|
+
|
|
82
|
+
export interface GltfMaterial {
|
|
83
|
+
name?: string;
|
|
84
|
+
pbrMetallicRoughness?: {
|
|
85
|
+
baseColorFactor?: [number, number, number, number];
|
|
86
|
+
baseColorTexture?: { index: number; texCoord?: number };
|
|
87
|
+
metallicFactor?: number;
|
|
88
|
+
roughnessFactor?: number;
|
|
89
|
+
metallicRoughnessTexture?: { index: number; texCoord?: number };
|
|
90
|
+
};
|
|
91
|
+
normalTexture?: { index: number; texCoord?: number; scale?: number };
|
|
92
|
+
occlusionTexture?: { index: number; texCoord?: number; strength?: number };
|
|
93
|
+
emissiveTexture?: { index: number; texCoord?: number };
|
|
94
|
+
emissiveFactor?: [number, number, number];
|
|
95
|
+
alphaMode?: "OPAQUE" | "MASK" | "BLEND";
|
|
96
|
+
alphaCutoff?: number;
|
|
97
|
+
doubleSided?: boolean;
|
|
98
|
+
}
|
|
99
|
+
|
|
100
|
+
export interface GltfTexture {
|
|
101
|
+
sampler?: number;
|
|
102
|
+
source?: number;
|
|
103
|
+
}
|
|
104
|
+
|
|
105
|
+
export interface GltfImage {
|
|
106
|
+
name?: string;
|
|
107
|
+
mimeType?: string;
|
|
108
|
+
bufferView?: number;
|
|
109
|
+
uri?: string;
|
|
110
|
+
}
|
|
111
|
+
|
|
112
|
+
export interface GltfSampler {
|
|
113
|
+
magFilter?: number;
|
|
114
|
+
minFilter?: number;
|
|
115
|
+
wrapS?: number;
|
|
116
|
+
wrapT?: number;
|
|
117
|
+
}
|
|
118
|
+
|
|
119
|
+
export interface GltfAccessor {
|
|
120
|
+
bufferView?: number;
|
|
121
|
+
byteOffset?: number;
|
|
122
|
+
componentType: number; // 5120..5126
|
|
123
|
+
count: number;
|
|
124
|
+
type: "SCALAR" | "VEC2" | "VEC3" | "VEC4" | "MAT2" | "MAT3" | "MAT4";
|
|
125
|
+
normalized?: boolean;
|
|
126
|
+
min?: number[];
|
|
127
|
+
max?: number[];
|
|
128
|
+
}
|
|
129
|
+
|
|
130
|
+
export interface GltfBufferView {
|
|
131
|
+
buffer: number;
|
|
132
|
+
byteOffset?: number;
|
|
133
|
+
byteLength: number;
|
|
134
|
+
byteStride?: number;
|
|
135
|
+
target?: number;
|
|
136
|
+
}
|
|
137
|
+
|
|
138
|
+
export interface GltfBuffer {
|
|
139
|
+
byteLength: number;
|
|
140
|
+
uri?: string;
|
|
141
|
+
}
|
|
142
|
+
|
|
143
|
+
// glTF componentType constants
|
|
144
|
+
export const COMPONENT_TYPE = {
|
|
145
|
+
BYTE: 5120,
|
|
146
|
+
UNSIGNED_BYTE: 5121,
|
|
147
|
+
SHORT: 5122,
|
|
148
|
+
UNSIGNED_SHORT: 5123,
|
|
149
|
+
UNSIGNED_INT: 5125,
|
|
150
|
+
FLOAT: 5126,
|
|
151
|
+
} as const;
|
|
152
|
+
|
|
153
|
+
export const ACCESSOR_TYPE_COMPONENTS: Record<GltfAccessor["type"], number> = {
|
|
154
|
+
SCALAR: 1,
|
|
155
|
+
VEC2: 2,
|
|
156
|
+
VEC3: 3,
|
|
157
|
+
VEC4: 4,
|
|
158
|
+
MAT2: 4,
|
|
159
|
+
MAT3: 9,
|
|
160
|
+
MAT4: 16,
|
|
161
|
+
};
|
|
@@ -0,0 +1,220 @@
|
|
|
1
|
+
// © 2026 Adobe. MIT License. See /LICENSE for details.
|
|
2
|
+
|
|
3
|
+
import { Mat4x4, type Aabb } from "@adobe/data/math";
|
|
4
|
+
import { VisibleMaterial } from "../../../rendering/visible-material/visible-material.js";
|
|
5
|
+
import { readAccessor } from "./accessor-view.js";
|
|
6
|
+
import { buildMaterialBindGroup, type FallbackViews } from "./build-material-bind-group.js";
|
|
7
|
+
import { computeWorldMatrices } from "./compute-world-matrices.js";
|
|
8
|
+
import { createFallbackTextures, decodeAllImages } from "./decode-images.js";
|
|
9
|
+
import { packPrimitiveVertices } from "./pack-vertex-buffer.js";
|
|
10
|
+
import { parseGlb } from "./parse-glb.js";
|
|
11
|
+
import { parseGltfSkin, type LoadedSkin } from "./parse-skin.js";
|
|
12
|
+
import { parseGltfAnimations, type LoadedAnimation } from "./parse-animations.js";
|
|
13
|
+
|
|
14
|
+
export interface GpuPrimitiveData {
|
|
15
|
+
pbrVertexBuffer: GPUBuffer;
|
|
16
|
+
/** Secondary VBO with skinning attributes (joints u32×4, weights f32×4).
|
|
17
|
+
* Null for non-skinned primitives. Drives the renderer's pipeline choice. */
|
|
18
|
+
pbrSkinVertexBuffer: GPUBuffer | null;
|
|
19
|
+
pbrIndexBuffer: GPUBuffer;
|
|
20
|
+
pbrIndexCount: number;
|
|
21
|
+
pbrIndexFormat: GPUIndexFormat;
|
|
22
|
+
pbrMaterialBindGroup: GPUBindGroup;
|
|
23
|
+
/** Node's model-root-local matrix. Renderers pre-multiply this with the
|
|
24
|
+
* per-instance model-root world matrix at draw time. Identity for
|
|
25
|
+
* single-node and skinned-mesh primitives (skin owns the deformation). */
|
|
26
|
+
pbrNodeLocalMatrix: Mat4x4;
|
|
27
|
+
}
|
|
28
|
+
|
|
29
|
+
export interface LoadedGltfData {
|
|
30
|
+
primitives: GpuPrimitiveData[];
|
|
31
|
+
bounds: Aabb;
|
|
32
|
+
/** Present when the glTF declares a `skins[0]`. */
|
|
33
|
+
skin: LoadedSkin | null;
|
|
34
|
+
/** Parsed `animations[]`; jointIndex on each track is into `skin.jointTemplate`. */
|
|
35
|
+
animations: LoadedAnimation[];
|
|
36
|
+
/** Model-space collision geometry retained on the CPU for auto-generating
|
|
37
|
+
* physics colliders (convex hull / trimesh) — the non-skinned primitives'
|
|
38
|
+
* positions (each baked by its node matrix) + indices, aggregated. Null when
|
|
39
|
+
* the model has no static geometry (e.g. skin-only). */
|
|
40
|
+
collision: { positions: Float32Array; indices: Uint32Array } | null;
|
|
41
|
+
/** Skinned vertices retained on the CPU (mesh-bind positions + 4 joint
|
|
42
|
+
* indices + 4 weights per vertex), for fitting per-bone ragdoll capsules.
|
|
43
|
+
* Null for non-skinned models. */
|
|
44
|
+
skinVertices: { positions: Float32Array; joints: Uint32Array; weights: Float32Array } | null;
|
|
45
|
+
}
|
|
46
|
+
|
|
47
|
+
function expandBounds(
|
|
48
|
+
m: Mat4x4,
|
|
49
|
+
localMin: readonly [number, number, number],
|
|
50
|
+
localMax: readonly [number, number, number],
|
|
51
|
+
outMin: [number, number, number],
|
|
52
|
+
outMax: [number, number, number],
|
|
53
|
+
): void {
|
|
54
|
+
const xs = [localMin[0], localMax[0]];
|
|
55
|
+
const ys = [localMin[1], localMax[1]];
|
|
56
|
+
const zs = [localMin[2], localMax[2]];
|
|
57
|
+
for (const lx of xs) for (const ly of ys) for (const lz of zs) {
|
|
58
|
+
const wx = m[0] * lx + m[4] * ly + m[8] * lz + m[12];
|
|
59
|
+
const wy = m[1] * lx + m[5] * ly + m[9] * lz + m[13];
|
|
60
|
+
const wz = m[2] * lx + m[6] * ly + m[10] * lz + m[14];
|
|
61
|
+
if (wx < outMin[0]) outMin[0] = wx; if (wx > outMax[0]) outMax[0] = wx;
|
|
62
|
+
if (wy < outMin[1]) outMin[1] = wy; if (wy > outMax[1]) outMax[1] = wy;
|
|
63
|
+
if (wz < outMin[2]) outMin[2] = wz; if (wz > outMax[2]) outMax[2] = wz;
|
|
64
|
+
}
|
|
65
|
+
}
|
|
66
|
+
|
|
67
|
+
function pickIndexFormat(raw: Uint16Array | Uint32Array | Uint8Array | Float32Array): {
|
|
68
|
+
indices: Uint16Array | Uint32Array;
|
|
69
|
+
format: GPUIndexFormat;
|
|
70
|
+
} {
|
|
71
|
+
if (raw instanceof Uint32Array) return { indices: raw, format: "uint32" };
|
|
72
|
+
if (raw instanceof Uint16Array) return { indices: raw, format: "uint16" };
|
|
73
|
+
if (raw instanceof Uint8Array) {
|
|
74
|
+
const u16 = new Uint16Array(raw.length);
|
|
75
|
+
for (let i = 0; i < raw.length; i++) u16[i] = raw[i];
|
|
76
|
+
return { indices: u16, format: "uint16" };
|
|
77
|
+
}
|
|
78
|
+
throw new Error("Index accessor must be an integer type");
|
|
79
|
+
}
|
|
80
|
+
|
|
81
|
+
export async function loadGltfPrimitives(device: GPUDevice, url: string): Promise<LoadedGltfData> {
|
|
82
|
+
const response = await fetch(url);
|
|
83
|
+
if (!response.ok) throw new Error(`Failed to fetch ${url}: ${response.status}`);
|
|
84
|
+
const buffer = await response.arrayBuffer();
|
|
85
|
+
|
|
86
|
+
const { json, bin } = parseGlb(buffer);
|
|
87
|
+
|
|
88
|
+
const materialLayout = VisibleMaterial.createBindGroupLayout(device);
|
|
89
|
+
const sourceTextures = await decodeAllImages(device, json, bin);
|
|
90
|
+
const fallback: FallbackViews = createFallbackTextures(device);
|
|
91
|
+
|
|
92
|
+
const sampler = device.createSampler({
|
|
93
|
+
magFilter: "linear",
|
|
94
|
+
minFilter: "linear",
|
|
95
|
+
addressModeU: "repeat",
|
|
96
|
+
addressModeV: "repeat",
|
|
97
|
+
});
|
|
98
|
+
|
|
99
|
+
const worldMatrices = computeWorldMatrices(json);
|
|
100
|
+
const skin = parseGltfSkin(json, bin);
|
|
101
|
+
const animations = skin ? parseGltfAnimations(json, bin, json.skins![0].joints) : [];
|
|
102
|
+
|
|
103
|
+
const boundsMin: [number, number, number] = [Infinity, Infinity, Infinity];
|
|
104
|
+
const boundsMax: [number, number, number] = [-Infinity, -Infinity, -Infinity];
|
|
105
|
+
const primitives: GpuPrimitiveData[] = [];
|
|
106
|
+
// CPU-retained collision geometry (model space, non-skinned primitives only).
|
|
107
|
+
const collPositions: number[] = [], collIndices: number[] = [];
|
|
108
|
+
// CPU-retained skin vertices (mesh-bind space, skinned primitives only).
|
|
109
|
+
const skinPos: number[] = [], skinJoints: number[] = [], skinWeights: number[] = [];
|
|
110
|
+
|
|
111
|
+
for (let nodeIdx = 0; nodeIdx < (json.nodes ?? []).length; nodeIdx++) {
|
|
112
|
+
const node = json.nodes![nodeIdx];
|
|
113
|
+
if (node.mesh === undefined) continue;
|
|
114
|
+
const mesh = json.meshes![node.mesh];
|
|
115
|
+
// For skinned primitives the joint transforms own the deformation;
|
|
116
|
+
// the mesh node's own transform must not be baked in. For non-skinned
|
|
117
|
+
// primitives we pre-bake the node's world matrix as before.
|
|
118
|
+
const skinned = node.skin !== undefined;
|
|
119
|
+
const pbrNodeLocalMatrix = skinned ? Mat4x4.identity : worldMatrices[nodeIdx];
|
|
120
|
+
|
|
121
|
+
for (const prim of mesh.primitives) {
|
|
122
|
+
const packed = packPrimitiveVertices(json, bin, prim);
|
|
123
|
+
|
|
124
|
+
expandBounds(pbrNodeLocalMatrix, packed.boundsMin, packed.boundsMax, boundsMin, boundsMax);
|
|
125
|
+
|
|
126
|
+
const vertexBuffer = device.createBuffer({
|
|
127
|
+
size: packed.vertices.byteLength,
|
|
128
|
+
usage: GPUBufferUsage.VERTEX | GPUBufferUsage.COPY_DST,
|
|
129
|
+
});
|
|
130
|
+
device.queue.writeBuffer(vertexBuffer, 0, packed.vertices);
|
|
131
|
+
|
|
132
|
+
let skinVertexBuffer: GPUBuffer | null = null;
|
|
133
|
+
if (packed.skinningAttributes) {
|
|
134
|
+
skinVertexBuffer = device.createBuffer({
|
|
135
|
+
size: packed.skinningAttributes.byteLength,
|
|
136
|
+
usage: GPUBufferUsage.VERTEX | GPUBufferUsage.COPY_DST,
|
|
137
|
+
});
|
|
138
|
+
device.queue.writeBuffer(skinVertexBuffer, 0, packed.skinningAttributes);
|
|
139
|
+
}
|
|
140
|
+
|
|
141
|
+
// Non-indexed primitives are valid in glTF — synthesize sequential indices.
|
|
142
|
+
let indices: Uint16Array | Uint32Array;
|
|
143
|
+
let format: GPUIndexFormat;
|
|
144
|
+
if (prim.indices === undefined) {
|
|
145
|
+
if (packed.vertexCount <= 0xffff) {
|
|
146
|
+
indices = new Uint16Array(packed.vertexCount);
|
|
147
|
+
for (let k = 0; k < packed.vertexCount; k++) indices[k] = k;
|
|
148
|
+
format = "uint16";
|
|
149
|
+
} else {
|
|
150
|
+
indices = new Uint32Array(packed.vertexCount);
|
|
151
|
+
for (let k = 0; k < packed.vertexCount; k++) indices[k] = k;
|
|
152
|
+
format = "uint32";
|
|
153
|
+
}
|
|
154
|
+
} else {
|
|
155
|
+
const raw = readAccessor(json, bin, prim.indices);
|
|
156
|
+
({ indices, format } = pickIndexFormat(raw));
|
|
157
|
+
}
|
|
158
|
+
|
|
159
|
+
const indexBuffer = device.createBuffer({
|
|
160
|
+
size: indices.byteLength,
|
|
161
|
+
usage: GPUBufferUsage.INDEX | GPUBufferUsage.COPY_DST,
|
|
162
|
+
});
|
|
163
|
+
device.queue.writeBuffer(indexBuffer, 0, indices);
|
|
164
|
+
|
|
165
|
+
// Retain collision geometry for non-skinned primitives: deinterleave the
|
|
166
|
+
// positions (stride = floats/vertex, position at offset 0), bake the node
|
|
167
|
+
// matrix into model space, and append with index offset. Skinned primitives
|
|
168
|
+
// deform at runtime, so a static collider from their bind pose is meaningless.
|
|
169
|
+
if (!skinned) {
|
|
170
|
+
const m = pbrNodeLocalMatrix, verts = packed.vertices;
|
|
171
|
+
const stride = packed.vertices.length / packed.vertexCount;
|
|
172
|
+
const vbase = collPositions.length / 3;
|
|
173
|
+
for (let v = 0; v < packed.vertexCount; v++) {
|
|
174
|
+
const o = v * stride, x = verts[o], y = verts[o + 1], z = verts[o + 2];
|
|
175
|
+
collPositions.push(
|
|
176
|
+
m[0] * x + m[4] * y + m[8] * z + m[12],
|
|
177
|
+
m[1] * x + m[5] * y + m[9] * z + m[13],
|
|
178
|
+
m[2] * x + m[6] * y + m[10] * z + m[14],
|
|
179
|
+
);
|
|
180
|
+
}
|
|
181
|
+
for (let k = 0; k < indices.length; k++) collIndices.push(indices[k] + vbase);
|
|
182
|
+
} else if (packed.skinningAttributes) {
|
|
183
|
+
// Retain skin vertices (mesh-bind positions + joints/weights) for
|
|
184
|
+
// fitting per-bone ragdoll capsules. Skinning attributes pack 8 words
|
|
185
|
+
// per vertex: joints (u32×4) in words 0–3, weights (f32×4) in 4–7.
|
|
186
|
+
const verts = packed.vertices, stride = packed.vertices.length / packed.vertexCount;
|
|
187
|
+
const sj = new Uint32Array(packed.skinningAttributes), sw = new Float32Array(packed.skinningAttributes);
|
|
188
|
+
for (let v = 0; v < packed.vertexCount; v++) {
|
|
189
|
+
const o = v * stride, s = v * 8;
|
|
190
|
+
skinPos.push(verts[o], verts[o + 1], verts[o + 2]);
|
|
191
|
+
skinJoints.push(sj[s], sj[s + 1], sj[s + 2], sj[s + 3]);
|
|
192
|
+
skinWeights.push(sw[s + 4], sw[s + 5], sw[s + 6], sw[s + 7]);
|
|
193
|
+
}
|
|
194
|
+
}
|
|
195
|
+
|
|
196
|
+
const materialBindGroup = buildMaterialBindGroup(
|
|
197
|
+
device, json, sourceTextures, fallback, sampler, materialLayout, prim.material,
|
|
198
|
+
);
|
|
199
|
+
|
|
200
|
+
primitives.push({
|
|
201
|
+
pbrVertexBuffer: vertexBuffer,
|
|
202
|
+
pbrSkinVertexBuffer: skinVertexBuffer,
|
|
203
|
+
pbrIndexBuffer: indexBuffer,
|
|
204
|
+
pbrIndexCount: indices.length,
|
|
205
|
+
pbrIndexFormat: format,
|
|
206
|
+
pbrMaterialBindGroup: materialBindGroup,
|
|
207
|
+
pbrNodeLocalMatrix,
|
|
208
|
+
});
|
|
209
|
+
}
|
|
210
|
+
}
|
|
211
|
+
|
|
212
|
+
return {
|
|
213
|
+
primitives,
|
|
214
|
+
bounds: { min: boundsMin as [number, number, number], max: boundsMax as [number, number, number] },
|
|
215
|
+
skin,
|
|
216
|
+
animations,
|
|
217
|
+
collision: collPositions.length ? { positions: new Float32Array(collPositions), indices: new Uint32Array(collIndices) } : null,
|
|
218
|
+
skinVertices: skinPos.length ? { positions: new Float32Array(skinPos), joints: new Uint32Array(skinJoints), weights: new Float32Array(skinWeights) } : null,
|
|
219
|
+
};
|
|
220
|
+
}
|