@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,141 @@
|
|
|
1
|
+
// © 2026 Adobe. MIT License. See /LICENSE for details.
|
|
2
|
+
|
|
3
|
+
import type { ShapeMesh } from "./shape-mesh.js";
|
|
4
|
+
|
|
5
|
+
/**
|
|
6
|
+
* Faceted render mesh of the convex hull of a point cloud (flat per-face normals,
|
|
7
|
+
* StandardVertex layout). A convex collider is *authored* as a point cloud — the
|
|
8
|
+
* physics engine builds the collision hull from the same points — but rendering
|
|
9
|
+
* needs a triangulated surface, which this computes. Phase-2 auto-hull (hull of a
|
|
10
|
+
* render mesh's vertices) reuses it.
|
|
11
|
+
*
|
|
12
|
+
* Incremental 3D hull: seed a tetrahedron, then fold each remaining point in by
|
|
13
|
+
* deleting the faces it can see and bridging the horizon to it. Every face's
|
|
14
|
+
* normal is oriented away from a fixed interior point (the seed centroid, always
|
|
15
|
+
* strictly inside a convex hull) — so orientation is robust without half-edge
|
|
16
|
+
* bookkeeping. Authored hulls are small (tens of points), so the simple O(n·f)
|
|
17
|
+
* form is plenty fast. Degenerate input (< 4 points or coplanar) → empty mesh.
|
|
18
|
+
*/
|
|
19
|
+
|
|
20
|
+
interface Face { a: number; b: number; c: number; nx: number; ny: number; nz: number }
|
|
21
|
+
|
|
22
|
+
const EPS = 1e-7;
|
|
23
|
+
|
|
24
|
+
export function convexHullMesh(points: Float32Array): ShapeMesh {
|
|
25
|
+
const faces = hullFaces(points);
|
|
26
|
+
if (!faces) return { vertices: new Float32Array(0), indices: new Uint16Array(0) };
|
|
27
|
+
const px = (i: number) => points[i * 3], py = (i: number) => points[i * 3 + 1], pz = (i: number) => points[i * 3 + 2];
|
|
28
|
+
|
|
29
|
+
// flat-shaded: three unique verts per face, all sharing the face normal.
|
|
30
|
+
const verts: number[] = [], indices: number[] = [];
|
|
31
|
+
for (const f of faces) {
|
|
32
|
+
const len = Math.hypot(f.nx, f.ny, f.nz) || 1;
|
|
33
|
+
const nx = f.nx / len, ny = f.ny / len, nz = f.nz / len;
|
|
34
|
+
// any in-plane unit vector for the tangent (flat shading ignores its sign)
|
|
35
|
+
let tx = px(f.b) - px(f.a), ty = py(f.b) - py(f.a), tz = pz(f.b) - pz(f.a);
|
|
36
|
+
const tl = Math.hypot(tx, ty, tz) || 1; tx /= tl; ty /= tl; tz /= tl;
|
|
37
|
+
const base = verts.length / 12;
|
|
38
|
+
const corners = [f.a, f.b, f.c], uv = [[0, 0], [1, 0], [0, 1]];
|
|
39
|
+
for (let i = 0; i < 3; i++) {
|
|
40
|
+
const v = corners[i];
|
|
41
|
+
verts.push(px(v), py(v), pz(v), nx, ny, nz, tx, ty, tz, 1, uv[i][0], uv[i][1]);
|
|
42
|
+
}
|
|
43
|
+
indices.push(base, base + 1, base + 2);
|
|
44
|
+
}
|
|
45
|
+
return { vertices: new Float32Array(verts), indices: new Uint16Array(indices) };
|
|
46
|
+
}
|
|
47
|
+
|
|
48
|
+
/**
|
|
49
|
+
* The deduplicated hull vertices (the extreme points) of a cloud — a minimal
|
|
50
|
+
* point set whose convex hull equals the cloud's. Used to feed a physics engine's
|
|
51
|
+
* convex-hull builder a *simplified* collider from a detailed mesh (thousands of
|
|
52
|
+
* verts → a few dozen). Empty for degenerate input.
|
|
53
|
+
*/
|
|
54
|
+
export function hullVertices(points: Float32Array): Float32Array {
|
|
55
|
+
const faces = hullFaces(points);
|
|
56
|
+
if (!faces) return new Float32Array(0);
|
|
57
|
+
const used = new Set<number>();
|
|
58
|
+
for (const f of faces) { used.add(f.a); used.add(f.b); used.add(f.c); }
|
|
59
|
+
const out = new Float32Array(used.size * 3);
|
|
60
|
+
let i = 0;
|
|
61
|
+
for (const idx of used) { out[i * 3] = points[idx * 3]; out[i * 3 + 1] = points[idx * 3 + 1]; out[i * 3 + 2] = points[idx * 3 + 2]; i++; }
|
|
62
|
+
return out;
|
|
63
|
+
}
|
|
64
|
+
|
|
65
|
+
/** The hull's triangular faces, each normal oriented outward, or null if the
|
|
66
|
+
* point cloud is degenerate (fewer than 4 points, or all coplanar). Exported
|
|
67
|
+
* for tests; rendering goes through {@link convexHullMesh}. */
|
|
68
|
+
export function hullFaces(points: Float32Array): Face[] | null {
|
|
69
|
+
const n = points.length / 3;
|
|
70
|
+
if (n < 4) return null;
|
|
71
|
+
const px = (i: number) => points[i * 3], py = (i: number) => points[i * 3 + 1], pz = (i: number) => points[i * 3 + 2];
|
|
72
|
+
|
|
73
|
+
const seed = seedTetra(n, px, py, pz);
|
|
74
|
+
if (!seed) return null;
|
|
75
|
+
// centroid of the seed tetra — strictly inside the hull for its whole life, so
|
|
76
|
+
// "normal points away from this" is always the correct outward test.
|
|
77
|
+
const [i0, i1, i2, i3] = seed;
|
|
78
|
+
const cx = (px(i0) + px(i1) + px(i2) + px(i3)) / 4;
|
|
79
|
+
const cy = (py(i0) + py(i1) + py(i2) + py(i3)) / 4;
|
|
80
|
+
const cz = (pz(i0) + pz(i1) + pz(i2) + pz(i3)) / 4;
|
|
81
|
+
|
|
82
|
+
const makeFace = (a: number, b: number, c: number): Face => {
|
|
83
|
+
const ux = px(b) - px(a), uy = py(b) - py(a), uz = pz(b) - pz(a);
|
|
84
|
+
const vx = px(c) - px(a), vy = py(c) - py(a), vz = pz(c) - pz(a);
|
|
85
|
+
let nx = uy * vz - uz * vy, ny = uz * vx - ux * vz, nz = ux * vy - uy * vx;
|
|
86
|
+
if (nx * (px(a) - cx) + ny * (py(a) - cy) + nz * (pz(a) - cz) < 0) { // points inward → flip
|
|
87
|
+
return { a, b: c, c: b, nx: -nx, ny: -ny, nz: -nz };
|
|
88
|
+
}
|
|
89
|
+
return { a, b, c, nx, ny, nz };
|
|
90
|
+
};
|
|
91
|
+
const above = (f: Face, p: number): number =>
|
|
92
|
+
f.nx * (px(p) - px(f.a)) + f.ny * (py(p) - py(f.a)) + f.nz * (pz(p) - pz(f.a));
|
|
93
|
+
|
|
94
|
+
const faces: Face[] = [makeFace(i0, i1, i2), makeFace(i0, i1, i3), makeFace(i0, i2, i3), makeFace(i1, i2, i3)];
|
|
95
|
+
for (let p = 0; p < n; p++) {
|
|
96
|
+
if (faces.every(f => above(f, p) <= EPS)) continue; // inside the current hull
|
|
97
|
+
|
|
98
|
+
// horizon = edges on exactly one visible face (the toggle leaves only those).
|
|
99
|
+
const horizon = new Map<string, [number, number]>();
|
|
100
|
+
for (const f of faces) {
|
|
101
|
+
if (above(f, p) <= EPS) continue;
|
|
102
|
+
for (const [u, v] of [[f.a, f.b], [f.b, f.c], [f.c, f.a]] as const) {
|
|
103
|
+
const k = u < v ? `${u}_${v}` : `${v}_${u}`;
|
|
104
|
+
if (horizon.has(k)) horizon.delete(k); else horizon.set(k, [u, v]);
|
|
105
|
+
}
|
|
106
|
+
}
|
|
107
|
+
for (let i = faces.length - 1; i >= 0; i--) if (above(faces[i], p) > EPS) faces.splice(i, 1);
|
|
108
|
+
for (const [u, v] of horizon.values()) faces.push(makeFace(u, v, p));
|
|
109
|
+
}
|
|
110
|
+
return faces;
|
|
111
|
+
}
|
|
112
|
+
|
|
113
|
+
/** Indices of 4 non-coplanar seed points (max-spread pair, point farthest from
|
|
114
|
+
* that line, point farthest from that plane), or null if all points are coplanar. */
|
|
115
|
+
function seedTetra(n: number, px: (i: number) => number, py: (i: number) => number, pz: (i: number) => number): [number, number, number, number] | null {
|
|
116
|
+
let i0 = 0, i1 = 0, best = -1;
|
|
117
|
+
for (let i = 0; i < n; i++) for (let j = i + 1; j < n; j++) {
|
|
118
|
+
const d = (px(i) - px(j)) ** 2 + (py(i) - py(j)) ** 2 + (pz(i) - pz(j)) ** 2;
|
|
119
|
+
if (d > best) { best = d; i0 = i; i1 = j; }
|
|
120
|
+
}
|
|
121
|
+
if (best <= EPS) return null;
|
|
122
|
+
const ex = px(i1) - px(i0), ey = py(i1) - py(i0), ez = pz(i1) - pz(i0);
|
|
123
|
+
let i2 = -1; best = EPS;
|
|
124
|
+
for (let i = 0; i < n; i++) { // area² of triangle (i0,i1,i) ∝ |edge × (i0→i)|²
|
|
125
|
+
const wx = px(i) - px(i0), wy = py(i) - py(i0), wz = pz(i) - pz(i0);
|
|
126
|
+
const cx = ey * wz - ez * wy, cy = ez * wx - ex * wz, cz = ex * wy - ey * wx;
|
|
127
|
+
const a = cx * cx + cy * cy + cz * cz;
|
|
128
|
+
if (a > best) { best = a; i2 = i; }
|
|
129
|
+
}
|
|
130
|
+
if (i2 < 0) return null;
|
|
131
|
+
const ux = px(i1) - px(i0), uy = py(i1) - py(i0), uz = pz(i1) - pz(i0);
|
|
132
|
+
const vx = px(i2) - px(i0), vy = py(i2) - py(i0), vz = pz(i2) - pz(i0);
|
|
133
|
+
const pnx = uy * vz - uz * vy, pny = uz * vx - ux * vz, pnz = ux * vy - uy * vx;
|
|
134
|
+
let i3 = -1; best = EPS;
|
|
135
|
+
for (let i = 0; i < n; i++) {
|
|
136
|
+
const d = Math.abs(pnx * (px(i) - px(i0)) + pny * (py(i) - py(i0)) + pnz * (pz(i) - pz(i0)));
|
|
137
|
+
if (d > best) { best = d; i3 = i; }
|
|
138
|
+
}
|
|
139
|
+
if (i3 < 0) return null; // coplanar
|
|
140
|
+
return [i0, i1, i2, i3];
|
|
141
|
+
}
|
|
@@ -0,0 +1,61 @@
|
|
|
1
|
+
// © 2026 Adobe. MIT License. See /LICENSE for details.
|
|
2
|
+
|
|
3
|
+
import { Database, type Entity } from "@adobe/data/ecs";
|
|
4
|
+
import { Mat4x4 } from "@adobe/data/math";
|
|
5
|
+
import { pbrCore } from "../../../rendering/pbr-core-plugin.js";
|
|
6
|
+
import { core } from "../../../../core/core-plugin.js";
|
|
7
|
+
import { model } from "../model-plugin.js";
|
|
8
|
+
import { unitSphere, unitCube } from "./shape-mesh.js";
|
|
9
|
+
import { uploadShapeMesh } from "./upload-shape-mesh.js";
|
|
10
|
+
|
|
11
|
+
/**
|
|
12
|
+
* shapeGeometry — registers procedural unit-sphere and unit-cube geometries as
|
|
13
|
+
* `Geometry` + `_PbrPrimitive` entities (StandardVertex layout), exactly like
|
|
14
|
+
* the model loader does for glTF, so primitives and loaded models share one
|
|
15
|
+
* render path. The two geometry entity ids are published in `_shapeGeometry`
|
|
16
|
+
* for the physics render bridge to reference (sphere / cuboid bodies). Built
|
|
17
|
+
* once when the device is ready.
|
|
18
|
+
*/
|
|
19
|
+
export const shapeGeometry = Database.Plugin.create({
|
|
20
|
+
extends: Database.Plugin.combine(pbrCore, model, core),
|
|
21
|
+
resources: {
|
|
22
|
+
_shapeGeometry: { default: null as { sphere: Entity; cube: Entity } | null, transient: true },
|
|
23
|
+
},
|
|
24
|
+
transactions: {
|
|
25
|
+
insertShapePrimitive(t, args: { vertexBuffer: GPUBuffer; indexBuffer: GPUBuffer; indexCount: number }): Entity {
|
|
26
|
+
const geometry = t.archetypes.Geometry.insert({ modelUrl: "" });
|
|
27
|
+
t.archetypes._PbrPrimitive.insert({
|
|
28
|
+
ephemeral: true,
|
|
29
|
+
_geometry: geometry,
|
|
30
|
+
_material: 0, // primitives carry material per-instance, not here
|
|
31
|
+
_vertexBuffer: args.vertexBuffer,
|
|
32
|
+
_skinVertexBuffer: null,
|
|
33
|
+
_indexBuffer: args.indexBuffer,
|
|
34
|
+
_indexCount: args.indexCount,
|
|
35
|
+
_indexFormat: "uint16",
|
|
36
|
+
_nodeLocalMatrix: Mat4x4.identity,
|
|
37
|
+
});
|
|
38
|
+
return geometry;
|
|
39
|
+
},
|
|
40
|
+
},
|
|
41
|
+
systems: {
|
|
42
|
+
shapeGeometryInit: {
|
|
43
|
+
schedule: { during: ["preUpdate"] },
|
|
44
|
+
create: db => {
|
|
45
|
+
let done = false;
|
|
46
|
+
return () => {
|
|
47
|
+
if (done) return;
|
|
48
|
+
const { device } = db.store.resources;
|
|
49
|
+
if (!device) return;
|
|
50
|
+
|
|
51
|
+
const s = uploadShapeMesh(device, unitSphere());
|
|
52
|
+
const c = uploadShapeMesh(device, unitCube());
|
|
53
|
+
const sphere = db.transactions.insertShapePrimitive({ vertexBuffer: s.vb, indexBuffer: s.ib, indexCount: s.count });
|
|
54
|
+
const cube = db.transactions.insertShapePrimitive({ vertexBuffer: c.vb, indexBuffer: c.ib, indexCount: c.count });
|
|
55
|
+
db.store.resources._shapeGeometry = { sphere, cube };
|
|
56
|
+
done = true;
|
|
57
|
+
};
|
|
58
|
+
},
|
|
59
|
+
},
|
|
60
|
+
},
|
|
61
|
+
});
|
|
@@ -0,0 +1,150 @@
|
|
|
1
|
+
// © 2026 Adobe. MIT License. See /LICENSE for details.
|
|
2
|
+
|
|
3
|
+
/**
|
|
4
|
+
* Procedural unit-shape meshes in the StandardVertex packed layout
|
|
5
|
+
* (position vec3, normal vec3, tangent vec4, uv vec2 — 12 floats/vertex), so
|
|
6
|
+
* they feed the same PBR pipeline and `StandardVertex.layout` as glTF meshes.
|
|
7
|
+
* Unit-sized (radius / half-extent 1): a Node `scale` sets the real size, so a
|
|
8
|
+
* cuboid is the unit cube scaled by its half-extents and a sphere is the unit
|
|
9
|
+
* sphere scaled by its radius.
|
|
10
|
+
*/
|
|
11
|
+
export interface ShapeMesh {
|
|
12
|
+
vertices: Float32Array;
|
|
13
|
+
indices: Uint16Array;
|
|
14
|
+
}
|
|
15
|
+
|
|
16
|
+
function push(out: number[], px: number, py: number, pz: number, nx: number, ny: number, nz: number, tx: number, ty: number, tz: number, tw: number, u: number, v: number): void {
|
|
17
|
+
out.push(px, py, pz, nx, ny, nz, tx, ty, tz, tw, u, v);
|
|
18
|
+
}
|
|
19
|
+
|
|
20
|
+
/** UV sphere, radius 1, centred at origin. */
|
|
21
|
+
export function unitSphere(rings = 24, segments = 48): ShapeMesh {
|
|
22
|
+
const verts: number[] = [];
|
|
23
|
+
for (let ring = 0; ring <= rings; ring++) {
|
|
24
|
+
const theta = (ring / rings) * Math.PI;
|
|
25
|
+
const st = Math.sin(theta), ct = Math.cos(theta);
|
|
26
|
+
for (let seg = 0; seg <= segments; seg++) {
|
|
27
|
+
const phi = (seg / segments) * Math.PI * 2;
|
|
28
|
+
const sp = Math.sin(phi), cp = Math.cos(phi);
|
|
29
|
+
const x = st * cp, y = ct, z = st * sp;
|
|
30
|
+
// tangent = d(pos)/dphi, normalized; degenerate at the poles.
|
|
31
|
+
let tx = -sp, ty = 0, tz = cp;
|
|
32
|
+
const tl = Math.hypot(tx, ty, tz);
|
|
33
|
+
if (tl < 1e-5) { tx = 1; ty = 0; tz = 0; } else { tx /= tl; tz /= tl; }
|
|
34
|
+
push(verts, x, y, z, x, y, z, tx, ty, tz, 1, seg / segments, ring / rings);
|
|
35
|
+
}
|
|
36
|
+
}
|
|
37
|
+
const indices: number[] = [];
|
|
38
|
+
const stride = segments + 1;
|
|
39
|
+
for (let ring = 0; ring < rings; ring++) {
|
|
40
|
+
for (let seg = 0; seg < segments; seg++) {
|
|
41
|
+
const a = ring * stride + seg, b = a + stride;
|
|
42
|
+
indices.push(a, b, a + 1, a + 1, b, b + 1);
|
|
43
|
+
}
|
|
44
|
+
}
|
|
45
|
+
return { vertices: new Float32Array(verts), indices: new Uint16Array(indices) };
|
|
46
|
+
}
|
|
47
|
+
|
|
48
|
+
interface Face { n: [number, number, number]; u: [number, number, number]; v: [number, number, number] }
|
|
49
|
+
|
|
50
|
+
// u × v = n for every face, so [c0,c1,c2,c0,c2,c3] winds CCW outward (back-cull).
|
|
51
|
+
const CUBE_FACES: Face[] = [
|
|
52
|
+
{ n: [1, 0, 0], u: [0, 0, -1], v: [0, 1, 0] },
|
|
53
|
+
{ n: [-1, 0, 0], u: [0, 0, 1], v: [0, 1, 0] },
|
|
54
|
+
{ n: [0, 1, 0], u: [1, 0, 0], v: [0, 0, -1] },
|
|
55
|
+
{ n: [0, -1, 0], u: [1, 0, 0], v: [0, 0, 1] },
|
|
56
|
+
{ n: [0, 0, 1], u: [1, 0, 0], v: [0, 1, 0] },
|
|
57
|
+
{ n: [0, 0, -1], u: [-1, 0, 0], v: [0, 1, 0] },
|
|
58
|
+
];
|
|
59
|
+
|
|
60
|
+
/**
|
|
61
|
+
* Flat-shaded StandardVertex mesh from a triangle soup (positions + indices) —
|
|
62
|
+
* one face normal per triangle, three unique verts per triangle. Used to render
|
|
63
|
+
* an authored static-mesh collider. Indices are emitted as `uint16`, so this is
|
|
64
|
+
* for the modest authored meshes (ramps, props) of the current shape path, not
|
|
65
|
+
* dense terrain (which would need a `uint32`-indexed primitive).
|
|
66
|
+
*/
|
|
67
|
+
export function flatShadedMesh(positions: Float32Array, indices: ArrayLike<number>): ShapeMesh {
|
|
68
|
+
const verts: number[] = [], out: number[] = [];
|
|
69
|
+
for (let t = 0; t < indices.length; t += 3) {
|
|
70
|
+
const ia = indices[t] * 3, ib = indices[t + 1] * 3, ic = indices[t + 2] * 3;
|
|
71
|
+
const ax = positions[ia], ay = positions[ia + 1], az = positions[ia + 2];
|
|
72
|
+
const bx = positions[ib], by = positions[ib + 1], bz = positions[ib + 2];
|
|
73
|
+
const cx = positions[ic], cy = positions[ic + 1], cz = positions[ic + 2];
|
|
74
|
+
let nx = (by - ay) * (cz - az) - (bz - az) * (cy - ay);
|
|
75
|
+
let ny = (bz - az) * (cx - ax) - (bx - ax) * (cz - az);
|
|
76
|
+
let nz = (bx - ax) * (cy - ay) - (by - ay) * (cx - ax);
|
|
77
|
+
const nl = Math.hypot(nx, ny, nz) || 1; nx /= nl; ny /= nl; nz /= nl;
|
|
78
|
+
let tx = bx - ax, ty = by - ay, tz = bz - az;
|
|
79
|
+
const tl = Math.hypot(tx, ty, tz) || 1; tx /= tl; ty /= tl; tz /= tl;
|
|
80
|
+
const base = verts.length / 12;
|
|
81
|
+
push(verts, ax, ay, az, nx, ny, nz, tx, ty, tz, 1, 0, 0);
|
|
82
|
+
push(verts, bx, by, bz, nx, ny, nz, tx, ty, tz, 1, 1, 0);
|
|
83
|
+
push(verts, cx, cy, cz, nx, ny, nz, tx, ty, tz, 1, 0, 1);
|
|
84
|
+
out.push(base, base + 1, base + 2);
|
|
85
|
+
}
|
|
86
|
+
return { vertices: new Float32Array(verts), indices: new Uint16Array(out) };
|
|
87
|
+
}
|
|
88
|
+
|
|
89
|
+
/**
|
|
90
|
+
* Y-aligned capsule: a cylinder (radius `r`, half-height `halfHeight`) capped by
|
|
91
|
+
* two hemispheres of radius `r`, centred at the origin (total height
|
|
92
|
+
* 2·(halfHeight + r)). Unlike the sphere/cube, a capsule has two independent
|
|
93
|
+
* dimensions and spherical caps that must not distort under non-uniform scale —
|
|
94
|
+
* so it is built at its real size and rendered with unit scale (the bridge caches
|
|
95
|
+
* one mesh per distinct radius/half-height). Rings run top pole → bottom pole;
|
|
96
|
+
* the two equator rings (`ny = 0`, full radius) bound the straight cylinder wall.
|
|
97
|
+
*/
|
|
98
|
+
export function capsuleMesh(r: number, halfHeight: number, capRings = 8, segments = 24): ShapeMesh {
|
|
99
|
+
const rows: { y: number; rr: number; ny: number }[] = [];
|
|
100
|
+
for (let i = 0; i <= capRings; i++) { // top cap: pole → equator
|
|
101
|
+
const a = (i / capRings) * (Math.PI / 2);
|
|
102
|
+
rows.push({ y: halfHeight + r * Math.cos(a), rr: r * Math.sin(a), ny: Math.cos(a) });
|
|
103
|
+
}
|
|
104
|
+
rows.push({ y: -halfHeight, rr: r, ny: 0 }); // cylinder bottom rim
|
|
105
|
+
for (let i = 1; i <= capRings; i++) { // bottom cap: equator → pole
|
|
106
|
+
const b = (i / capRings) * (Math.PI / 2);
|
|
107
|
+
rows.push({ y: -halfHeight - r * Math.sin(b), rr: r * Math.cos(b), ny: -Math.sin(b) });
|
|
108
|
+
}
|
|
109
|
+
const verts: number[] = [];
|
|
110
|
+
const stride = segments + 1;
|
|
111
|
+
for (let row = 0; row < rows.length; row++) {
|
|
112
|
+
const { y, rr, ny } = rows[row];
|
|
113
|
+
const rad = Math.sqrt(Math.max(0, 1 - ny * ny)); // radial component of the unit normal
|
|
114
|
+
for (let seg = 0; seg <= segments; seg++) {
|
|
115
|
+
const phi = (seg / segments) * Math.PI * 2;
|
|
116
|
+
const cp = Math.cos(phi), sp = Math.sin(phi);
|
|
117
|
+
push(verts, rr * cp, y, rr * sp, rad * cp, ny, rad * sp, -sp, 0, cp, 1, seg / segments, row / (rows.length - 1));
|
|
118
|
+
}
|
|
119
|
+
}
|
|
120
|
+
const indices: number[] = [];
|
|
121
|
+
for (let row = 0; row < rows.length - 1; row++) {
|
|
122
|
+
for (let seg = 0; seg < segments; seg++) {
|
|
123
|
+
const a = row * stride + seg, b = a + stride;
|
|
124
|
+
indices.push(a, b, a + 1, a + 1, b, b + 1);
|
|
125
|
+
}
|
|
126
|
+
}
|
|
127
|
+
return { vertices: new Float32Array(verts), indices: new Uint16Array(indices) };
|
|
128
|
+
}
|
|
129
|
+
|
|
130
|
+
/** Cube spanning [-1, 1] on each axis, one material-space UV per face. */
|
|
131
|
+
export function unitCube(): ShapeMesh {
|
|
132
|
+
const verts: number[] = [];
|
|
133
|
+
const indices: number[] = [];
|
|
134
|
+
let base = 0;
|
|
135
|
+
for (const f of CUBE_FACES) {
|
|
136
|
+
const [nx, ny, nz] = f.n, [ux, uy, uz] = f.u, [vx, vy, vz] = f.v;
|
|
137
|
+
const corner = (su: number, sv: number, tu: number, tv: number): void => {
|
|
138
|
+
push(verts,
|
|
139
|
+
nx + su * ux + sv * vx, ny + su * uy + sv * vy, nz + su * uz + sv * vz,
|
|
140
|
+
nx, ny, nz, ux, uy, uz, 1, tu, tv);
|
|
141
|
+
};
|
|
142
|
+
corner(-1, -1, 0, 0);
|
|
143
|
+
corner(1, -1, 1, 0);
|
|
144
|
+
corner(1, 1, 1, 1);
|
|
145
|
+
corner(-1, 1, 0, 1);
|
|
146
|
+
indices.push(base, base + 1, base + 2, base, base + 2, base + 3);
|
|
147
|
+
base += 4;
|
|
148
|
+
}
|
|
149
|
+
return { vertices: new Float32Array(verts), indices: new Uint16Array(indices) };
|
|
150
|
+
}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
// © 2026 Adobe. MIT License. See /LICENSE for details.
|
|
2
|
+
|
|
3
|
+
import type { ShapeMesh } from "./shape-mesh.js";
|
|
4
|
+
|
|
5
|
+
/** Upload a procedural shape mesh into GPU vertex + index buffers (one-time,
|
|
6
|
+
* when the device is ready). Shared by `shapeGeometry` (sphere/cube) and the
|
|
7
|
+
* physics bridge (per-dimension capsules). */
|
|
8
|
+
export function uploadShapeMesh(device: GPUDevice, mesh: ShapeMesh): { vb: GPUBuffer; ib: GPUBuffer; count: number } {
|
|
9
|
+
const vb = device.createBuffer({ size: mesh.vertices.byteLength, usage: GPUBufferUsage.VERTEX | GPUBufferUsage.COPY_DST });
|
|
10
|
+
device.queue.writeBuffer(vb, 0, mesh.vertices);
|
|
11
|
+
const ib = device.createBuffer({ size: mesh.indices.byteLength, usage: GPUBufferUsage.INDEX | GPUBufferUsage.COPY_DST });
|
|
12
|
+
device.queue.writeBuffer(ib, 0, mesh.indices);
|
|
13
|
+
return { vb, ib, count: mesh.indices.length };
|
|
14
|
+
}
|
|
@@ -0,0 +1,88 @@
|
|
|
1
|
+
// © 2026 Adobe. MIT License. See /LICENSE for details.
|
|
2
|
+
|
|
3
|
+
import { Database } from "@adobe/data/ecs";
|
|
4
|
+
import { Aabb, Mat4x4, type Vec3 } from "@adobe/data/math";
|
|
5
|
+
import { transform } from "../node/transform-plugin.js";
|
|
6
|
+
import { modelLoader } from "./model-loader-plugin.js";
|
|
7
|
+
|
|
8
|
+
/**
|
|
9
|
+
* worldBoundsCreate
|
|
10
|
+
* query: Model-_worldBounds
|
|
11
|
+
* write: _worldBounds (archetype migration; unit placeholder)
|
|
12
|
+
*
|
|
13
|
+
* Adds the `_worldBounds` column to any Model that doesn't have it yet, so
|
|
14
|
+
* `worldBoundsSystem` can write directly without further migration.
|
|
15
|
+
*
|
|
16
|
+
* worldBoundsSystem
|
|
17
|
+
* query: Model+_worldMatrix+_worldBounds
|
|
18
|
+
* read: geometry → _bounds, _worldMatrix
|
|
19
|
+
* write: _worldBounds
|
|
20
|
+
*
|
|
21
|
+
* Transforms the asset-space AABB on each Model's `geometry` by the Model's
|
|
22
|
+
* `_worldMatrix` (all 8 corners, reduce to min/max) and writes the result.
|
|
23
|
+
* Geometries still loading have no `_bounds` yet — those Models are skipped
|
|
24
|
+
* until the asset finishes; their `_worldBounds` stays at its placeholder.
|
|
25
|
+
*
|
|
26
|
+
* Cost: one matrix-vec multiply × 8 corners × N visible Models, per frame.
|
|
27
|
+
* At N=1000 that's ~8K vec3 ops; well under 0.1ms on modern CPUs.
|
|
28
|
+
*/
|
|
29
|
+
export const worldBounds = Database.Plugin.create({
|
|
30
|
+
extends: Database.Plugin.combine(modelLoader, transform),
|
|
31
|
+
systems: {
|
|
32
|
+
worldBoundsCreate: {
|
|
33
|
+
schedule: { after: ["transformCreateWorldMatrix"] },
|
|
34
|
+
create: db => () => {
|
|
35
|
+
for (const arch of db.store.queryArchetypes(
|
|
36
|
+
["geometry", "_worldMatrix"],
|
|
37
|
+
{ exclude: ["_worldBounds"] },
|
|
38
|
+
)) {
|
|
39
|
+
const ids = arch.columns.id;
|
|
40
|
+
// Iterate tail→head: every row migrates out of this archetype.
|
|
41
|
+
for (let i = arch.rowCount - 1; i >= 0; i--) {
|
|
42
|
+
db.store.update(ids.get(i), { _worldBounds: Aabb.unit });
|
|
43
|
+
}
|
|
44
|
+
}
|
|
45
|
+
},
|
|
46
|
+
},
|
|
47
|
+
worldBoundsSystem: {
|
|
48
|
+
schedule: { after: ["transformSystem", "worldBoundsCreate"] },
|
|
49
|
+
create: db => () => {
|
|
50
|
+
for (const arch of db.store.queryArchetypes([
|
|
51
|
+
"geometry", "_worldMatrix", "_worldBounds",
|
|
52
|
+
])) {
|
|
53
|
+
const geos = arch.columns.geometry;
|
|
54
|
+
const worldMats = arch.columns._worldMatrix;
|
|
55
|
+
const worldBoundsCol = arch.columns._worldBounds;
|
|
56
|
+
for (let i = 0; i < arch.rowCount; i++) {
|
|
57
|
+
const localBounds = db.store.get(geos.get(i), "_bounds");
|
|
58
|
+
if (!localBounds) continue;
|
|
59
|
+
worldBoundsCol.set(i, transformAabb(localBounds, worldMats.get(i)));
|
|
60
|
+
}
|
|
61
|
+
}
|
|
62
|
+
},
|
|
63
|
+
},
|
|
64
|
+
},
|
|
65
|
+
});
|
|
66
|
+
|
|
67
|
+
const transformAabb = (local: Aabb, m: Mat4x4): Aabb => {
|
|
68
|
+
const { min, max } = local;
|
|
69
|
+
let minX = Infinity, minY = Infinity, minZ = Infinity;
|
|
70
|
+
let maxX = -Infinity, maxY = -Infinity, maxZ = -Infinity;
|
|
71
|
+
// The 8 box corners.
|
|
72
|
+
for (let cx = 0; cx < 2; cx++) {
|
|
73
|
+
for (let cy = 0; cy < 2; cy++) {
|
|
74
|
+
for (let cz = 0; cz < 2; cz++) {
|
|
75
|
+
const corner: Vec3 = [
|
|
76
|
+
cx === 0 ? min[0] : max[0],
|
|
77
|
+
cy === 0 ? min[1] : max[1],
|
|
78
|
+
cz === 0 ? min[2] : max[2],
|
|
79
|
+
];
|
|
80
|
+
const w = Mat4x4.multiplyVec3(m, corner);
|
|
81
|
+
if (w[0] < minX) minX = w[0]; if (w[0] > maxX) maxX = w[0];
|
|
82
|
+
if (w[1] < minY) minY = w[1]; if (w[1] > maxY) maxY = w[1];
|
|
83
|
+
if (w[2] < minZ) minZ = w[2]; if (w[2] > maxZ) maxZ = w[2];
|
|
84
|
+
}
|
|
85
|
+
}
|
|
86
|
+
}
|
|
87
|
+
return { min: [minX, minY, minZ], max: [maxX, maxY, maxZ] };
|
|
88
|
+
};
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
// © 2026 Adobe. MIT License. See /LICENSE for details.
|
|
2
|
+
|
|
3
|
+
import { Database, Entity } from "@adobe/data/ecs";
|
|
4
|
+
import { Aabb, Mat4x4, Quat, Vec3 } from "@adobe/data/math";
|
|
5
|
+
import { True } from "@adobe/data/schema";
|
|
6
|
+
|
|
7
|
+
/**
|
|
8
|
+
* The transform-hierarchy core model. Every entity with a position in the
|
|
9
|
+
* world is a `Node` — see `node.ts` for the field bundle.
|
|
10
|
+
*
|
|
11
|
+
* `_worldMatrix` and `_worldBounds` are declared as components but NOT listed
|
|
12
|
+
* on the authored Node archetype — systems write them via `db.store.update`,
|
|
13
|
+
* migrating each entity once into a wider archetype.
|
|
14
|
+
*/
|
|
15
|
+
export const nodeData = Database.Plugin.create({
|
|
16
|
+
components: {
|
|
17
|
+
visible: True.schema,
|
|
18
|
+
position: Vec3.schema,
|
|
19
|
+
rotation: Quat.schema,
|
|
20
|
+
scale: Vec3.schema,
|
|
21
|
+
parent: Entity.schema,
|
|
22
|
+
_worldMatrix: Mat4x4.schema,
|
|
23
|
+
_worldBounds: Aabb.schema,
|
|
24
|
+
},
|
|
25
|
+
archetypes: {
|
|
26
|
+
Node: ["position", "rotation", "scale", "parent", "visible"],
|
|
27
|
+
},
|
|
28
|
+
});
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
// © 2026 Adobe. MIT License. See /LICENSE for details.
|
|
2
|
+
|
|
3
|
+
import { Database } from "@adobe/data/ecs";
|
|
4
|
+
import { nodeData } from "./node-data-plugin.js";
|
|
5
|
+
import { transform } from "./transform-plugin.js";
|
|
6
|
+
|
|
7
|
+
/**
|
|
8
|
+
* Full node plugin — spatial hierarchy data plus the `transform` system that
|
|
9
|
+
* derives `_worldMatrix` each frame. Use `Node.plugin` (= this) to get both.
|
|
10
|
+
* Use `nodeData` directly if you only need the declared components and archetype
|
|
11
|
+
* without the per-frame TRS computation.
|
|
12
|
+
*/
|
|
13
|
+
export const plugin = Database.Plugin.combine(nodeData, transform);
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
// © 2026 Adobe. MIT License. See /LICENSE for details.
|
|
2
|
+
|
|
3
|
+
import type { Entity } from "@adobe/data/ecs";
|
|
4
|
+
import type { Quat, Vec3 } from "@adobe/data/math";
|
|
5
|
+
|
|
6
|
+
/**
|
|
7
|
+
* One entity in the Node archetype — a transform-hierarchy slot. Each field
|
|
8
|
+
* is its own ECS component (typed-buffer column), but the Node shape names
|
|
9
|
+
* the bundle so consumers can declare typed locals like
|
|
10
|
+
* `const node: Node = arch.read(i)`.
|
|
11
|
+
*
|
|
12
|
+
* `_worldMatrix` is *not* on the authored Node — the `transform` system
|
|
13
|
+
* adds it later, migrating each entity into a wider archetype.
|
|
14
|
+
*/
|
|
15
|
+
export interface Node {
|
|
16
|
+
position: Vec3;
|
|
17
|
+
rotation: Quat;
|
|
18
|
+
scale: Vec3;
|
|
19
|
+
parent: Entity;
|
|
20
|
+
visible: boolean;
|
|
21
|
+
}
|
|
22
|
+
|
|
23
|
+
export * as Node from "./public.js";
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export { plugin } from "./node-plugin.js";
|
|
@@ -0,0 +1,72 @@
|
|
|
1
|
+
// © 2026 Adobe. MIT License. See /LICENSE for details.
|
|
2
|
+
|
|
3
|
+
import { Database } from "@adobe/data/ecs";
|
|
4
|
+
import { Mat4x4, Quat } from "@adobe/data/math";
|
|
5
|
+
import { nodeData } from "./node-data-plugin.js";
|
|
6
|
+
|
|
7
|
+
/**
|
|
8
|
+
* transformCreateWorldMatrix
|
|
9
|
+
* query: Node-_worldMatrix
|
|
10
|
+
* write: _worldMatrix (archetype migration; identity)
|
|
11
|
+
*
|
|
12
|
+
* Adds the `_worldMatrix` column to any Node that doesn't have it yet, so
|
|
13
|
+
* `transformSystem` can assume the column exists and write to it directly.
|
|
14
|
+
*
|
|
15
|
+
* transformSystem
|
|
16
|
+
* query: Node+_worldMatrix
|
|
17
|
+
* read: position, rotation, scale, parent
|
|
18
|
+
* write: _worldMatrix
|
|
19
|
+
*
|
|
20
|
+
* Computes TRS for every Node and writes the result into the existing
|
|
21
|
+
* `_worldMatrix` column. Parents are typically inserted before children
|
|
22
|
+
* (glTF order, sample setup), so by the time we reach a child the parent's
|
|
23
|
+
* matrix is already populated this frame.
|
|
24
|
+
*/
|
|
25
|
+
export const transform = Database.Plugin.create({
|
|
26
|
+
extends: nodeData,
|
|
27
|
+
systems: {
|
|
28
|
+
transformCreateWorldMatrix: {
|
|
29
|
+
create: db => () => {
|
|
30
|
+
for (const arch of db.store.queryArchetypes(
|
|
31
|
+
["position", "rotation", "scale", "parent"],
|
|
32
|
+
{ exclude: ["_worldMatrix"] },
|
|
33
|
+
)) {
|
|
34
|
+
const ids = arch.columns.id;
|
|
35
|
+
// Iterate tail→head: every row migrates out of this archetype,
|
|
36
|
+
// and removing the last row first means no hole-fill shift.
|
|
37
|
+
for (let i = arch.rowCount - 1; i >= 0; i--) {
|
|
38
|
+
db.store.update(ids.get(i), { _worldMatrix: Mat4x4.identity });
|
|
39
|
+
}
|
|
40
|
+
}
|
|
41
|
+
},
|
|
42
|
+
},
|
|
43
|
+
transformSystem: {
|
|
44
|
+
schedule: { after: ["transformCreateWorldMatrix"] },
|
|
45
|
+
create: db => () => {
|
|
46
|
+
for (const arch of db.store.queryArchetypes([
|
|
47
|
+
"position", "rotation", "scale", "parent", "_worldMatrix",
|
|
48
|
+
])) {
|
|
49
|
+
const positions = arch.columns.position;
|
|
50
|
+
const rotations = arch.columns.rotation;
|
|
51
|
+
const scales = arch.columns.scale;
|
|
52
|
+
const parents = arch.columns.parent;
|
|
53
|
+
const worldMats = arch.columns._worldMatrix;
|
|
54
|
+
for (let i = 0; i < arch.rowCount; i++) {
|
|
55
|
+
const pos = positions.get(i);
|
|
56
|
+
const rot = rotations.get(i);
|
|
57
|
+
const scl = scales.get(i);
|
|
58
|
+
const parentId = parents.get(i);
|
|
59
|
+
const local = Mat4x4.multiply(
|
|
60
|
+
Mat4x4.translation(pos[0], pos[1], pos[2]),
|
|
61
|
+
Mat4x4.multiply(Quat.toMat4(rot), Mat4x4.scaling(scl[0], scl[1], scl[2])),
|
|
62
|
+
);
|
|
63
|
+
const parentWorld = parentId === 0
|
|
64
|
+
? Mat4x4.identity
|
|
65
|
+
: db.store.get(parentId, "_worldMatrix") ?? Mat4x4.identity;
|
|
66
|
+
worldMats.set(i, parentId === 0 ? local : Mat4x4.multiply(parentWorld, local));
|
|
67
|
+
}
|
|
68
|
+
}
|
|
69
|
+
},
|
|
70
|
+
},
|
|
71
|
+
},
|
|
72
|
+
});
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
// © 2026 Adobe. MIT License. See /LICENSE for details.
|
|
2
|
+
|
|
3
|
+
import { Database } from "@adobe/data/ecs";
|
|
4
|
+
import { plugin as nodePlugin } from "./node/node-plugin.js";
|
|
5
|
+
import { model } from "./model/model-plugin.js";
|
|
6
|
+
import { SceneUniforms } from "./scene-uniforms/scene-uniforms.js";
|
|
7
|
+
|
|
8
|
+
/**
|
|
9
|
+
* The complete authored scene — spatial hierarchy, models, camera, lighting,
|
|
10
|
+
* and the GPU uniform buffer that ties them together for rendering.
|
|
11
|
+
*
|
|
12
|
+
* Combines:
|
|
13
|
+
* - `Node.plugin` (node data + transform system)
|
|
14
|
+
* - `model` (Geometry + Model archetypes)
|
|
15
|
+
* - `SceneUniforms.plugin` (camera resource + light resource + GPU uniform packing)
|
|
16
|
+
*
|
|
17
|
+
* Add a camera controller (e.g. `Orbit.plugin`), animation, and a renderer
|
|
18
|
+
* (`pbrIblRender`) to get a working interactive scene.
|
|
19
|
+
*/
|
|
20
|
+
export const scene = Database.Plugin.combine(nodePlugin, model, SceneUniforms.plugin);
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
// © 2026 Adobe. MIT License. See /LICENSE for details.
|
|
2
|
+
|
|
3
|
+
/**
|
|
4
|
+
* Bind group layout for the SceneUniforms uniform buffer. Stable across the
|
|
5
|
+
* renderer pipeline (consumer) and `_sceneUniforms` system (producer).
|
|
6
|
+
* WebGPU compares layouts structurally, so creating two layout objects from
|
|
7
|
+
* this descriptor is safe.
|
|
8
|
+
*/
|
|
9
|
+
export function createBindGroupLayout(device: GPUDevice): GPUBindGroupLayout {
|
|
10
|
+
return device.createBindGroupLayout({
|
|
11
|
+
entries: [
|
|
12
|
+
{
|
|
13
|
+
binding: 0,
|
|
14
|
+
visibility: GPUShaderStage.VERTEX | GPUShaderStage.FRAGMENT,
|
|
15
|
+
buffer: { type: "uniform" },
|
|
16
|
+
},
|
|
17
|
+
],
|
|
18
|
+
});
|
|
19
|
+
}
|