@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,251 @@
|
|
|
1
|
+
// © 2026 Adobe. MIT License. See /LICENSE for details.
|
|
2
|
+
|
|
3
|
+
import RAPIER from "@dimforge/rapier3d-compat";
|
|
4
|
+
import { Database, type Entity } from "@adobe/data/ecs";
|
|
5
|
+
import { True } from "@adobe/data/schema";
|
|
6
|
+
import { physicsClock } from "../physics-clock-plugin.js";
|
|
7
|
+
import { physicsData } from "../physics-data-plugin.js";
|
|
8
|
+
import { jointData } from "../joint/joint-plugin.js";
|
|
9
|
+
import { BodyType } from "../body/body-type/body-type.js";
|
|
10
|
+
import { ColliderShape } from "../body/collider-shape/collider-shape.js";
|
|
11
|
+
|
|
12
|
+
/**
|
|
13
|
+
* A second rigid-body solver behind the same `physicsData` seam — the
|
|
14
|
+
* battle-tested Rapier engine (dimforge, Rust→WASM). It reads the identical
|
|
15
|
+
* authored components (`RigidBody` + `StaticCollider`) and writes back
|
|
16
|
+
* `position`/`rotation`/velocity for dynamic bodies, exactly like `joltSolver`,
|
|
17
|
+
* so the same scene runs unchanged on either solver.
|
|
18
|
+
*
|
|
19
|
+
* Rapier's WASM must be initialised before use; per the repo's no-top-level-await
|
|
20
|
+
* rule, the init promise lives in the system closure and is awaited lazily — the
|
|
21
|
+
* system no-ops until the world exists, then runs every frame.
|
|
22
|
+
*/
|
|
23
|
+
|
|
24
|
+
const GRAVITY = 18; // matches joltSolver so the two solvers are directly comparable
|
|
25
|
+
|
|
26
|
+
const RIGID = ["bodyType", "colliderShape", "halfExtents", "material", "position", "rotation", "linearVelocity", "angularVelocity"] as const;
|
|
27
|
+
const STATIC = ["colliderShape", "halfExtents", "material", "position", "rotation"] as const;
|
|
28
|
+
// Dynamic bodies carry the derived prev-pose snapshot (added on first sync) used
|
|
29
|
+
// for render interpolation; this query reads/writes it alongside the live pose.
|
|
30
|
+
const SNAPSHOT = ["bodyType", "position", "rotation", "_prevPosition", "_prevRotation"] as const;
|
|
31
|
+
// Sync only over bodies not yet mirrored into Rapier: a private `_rapierBody`
|
|
32
|
+
// tag is added once a body is created, and excluded here, so steady state
|
|
33
|
+
// iterates zero rows (archetype-level) instead of re-scanning every body each
|
|
34
|
+
// frame — the win for the "many static, few dynamic" target.
|
|
35
|
+
const NEW_RIGID = { exclude: ["_rapierBody"] } as const;
|
|
36
|
+
const NEW_STATIC = { exclude: ["linearVelocity", "_rapierBody"] } as const;
|
|
37
|
+
// Kinematic bodies, by archetype shape (no per-row value test): they have
|
|
38
|
+
// `bodyType` (so not a StaticCollider) and are mirrored (`_rapierBody`) but never
|
|
39
|
+
// gained `_prevPosition` (only dynamics do) — so excluding it isolates kinematics.
|
|
40
|
+
const KINEMATIC = ["bodyType", "position", "rotation", "_rapierBody"] as const;
|
|
41
|
+
const KINEMATIC_ONLY = { exclude: ["_prevPosition"] } as const;
|
|
42
|
+
const JOINT = ["jointType", "jointBodyA", "jointBodyB", "jointAnchorA", "jointAnchorB", "jointAxis", "jointMinLimit", "jointMaxLimit", "jointSwingLimit"] as const;
|
|
43
|
+
const NEW_JOINT = { exclude: ["_rapierJoint"] } as const;
|
|
44
|
+
|
|
45
|
+
interface MatProps { density: number; restitution: number; friction: number }
|
|
46
|
+
|
|
47
|
+
export const rapierSolver = Database.Plugin.create({
|
|
48
|
+
extends: Database.Plugin.combine(physicsData, jointData, physicsClock),
|
|
49
|
+
components: {
|
|
50
|
+
_rapierBody: True.schema, // tag: this body has been mirrored into the Rapier world
|
|
51
|
+
_rapierJoint: True.schema, // tag: this joint has been mirrored into the Rapier world
|
|
52
|
+
},
|
|
53
|
+
systems: {
|
|
54
|
+
rapierStep: {
|
|
55
|
+
schedule: { during: ["physics"], after: ["advancePhysicsClock"] },
|
|
56
|
+
create: db => {
|
|
57
|
+
let world: RAPIER.World | null = null;
|
|
58
|
+
let initStarted = false;
|
|
59
|
+
const bodies = new Map<Entity, RAPIER.RigidBody>(); // entity → Rapier body
|
|
60
|
+
|
|
61
|
+
const matPropsOf = (id: Entity): MatProps => {
|
|
62
|
+
// Material entities carry density/restitution/friction (read once at body creation).
|
|
63
|
+
const m = db.store.read(id) as { density?: number; restitution?: number; friction?: number } | null;
|
|
64
|
+
return { density: m?.density ?? 1, restitution: m?.restitution ?? 0.2, friction: m?.friction ?? 0.5 };
|
|
65
|
+
};
|
|
66
|
+
|
|
67
|
+
// hull/mesh colliders may be auto-generated from a model that's still
|
|
68
|
+
// loading — defer mirroring such a body until its collision data exists.
|
|
69
|
+
const colliderReady = (id: Entity, shape: ColliderShape): boolean => {
|
|
70
|
+
if (shape !== "hull" && shape !== "mesh") return true;
|
|
71
|
+
const r = db.store.read(id) as { convexPoints?: unknown; colliderMesh?: unknown } | null;
|
|
72
|
+
return !!(r?.convexPoints || r?.colliderMesh);
|
|
73
|
+
};
|
|
74
|
+
|
|
75
|
+
const ensureBody = (id: Entity, motion: BodyType, shape: ColliderShape, hx: number, hy: number, hz: number, mat: Entity, px: number, py: number, pz: number, q: ArrayLike<number>, vx: number, vy: number, vz: number, wx: number, wy: number, wz: number): void => {
|
|
76
|
+
if (!world || bodies.has(id)) return;
|
|
77
|
+
const m = matPropsOf(mat);
|
|
78
|
+
// dynamic = simulated; kinematic = position-driven (pushes dynamics,
|
|
79
|
+
// isn't pushed back); fixed = immovable collider.
|
|
80
|
+
const desc = motion === "dynamic" ? RAPIER.RigidBodyDesc.dynamic()
|
|
81
|
+
: motion === "kinematic" ? RAPIER.RigidBodyDesc.kinematicPositionBased()
|
|
82
|
+
: RAPIER.RigidBodyDesc.fixed();
|
|
83
|
+
desc.setTranslation(px, py, pz).setRotation({ x: q[0], y: q[1], z: q[2], w: q[3] });
|
|
84
|
+
if (motion === "dynamic") { desc.setLinvel(vx, vy, vz); desc.setAngvel({ x: wx, y: wy, z: wz }); }
|
|
85
|
+
const body = world.createRigidBody(desc);
|
|
86
|
+
// capsule: Y-aligned, halfHeight = cylinder half (hy), radius = hx.
|
|
87
|
+
// hull: convex hull of the authored point cloud (read once here).
|
|
88
|
+
let col: RAPIER.ColliderDesc | null;
|
|
89
|
+
if (shape === "sphere") col = RAPIER.ColliderDesc.ball(hx);
|
|
90
|
+
else if (shape === "capsule") col = RAPIER.ColliderDesc.capsule(hy, hx);
|
|
91
|
+
else if (shape === "hull") {
|
|
92
|
+
const pts = (db.store.read(id) as { convexPoints?: Float32Array | null }).convexPoints;
|
|
93
|
+
col = pts ? RAPIER.ColliderDesc.convexHull(pts) : null;
|
|
94
|
+
if (!col) col = RAPIER.ColliderDesc.ball(Math.max(hx, 0.1)); // degenerate cloud fallback
|
|
95
|
+
} else if (shape === "mesh") {
|
|
96
|
+
const cm = (db.store.read(id) as { colliderMesh?: { positions: Float32Array; indices: Uint32Array } | null }).colliderMesh;
|
|
97
|
+
col = cm ? RAPIER.ColliderDesc.trimesh(cm.positions, cm.indices) : RAPIER.ColliderDesc.cuboid(0.1, 0.1, 0.1);
|
|
98
|
+
} else col = RAPIER.ColliderDesc.cuboid(hx, hy, hz);
|
|
99
|
+
col.setRestitution(m.restitution).setFriction(m.friction).setDensity(m.density);
|
|
100
|
+
// collisionGroup g (>0): membership bit g, collide with everything
|
|
101
|
+
// except bit g — so same-group bodies (e.g. a ragdoll's bones) skip
|
|
102
|
+
// each other but still hit the world (group 0).
|
|
103
|
+
const g = (db.store.read(id) as { collisionGroup?: number } | null)?.collisionGroup ?? 0;
|
|
104
|
+
if (g > 0) { const bit = 1 << (g & 15); col.setCollisionGroups(((bit << 16) | (0xffff & ~bit)) >>> 0); }
|
|
105
|
+
world.createCollider(col, body);
|
|
106
|
+
bodies.set(id, body);
|
|
107
|
+
};
|
|
108
|
+
|
|
109
|
+
return () => {
|
|
110
|
+
if (!world) {
|
|
111
|
+
if (!initStarted) {
|
|
112
|
+
initStarted = true;
|
|
113
|
+
RAPIER.init().then(() => { world = new RAPIER.World({ x: 0, y: -GRAVITY, z: 0 }); });
|
|
114
|
+
}
|
|
115
|
+
return; // WASM not ready yet
|
|
116
|
+
}
|
|
117
|
+
|
|
118
|
+
// sync: mirror only bodies not yet in Rapier (excluded by tag),
|
|
119
|
+
// then tag them. Iterate tail→head since every row migrates out
|
|
120
|
+
// on tagging. Reads use column accessors (robust to the migration;
|
|
121
|
+
// this loop only touches genuinely-new bodies, so it's cold).
|
|
122
|
+
for (const arch of db.store.queryArchetypes(RIGID, NEW_RIGID)) {
|
|
123
|
+
const ids = arch.columns.id, bt = arch.columns.bodyType, cs = arch.columns.colliderShape, mat = arch.columns.material;
|
|
124
|
+
const he = arch.columns.halfExtents, pos = arch.columns.position, ori = arch.columns.rotation, lv = arch.columns.linearVelocity, av = arch.columns.angularVelocity;
|
|
125
|
+
for (let r = arch.rowCount - 1; r >= 0; r--) {
|
|
126
|
+
const id = ids.get(r), bodyType = bt.get(r), shape = cs.get(r), h = he.get(r), p = pos.get(r), o = ori.get(r), v = lv.get(r), w = av.get(r);
|
|
127
|
+
if (!colliderReady(id, shape)) continue; // auto-collider not generated yet
|
|
128
|
+
ensureBody(id, bodyType, shape, h[0], h[1], h[2], mat.get(r), p[0], p[1], p[2], o, v[0], v[1], v[2], w[0], w[1], w[2]);
|
|
129
|
+
// Tag as mirrored. Dynamics also migrate onto the derived prev-pose
|
|
130
|
+
// snapshot (the interpolator reads it); kinematic bodies are authored
|
|
131
|
+
// each frame, so they render at the live pose with no snapshot — the
|
|
132
|
+
// _prevPosition absence is exactly what the kinematic-drive query keys on.
|
|
133
|
+
db.store.update(id, BodyType.isDynamic(bodyType) ? { _rapierBody: true, _prevPosition: p, _prevRotation: o } : { _rapierBody: true });
|
|
134
|
+
}
|
|
135
|
+
}
|
|
136
|
+
for (const arch of db.store.queryArchetypes(STATIC, NEW_STATIC)) {
|
|
137
|
+
const ids = arch.columns.id, cs = arch.columns.colliderShape, mat = arch.columns.material;
|
|
138
|
+
const he = arch.columns.halfExtents, pos = arch.columns.position, ori = arch.columns.rotation;
|
|
139
|
+
for (let r = arch.rowCount - 1; r >= 0; r--) {
|
|
140
|
+
const id = ids.get(r), shape = cs.get(r), h = he.get(r), p = pos.get(r);
|
|
141
|
+
if (!colliderReady(id, shape)) continue; // auto-collider not generated yet
|
|
142
|
+
ensureBody(id, "static", shape, h[0], h[1], h[2], mat.get(r), p[0], p[1], p[2], ori.get(r), 0, 0, 0, 0, 0, 0);
|
|
143
|
+
db.store.update(id, { _rapierBody: true });
|
|
144
|
+
}
|
|
145
|
+
}
|
|
146
|
+
|
|
147
|
+
// Mirror new joints once both their bodies exist (tag + exclude;
|
|
148
|
+
// tail→head since tagging migrates the row). Anchors are body-local.
|
|
149
|
+
for (const arch of db.store.queryArchetypes(JOINT, NEW_JOINT)) {
|
|
150
|
+
const ids = arch.columns.id, jt = arch.columns.jointType;
|
|
151
|
+
const ba = arch.columns.jointBodyA, bb = arch.columns.jointBodyB;
|
|
152
|
+
const aa = arch.columns.jointAnchorA, ab = arch.columns.jointAnchorB, axc = arch.columns.jointAxis;
|
|
153
|
+
const lo = arch.columns.jointMinLimit, hi = arch.columns.jointMaxLimit;
|
|
154
|
+
for (let r = arch.rowCount - 1; r >= 0; r--) {
|
|
155
|
+
const a = bodies.get(ba.get(r)), b = bodies.get(bb.get(r));
|
|
156
|
+
if (!a || !b) continue; // a body isn't mirrored yet — retry next frame
|
|
157
|
+
const type = jt.get(r), pa = aa.get(r), pb = ab.get(r), ax = axc.get(r), min = lo.get(r), max = hi.get(r);
|
|
158
|
+
const A = { x: pa[0], y: pa[1], z: pa[2] }, B = { x: pb[0], y: pb[1], z: pb[2] };
|
|
159
|
+
let jd: RAPIER.JointData;
|
|
160
|
+
if (type === "fixed") jd = RAPIER.JointData.fixed(A, { x: 0, y: 0, z: 0, w: 1 }, B, { x: 0, y: 0, z: 0, w: 1 });
|
|
161
|
+
else if (type === "hinge") { jd = RAPIER.JointData.revolute(A, B, { x: ax[0], y: ax[1], z: ax[2] }); if (min < max) { jd.limitsEnabled = true; jd.limits = [min, max]; } }
|
|
162
|
+
// point — and cone: the rapier3d-compat binding has no cone/swing-twist
|
|
163
|
+
// limit, so a `cone` joint is approximated as a free spherical (use joltSolver
|
|
164
|
+
// for anatomical ragdoll limits; see physics/README.md).
|
|
165
|
+
else jd = RAPIER.JointData.spherical(A, B);
|
|
166
|
+
world.createImpulseJoint(jd, a, b, true);
|
|
167
|
+
db.store.update(ids.get(r), { _rapierJoint: true });
|
|
168
|
+
}
|
|
169
|
+
}
|
|
170
|
+
|
|
171
|
+
// Step on the fixed clock: 0..N steps of `fixedDt` this frame
|
|
172
|
+
// (decoupled from the render rate). On a stepping frame, snapshot
|
|
173
|
+
// the pose entering the final step into `_prevPosition`/`_prevRotation`
|
|
174
|
+
// first, so the pre-render interpolator can blend prev→current.
|
|
175
|
+
const clock = db.store.resources.physicsClock;
|
|
176
|
+
const steps = clock.steps;
|
|
177
|
+
if (steps === 0) return; // no sim time accrued — leave pose + snapshot intact
|
|
178
|
+
|
|
179
|
+
// Drive kinematic bodies to their authored pose: Rapier moves a
|
|
180
|
+
// position-based kinematic toward the target over the step, deriving
|
|
181
|
+
// the velocity that pushes dynamics. (Author the pose however you like —
|
|
182
|
+
// a system, animation, input — the solver just follows it.)
|
|
183
|
+
const toFlip: Entity[] = []; // kinematic bodies whose bodyType became "dynamic" (ragdoll)
|
|
184
|
+
for (const arch of db.store.queryArchetypes(KINEMATIC, KINEMATIC_ONLY)) {
|
|
185
|
+
const ids = arch.columns.id, bt = arch.columns.bodyType;
|
|
186
|
+
const pos = arch.columns.position.getTypedArray(), ori = arch.columns.rotation.getTypedArray();
|
|
187
|
+
for (let r = 0; r < arch.rowCount; r++) {
|
|
188
|
+
const body = bodies.get(ids.get(r));
|
|
189
|
+
if (!body) continue;
|
|
190
|
+
if (bt.get(r) === "dynamic") { toFlip.push(ids.get(r)); continue; }
|
|
191
|
+
const r3 = r * 3, r4 = r * 4;
|
|
192
|
+
body.setNextKinematicTranslation({ x: pos[r3], y: pos[r3 + 1], z: pos[r3 + 2] });
|
|
193
|
+
body.setNextKinematicRotation({ x: ori[r4], y: ori[r4 + 1], z: ori[r4 + 2], w: ori[r4 + 3] });
|
|
194
|
+
}
|
|
195
|
+
}
|
|
196
|
+
// Flip kinematic→dynamic (after the loop, since migrating the row moves the
|
|
197
|
+
// typed arrays): the engine body becomes dynamic and it gains the prev-pose
|
|
198
|
+
// snapshot, so from now on it's simulated + written back like any dynamic body.
|
|
199
|
+
for (const id of toFlip) {
|
|
200
|
+
const body = bodies.get(id);
|
|
201
|
+
if (!body) continue;
|
|
202
|
+
body.setBodyType(RAPIER.RigidBodyType.Dynamic, true);
|
|
203
|
+
const rec = db.store.read(id) as { position: ArrayLike<number>; rotation: ArrayLike<number> };
|
|
204
|
+
db.store.update(id, {
|
|
205
|
+
_prevPosition: [rec.position[0], rec.position[1], rec.position[2]],
|
|
206
|
+
_prevRotation: [rec.rotation[0], rec.rotation[1], rec.rotation[2], rec.rotation[3]],
|
|
207
|
+
});
|
|
208
|
+
}
|
|
209
|
+
for (const arch of db.store.queryArchetypes(SNAPSHOT)) {
|
|
210
|
+
const bt = arch.columns.bodyType;
|
|
211
|
+
const pos = arch.columns.position.getTypedArray(), ori = arch.columns.rotation.getTypedArray();
|
|
212
|
+
const pp = arch.columns._prevPosition.getTypedArray(), pr = arch.columns._prevRotation.getTypedArray();
|
|
213
|
+
for (let r = 0; r < arch.rowCount; r++) {
|
|
214
|
+
if (!BodyType.isDynamic(bt.get(r))) continue;
|
|
215
|
+
const r3 = r * 3, r4 = r * 4;
|
|
216
|
+
pp[r3] = pos[r3]; pp[r3 + 1] = pos[r3 + 1]; pp[r3 + 2] = pos[r3 + 2];
|
|
217
|
+
pr[r4] = ori[r4]; pr[r4 + 1] = ori[r4 + 1]; pr[r4 + 2] = ori[r4 + 2]; pr[r4 + 3] = ori[r4 + 3];
|
|
218
|
+
}
|
|
219
|
+
}
|
|
220
|
+
world.timestep = clock.fixedDt;
|
|
221
|
+
for (let s = 0; s < steps; s++) world.step();
|
|
222
|
+
|
|
223
|
+
// write the dynamic bodies' new pose + velocity back onto the canonical columns
|
|
224
|
+
for (const arch of db.store.queryArchetypes(RIGID)) {
|
|
225
|
+
const ids = arch.columns.id, bt = arch.columns.bodyType;
|
|
226
|
+
const pos = arch.columns.position.getTypedArray(), ori = arch.columns.rotation.getTypedArray();
|
|
227
|
+
const lv = arch.columns.linearVelocity.getTypedArray(), av = arch.columns.angularVelocity.getTypedArray();
|
|
228
|
+
for (let r = 0; r < arch.rowCount; r++) {
|
|
229
|
+
if (!BodyType.isDynamic(bt.get(r))) continue;
|
|
230
|
+
const body = bodies.get(ids.get(r));
|
|
231
|
+
if (!body) continue;
|
|
232
|
+
// PERF residual: rapier3d-compat returns a fresh {x,y,z}/{x,y,z,w}
|
|
233
|
+
// object from each of these getters → ~4 small allocations per
|
|
234
|
+
// dynamic body per frame (GC pressure). It scales with the *dynamic*
|
|
235
|
+
// count only (small for our target), and the compat binding offers
|
|
236
|
+
// no out-param read, so it's left as-is. If dynamic counts ever get
|
|
237
|
+
// large, drop to rapier's raw bindings (rawBodies / a flat buffer)
|
|
238
|
+
// to read straight into our typed arrays with zero allocation.
|
|
239
|
+
const t = body.translation(), rot = body.rotation(), v = body.linvel(), w = body.angvel();
|
|
240
|
+
const r3 = r * 3, r4 = r * 4;
|
|
241
|
+
pos[r3] = t.x; pos[r3 + 1] = t.y; pos[r3 + 2] = t.z;
|
|
242
|
+
ori[r4] = rot.x; ori[r4 + 1] = rot.y; ori[r4 + 2] = rot.z; ori[r4 + 3] = rot.w;
|
|
243
|
+
lv[r3] = v.x; lv[r3 + 1] = v.y; lv[r3 + 2] = v.z;
|
|
244
|
+
av[r3] = w.x; av[r3 + 1] = w.y; av[r3 + 2] = w.z;
|
|
245
|
+
}
|
|
246
|
+
}
|
|
247
|
+
};
|
|
248
|
+
},
|
|
249
|
+
},
|
|
250
|
+
},
|
|
251
|
+
});
|
|
@@ -0,0 +1,172 @@
|
|
|
1
|
+
// © 2026 Adobe. MIT License. See /LICENSE for details.
|
|
2
|
+
|
|
3
|
+
import { Database } from "@adobe/data/ecs";
|
|
4
|
+
|
|
5
|
+
/**
|
|
6
|
+
* Headless benchmark harness for a physics **solver plugin** (anything built on
|
|
7
|
+
* the `physicsData` seam — `rapierSolver`, `joltSolver`, …). It builds a fixed,
|
|
8
|
+
* deterministic scene (a floor + a grid of bodies dropped to pile up), then
|
|
9
|
+
* advances the simulation at a fixed timestep as fast as the CPU allows and
|
|
10
|
+
* reports the wall-clock cost per frame. No rendering, no rAF, no GPU — so the
|
|
11
|
+
* numbers reflect solver compute only and are directly comparable across plugins.
|
|
12
|
+
*
|
|
13
|
+
* Async because some solvers (Rapier) initialise WASM lazily; the warm-up phase
|
|
14
|
+
* yields to the event loop so that init + scene settling complete before timing.
|
|
15
|
+
*/
|
|
16
|
+
|
|
17
|
+
export interface SolverBenchmarkOptions {
|
|
18
|
+
/** Dynamic bodies dropped into the scene (≈ workload size). Default 256. */
|
|
19
|
+
bodies?: number;
|
|
20
|
+
/** Timed frames. Default 300. */
|
|
21
|
+
frames?: number;
|
|
22
|
+
/** Warm-up frames before timing (lets async init finish + the pile settle). Default 90. */
|
|
23
|
+
warmupFrames?: number;
|
|
24
|
+
/** Fixed timestep per frame (seconds). Default 1/60. */
|
|
25
|
+
dt?: number;
|
|
26
|
+
/** Fraction of `bodies` that are spheres (rest are boxes). Default 0.5. */
|
|
27
|
+
sphereFraction?: number;
|
|
28
|
+
/** Extra *static* collider boxes laid out as resting scenery. They barely
|
|
29
|
+
* cost the engine (nothing moves) but they ARE mirrored once and then scanned
|
|
30
|
+
* by a naive per-frame sync — so this isolates the gather/sync overhead, which
|
|
31
|
+
* is the realistic "many static, few dynamic" target workload. Default 0. */
|
|
32
|
+
staticBodies?: number;
|
|
33
|
+
}
|
|
34
|
+
|
|
35
|
+
export interface SolverBenchmarkResult {
|
|
36
|
+
bodies: number;
|
|
37
|
+
frames: number;
|
|
38
|
+
/** Total wall-clock time of the timed frames (ms). */
|
|
39
|
+
totalMs: number;
|
|
40
|
+
/** Mean cost of one frame (ms) — the headline number. */
|
|
41
|
+
msPerFrame: number;
|
|
42
|
+
/** Simulation frames per real second (1000 / msPerFrame). */
|
|
43
|
+
simFps: number;
|
|
44
|
+
/** Slowest single frame (ms) — surfaces hitches. */
|
|
45
|
+
maxFrameMs: number;
|
|
46
|
+
// --- coarse end-state, for cross-solver parity / sanity (not perf) ---
|
|
47
|
+
avgY: number; // mean height of dynamic bodies (piled ≈ low, exploded ≈ wild)
|
|
48
|
+
maxSpeed: number; // fastest dynamic body (a stable pile is near 0)
|
|
49
|
+
belowFloor: number; // dynamic bodies that sank below the floor top (should be 0)
|
|
50
|
+
}
|
|
51
|
+
|
|
52
|
+
interface LooseStore {
|
|
53
|
+
archetypes: Record<string, { insert(v: unknown): number }>;
|
|
54
|
+
queryArchetypes(include: readonly string[], opts?: { exclude?: readonly string[] }): Iterable<{
|
|
55
|
+
rowCount: number;
|
|
56
|
+
columns: Record<string, { getTypedArray(): { [i: number]: number } }>;
|
|
57
|
+
}>;
|
|
58
|
+
resources: Record<string, unknown>;
|
|
59
|
+
}
|
|
60
|
+
interface LooseDb { store: LooseStore; system: { functions: Record<string, () => unknown>; order?: string[][] }; }
|
|
61
|
+
|
|
62
|
+
const yieldToEventLoop = () => new Promise<void>(r => setTimeout(r, 0));
|
|
63
|
+
|
|
64
|
+
export async function runSolverBenchmark(solver: Database.Plugin, opts: SolverBenchmarkOptions = {}): Promise<SolverBenchmarkResult> {
|
|
65
|
+
const bodies = opts.bodies ?? 256;
|
|
66
|
+
const frames = opts.frames ?? 300;
|
|
67
|
+
const warmupFrames = opts.warmupFrames ?? 90;
|
|
68
|
+
const dt = opts.dt ?? 1 / 60;
|
|
69
|
+
const sphereFraction = opts.sphereFraction ?? 0.5;
|
|
70
|
+
const staticBodies = opts.staticBodies ?? 0;
|
|
71
|
+
|
|
72
|
+
// The solver plugin extends `physicsData`, so the RigidBody / StaticCollider
|
|
73
|
+
// archetypes and the `frameTime` resource exist on the created database. The
|
|
74
|
+
// benchmark drives the sim dynamically, so the store is used through a loose
|
|
75
|
+
// shape (runtime invariant: these members exist on any physicsData solver).
|
|
76
|
+
const db = Database.create(solver) as unknown as LooseDb;
|
|
77
|
+
|
|
78
|
+
buildScene(db, bodies, sphereFraction, staticBodies);
|
|
79
|
+
|
|
80
|
+
// Drive one frame: set a fixed dt, then run every system except the rAF/clock
|
|
81
|
+
// ones (we supply dt ourselves so timing is deterministic and high-rate).
|
|
82
|
+
const order = db.system.order;
|
|
83
|
+
const names = order ? order.flat() : Object.keys(db.system.functions);
|
|
84
|
+
const runNames = names.filter(n => n !== "_frameTime" && n !== "schedulerSystem");
|
|
85
|
+
const tick = (f: number): void => {
|
|
86
|
+
db.store.resources.frameTime = { now: f * dt * 1000, dt, elapsed: f * dt };
|
|
87
|
+
for (const n of runNames) { const fn = db.system.functions[n]; if (fn) fn(); }
|
|
88
|
+
};
|
|
89
|
+
|
|
90
|
+
// Warm-up: yield to the event loop so lazy WASM init (Rapier) completes and
|
|
91
|
+
// the pile settles into a steady-state contact count before we measure.
|
|
92
|
+
for (let f = 0; f < warmupFrames; f++) { tick(f); await yieldToEventLoop(); }
|
|
93
|
+
|
|
94
|
+
// Timed run: tight synchronous loop — pure solver compute.
|
|
95
|
+
let maxFrameMs = 0;
|
|
96
|
+
const t0 = performance.now();
|
|
97
|
+
for (let f = 0; f < frames; f++) {
|
|
98
|
+
const a = performance.now();
|
|
99
|
+
tick(warmupFrames + f);
|
|
100
|
+
const ms = performance.now() - a;
|
|
101
|
+
if (ms > maxFrameMs) maxFrameMs = ms;
|
|
102
|
+
}
|
|
103
|
+
const totalMs = performance.now() - t0;
|
|
104
|
+
|
|
105
|
+
const { avgY, maxSpeed, belowFloor } = sampleState(db);
|
|
106
|
+
return {
|
|
107
|
+
bodies, frames,
|
|
108
|
+
totalMs, msPerFrame: totalMs / frames, simFps: 1000 / (totalMs / frames), maxFrameMs,
|
|
109
|
+
avgY, maxSpeed, belowFloor,
|
|
110
|
+
};
|
|
111
|
+
}
|
|
112
|
+
|
|
113
|
+
/** A thick static floor + `bodies` dynamic bodies in a compact cube grid that
|
|
114
|
+
* drops a short distance and piles up — a steady-state contact workload. The
|
|
115
|
+
* floor is deliberately thick (a finite box has a far side) and the drop is
|
|
116
|
+
* short, so a correct solver never tunnels: end-state avgY/maxV then cleanly
|
|
117
|
+
* separate a stable solver from an exploding one. Optional `staticBodies` adds
|
|
118
|
+
* resting static scenery to exercise the sync/gather path at scale. */
|
|
119
|
+
function buildScene(db: LooseDb, bodies: number, sphereFraction: number, staticBodies: number): void {
|
|
120
|
+
db.store.archetypes.StaticCollider.insert({
|
|
121
|
+
colliderShape: "box", halfExtents: [12, 2, 12], material: 0,
|
|
122
|
+
position: [0, -2, 0], rotation: [0, 0, 0, 1], // top face at y = 0
|
|
123
|
+
});
|
|
124
|
+
// resting static scenery far from the action (negligible engine cost, but it
|
|
125
|
+
// is mirrored once and then scanned every frame by a naive per-frame sync)
|
|
126
|
+
if (staticBodies > 0) {
|
|
127
|
+
const side = Math.ceil(Math.cbrt(staticBodies));
|
|
128
|
+
let n = 0;
|
|
129
|
+
for (let x = 0; x < side && n < staticBodies; x++)
|
|
130
|
+
for (let y = 0; y < side && n < staticBodies; y++)
|
|
131
|
+
for (let z = 0; z < side && n < staticBodies; z++, n++)
|
|
132
|
+
db.store.archetypes.StaticCollider.insert({
|
|
133
|
+
colliderShape: "box", halfExtents: [0.4, 0.4, 0.4], material: 0,
|
|
134
|
+
position: [100 + x, y, z], rotation: [0, 0, 0, 1],
|
|
135
|
+
});
|
|
136
|
+
}
|
|
137
|
+
const side = Math.ceil(Math.cbrt(bodies));
|
|
138
|
+
const gap = 1.5, base = -((side - 1) / 2) * gap; // spaced so the initial drop is non-overlapping
|
|
139
|
+
let n = 0;
|
|
140
|
+
for (let y = 0; y < side && n < bodies; y++) {
|
|
141
|
+
for (let x = 0; x < side && n < bodies; x++) {
|
|
142
|
+
for (let z = 0; z < side && n < bodies; z++, n++) {
|
|
143
|
+
const sphere = ((n * 0x9e3779b1) >>> 0) / 4294967296 < sphereFraction;
|
|
144
|
+
db.store.archetypes.RigidBody.insert({
|
|
145
|
+
bodyType: "dynamic",
|
|
146
|
+
colliderShape: sphere ? "sphere" : "box",
|
|
147
|
+
halfExtents: sphere ? [0.45, 0, 0] : [0.45, 0.45, 0.45],
|
|
148
|
+
material: 0,
|
|
149
|
+
position: [base + x * gap, 0.6 + y * gap, base + z * gap],
|
|
150
|
+
rotation: [0, 0, 0, 1],
|
|
151
|
+
linearVelocity: [0, 0, 0],
|
|
152
|
+
angularVelocity: [0, 0, 0],
|
|
153
|
+
});
|
|
154
|
+
}
|
|
155
|
+
}
|
|
156
|
+
}
|
|
157
|
+
}
|
|
158
|
+
|
|
159
|
+
function sampleState(db: LooseDb): { avgY: number; maxSpeed: number; belowFloor: number } {
|
|
160
|
+
let count = 0, sumY = 0, maxSpeed = 0, belowFloor = 0;
|
|
161
|
+
for (const arch of db.store.queryArchetypes(["linearVelocity", "position"])) {
|
|
162
|
+
const pos = arch.columns.position.getTypedArray(), lv = arch.columns.linearVelocity.getTypedArray();
|
|
163
|
+
for (let r = 0; r < arch.rowCount; r++, count++) {
|
|
164
|
+
const r3 = r * 3, y = pos[r3 + 1];
|
|
165
|
+
sumY += y;
|
|
166
|
+
if (y < -0.5) belowFloor++; // floor top is y = 0; a resting body sits above it
|
|
167
|
+
const sp = Math.hypot(lv[r3], lv[r3 + 1], lv[r3 + 2]);
|
|
168
|
+
if (sp > maxSpeed) maxSpeed = sp;
|
|
169
|
+
}
|
|
170
|
+
}
|
|
171
|
+
return { avgY: count ? sumY / count : 0, maxSpeed, belowFloor };
|
|
172
|
+
}
|
package/tsconfig.json
ADDED
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
{
|
|
2
|
+
"compilerOptions": {
|
|
3
|
+
"composite": true,
|
|
4
|
+
"target": "ESNext",
|
|
5
|
+
"module": "NodeNext",
|
|
6
|
+
"moduleResolution": "NodeNext",
|
|
7
|
+
"lib": ["ES5", "ES2015", "ES2016", "ES2017", "ES2018", "ES2019", "ES2020", "ES2021", "ES2022", "ES2023", "ESNext", "DOM", "DOM.Iterable"],
|
|
8
|
+
"types": ["@webgpu/types"],
|
|
9
|
+
"experimentalDecorators": true,
|
|
10
|
+
"useDefineForClassFields": false,
|
|
11
|
+
"skipLibCheck": true,
|
|
12
|
+
"rootDir": "src",
|
|
13
|
+
"outDir": "dist",
|
|
14
|
+
"declaration": true,
|
|
15
|
+
"resolveJsonModule": true,
|
|
16
|
+
"isolatedModules": true,
|
|
17
|
+
"strict": true,
|
|
18
|
+
"noFallthroughCasesInSwitch": true,
|
|
19
|
+
"stripInternal": true,
|
|
20
|
+
"sourceMap": true
|
|
21
|
+
},
|
|
22
|
+
"include": ["src/**/*"],
|
|
23
|
+
"exclude": ["node_modules", "dist"],
|
|
24
|
+
"references": []
|
|
25
|
+
}
|