@babylonjs/lite 1.7.0 → 1.8.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (78) hide show
  1. package/CHANGELOG.md +735 -0
  2. package/README.md +26 -1
  3. package/THIRD_PARTY_NOTICES.txt +139 -0
  4. package/dist/index.js +292 -277
  5. package/dist/index.js.map +1 -1
  6. package/index.d.ts +277 -11
  7. package/lib/_chunks/vendor/{manifold-Sh8xE2da.js → manifold-DtI3BJoR.js} +2 -2
  8. package/lib/_chunks/vendor/{manifold-Sh8xE2da.js.map → manifold-DtI3BJoR.js.map} +1 -1
  9. package/lib/animation/animation-group-task.js +1 -1
  10. package/lib/animation/animation-group-task.js.map +1 -1
  11. package/lib/animation/animation-group.js +20 -15
  12. package/lib/animation/animation-group.js.map +1 -1
  13. package/lib/animation/animation-tick.js +10 -0
  14. package/lib/animation/animation-tick.js.map +1 -0
  15. package/lib/animation/property-animation.js +2 -1
  16. package/lib/animation/property-animation.js.map +1 -1
  17. package/lib/animation/weighted-gltf-mixer.js +1 -1
  18. package/lib/animation/weighted-gltf-mixer.js.map +1 -1
  19. package/lib/animation/weighted-pointer-mixer.js +1 -1
  20. package/lib/animation/weighted-pointer-mixer.js.map +1 -1
  21. package/lib/engine/device-lost-recovery.js +1 -0
  22. package/lib/engine/device-lost-recovery.js.map +1 -1
  23. package/lib/engine/engine.js +1 -1
  24. package/lib/engine/null-engine.js +29 -0
  25. package/lib/engine/null-engine.js.map +1 -0
  26. package/lib/frame-graph/depth-pyramid.js +158 -0
  27. package/lib/frame-graph/depth-pyramid.js.map +1 -0
  28. package/lib/frame-graph/frame-graph-actions.js +10 -1
  29. package/lib/frame-graph/frame-graph-actions.js.map +1 -1
  30. package/lib/frame-graph/render-task.js +7 -0
  31. package/lib/frame-graph/render-task.js.map +1 -1
  32. package/lib/frame-graph/transmission-depth-grab.js +88 -0
  33. package/lib/frame-graph/transmission-depth-grab.js.map +1 -0
  34. package/lib/frame-graph/transmission.js +30 -1
  35. package/lib/frame-graph/transmission.js.map +1 -1
  36. package/lib/gizmo/bounding-box-gizmo.js +1 -1
  37. package/lib/index.js +8 -6
  38. package/lib/index.js.map +1 -1
  39. package/lib/loader-gltf/gltf-feature-gpu-instancing.js +1 -1
  40. package/lib/loader-gltf/gltf-interleave.js +1 -1
  41. package/lib/loader-gltf/load-gltf.js +1 -1
  42. package/lib/material/shader/shader-pipeline.js +1 -1
  43. package/lib/material/shader/shader-pipeline.js.map +1 -1
  44. package/lib/material/shader/shader-renderable.js +23 -8
  45. package/lib/material/shader/shader-renderable.js.map +1 -1
  46. package/lib/math/aabb.js +1 -1
  47. package/lib/math/compute-aabb.js +63 -1
  48. package/lib/math/compute-aabb.js.map +1 -1
  49. package/lib/math/index.js +1 -1
  50. package/lib/mesh/csg2.js +3 -2
  51. package/lib/mesh/csg2.js.map +1 -1
  52. package/lib/mesh/mesh-factories.js +1 -1
  53. package/lib/mesh/thin-instance-gpu-culling.js +4 -2
  54. package/lib/mesh/thin-instance-gpu-culling.js.map +1 -1
  55. package/lib/mesh/thin-instance.js +8 -1
  56. package/lib/mesh/thin-instance.js.map +1 -1
  57. package/lib/navigation/index.js +1 -1
  58. package/lib/navigation/navigation.js +9 -1
  59. package/lib/navigation/navigation.js.map +1 -1
  60. package/lib/physics/character-controller.js +2 -2
  61. package/lib/physics/character-controller.js.map +1 -1
  62. package/lib/physics/havok-floating-origin.js +2 -2
  63. package/lib/physics/havok-floating-origin.js.map +1 -1
  64. package/lib/physics/havok.js +40 -13
  65. package/lib/physics/havok.js.map +1 -1
  66. package/lib/picking/gpu-picker.js +16 -2
  67. package/lib/picking/gpu-picker.js.map +1 -1
  68. package/lib/scene/scene-core.js +9 -3
  69. package/lib/scene/scene-core.js.map +1 -1
  70. package/lib/scene/scene-remove.js +8 -0
  71. package/lib/scene/scene-remove.js.map +1 -1
  72. package/lib/texture/pixels-texture.js +31 -1
  73. package/lib/texture/pixels-texture.js.map +1 -1
  74. package/lib/vat/vat-baker.js +41 -2
  75. package/lib/vat/vat-baker.js.map +1 -1
  76. package/package.json +15 -3
  77. package/lib/_chunks/__vite-browser-external-BFTKbDcV.js +0 -68
  78. package/lib/_chunks/__vite-browser-external-BFTKbDcV.js.map +0 -1
@@ -1 +1 @@
1
- {"version":3,"file":"havok.js","sources":["../../../src/physics/havok.ts"],"sourcesContent":["/**\n * Havok Physics V2 integration for Babylon Lite.\n *\n * Standalone-function API consistent with Lite conventions:\n * ```ts\n * const world = await createHavokWorld(scene);\n * setPhysicsGravity(world, { x: 0, y: -9.81, z: 0 });\n * const agg = createPhysicsAggregate(world, sphere, PhysicsShapeType.SPHERE, { mass: 1 });\n * ```\n *\n * The WASM binary is loaded lazily on first call and cached for subsequent worlds.\n */\n\nimport type { Mat4, Vec3, Quat } from \"../math/types.js\";\nimport type { SceneNode } from \"../scene/scene-node.js\";\nimport type { SceneContext } from \"../scene/scene-core.js\";\nimport type { Mesh } from \"../mesh/mesh.js\";\nimport type { HavokFloatingOriginContext, WorldRegion } from \"./havok-floating-origin.js\";\nimport { onBeforeRender } from \"../scene/scene-core.js\";\nimport { mat4Invert } from \"../math/mat4-invert.js\";\nimport { mat4Multiply } from \"../math/mat4-multiply.js\";\nimport { mat4Scale } from \"../math/mat4-scale.js\";\nimport { mat4Decompose } from \"../math/mat4-decompose.js\";\n\n// ─── Enums ───────────────────────────────────────────────────────────\n\n/** Geometry type of a physics collision shape. */\nexport const enum PhysicsShapeType {\n SPHERE = 0,\n CAPSULE = 1,\n CYLINDER = 2,\n BOX = 3,\n CONVEX_HULL = 4,\n CONTAINER = 5,\n MESH = 6,\n HEIGHTFIELD = 7,\n}\n\n/** How a body moves: `STATIC` (immovable), `ANIMATED` (driven by the node transform), or `DYNAMIC` (simulated). */\nexport const enum PhysicsMotionType {\n STATIC = 0,\n ANIMATED = 1,\n DYNAMIC = 2,\n}\n\n/**\n * How a moved transform node is propagated to its physics body before each step.\n * `DISABLED` skips the sync, `TELEPORT` snaps the body to the node (`HP_Body_SetQTransform`),\n * and `ACTION` sets the body's velocity so it reaches the node (`HP_Body_SetTargetQTransform`,\n * dragging resting bodies via friction). Values match Babylon.js `PhysicsPrestepType`.\n */\nexport const enum PhysicsPrestepType {\n DISABLED = 0,\n TELEPORT = 1,\n ACTION = 2,\n}\n\n/** Type of Havok Physics V2 constraint. */\nexport const enum PhysicsConstraintType {\n BALL_AND_SOCKET = 1,\n DISTANCE = 2,\n HINGE = 3,\n SLIDER = 4,\n LOCK = 5,\n PRISMATIC = 6,\n SIX_DOF = 7,\n}\n\n/** Axis addressed by a Physics V2 constraint limit. */\nexport const enum PhysicsConstraintAxis {\n LINEAR_X = 0,\n LINEAR_Y = 1,\n LINEAR_Z = 2,\n ANGULAR_X = 3,\n ANGULAR_Y = 4,\n ANGULAR_Z = 5,\n LINEAR_DISTANCE = 6,\n}\n\n// ─── Option interfaces ───────────────────────────────────────────────\n\n/** Geometry parameters describing a collision shape; which fields apply depends on the shape type. */\nexport interface PhysicsShapeParameters {\n center?: Vec3;\n radius?: number;\n pointA?: Vec3;\n pointB?: Vec3;\n rotation?: Quat;\n extents?: Vec3;\n}\n\n/** Options for `createPhysicsShape`: the shape type plus its geometry parameters. */\nexport interface PhysicsShapeOptions {\n type: PhysicsShapeType;\n parameters?: PhysicsShapeParameters;\n /** Mesh or transform hierarchy used when `type` is `MESH` or `CONVEX_HULL`. */\n mesh?: SceneNode;\n /** When true, mesh and convex-hull shapes accumulate descendant meshes under `mesh`. */\n includeChildMeshes?: boolean;\n}\n\n/** Options for `createPhysicsAggregate`: mass, material (friction/restitution), and optional shape geometry overrides. */\nexport interface PhysicsAggregateOptions {\n mass: number;\n friction?: number;\n restitution?: number;\n radius?: number;\n pointA?: Vec3;\n pointB?: Vec3;\n extents?: Vec3;\n rotation?: Quat;\n center?: Vec3;\n startAsleep?: boolean;\n isTriggerShape?: boolean;\n /**\n * Optional pre-built shape. When provided, it is used directly and the\n * primitive-shape build path is skipped. This lets callers supply\n * mesh/convex-hull shapes (built via `createPhysicsShape`) without pulling\n * the mesh-shape code into `createPhysicsAggregate` itself.\n */\n shape?: PhysicsShape;\n}\n\n/** Mass properties applied to a physics body. Omitted fields keep Havok's shape-derived values. */\nexport interface PhysicsMassProperties {\n centerOfMass?: Vec3;\n mass?: number;\n inertia?: Vec3;\n inertiaOrientation?: Quat;\n}\n\n/** Pivot/axis options used to create a physics constraint. */\nexport interface PhysicsConstraintOptions {\n pivotA?: Vec3;\n pivotB?: Vec3;\n axisA?: Vec3;\n axisB?: Vec3;\n perpAxisA?: Vec3;\n perpAxisB?: Vec3;\n maxDistance?: number;\n collision?: boolean;\n}\n\n/** Limit options used by 6DoF constraints. */\nexport interface PhysicsConstraintLimit {\n axis: PhysicsConstraintAxis;\n minLimit?: number;\n maxLimit?: number;\n stiffness?: number;\n damping?: number;\n}\n\n// ─── Opaque handles (pure state — no methods) ────────────────────────\n\n/** Opaque handle to a Havok rigid body, bound to a scene node and a motion type. */\nexport interface PhysicsBody {\n /** @internal */ readonly _hkBody: any;\n /** @internal */ readonly _world: PhysicsWorld;\n /** @internal */ _shape?: PhysicsShape | null;\n /** @internal */ _preStep: boolean;\n /** @internal How a moved node is propagated to the body pre-step (TELEPORT by default). */\n _prestepType: PhysicsPrestepType;\n readonly node: SceneNode;\n readonly motionType: PhysicsMotionType;\n /** @internal The floating-origin region this body lives in; set only under floating origin. */\n _region?: WorldRegion;\n}\n\n/** Opaque handle to a Havok collision shape. */\nexport interface PhysicsShape {\n /** @internal */ readonly _hkShape: any;\n /** @internal */ readonly _type: PhysicsShapeType;\n}\n\n/** A body and its shape wired together, as produced by `createPhysicsAggregate`. */\nexport interface PhysicsAggregate {\n readonly body: PhysicsBody;\n readonly shape: PhysicsShape;\n}\n\n/** Opaque handle to a Havok constraint between two bodies. */\nexport interface PhysicsConstraint {\n /** @internal */ readonly _hkConstraint: any;\n readonly bodyA: PhysicsBody;\n readonly bodyB: PhysicsBody;\n readonly type: PhysicsConstraintType;\n readonly options: PhysicsConstraintOptions;\n readonly limits?: readonly PhysicsConstraintLimit[];\n}\n\n// ─── PhysicsWorld — pure-state handle ────────────────────────────────\n\n/** Pure-state handle to a Havok physics world: the WASM module, the native world, its bodies, and the timestep. */\nexport interface PhysicsWorld {\n /** @internal */ readonly _hknp: any;\n /** @internal */ readonly _hkWorld: any;\n /** @internal */ readonly _bodies: PhysicsBody[];\n /** @internal */ _timestep: number;\n /** @internal World-wide gravity `[x, y, z]` set at creation; used to seed floating-origin regions. */\n _gravity: number[];\n /** @internal Floating-origin runtime; present only after `enableHavokFloatingOrigin` is called. */\n _fo?: HavokFloatingOriginContext;\n /** @internal Callbacks run after each physics step (post body→node sync, pre-render). */\n _afterStep?: ((timestep: number) => void)[];\n /** @internal Lazily-created Havok query collector, cached by the standalone `physics/havok-queries.ts` module. */\n _queryCollector?: any;\n}\n\n// ─── Factory ─────────────────────────────────────────────────────────\n\n/**\n * Create a Havok physics world and register per-frame stepping on the scene.\n *\n * The caller is responsible for loading the WASM binary externally:\n * ```ts\n * import HavokPhysics from \"@babylonjs/havok\";\n * const hknp = await HavokPhysics({ locateFile: () => \"/HavokPhysics.wasm\" });\n * const world = createHavokWorld(scene, hknp);\n * ```\n *\n * For Large World Rendering, call {@link enableHavokFloatingOrigin} on the returned world (before\n * creating any bodies) to opt into multi-region floating-origin simulation.\n */\nexport function createHavokWorld(scene: SceneContext, hknp: any, gravity?: Vec3): PhysicsWorld {\n const hkWorld = hknp.HP_World_Create()[1];\n\n const g = gravity ?? { x: 0, y: -9.81, z: 0 };\n hknp.HP_World_SetGravity(hkWorld, [g.x, g.y, g.z]);\n\n const world: PhysicsWorld = {\n _hknp: hknp,\n _hkWorld: hkWorld,\n _bodies: [],\n _timestep: 1 / 60,\n _gravity: [g.x, g.y, g.z],\n };\n\n // Register per-frame physics step\n onBeforeRender(scene, (deltaMs: number) => {\n _stepWorld(world, deltaMs);\n });\n\n return world;\n}\n\n/**\n * Opt a Havok world into multi-region floating-origin simulation (Large World Rendering).\n *\n * Loads the floating-origin runtime on demand (`physics/havok-floating-origin.ts`) so worlds that\n * never call this — i.e. ordinary near-origin physics scenes — never pull that code into their\n * bundle. Once enabled, bodies far apart in world space are simulated in separate regions (each\n * within `floatingOriginWorldRadius` of its origin) so the float32 Havok solver keeps full\n * precision. Node transforms remain true world coordinates; eye-relative rendering is handled\n * independently by the floating-origin render path.\n *\n * Must be called **before** creating any bodies in the world. Pair it with an engine created with\n * `useFloatingOrigin: true` so rendering and physics share the same far-from-origin handling.\n * @param world - The physics world to enable floating origin on.\n * @param floatingOriginWorldRadius - Region capture radius in metres (default 100000, matching Babylon.js).\n */\nexport async function enableHavokFloatingOrigin(world: PhysicsWorld, floatingOriginWorldRadius = 100000): Promise<void> {\n const fo = await import(\"./havok-floating-origin.js\");\n world._fo = fo.createHavokFloatingOriginContext(world._hkWorld, world._gravity, floatingOriginWorldRadius);\n}\n\n// ─── Per-frame stepping ──────────────────────────────────────────────\n\nfunction _stepWorld(world: PhysicsWorld, deltaMs: number): void {\n const { _hknp: hknp, _hkWorld: hkWorld, _bodies: bodies } = world;\n const dt = Math.min(deltaMs / 1000, 0.1);\n if (dt <= 0) {\n return;\n }\n\n // Floating-origin worlds run a multi-region step (loaded on demand).\n if (world._fo) {\n world._fo.step(world);\n return;\n }\n\n // Pre-step: sync moved nodes into Havok. A body syncs only when its prestep type is not\n // DISABLED and it is either ANIMATED (kinematic) or explicitly pre-stepped. TELEPORT snaps the\n // body to the node; ACTION sets a velocity toward it (so resting bodies are dragged via friction).\n for (let i = 0; i < bodies.length; i++) {\n const b = bodies[i]!;\n if (b._prestepType !== PhysicsPrestepType.DISABLED && (b.motionType === (PhysicsMotionType.ANIMATED as number) || b._preStep)) {\n if (b._prestepType === PhysicsPrestepType.ACTION) {\n _syncNodeToBodyTarget(hknp, b);\n } else {\n _syncNodeToBody(hknp, b);\n }\n }\n }\n\n hknp.HP_World_Step(hkWorld, world._timestep);\n\n // Post-step: sync DYNAMIC bodies from Havok → node\n for (let i = 0; i < bodies.length; i++) {\n const b = bodies[i]!;\n if (b.motionType === (PhysicsMotionType.DYNAMIC as number)) {\n _syncBodyToNode(hknp, b);\n }\n }\n\n // After-step hooks run once body→node sync is complete, before rendering. This mirrors\n // Babylon.js, where physics is advanced inside `scene.animate()` (before render) and\n // post-step scene logic runs in `onAfterRenderObservable`.\n if (world._afterStep) {\n const cbs = world._afterStep;\n for (let i = 0; i < cbs.length; i++) {\n cbs[i]!(world._timestep);\n }\n }\n}\n\n/**\n * Registers a callback to run after each physics step, once dynamic body transforms have been\n * synced back to their nodes and before the frame is rendered. Use this for per-step logic that\n * must observe (or react to) the freshly-integrated state — e.g. tracking a marker to a body's\n * post-step pose, or applying a force whose effect should integrate on the next step.\n * @param world - The physics world to hook.\n * @param cb - Callback invoked with the world timestep (seconds) after each step.\n */\nexport function onPhysicsAfterStep(world: PhysicsWorld, cb: (timestep: number) => void): void {\n (world._afterStep ??= []).push(cb);\n}\n\nfunction _syncBodyToNode(hknp: any, body: PhysicsBody): void {\n const t = hknp.HP_Body_GetQTransform(body._hkBody)[1];\n const pos = t[0]; // [x, y, z]\n const rot = t[1]; // [x, y, z, w]\n const node = body.node;\n node.position.set(pos[0], pos[1], pos[2]);\n node.rotationQuaternion.set(rot[0], rot[1], rot[2], rot[3]);\n}\n\nfunction _syncNodeToBody(hknp: any, body: PhysicsBody): void {\n const node = body.node;\n const p = node.position;\n const q = node.rotationQuaternion;\n hknp.HP_Body_SetQTransform(body._hkBody, [\n [p.x, p.y, p.z],\n [q.x, q.y, q.z, q.w],\n ]);\n}\n\n// ACTION prestep: instead of snapping the body, set its target transform so Havok derives a\n// velocity that carries the body to the node over the step. Resting bodies stacked on top are then\n// dragged along by friction rather than tunneled through.\nfunction _syncNodeToBodyTarget(hknp: any, body: PhysicsBody): void {\n const node = body.node;\n const p = node.position;\n const q = node.rotationQuaternion;\n hknp.HP_Body_SetTargetQTransform(body._hkBody, [\n [p.x, p.y, p.z],\n [q.x, q.y, q.z, q.w],\n ]);\n}\n\n// ─── Gravity ─────────────────────────────────────────────────────────\n\n/**\n * Sets gravity for the world, or for a single region when `worldPosition` is given.\n * Passing a position is useful for planetary scenarios where gravity direction varies by location.\n * @param world - The physics world.\n * @param gravity - Gravity acceleration in m/s².\n * @param worldPosition - Optional world position selecting the region to update; omit to update all regions.\n */\nexport function setPhysicsGravity(world: PhysicsWorld, gravity: Vec3, worldPosition?: Vec3): void {\n if (world._fo) {\n world._fo.setGravity(world, [gravity.x, gravity.y, gravity.z], worldPosition);\n return;\n }\n world._hknp.HP_World_SetGravity(world._hkWorld, [gravity.x, gravity.y, gravity.z]);\n}\n\n/**\n * Returns the world's current gravity vector, or a specific region's when `worldPosition` is given.\n * @param world - The physics world.\n * @param worldPosition - Optional world position selecting the region to read; omit for the world-wide gravity.\n * @returns Gravity acceleration in m/s².\n */\nexport function getPhysicsGravity(world: PhysicsWorld, worldPosition?: Vec3): Vec3 {\n if (worldPosition && world._fo) {\n const g = world._fo.getRegionGravity(world, worldPosition);\n return { x: g[0]!, y: g[1]!, z: g[2]! };\n }\n const g = world._hknp.HP_World_GetGravity(world._hkWorld)[1];\n return { x: g[0], y: g[1], z: g[2] };\n}\n\n// ─── Timestep ────────────────────────────────────────────────────────\n\n/**\n * Sets the fixed simulation timestep used by each world step.\n * @param world - The physics world.\n * @param dt - Timestep in seconds (e.g. `1 / 60`).\n */\nexport function setPhysicsTimestep(world: PhysicsWorld, dt: number): void {\n world._timestep = dt;\n}\n\n/**\n * Returns the world's fixed simulation timestep in seconds.\n * @param world - The physics world.\n * @returns The timestep in seconds.\n */\nexport function getPhysicsTimestep(world: PhysicsWorld): number {\n return world._timestep;\n}\n\n// ─── Velocity limits ─────────────────────────────────────────────────\n\n/**\n * Clamps the maximum linear and angular speeds of bodies in the world.\n * @param world - The physics world.\n * @param maxLinear - Maximum linear speed.\n * @param maxAngular - Maximum angular speed.\n */\nexport function setPhysicsVelocityLimits(world: PhysicsWorld, maxLinear: number, maxAngular: number): void {\n if (world._fo) {\n world._fo.setVelocityLimits(world, maxLinear, maxAngular);\n return;\n }\n world._hknp.HP_World_SetSpeedLimit(world._hkWorld, maxLinear, maxAngular);\n}\n\n/**\n * Returns the world's current maximum linear and angular speed limits.\n * @param world - The physics world.\n * @returns The `maxLinear` and `maxAngular` speed limits.\n */\nexport function getPhysicsVelocityLimits(world: PhysicsWorld): { maxLinear: number; maxAngular: number } {\n const limits = world._hknp.HP_World_GetSpeedLimit(world._hkWorld);\n return { maxLinear: limits[1], maxAngular: limits[2] };\n}\n\n// ─── Body ────────────────────────────────────────────────────────────\n\n/**\n * Creates a rigid body bound to a scene node, adds it to the world, and seeds it with the node's transform.\n * @param world - The physics world.\n * @param node - The scene node the body follows / drives.\n * @param motionType - Whether the body is static, animated (kinematic), or dynamic.\n * @param startsAsleep - When true, the body is added in a sleeping state.\n * @returns The created physics body handle.\n */\nexport function createPhysicsBody(world: PhysicsWorld, node: SceneNode, motionType: PhysicsMotionType, startsAsleep = false): PhysicsBody {\n const { _hknp: hknp, _hkWorld: hkWorld } = world;\n\n const hkBody = hknp.HP_Body_Create()[1];\n\n // Set motion type\n const hkMotion =\n motionType === PhysicsMotionType.STATIC ? hknp.MotionType.STATIC : motionType === PhysicsMotionType.ANIMATED ? hknp.MotionType.KINEMATIC : hknp.MotionType.DYNAMIC;\n hknp.HP_Body_SetMotionType(hkBody, hkMotion);\n\n const body: PhysicsBody = {\n _hkBody: hkBody,\n _shape: null,\n _preStep: false,\n _prestepType: PhysicsPrestepType.TELEPORT,\n _world: world,\n node,\n motionType,\n };\n\n if (world._fo) {\n // Floating origin: place the body in its region, storing it in region-local coordinates.\n world._fo.placeBody(world, body, startsAsleep);\n } else {\n // Add to world first, then set transform (Havok resets transform on add)\n hknp.HP_World_AddBody(hkWorld, hkBody, startsAsleep);\n\n const p = node.position;\n const q = node.rotationQuaternion;\n hknp.HP_Body_SetQTransform(hkBody, [\n [p.x, p.y, p.z],\n [q.x, q.y, q.z, q.w],\n ]);\n }\n\n world._bodies.push(body);\n return body;\n}\n\n/**\n * Enable or disable pre-step synchronization from a node transform to its Havok body.\n * @param body - The physics body to update.\n * @param enabled - When true, the node transform is written to Havok before each physics step.\n */\nexport function setPhysicsBodyPreStep(body: PhysicsBody, enabled: boolean): void {\n body._preStep = enabled;\n}\n\n/**\n * Sets how a moved transform node is propagated to its physics body before each step.\n * `TELEPORT` snaps the body to the node, `ACTION` sets a velocity toward it (so resting bodies are\n * dragged along by friction), and `DISABLED` skips the pre-step sync entirely. Setting any type\n * other than `DISABLED` automatically enables prestep syncing for the body (equivalent to\n * {@link setPhysicsBodyPreStep}), so STATIC/DYNAMIC bodies are synced without an extra call.\n * @param body - The physics body to update.\n * @param type - The prestep behaviour to apply.\n */\nexport function setPhysicsBodyPrestepType(body: PhysicsBody, type: PhysicsPrestepType): void {\n body._prestepType = type;\n if (type !== PhysicsPrestepType.DISABLED) {\n body._preStep = true;\n }\n}\n\n/**\n * Applies a world-space impulse to a physics body.\n * @param body - The physics body to update.\n * @param impulse - Impulse vector.\n * @param location - World-space application point.\n */\nexport function applyPhysicsBodyImpulse(body: PhysicsBody, impulse: Vec3, location: Vec3): void {\n const hknp = body._world._hknp;\n hknp.HP_Body_ApplyImpulse(body._hkBody, [location.x, location.y, location.z], [impulse.x, impulse.y, impulse.z]);\n}\n\n/**\n * Applies a force for one fixed physics timestep, matching Babylon.js PhysicsBody.applyForce.\n * @param world - The physics world.\n * @param body - The physics body to update.\n * @param force - Force vector.\n * @param location - World-space application point.\n */\nexport function applyPhysicsBodyForce(world: PhysicsWorld, body: PhysicsBody, force: Vec3, location: Vec3): void {\n applyPhysicsBodyImpulse(body, { x: force.x * world._timestep, y: force.y * world._timestep, z: force.z * world._timestep }, location);\n}\n\n/**\n * Creates and enables a Havok constraint between two physics bodies.\n * @param world - The physics world.\n * @param bodyA - Parent body.\n * @param bodyB - Child body.\n * @param type - Constraint type.\n * @param options - Pivot and axis options.\n * @param limits - Optional 6DoF limits.\n */\nexport function createPhysicsConstraint(\n world: PhysicsWorld,\n bodyA: PhysicsBody,\n bodyB: PhysicsBody,\n type: PhysicsConstraintType,\n options: PhysicsConstraintOptions = {},\n limits: readonly PhysicsConstraintLimit[] = []\n): PhysicsConstraint {\n const hknp = world._hknp;\n const joint = hknp.HP_Constraint_Create()[1];\n hknp.HP_Constraint_SetParentBody(joint, bodyA._hkBody);\n hknp.HP_Constraint_SetChildBody(joint, bodyB._hkBody);\n\n const pivotA = options.pivotA ?? ZERO_VEC3;\n const pivotB = options.pivotB ?? ZERO_VEC3;\n const axisA = options.axisA ?? X_AXIS;\n const axisB = options.axisB ?? X_AXIS;\n const perpAxisA = options.perpAxisA ?? normalTo(axisA);\n const perpAxisB = options.perpAxisB ?? normalTo(axisB);\n hknp.HP_Constraint_SetAnchorInParent(joint, vec3Array(pivotA), vec3Array(axisA), vec3Array(perpAxisA));\n hknp.HP_Constraint_SetAnchorInChild(joint, vec3Array(pivotB), vec3Array(axisB), vec3Array(perpAxisB));\n\n configureConstraintAxes(hknp, joint, type, options, limits);\n hknp.HP_Constraint_SetCollisionsEnabled(joint, !!options.collision);\n hknp.HP_Constraint_SetEnabled(joint, true);\n\n return { _hkConstraint: joint, bodyA, bodyB, type, options: { ...options, axisA, axisB, perpAxisA, perpAxisB }, limits };\n}\n\n/**\n * Sets the Havok filter membership mask for a collision shape.\n * @param world - The physics world.\n * @param shape - The shape to update.\n * @param membershipMask - Bitmask describing which collision group this shape belongs to.\n */\nexport function setPhysicsShapeFilterMembershipMask(world: PhysicsWorld, shape: PhysicsShape, membershipMask: number): void {\n const info = world._hknp.HP_Shape_GetFilterInfo(shape._hkShape)[1];\n world._hknp.HP_Shape_SetFilterInfo(shape._hkShape, [membershipMask, info[1]]);\n}\n\n/**\n * Sets the Havok filter collide mask for a collision shape.\n * @param world - The physics world.\n * @param shape - The shape to update.\n * @param collideMask - Bitmask describing which collision groups this shape collides with.\n */\nexport function setPhysicsShapeFilterCollideMask(world: PhysicsWorld, shape: PhysicsShape, collideMask: number): void {\n const info = world._hknp.HP_Shape_GetFilterInfo(shape._hkShape)[1];\n world._hknp.HP_Shape_SetFilterInfo(shape._hkShape, [info[0], collideMask]);\n}\n\nconst ZERO_VEC3: Vec3 = { x: 0, y: 0, z: 0 };\nconst X_AXIS: Vec3 = { x: 1, y: 0, z: 0 };\n\nfunction vec3Array(v: Vec3): [number, number, number] {\n return [v.x, v.y, v.z];\n}\n\nfunction normalTo(axis: Vec3): Vec3 {\n const ax = Math.abs(axis.x);\n const ay = Math.abs(axis.y);\n const az = Math.abs(axis.z);\n if (ax <= ay && ax <= az) {\n return normalizeVec3({ x: 0, y: -axis.z, z: axis.y });\n }\n if (ay <= ax && ay <= az) {\n return normalizeVec3({ x: -axis.z, y: 0, z: axis.x });\n }\n return normalizeVec3({ x: -axis.y, y: axis.x, z: 0 });\n}\n\nfunction normalizeVec3(v: Vec3): Vec3 {\n const inv = 1 / Math.max(1e-8, Math.hypot(v.x, v.y, v.z));\n return { x: v.x * inv, y: v.y * inv, z: v.z * inv };\n}\n\nfunction configureConstraintAxes(hknp: any, joint: any, type: PhysicsConstraintType, options: PhysicsConstraintOptions, limits: readonly PhysicsConstraintLimit[]): void {\n const axis = hknp.ConstraintAxis;\n const mode = hknp.ConstraintAxisLimitMode;\n const lock = (a: any): void => hknp.HP_Constraint_SetAxisMode(joint, a, mode.LOCKED);\n const limit = (a: any, min: number, max: number): void => {\n hknp.HP_Constraint_SetAxisMode(joint, a, mode.LIMITED);\n hknp.HP_Constraint_SetAxisMinLimit(joint, a, min);\n hknp.HP_Constraint_SetAxisMaxLimit(joint, a, max);\n };\n\n switch (type) {\n case PhysicsConstraintType.LOCK:\n lock(axis.LINEAR_X);\n lock(axis.LINEAR_Y);\n lock(axis.LINEAR_Z);\n lock(axis.ANGULAR_X);\n lock(axis.ANGULAR_Y);\n lock(axis.ANGULAR_Z);\n break;\n case PhysicsConstraintType.DISTANCE: {\n const d = options.maxDistance ?? 0;\n limit(axis.LINEAR_DISTANCE, d, d);\n break;\n }\n case PhysicsConstraintType.HINGE:\n lock(axis.LINEAR_X);\n lock(axis.LINEAR_Y);\n lock(axis.LINEAR_Z);\n lock(axis.ANGULAR_Y);\n lock(axis.ANGULAR_Z);\n break;\n case PhysicsConstraintType.PRISMATIC:\n lock(axis.LINEAR_Y);\n lock(axis.LINEAR_Z);\n lock(axis.ANGULAR_X);\n lock(axis.ANGULAR_Y);\n lock(axis.ANGULAR_Z);\n break;\n case PhysicsConstraintType.SLIDER:\n lock(axis.LINEAR_Y);\n lock(axis.LINEAR_Z);\n lock(axis.ANGULAR_Y);\n lock(axis.ANGULAR_Z);\n break;\n case PhysicsConstraintType.BALL_AND_SOCKET:\n lock(axis.LINEAR_X);\n lock(axis.LINEAR_Y);\n lock(axis.LINEAR_Z);\n break;\n case PhysicsConstraintType.SIX_DOF:\n for (const l of limits) {\n const nativeAxis = constraintAxisToNative(axis, l.axis);\n if ((l.minLimit ?? -1) === 0 && (l.maxLimit ?? -1) === 0) {\n lock(nativeAxis);\n } else {\n if (l.minLimit !== undefined || l.maxLimit !== undefined) {\n hknp.HP_Constraint_SetAxisMode(joint, nativeAxis, mode.LIMITED);\n }\n if (l.minLimit !== undefined) {\n hknp.HP_Constraint_SetAxisMinLimit(joint, nativeAxis, l.minLimit);\n }\n if (l.maxLimit !== undefined) {\n hknp.HP_Constraint_SetAxisMaxLimit(joint, nativeAxis, l.maxLimit);\n }\n }\n if (l.stiffness !== undefined) {\n hknp.HP_Constraint_SetAxisStiffness(joint, nativeAxis, l.stiffness);\n }\n if (l.damping !== undefined) {\n hknp.HP_Constraint_SetAxisDamping(joint, nativeAxis, l.damping);\n }\n }\n break;\n }\n}\n\nfunction constraintAxisToNative(axis: any, value: PhysicsConstraintAxis): any {\n switch (value) {\n case PhysicsConstraintAxis.LINEAR_X:\n return axis.LINEAR_X;\n case PhysicsConstraintAxis.LINEAR_Y:\n return axis.LINEAR_Y;\n case PhysicsConstraintAxis.LINEAR_Z:\n return axis.LINEAR_Z;\n case PhysicsConstraintAxis.ANGULAR_X:\n return axis.ANGULAR_X;\n case PhysicsConstraintAxis.ANGULAR_Y:\n return axis.ANGULAR_Y;\n case PhysicsConstraintAxis.ANGULAR_Z:\n return axis.ANGULAR_Z;\n case PhysicsConstraintAxis.LINEAR_DISTANCE:\n return axis.LINEAR_DISTANCE;\n }\n}\n\n// ─── Shape ───────────────────────────────────────────────────────────\n\ninterface HavokBuffer {\n offset: number;\n numObjects: number;\n}\n\nclass MeshAccumulator {\n private readonly _vertices: number[] = [];\n private readonly _indices: number[] = [];\n private readonly _collectIndices: boolean;\n\n public constructor(collectIndices: boolean) {\n this._collectIndices = collectIndices;\n }\n\n public addNodeMeshes(root: SceneNode, includeChildren: boolean): void {\n const invRoot = mat4Invert(root.worldMatrix as Mat4);\n if (!invRoot) {\n throw new Error(\"Cannot create physics mesh shape from a singular root transform.\");\n }\n\n const rootScale = mat4Scale(root.scaling.x, root.scaling.y, root.scaling.z);\n const rootToBody = mat4Multiply(rootScale, invRoot);\n this._addNodeMesh(root, rootToBody);\n\n if (includeChildren) {\n for (const child of root.children) {\n this._addDescendantMeshes(child, rootToBody);\n }\n }\n\n if (this._vertices.length === 0) {\n throw new Error(\"Cannot create physics mesh shape without vertex positions.\");\n }\n if (this._collectIndices && this._indices.length === 0) {\n throw new Error(\"Cannot create physics mesh shape without triangle indices.\");\n }\n }\n\n public getVertices(hknp: any): HavokBuffer {\n const numObjects = this._vertices.length;\n const offset = hknp._malloc(numObjects * 4);\n new Float32Array(hknp.HEAPU8.buffer, offset, numObjects).set(this._vertices);\n return { offset, numObjects };\n }\n\n public getTriangles(hknp: any): HavokBuffer {\n const numObjects = this._indices.length;\n const offset = hknp._malloc(numObjects * 4);\n new Int32Array(hknp.HEAPU8.buffer, offset, numObjects).set(this._indices);\n return { offset, numObjects };\n }\n\n public freeBuffer(hknp: any, buffer: HavokBuffer): void {\n hknp._free(buffer.offset);\n }\n\n private _addDescendantMeshes(node: SceneNode, rootToBody: Mat4): void {\n this._addNodeMesh(node, rootToBody);\n for (const child of node.children) {\n this._addDescendantMeshes(child, rootToBody);\n }\n }\n\n private _addNodeMesh(node: SceneNode, rootToBody: Mat4): void {\n if (!isMesh(node)) {\n return;\n }\n const positions = node._cpuPositions;\n if (!positions || positions.length === 0) {\n return;\n }\n\n const meshToBody = mat4Multiply(rootToBody, node.worldMatrix as Mat4);\n const indexOffset = this._vertices.length / 3;\n for (let i = 0; i < positions.length; i += 3) {\n transformPositionInto(this._vertices, meshToBody, positions[i]!, positions[i + 1]!, positions[i + 2]!);\n }\n\n if (!this._collectIndices) {\n return;\n }\n\n const indices = node._cpuIndices;\n if (!indices) {\n return;\n }\n for (let i = 0; i < indices.length; i += 3) {\n const a = indices[i]! + indexOffset;\n const b = indices[i + 1]! + indexOffset;\n const c = indices[i + 2]! + indexOffset;\n // Babylon Lite scenes use Babylon.js' default left-handed winding, so\n // reverse triangle order for Havok's mesh-shape interior optimization.\n this._indices.push(c, b, a);\n }\n }\n}\n\nfunction isMesh(node: SceneNode): node is Mesh {\n return \"_gpu\" in node && \"_cpuPositions\" in node;\n}\n\nfunction transformPositionInto(dst: number[], m: Mat4, x: number, y: number, z: number): void {\n dst.push(m[0]! * x + m[4]! * y + m[8]! * z + m[12]!, m[1]! * x + m[5]! * y + m[9]! * z + m[13]!, m[2]! * x + m[6]! * y + m[10]! * z + m[14]!);\n}\n\n/**\n * Creates a collision shape from the given options.\n * @param world - The physics world.\n * @param options - The shape type and its geometry parameters.\n * @returns The created shape handle.\n */\nexport function createPhysicsShape(world: PhysicsWorld, options: PhysicsShapeOptions): PhysicsShape {\n const { _hknp: hknp } = world;\n const params = options.parameters ?? {};\n\n let hkShape: any;\n const primitiveShape = createPrimitivePhysicsShapeHandle(hknp, options.type, params);\n if (primitiveShape !== null) {\n return { _hkShape: primitiveShape, _type: options.type };\n }\n\n switch (options.type) {\n case PhysicsShapeType.CONTAINER: {\n hkShape = hknp.HP_Shape_CreateContainer()[1];\n break;\n }\n case PhysicsShapeType.CONVEX_HULL:\n case PhysicsShapeType.MESH: {\n if (!options.mesh) {\n throw new Error(\"Physics mesh shapes require a mesh or transform hierarchy.\");\n }\n const collectIndices = options.type === PhysicsShapeType.MESH;\n const accum = new MeshAccumulator(collectIndices);\n accum.addNodeMeshes(options.mesh, options.includeChildMeshes ?? false);\n const positions = accum.getVertices(hknp);\n const numVec3s = positions.numObjects / 3;\n if (options.type === PhysicsShapeType.CONVEX_HULL) {\n hkShape = hknp.HP_Shape_CreateConvexHull(positions.offset, numVec3s)[1];\n } else {\n const triangles = accum.getTriangles(hknp);\n const numTriangles = triangles.numObjects / 3;\n hkShape = hknp.HP_Shape_CreateMesh(positions.offset, numVec3s, triangles.offset, numTriangles)[1];\n accum.freeBuffer(hknp, triangles);\n }\n accum.freeBuffer(hknp, positions);\n break;\n }\n default:\n throw new Error(`Unsupported shape type: ${options.type}`);\n }\n\n return { _hkShape: hkShape, _type: options.type };\n}\n\nfunction createPrimitivePhysicsShapeHandle(hknp: any, type: PhysicsShapeType, params: PhysicsShapeParameters): any | null {\n switch (type) {\n case PhysicsShapeType.SPHERE: {\n const c = params.center ?? { x: 0, y: 0, z: 0 };\n const r = params.radius ?? 0.5;\n return hknp.HP_Shape_CreateSphere([c.x, c.y, c.z], r)[1];\n }\n case PhysicsShapeType.BOX: {\n const c = params.center ?? { x: 0, y: 0, z: 0 };\n const q = params.rotation ?? { x: 0, y: 0, z: 0, w: 1 };\n const e = params.extents ?? { x: 1, y: 1, z: 1 };\n return hknp.HP_Shape_CreateBox([c.x, c.y, c.z], [q.x, q.y, q.z, q.w], [e.x, e.y, e.z])[1];\n }\n case PhysicsShapeType.CAPSULE: {\n const a = params.pointA ?? { x: 0, y: 0, z: 0 };\n const b = params.pointB ?? { x: 0, y: 1, z: 0 };\n const r = params.radius ?? 0.5;\n return hknp.HP_Shape_CreateCapsule([a.x, a.y, a.z], [b.x, b.y, b.z], r)[1];\n }\n case PhysicsShapeType.CYLINDER: {\n const a = params.pointA ?? { x: 0, y: 0, z: 0 };\n const b = params.pointB ?? { x: 0, y: 1, z: 0 };\n const r = params.radius ?? 0.5;\n return hknp.HP_Shape_CreateCylinder([a.x, a.y, a.z], [b.x, b.y, b.z], r)[1];\n }\n default:\n return null;\n }\n}\n\n// ─── Shape ↔ Body wiring ─────────────────────────────────────────────\n\n/**\n * Assigns a collision shape to a body.\n * @param world - The physics world.\n * @param body - The body to attach the shape to.\n * @param shape - The collision shape.\n */\nexport function setPhysicsBodyShape(world: PhysicsWorld, body: PhysicsBody, shape: PhysicsShape): void {\n world._hknp.HP_Body_SetShape(body._hkBody, shape._hkShape);\n body._shape = shape;\n}\n\n/**\n * Adds a child shape to a container shape with an explicit local transform.\n * @param world - The physics world.\n * @param container - Parent container shape.\n * @param child - Child shape to append.\n * @param translation - Child translation in container space.\n * @param rotation - Child rotation in container space.\n * @param scale - Child scale in container space.\n */\nexport function addPhysicsShapeChild(world: PhysicsWorld, container: PhysicsShape, child: PhysicsShape, translation?: Vec3, rotation?: Quat, scale?: Vec3): void {\n const t = translation ?? { x: 0, y: 0, z: 0 };\n const r = rotation ?? { x: 0, y: 0, z: 0, w: 1 };\n const s = scale ?? { x: 1, y: 1, z: 1 };\n world._hknp.HP_Shape_AddChild(container._hkShape, child._hkShape, [\n [t.x, t.y, t.z],\n [r.x, r.y, r.z, r.w],\n [s.x, s.y, s.z],\n ]);\n}\n\n/**\n * Adds a child shape to a container, deriving its local transform from two scene nodes.\n * @param world - The physics world.\n * @param container - Parent container shape.\n * @param parentNode - Scene node associated with the container shape.\n * @param child - Child shape to append.\n * @param childNode - Scene node associated with the child shape.\n */\nexport function addPhysicsShapeChildFromParent(world: PhysicsWorld, container: PhysicsShape, parentNode: SceneNode, child: PhysicsShape, childNode: SceneNode): void {\n const invParent = mat4Invert(parentNode.worldMatrix as Mat4);\n if (!invParent) {\n throw new Error(\"Cannot add physics child shape from a singular parent transform.\");\n }\n const childToParent = mat4Multiply(invParent, childNode.worldMatrix as Mat4);\n const transform = mat4Decompose(childToParent);\n addPhysicsShapeChild(world, container, child, transform.translation, transform.rotation, transform.scale);\n}\n\n/**\n * Sets a shape's surface material properties.\n * @param world - The physics world.\n * @param shape - The collision shape.\n * @param friction - Friction coefficient (used for both static and dynamic friction).\n * @param restitution - Bounciness in `[0, 1]`.\n */\nexport function setPhysicsShapeMaterial(world: PhysicsWorld, shape: PhysicsShape, friction: number, restitution: number): void {\n // Material array: [staticFriction, dynamicFriction, restitution, frictionCombine, restitutionCombine].\n // Havok's combine modes are embind enum objects, not raw numbers.\n const combines = world._hknp.MaterialCombine;\n const material = [friction, friction, restitution, combines.MINIMUM, combines.MAXIMUM];\n world._hknp.HP_Shape_SetMaterial(shape._hkShape, material);\n}\n\n// ─── Mass ────────────────────────────────────────────────────────────\n\n/**\n * Sets a body's mass, preserving the shape-derived inertia tensor, centre of mass, and inertia\n * orientation (matching Babylon.js `HavokPlugin` — only the mass scalar is overridden). A body with\n * no shape attached yet has no inertia tensor to derive, so it falls back to an isotropic inertia\n * proportional to the mass until a shape is set.\n * @param world - The physics world.\n * @param body - The body to update.\n * @param mass - Mass in kilograms.\n * @param centerOfMass - Optional body-local centre of mass override. When omitted, the shape-derived\n * centre of mass is preserved. Use this when the collision shape is offset from the body's reference\n * frame (e.g. a prop whose body origin sits at its base but whose shape is centred on its middle)\n * so it tumbles around its real centre.\n */\nexport function setPhysicsBodyMass(world: PhysicsWorld, body: PhysicsBody, mass: number, centerOfMass?: Vec3): void {\n // Match Babylon.js HavokPlugin._internalUpdateMassProperties: for a body with a shape, start from\n // the shape-derived mass properties (correct anisotropic inertia tensor + centre of mass +\n // orientation) and override only the mass scalar. Writing a placeholder isotropic inertia would\n // make constrained/torqued bodies rotate at the wrong rate and break physics parity. A shape-less\n // body has no inertia to derive, so keep the previous mass-proportional isotropic fallback.\n const massProps = body._shape ? buildMassProperties(world, body) : [[0, 0, 0], mass, [mass, mass, mass], [0, 0, 0, 1]];\n massProps[1] = mass;\n if (centerOfMass) {\n massProps[0] = [centerOfMass.x, centerOfMass.y, centerOfMass.z];\n }\n world._hknp.HP_Body_SetMassProperties(body._hkBody, massProps);\n}\n\n/**\n * Sets a body's mass properties, preserving Havok's shape-derived values for omitted fields.\n * @param world - The physics world.\n * @param body - The body to update.\n * @param properties - Mass-property overrides.\n */\nexport function setPhysicsBodyMassProperties(world: PhysicsWorld, body: PhysicsBody, properties: PhysicsMassProperties): void {\n const massProps = buildMassProperties(world, body);\n if (properties.centerOfMass) {\n massProps[0] = [properties.centerOfMass.x, properties.centerOfMass.y, properties.centerOfMass.z];\n }\n if (properties.mass !== undefined) {\n massProps[1] = properties.mass;\n }\n if (properties.inertia) {\n massProps[2] = [properties.inertia.x, properties.inertia.y, properties.inertia.z];\n }\n if (properties.inertiaOrientation) {\n massProps[3] = [properties.inertiaOrientation.x, properties.inertiaOrientation.y, properties.inertiaOrientation.z, properties.inertiaOrientation.w];\n }\n world._hknp.HP_Body_SetMassProperties(body._hkBody, massProps);\n}\n\nfunction buildMassProperties(world: PhysicsWorld, body: PhysicsBody): any[] {\n const hknp = world._hknp;\n const ok = hknp.Result?.RESULT_OK ?? 0;\n const shape = hknp.HP_Body_GetShape(body._hkBody);\n if (shape[0] === ok) {\n const shapeMass = hknp.HP_Shape_BuildMassProperties(shape[1]);\n if (shapeMass[0] === ok) {\n return shapeMass[1];\n }\n }\n return [[0, 0, 0], 1, [1, 1, 1], [0, 0, 0, 1]];\n}\n\n// ─── Body control (impulse / velocity / motion type / transform) ─────\n// Runtime body controls used by gameplay: shoot/throw (impulse + velocity), grab (switch a body to\n// ANIMATED/kinematic while held, then back to DYNAMIC on release), and teleport (restore/load/undo).\n\n/**\n * Apply a one-shot linear impulse (kg·m/s) to a body at a world `point` (defaults to the body's\n * current position / centre of mass), waking it if asleep. Used to shoot, throw, or shove a prop.\n * @param world - The physics world.\n * @param body - The body to push.\n * @param impulse - World-space impulse vector (kg·m/s).\n * @param point - World point of application; defaults to the body's current position.\n */\nexport function applyPhysicsImpulse(world: PhysicsWorld, body: PhysicsBody, impulse: Vec3, point?: Vec3): void {\n const hknp = world._hknp;\n let loc = point;\n if (!loc) {\n const t = hknp.HP_Body_GetQTransform(body._hkBody)[1];\n loc = { x: t[0][0], y: t[0][1], z: t[0][2] };\n }\n hknp.HP_Body_ApplyImpulse(body._hkBody, [loc.x, loc.y, loc.z], [impulse.x, impulse.y, impulse.z]);\n}\n\n/**\n * Set a body's linear velocity (m/s) directly — e.g. to impart a throw velocity on release.\n */\nexport function setPhysicsBodyLinearVelocity(world: PhysicsWorld, body: PhysicsBody, velocity: Vec3): void {\n world._hknp.HP_Body_SetLinearVelocity(body._hkBody, [velocity.x, velocity.y, velocity.z]);\n}\n\n/**\n * Get a body's current linear velocity (m/s).\n */\nexport function getPhysicsBodyLinearVelocity(world: PhysicsWorld, body: PhysicsBody): Vec3 {\n const v = world._hknp.HP_Body_GetLinearVelocity(body._hkBody)[1];\n return { x: v[0], y: v[1], z: v[2] };\n}\n\n/**\n * Set a body's angular velocity (rad/s).\n */\nexport function setPhysicsBodyAngularVelocity(world: PhysicsWorld, body: PhysicsBody, velocity: Vec3): void {\n world._hknp.HP_Body_SetAngularVelocity(body._hkBody, [velocity.x, velocity.y, velocity.z]);\n}\n\n/**\n * Switch a body's motion type at runtime (e.g. ANIMATED/kinematic while a prop is grabbed, then\n * DYNAMIC on release). Mutates `body.motionType` so the per-frame step syncs it the right way\n * (ANIMATED: node → body before the step; DYNAMIC: body → node after).\n */\nexport function setPhysicsBodyMotionType(world: PhysicsWorld, body: PhysicsBody, motionType: PhysicsMotionType): void {\n const hknp = world._hknp;\n const hkMotion =\n motionType === PhysicsMotionType.STATIC ? hknp.MotionType.STATIC : motionType === PhysicsMotionType.ANIMATED ? hknp.MotionType.KINEMATIC : hknp.MotionType.DYNAMIC;\n hknp.HP_Body_SetMotionType(body._hkBody, hkMotion);\n (body as { motionType: PhysicsMotionType }).motionType = motionType;\n}\n\n/**\n * Teleport a body to a world position + orientation (a pure transform set — velocities are left\n * unchanged). For grab-follow, save-restore, and undo. Also updates the bound node so a render that\n * reads the node before the next physics step stays consistent.\n */\nexport function setPhysicsBodyTransform(world: PhysicsWorld, body: PhysicsBody, position: Vec3, rotation: Quat): void {\n world._hknp.HP_Body_SetQTransform(body._hkBody, [\n [position.x, position.y, position.z],\n [rotation.x, rotation.y, rotation.z, rotation.w],\n ]);\n body.node.position.set(position.x, position.y, position.z);\n body.node.rotationQuaternion.set(rotation.x, rotation.y, rotation.z, rotation.w);\n}\n\n// ─── Removal ─────────────────────────────────────────────────────────\n\n/**\n * Remove a single body from the world and release its native handle (the per-frame step skips it from\n * now on). After this the body must not be reused. A body that isn't in the world is ignored, so this is\n * safe to call once per body. Does NOT release the body's collision shape — release that separately with\n * {@link releasePhysicsShape} if it isn't shared.\n * @param world - The physics world.\n * @param body - The body to remove.\n */\nexport function removePhysicsBody(world: PhysicsWorld, body: PhysicsBody): void {\n const { _hknp: hknp, _hkWorld: hkWorld, _bodies: bodies } = world;\n const i = bodies.indexOf(body);\n if (i < 0) {\n return; // already removed / not part of this world\n }\n bodies.splice(i, 1);\n hknp.HP_World_RemoveBody(hkWorld, body._hkBody);\n hknp.HP_Body_Release(body._hkBody);\n}\n\n/**\n * Release a collision shape's native handle, freeing its WASM memory. Only call once no body still\n * references the shape (e.g. after {@link removePhysicsBody}). Useful when rebuilding a changing set of\n * static colliders so their shapes don't accumulate.\n * @param world - The physics world.\n * @param shape - The shape to release.\n */\nexport function releasePhysicsShape(world: PhysicsWorld, shape: PhysicsShape): void {\n world._hknp.HP_Shape_Release(shape._hkShape);\n}\n\n// ─── Aggregate (convenience) ─────────────────────────────────────────\n\n/**\n * Create a physics aggregate: body + shape + material wired together.\n * `mass === 0` → STATIC, `mass > 0` → DYNAMIC.\n * Primitive shape geometry is auto-sized from the mesh bounding box when not specified.\n */\nexport function createPhysicsAggregate(world: PhysicsWorld, node: Mesh, type: PhysicsShapeType, options: PhysicsAggregateOptions): PhysicsAggregate {\n const motionType = options.mass === 0 ? PhysicsMotionType.STATIC : PhysicsMotionType.DYNAMIC;\n\n // Use a caller-supplied pre-built shape if present (e.g. a mesh/convex-hull\n // shape built via createPhysicsShape); otherwise build a primitive shape.\n // Reading options.shape adds no mesh code to this function.\n let shape = options.shape;\n if (!shape) {\n // Build shape parameters, auto-sizing from bounding box if needed\n const shapeParams = _buildShapeParams(node, type, options);\n const hkShape = createPrimitivePhysicsShapeHandle(world._hknp, type, shapeParams);\n if (hkShape === null) {\n throw new Error(\"createPhysicsAggregate supports only primitive physics shapes.\");\n }\n shape = { _hkShape: hkShape, _type: type };\n }\n\n // Create body\n const body = createPhysicsBody(world, node, motionType, options.startAsleep);\n setPhysicsBodyShape(world, body, shape);\n\n // Set material (friction + restitution) after assigning the shape, matching\n // Babylon.js PhysicsAggregate/HavokPlugin ordering.\n const friction = options.friction ?? 0.2;\n const restitution = options.restitution ?? 0.2;\n setPhysicsShapeMaterial(world, shape, friction, restitution);\n\n // Set mass for dynamic bodies\n if (options.mass > 0) {\n setPhysicsBodyMass(world, body, options.mass);\n }\n\n return { body, shape };\n}\n\nfunction _buildShapeParams(node: Mesh, type: PhysicsShapeType, options: PhysicsAggregateOptions): PhysicsShapeParameters {\n const params: PhysicsShapeParameters = {};\n\n if (options.center) {\n params.center = options.center;\n }\n if (options.rotation) {\n params.rotation = options.rotation;\n }\n\n switch (type) {\n case PhysicsShapeType.SPHERE: {\n params.radius = options.radius ?? _boundingRadius(node);\n params.center = params.center ?? _boundingCenter(node);\n break;\n }\n case PhysicsShapeType.BOX: {\n params.extents = options.extents ?? _boundingExtents(node);\n params.center = params.center ?? _boundingCenter(node);\n break;\n }\n case PhysicsShapeType.CAPSULE:\n case PhysicsShapeType.CYLINDER: {\n params.radius = options.radius ?? _boundingRadius(node);\n params.pointA = options.pointA ?? { x: 0, y: 0, z: 0 };\n params.pointB = options.pointB ?? { x: 0, y: 1, z: 0 };\n break;\n }\n }\n return params;\n}\n\nfunction _boundingCenter(mesh: Mesh): Vec3 {\n if (mesh.boundMin && mesh.boundMax) {\n return {\n x: (mesh.boundMin[0] + mesh.boundMax[0]) * 0.5,\n y: (mesh.boundMin[1] + mesh.boundMax[1]) * 0.5,\n z: (mesh.boundMin[2] + mesh.boundMax[2]) * 0.5,\n };\n }\n return { x: 0, y: 0, z: 0 };\n}\n\nfunction _boundingExtents(mesh: Mesh): Vec3 {\n if (mesh.boundMin && mesh.boundMax) {\n return {\n x: mesh.boundMax[0] - mesh.boundMin[0],\n y: mesh.boundMax[1] - mesh.boundMin[1],\n z: mesh.boundMax[2] - mesh.boundMin[2],\n };\n }\n return { x: 1, y: 1, z: 1 };\n}\n\nfunction _boundingRadius(mesh: Mesh): number {\n if (mesh.boundMin && mesh.boundMax) {\n const dx = mesh.boundMax[0]! - mesh.boundMin[0]!;\n const dy = mesh.boundMax[1]! - mesh.boundMin[1]!;\n const dz = mesh.boundMax[2]! - mesh.boundMin[2]!;\n return Math.max(dx, dy, dz) * 0.5;\n }\n return 0.5;\n}\n\ninterface PhysicsDebugGeometry {\n positions: Float32Array;\n indices: Uint32Array;\n}\n\n/** @internal */\nexport function getPhysicsBodyDebugGeometry(world: PhysicsWorld, body: PhysicsBody): PhysicsDebugGeometry {\n const hknp = world._hknp;\n const shapeResult = hknp.HP_Body_GetShape(body._hkBody);\n const ok = hknp.Result?.RESULT_OK ?? 0;\n if (shapeResult[0] !== ok || !shapeResult[1]) {\n return { positions: new Float32Array(0), indices: new Uint32Array(0) };\n }\n const geometryResult = hknp.HP_Shape_CreateDebugDisplayGeometry(shapeResult[1]);\n if (geometryResult[0] !== ok) {\n return { positions: new Float32Array(0), indices: new Uint32Array(0) };\n }\n const geometryInfo = hknp.HP_DebugGeometry_GetInfo(geometryResult[1])[1];\n const positionsInPlugin = new Float32Array(hknp.HEAPU8.buffer, geometryInfo[0], geometryInfo[1] * 3);\n const indicesInPlugin = new Uint32Array(hknp.HEAPU8.buffer, geometryInfo[2], geometryInfo[3] * 3);\n const positions = positionsInPlugin.slice(0);\n const indices = indicesInPlugin.slice(0);\n hknp.HP_DebugGeometry_Release(geometryResult[1]);\n return { positions, indices };\n}\n\n// ─── Dispose ─────────────────────────────────────────────────────────\n\n/**\n * Removes and releases all bodies, then releases the native world. Call once when tearing down physics.\n * @param world - The physics world to dispose.\n */\nexport function disposePhysics(world: PhysicsWorld): void {\n if (world._fo) {\n world._fo.dispose(world);\n return;\n }\n\n const { _hknp: hknp, _hkWorld: hkWorld, _bodies: bodies } = world;\n\n // Remove and release all bodies\n for (let i = bodies.length - 1; i >= 0; i--) {\n const b = bodies[i]!;\n hknp.HP_World_RemoveBody(hkWorld, b._hkBody);\n hknp.HP_Body_Release(b._hkBody);\n }\n bodies.length = 0;\n\n // Release world\n hknp.HP_World_Release(hkWorld);\n}\n"],"names":["PhysicsShapeType","PhysicsMotionType","PhysicsPrestepType","PhysicsConstraintType","PhysicsConstraintAxis","g"],"mappings":"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"}
1
+ {"version":3,"file":"havok.js","sources":["../../../src/physics/havok.ts"],"sourcesContent":["/**\n * Havok Physics V2 integration for Babylon Lite.\n *\n * Standalone-function API consistent with Lite conventions:\n * ```ts\n * const world = await createHavokWorld(scene);\n * setPhysicsGravity(world, { x: 0, y: -9.81, z: 0 });\n * const agg = createPhysicsAggregate(world, sphere, PhysicsShapeType.SPHERE, { mass: 1 });\n * ```\n *\n * The WASM binary is loaded lazily on first call and cached for subsequent worlds.\n */\n\nimport type { Mat4, Vec3, Quat } from \"../math/types.js\";\nimport type { SceneNode } from \"../scene/scene-node.js\";\nimport type { SceneContext } from \"../scene/scene-core.js\";\nimport type { Mesh } from \"../mesh/mesh.js\";\nimport type { HavokFloatingOriginContext, WorldRegion } from \"./havok-floating-origin.js\";\nimport { mat4Invert } from \"../math/mat4-invert.js\";\nimport { mat4Multiply } from \"../math/mat4-multiply.js\";\nimport { mat4Scale } from \"../math/mat4-scale.js\";\nimport { mat4Decompose } from \"../math/mat4-decompose.js\";\n\n// ─── Enums ───────────────────────────────────────────────────────────\n\n/** Geometry type of a physics collision shape. */\nexport const enum PhysicsShapeType {\n SPHERE = 0,\n CAPSULE = 1,\n CYLINDER = 2,\n BOX = 3,\n CONVEX_HULL = 4,\n CONTAINER = 5,\n MESH = 6,\n HEIGHTFIELD = 7,\n}\n\n/** How a body moves: `STATIC` (immovable), `ANIMATED` (driven by the node transform), or `DYNAMIC` (simulated). */\nexport const enum PhysicsMotionType {\n STATIC = 0,\n ANIMATED = 1,\n DYNAMIC = 2,\n}\n\n/**\n * How a moved transform node is propagated to its physics body before each step.\n * `DISABLED` skips the sync, `TELEPORT` snaps the body to the node (`HP_Body_SetQTransform`),\n * and `ACTION` sets the body's velocity so it reaches the node (`HP_Body_SetTargetQTransform`,\n * dragging resting bodies via friction). Values match Babylon.js `PhysicsPrestepType`.\n */\nexport const enum PhysicsPrestepType {\n DISABLED = 0,\n TELEPORT = 1,\n ACTION = 2,\n}\n\n/** Type of Havok Physics V2 constraint. */\nexport const enum PhysicsConstraintType {\n BALL_AND_SOCKET = 1,\n DISTANCE = 2,\n HINGE = 3,\n SLIDER = 4,\n LOCK = 5,\n PRISMATIC = 6,\n SIX_DOF = 7,\n}\n\n/** Axis addressed by a Physics V2 constraint limit. */\nexport const enum PhysicsConstraintAxis {\n LINEAR_X = 0,\n LINEAR_Y = 1,\n LINEAR_Z = 2,\n ANGULAR_X = 3,\n ANGULAR_Y = 4,\n ANGULAR_Z = 5,\n LINEAR_DISTANCE = 6,\n}\n\n// ─── Option interfaces ───────────────────────────────────────────────\n\n/** Geometry parameters describing a collision shape; which fields apply depends on the shape type. */\nexport interface PhysicsShapeParameters {\n center?: Vec3;\n radius?: number;\n pointA?: Vec3;\n pointB?: Vec3;\n rotation?: Quat;\n extents?: Vec3;\n}\n\n/** Options for `createPhysicsShape`: the shape type plus its geometry parameters. */\nexport interface PhysicsShapeOptions {\n type: PhysicsShapeType;\n parameters?: PhysicsShapeParameters;\n /** Mesh or transform hierarchy used when `type` is `MESH` or `CONVEX_HULL`. */\n mesh?: SceneNode;\n /** When true, mesh and convex-hull shapes accumulate descendant meshes under `mesh`. */\n includeChildMeshes?: boolean;\n}\n\n/** Options for `createPhysicsAggregate`: mass, material (friction/restitution), and optional shape geometry overrides. */\nexport interface PhysicsAggregateOptions {\n mass: number;\n friction?: number;\n restitution?: number;\n radius?: number;\n pointA?: Vec3;\n pointB?: Vec3;\n extents?: Vec3;\n rotation?: Quat;\n center?: Vec3;\n startAsleep?: boolean;\n isTriggerShape?: boolean;\n /**\n * Optional pre-built shape. When provided, it is used directly and the\n * primitive-shape build path is skipped. This lets callers supply\n * mesh/convex-hull shapes (built via `createPhysicsShape`) without pulling\n * the mesh-shape code into `createPhysicsAggregate` itself.\n */\n shape?: PhysicsShape;\n}\n\n/** Mass properties applied to a physics body. Omitted fields keep Havok's shape-derived values. */\nexport interface PhysicsMassProperties {\n centerOfMass?: Vec3;\n mass?: number;\n inertia?: Vec3;\n inertiaOrientation?: Quat;\n}\n\n/** Pivot/axis options used to create a physics constraint. */\nexport interface PhysicsConstraintOptions {\n pivotA?: Vec3;\n pivotB?: Vec3;\n axisA?: Vec3;\n axisB?: Vec3;\n perpAxisA?: Vec3;\n perpAxisB?: Vec3;\n maxDistance?: number;\n collision?: boolean;\n}\n\n/** Limit options used by 6DoF constraints. */\nexport interface PhysicsConstraintLimit {\n axis: PhysicsConstraintAxis;\n minLimit?: number;\n maxLimit?: number;\n stiffness?: number;\n damping?: number;\n}\n\n// ─── Opaque handles (pure state — no methods) ────────────────────────\n\n/** Opaque handle to a Havok rigid body, bound to a scene node and a motion type. */\nexport interface PhysicsBody {\n /** @internal */ readonly _hkBody: any;\n /** @internal */ readonly _world: PhysicsWorld;\n /** @internal */ _shape?: PhysicsShape | null;\n /** @internal */ _preStep: boolean;\n /** @internal How a moved node is propagated to the body pre-step (TELEPORT by default). */\n _prestepType: PhysicsPrestepType;\n readonly node: SceneNode;\n readonly motionType: PhysicsMotionType;\n /** @internal The floating-origin region this body lives in; set only under floating origin. */\n _region?: WorldRegion;\n}\n\n/** Opaque handle to a Havok collision shape. */\nexport interface PhysicsShape {\n /** @internal */ readonly _hkShape: any;\n /** @internal */ readonly _type: PhysicsShapeType;\n}\n\n/** A body and its shape wired together, as produced by `createPhysicsAggregate`. */\nexport interface PhysicsAggregate {\n readonly body: PhysicsBody;\n readonly shape: PhysicsShape;\n}\n\n/** Opaque handle to a Havok constraint between two bodies. */\nexport interface PhysicsConstraint {\n /** @internal */ readonly _hkConstraint: any;\n readonly bodyA: PhysicsBody;\n readonly bodyB: PhysicsBody;\n readonly type: PhysicsConstraintType;\n readonly options: PhysicsConstraintOptions;\n readonly limits?: readonly PhysicsConstraintLimit[];\n}\n\n// ─── PhysicsWorld — pure-state handle ────────────────────────────────\n\n/** Pure-state handle to a Havok physics world: the WASM module, the native world, its bodies, and the timestep. */\nexport interface PhysicsWorld {\n /** @internal */ readonly _hknp: any;\n /** @internal */ readonly _hkWorld: any;\n /** @internal */ readonly _bodies: PhysicsBody[];\n /** @internal Owning scene, retained so out-of-step callers (e.g. the character controller) can\n * read the current per-frame delta (`scene.fixedDeltaMs` / `engine._currentDelta`) when the\n * world has no fixed step configured. The world already captures the scene in its per-frame\n * step closure, so this adds no new lifetime coupling. */\n readonly _scene: SceneContext;\n /** @internal Fixed simulation step in **milliseconds**, matching {@link SceneContext.fixedDeltaMs}.\n * Independent of the scene: defaults to `0` (\"no world-level fixed step\") and is only set by\n * {@link setPhysicsTimestep} / {@link setPhysicsTimestepMs}. When `0`, the step resolves the live\n * per-frame delta the scene feeds it (`scene.fixedDeltaMs` when running fixed, else the engine's\n * real frame delta), so runtime changes to `scene.fixedDeltaMs` are always respected. */\n _fixedDeltaMs: number;\n /** @internal World-wide gravity `[x, y, z]` set at creation; used to seed floating-origin regions. */\n _gravity: number[];\n /** @internal Floating-origin runtime; present only after `enableHavokFloatingOrigin` is called. */\n _fo?: HavokFloatingOriginContext;\n /** @internal Callbacks run after each physics step (post body→node sync, pre-render). */\n _afterStep?: ((timestep: number) => void)[];\n /** @internal Lazily-created Havok query collector, cached by the standalone `physics/havok-queries.ts` module. */\n _queryCollector?: any;\n /** @internal Removes the per-frame step callback from the scene; called by `disposePhysics` before the native world is released. */\n _stopStep?: () => void;\n}\n\n// ─── Factory ─────────────────────────────────────────────────────────\n\n/**\n * Create a Havok physics world and register per-frame stepping on the scene.\n *\n * The caller is responsible for loading the WASM binary externally:\n * ```ts\n * import HavokPhysics from \"@babylonjs/havok\";\n * const hknp = await HavokPhysics({ locateFile: () => \"/HavokPhysics.wasm\" });\n * const world = createHavokWorld(scene, hknp);\n * ```\n *\n * For Large World Rendering, call {@link enableHavokFloatingOrigin} on the returned world (before\n * creating any bodies) to opt into multi-region floating-origin simulation.\n */\nexport function createHavokWorld(scene: SceneContext, hknp: any, gravity?: Vec3): PhysicsWorld {\n const hkWorld = hknp.HP_World_Create()[1];\n\n const g = gravity ?? { x: 0, y: -9.81, z: 0 };\n hknp.HP_World_SetGravity(hkWorld, [g.x, g.y, g.z]);\n\n const world: PhysicsWorld = {\n _hknp: hknp,\n _hkWorld: hkWorld,\n _bodies: [],\n _scene: scene,\n _fixedDeltaMs: 0,\n _gravity: [g.x, g.y, g.z],\n };\n\n // Register the per-frame physics step directly on the scene (mirror of\n // physics-viewer.ts). Keep a remover so disposePhysics can stop stepping\n // before the native world is released — otherwise a still-running step\n // would step a freed world (use-after-free in Havok WASM).\n const stepCb = (deltaMs: number): void => {\n _stepWorld(world, deltaMs);\n };\n scene._beforeRender.unshift(stepCb);\n world._stopStep = () => {\n const i = scene._beforeRender.indexOf(stepCb);\n if (i >= 0) {\n scene._beforeRender.splice(i, 1);\n }\n };\n\n return world;\n}\n\n/**\n * Opt a Havok world into multi-region floating-origin simulation (Large World Rendering).\n *\n * Loads the floating-origin runtime on demand (`physics/havok-floating-origin.ts`) so worlds that\n * never call this — i.e. ordinary near-origin physics scenes — never pull that code into their\n * bundle. Once enabled, bodies far apart in world space are simulated in separate regions (each\n * within `floatingOriginWorldRadius` of its origin) so the float32 Havok solver keeps full\n * precision. Node transforms remain true world coordinates; eye-relative rendering is handled\n * independently by the floating-origin render path.\n *\n * Must be called **before** creating any bodies in the world. Pair it with an engine created with\n * `useFloatingOrigin: true` so rendering and physics share the same far-from-origin handling.\n * @param world - The physics world to enable floating origin on.\n * @param floatingOriginWorldRadius - Region capture radius in metres (default 100000, matching Babylon.js).\n */\nexport async function enableHavokFloatingOrigin(world: PhysicsWorld, floatingOriginWorldRadius = 100000): Promise<void> {\n const fo = await import(\"./havok-floating-origin.js\");\n world._fo = fo.createHavokFloatingOriginContext(world._hkWorld, world._gravity, floatingOriginWorldRadius);\n}\n\n// ─── Per-frame stepping ──────────────────────────────────────────────\n\n/** Hard ceiling on a single physics step (100 ms = a 10 fps floor). A long hitch — backgrounded tab,\n * GC pause, hit breakpoint — otherwise hands Havok a huge dt, which tunnels fast bodies through thin\n * geometry and can destabilise the constraint solver. Shared by the per-frame step and the\n * out-of-loop callers (`worldStepSeconds`) so every physics consumer agrees on the effective step. */\nconst MAX_STEP_MS = 100;\n\nfunction _stepWorld(world: PhysicsWorld, deltaMs: number): void {\n const { _hknp: hknp, _hkWorld: hkWorld, _bodies: bodies } = world;\n // Step size in ms: the world's own fixed step when set (`> 0`), otherwise the live per-frame delta\n // the scene supplies — which the render loop already resolves as `scene.fixedDeltaMs > 0 ?\n // scene.fixedDeltaMs : engine._currentDelta`, so runtime changes to `scene.fixedDeltaMs` flow\n // through here every frame. Reject non-finite or non-positive steps up front — matching the\n // animation/sprite managers — so a NaN/negative delta can never reach the solver (a NaN dt would\n // poison every body's integration).\n const stepMs = world._fixedDeltaMs > 0 ? world._fixedDeltaMs : deltaMs;\n if (!Number.isFinite(stepMs) || stepMs <= 0) {\n return;\n }\n // Clamp the step (see MAX_STEP_MS): capping degrades a stall into a brief slow-motion rather than\n // an explosion (Babylon.js caps its physics substep the same way).\n const dt = Math.min(stepMs, MAX_STEP_MS) / 1000;\n\n // Floating-origin worlds run a multi-region step (loaded on demand).\n if (world._fo) {\n world._fo.step(world, dt);\n return;\n }\n\n // Pre-step: sync moved nodes into Havok. A body syncs only when its prestep type is not\n // DISABLED and it is either ANIMATED (kinematic) or explicitly pre-stepped. TELEPORT snaps the\n // body to the node; ACTION sets a velocity toward it (so resting bodies are dragged via friction).\n for (let i = 0; i < bodies.length; i++) {\n const b = bodies[i]!;\n if (b._prestepType !== PhysicsPrestepType.DISABLED && (b.motionType === (PhysicsMotionType.ANIMATED as number) || b._preStep)) {\n if (b._prestepType === PhysicsPrestepType.ACTION) {\n _syncNodeToBodyTarget(hknp, b);\n } else {\n _syncNodeToBody(hknp, b);\n }\n }\n }\n\n hknp.HP_World_Step(hkWorld, dt);\n\n // Post-step: sync DYNAMIC bodies from Havok → node\n for (let i = 0; i < bodies.length; i++) {\n const b = bodies[i]!;\n if (b.motionType === (PhysicsMotionType.DYNAMIC as number)) {\n _syncBodyToNode(hknp, b);\n }\n }\n\n // After-step hooks run once body→node sync is complete, before rendering. This mirrors\n // Babylon.js, where physics is advanced inside `scene.animate()` (before render) and\n // post-step scene logic runs in `onAfterRenderObservable`.\n if (world._afterStep) {\n const cbs = world._afterStep;\n for (let i = 0; i < cbs.length; i++) {\n cbs[i]!(dt);\n }\n }\n}\n\n/**\n * Registers a callback to run after each physics step, once dynamic body transforms have been\n * synced back to their nodes and before the frame is rendered. Use this for per-step logic that\n * must observe (or react to) the freshly-integrated state — e.g. tracking a marker to a body's\n * post-step pose, or applying a force whose effect should integrate on the next step.\n * @param world - The physics world to hook.\n * @param cb - Callback invoked with the world timestep (seconds) after each step.\n */\nexport function onPhysicsAfterStep(world: PhysicsWorld, cb: (timestep: number) => void): void {\n (world._afterStep ??= []).push(cb);\n}\n\nfunction _syncBodyToNode(hknp: any, body: PhysicsBody): void {\n const t = hknp.HP_Body_GetQTransform(body._hkBody)[1];\n const pos = t[0]; // [x, y, z]\n const rot = t[1]; // [x, y, z, w]\n const node = body.node;\n node.position.set(pos[0], pos[1], pos[2]);\n node.rotationQuaternion.set(rot[0], rot[1], rot[2], rot[3]);\n}\n\nfunction _syncNodeToBody(hknp: any, body: PhysicsBody): void {\n const node = body.node;\n const p = node.position;\n const q = node.rotationQuaternion;\n hknp.HP_Body_SetQTransform(body._hkBody, [\n [p.x, p.y, p.z],\n [q.x, q.y, q.z, q.w],\n ]);\n}\n\n// ACTION prestep: instead of snapping the body, set its target transform so Havok derives a\n// velocity that carries the body to the node over the step. Resting bodies stacked on top are then\n// dragged along by friction rather than tunneled through.\nfunction _syncNodeToBodyTarget(hknp: any, body: PhysicsBody): void {\n const node = body.node;\n const p = node.position;\n const q = node.rotationQuaternion;\n hknp.HP_Body_SetTargetQTransform(body._hkBody, [\n [p.x, p.y, p.z],\n [q.x, q.y, q.z, q.w],\n ]);\n}\n\n// ─── Gravity ─────────────────────────────────────────────────────────\n\n/**\n * Sets gravity for the world, or for a single region when `worldPosition` is given.\n * Passing a position is useful for planetary scenarios where gravity direction varies by location.\n * @param world - The physics world.\n * @param gravity - Gravity acceleration in m/s².\n * @param worldPosition - Optional world position selecting the region to update; omit to update all regions.\n */\nexport function setPhysicsGravity(world: PhysicsWorld, gravity: Vec3, worldPosition?: Vec3): void {\n if (world._fo) {\n world._fo.setGravity(world, [gravity.x, gravity.y, gravity.z], worldPosition);\n return;\n }\n world._hknp.HP_World_SetGravity(world._hkWorld, [gravity.x, gravity.y, gravity.z]);\n}\n\n/**\n * Returns the world's current gravity vector, or a specific region's when `worldPosition` is given.\n * @param world - The physics world.\n * @param worldPosition - Optional world position selecting the region to read; omit for the world-wide gravity.\n * @returns Gravity acceleration in m/s².\n */\nexport function getPhysicsGravity(world: PhysicsWorld, worldPosition?: Vec3): Vec3 {\n if (worldPosition && world._fo) {\n const g = world._fo.getRegionGravity(world, worldPosition);\n return { x: g[0]!, y: g[1]!, z: g[2]! };\n }\n const g = world._hknp.HP_World_GetGravity(world._hkWorld)[1];\n return { x: g[0], y: g[1], z: g[2] };\n}\n\n// ─── Timestep ────────────────────────────────────────────────────────\n\n/**\n * Sets the fixed simulation timestep used by each world step, in **seconds**.\n *\n * Pass `0` to make the world step at the real per-frame delta instead of a fixed step.\n * See {@link setPhysicsTimestepMs} for the millisecond-based equivalent.\n * @param world - The physics world.\n * @param dt - Fixed step in seconds (e.g. `1 / 60`), or `0` to use the frame delta.\n */\nexport function setPhysicsTimestep(world: PhysicsWorld, dt: number): void {\n world._fixedDeltaMs = dt * 1000;\n}\n\n/**\n * Returns the world's fixed simulation timestep in **seconds** (`0` means the real per-frame delta\n * is used). See {@link getPhysicsTimestepMs} for the millisecond-based equivalent.\n * @param world - The physics world.\n * @returns The fixed step in seconds.\n */\nexport function getPhysicsTimestep(world: PhysicsWorld): number {\n return world._fixedDeltaMs / 1000;\n}\n\n/**\n * Sets the fixed simulation timestep used by each world step, in **milliseconds** (matching\n * {@link SceneContext.fixedDeltaMs}). Pass `0` to make the world step at the real per-frame delta\n * instead of a fixed step. See {@link setPhysicsTimestep} for the seconds-based equivalent.\n * @param world - The physics world.\n * @param fixedDeltaMs - Fixed step in milliseconds (e.g. `1000 / 60`), or `0` to use the frame delta.\n */\nexport function setPhysicsTimestepMs(world: PhysicsWorld, fixedDeltaMs: number): void {\n world._fixedDeltaMs = fixedDeltaMs;\n}\n\n/**\n * Returns the world's fixed simulation timestep in **milliseconds** (`0` means the real per-frame\n * delta is used). See {@link getPhysicsTimestep} for the seconds-based equivalent.\n * @param world - The physics world.\n * @returns The fixed step in milliseconds.\n */\nexport function getPhysicsTimestepMs(world: PhysicsWorld): number {\n return world._fixedDeltaMs;\n}\n\n/**\n * Effective physics step in **seconds** for callers that run outside the per-frame step loop\n * (force→impulse application, the character controller): the world's fixed step when set, otherwise\n * the owning scene's current per-frame delta — its own `fixedDeltaMs`, else the engine's real frame\n * delta — mirroring how `_stepWorld` resolves the delta the scene feeds it. Applies the same\n * finite/positive guard and {@link MAX_STEP_MS} clamp as `_stepWorld`, so every physics caller agrees\n * on the effective step. Returns `0` on a frame with no delta yet (e.g. before the first render);\n * callers guard against that.\n * @internal\n */\nexport function worldStepSeconds(world: PhysicsWorld): number {\n const scene = world._scene;\n const stepMs = world._fixedDeltaMs > 0 ? world._fixedDeltaMs : scene.fixedDeltaMs > 0 ? scene.fixedDeltaMs : scene.surface.engine._currentDelta;\n if (!Number.isFinite(stepMs) || stepMs <= 0) {\n return 0;\n }\n return Math.min(stepMs, MAX_STEP_MS) / 1000;\n}\n\n// ─── Velocity limits ─────────────────────────────────────────────────\n\n/**\n * Clamps the maximum linear and angular speeds of bodies in the world.\n * @param world - The physics world.\n * @param maxLinear - Maximum linear speed.\n * @param maxAngular - Maximum angular speed.\n */\nexport function setPhysicsVelocityLimits(world: PhysicsWorld, maxLinear: number, maxAngular: number): void {\n if (world._fo) {\n world._fo.setVelocityLimits(world, maxLinear, maxAngular);\n return;\n }\n world._hknp.HP_World_SetSpeedLimit(world._hkWorld, maxLinear, maxAngular);\n}\n\n/**\n * Returns the world's current maximum linear and angular speed limits.\n * @param world - The physics world.\n * @returns The `maxLinear` and `maxAngular` speed limits.\n */\nexport function getPhysicsVelocityLimits(world: PhysicsWorld): { maxLinear: number; maxAngular: number } {\n const limits = world._hknp.HP_World_GetSpeedLimit(world._hkWorld);\n return { maxLinear: limits[1], maxAngular: limits[2] };\n}\n\n// ─── Body ────────────────────────────────────────────────────────────\n\n/**\n * Creates a rigid body bound to a scene node, adds it to the world, and seeds it with the node's transform.\n * @param world - The physics world.\n * @param node - The scene node the body follows / drives.\n * @param motionType - Whether the body is static, animated (kinematic), or dynamic.\n * @param startsAsleep - When true, the body is added in a sleeping state.\n * @returns The created physics body handle.\n */\nexport function createPhysicsBody(world: PhysicsWorld, node: SceneNode, motionType: PhysicsMotionType, startsAsleep = false): PhysicsBody {\n const { _hknp: hknp, _hkWorld: hkWorld } = world;\n\n const hkBody = hknp.HP_Body_Create()[1];\n\n // Set motion type\n const hkMotion =\n motionType === PhysicsMotionType.STATIC ? hknp.MotionType.STATIC : motionType === PhysicsMotionType.ANIMATED ? hknp.MotionType.KINEMATIC : hknp.MotionType.DYNAMIC;\n hknp.HP_Body_SetMotionType(hkBody, hkMotion);\n\n const body: PhysicsBody = {\n _hkBody: hkBody,\n _shape: null,\n _preStep: false,\n _prestepType: PhysicsPrestepType.TELEPORT,\n _world: world,\n node,\n motionType,\n };\n\n if (world._fo) {\n // Floating origin: place the body in its region, storing it in region-local coordinates.\n world._fo.placeBody(world, body, startsAsleep);\n } else {\n // Add to world first, then set transform (Havok resets transform on add)\n hknp.HP_World_AddBody(hkWorld, hkBody, startsAsleep);\n\n const p = node.position;\n const q = node.rotationQuaternion;\n hknp.HP_Body_SetQTransform(hkBody, [\n [p.x, p.y, p.z],\n [q.x, q.y, q.z, q.w],\n ]);\n }\n\n world._bodies.push(body);\n return body;\n}\n\n/**\n * Enable or disable pre-step synchronization from a node transform to its Havok body.\n * @param body - The physics body to update.\n * @param enabled - When true, the node transform is written to Havok before each physics step.\n */\nexport function setPhysicsBodyPreStep(body: PhysicsBody, enabled: boolean): void {\n body._preStep = enabled;\n}\n\n/**\n * Sets how a moved transform node is propagated to its physics body before each step.\n * `TELEPORT` snaps the body to the node, `ACTION` sets a velocity toward it (so resting bodies are\n * dragged along by friction), and `DISABLED` skips the pre-step sync entirely. Setting any type\n * other than `DISABLED` automatically enables prestep syncing for the body (equivalent to\n * {@link setPhysicsBodyPreStep}), so STATIC/DYNAMIC bodies are synced without an extra call.\n * @param body - The physics body to update.\n * @param type - The prestep behaviour to apply.\n */\nexport function setPhysicsBodyPrestepType(body: PhysicsBody, type: PhysicsPrestepType): void {\n body._prestepType = type;\n if (type !== PhysicsPrestepType.DISABLED) {\n body._preStep = true;\n }\n}\n\n/**\n * Applies a world-space impulse to a physics body.\n * @param body - The physics body to update.\n * @param impulse - Impulse vector.\n * @param location - World-space application point.\n */\nexport function applyPhysicsBodyImpulse(body: PhysicsBody, impulse: Vec3, location: Vec3): void {\n const hknp = body._world._hknp;\n hknp.HP_Body_ApplyImpulse(body._hkBody, [location.x, location.y, location.z], [impulse.x, impulse.y, impulse.z]);\n}\n\n/**\n * Applies a force for one fixed physics timestep, matching Babylon.js PhysicsBody.applyForce.\n * @param world - The physics world.\n * @param body - The physics body to update.\n * @param force - Force vector.\n * @param location - World-space application point.\n */\nexport function applyPhysicsBodyForce(world: PhysicsWorld, body: PhysicsBody, force: Vec3, location: Vec3): void {\n // impulse = force × Δt (seconds). When the world has no fixed step, `worldStepSeconds` falls back\n // to the scene's current per-frame delta (its `fixedDeltaMs`, else the engine's real frame delta).\n const dt = worldStepSeconds(world);\n applyPhysicsBodyImpulse(body, { x: force.x * dt, y: force.y * dt, z: force.z * dt }, location);\n}\n\n/**\n * Creates and enables a Havok constraint between two physics bodies.\n * @param world - The physics world.\n * @param bodyA - Parent body.\n * @param bodyB - Child body.\n * @param type - Constraint type.\n * @param options - Pivot and axis options.\n * @param limits - Optional 6DoF limits.\n */\nexport function createPhysicsConstraint(\n world: PhysicsWorld,\n bodyA: PhysicsBody,\n bodyB: PhysicsBody,\n type: PhysicsConstraintType,\n options: PhysicsConstraintOptions = {},\n limits: readonly PhysicsConstraintLimit[] = []\n): PhysicsConstraint {\n const hknp = world._hknp;\n const joint = hknp.HP_Constraint_Create()[1];\n hknp.HP_Constraint_SetParentBody(joint, bodyA._hkBody);\n hknp.HP_Constraint_SetChildBody(joint, bodyB._hkBody);\n\n const pivotA = options.pivotA ?? ZERO_VEC3;\n const pivotB = options.pivotB ?? ZERO_VEC3;\n const axisA = options.axisA ?? X_AXIS;\n const axisB = options.axisB ?? X_AXIS;\n const perpAxisA = options.perpAxisA ?? normalTo(axisA);\n const perpAxisB = options.perpAxisB ?? normalTo(axisB);\n hknp.HP_Constraint_SetAnchorInParent(joint, vec3Array(pivotA), vec3Array(axisA), vec3Array(perpAxisA));\n hknp.HP_Constraint_SetAnchorInChild(joint, vec3Array(pivotB), vec3Array(axisB), vec3Array(perpAxisB));\n\n configureConstraintAxes(hknp, joint, type, options, limits);\n hknp.HP_Constraint_SetCollisionsEnabled(joint, !!options.collision);\n hknp.HP_Constraint_SetEnabled(joint, true);\n\n return { _hkConstraint: joint, bodyA, bodyB, type, options: { ...options, axisA, axisB, perpAxisA, perpAxisB }, limits };\n}\n\n/**\n * Sets the Havok filter membership mask for a collision shape.\n * @param world - The physics world.\n * @param shape - The shape to update.\n * @param membershipMask - Bitmask describing which collision group this shape belongs to.\n */\nexport function setPhysicsShapeFilterMembershipMask(world: PhysicsWorld, shape: PhysicsShape, membershipMask: number): void {\n const info = world._hknp.HP_Shape_GetFilterInfo(shape._hkShape)[1];\n world._hknp.HP_Shape_SetFilterInfo(shape._hkShape, [membershipMask, info[1]]);\n}\n\n/**\n * Sets the Havok filter collide mask for a collision shape.\n * @param world - The physics world.\n * @param shape - The shape to update.\n * @param collideMask - Bitmask describing which collision groups this shape collides with.\n */\nexport function setPhysicsShapeFilterCollideMask(world: PhysicsWorld, shape: PhysicsShape, collideMask: number): void {\n const info = world._hknp.HP_Shape_GetFilterInfo(shape._hkShape)[1];\n world._hknp.HP_Shape_SetFilterInfo(shape._hkShape, [info[0], collideMask]);\n}\n\nconst ZERO_VEC3: Vec3 = { x: 0, y: 0, z: 0 };\nconst X_AXIS: Vec3 = { x: 1, y: 0, z: 0 };\n\nfunction vec3Array(v: Vec3): [number, number, number] {\n return [v.x, v.y, v.z];\n}\n\nfunction normalTo(axis: Vec3): Vec3 {\n const ax = Math.abs(axis.x);\n const ay = Math.abs(axis.y);\n const az = Math.abs(axis.z);\n if (ax <= ay && ax <= az) {\n return normalizeVec3({ x: 0, y: -axis.z, z: axis.y });\n }\n if (ay <= ax && ay <= az) {\n return normalizeVec3({ x: -axis.z, y: 0, z: axis.x });\n }\n return normalizeVec3({ x: -axis.y, y: axis.x, z: 0 });\n}\n\nfunction normalizeVec3(v: Vec3): Vec3 {\n const inv = 1 / Math.max(1e-8, Math.hypot(v.x, v.y, v.z));\n return { x: v.x * inv, y: v.y * inv, z: v.z * inv };\n}\n\nfunction configureConstraintAxes(hknp: any, joint: any, type: PhysicsConstraintType, options: PhysicsConstraintOptions, limits: readonly PhysicsConstraintLimit[]): void {\n const axis = hknp.ConstraintAxis;\n const mode = hknp.ConstraintAxisLimitMode;\n const lock = (a: any): void => hknp.HP_Constraint_SetAxisMode(joint, a, mode.LOCKED);\n const limit = (a: any, min: number, max: number): void => {\n hknp.HP_Constraint_SetAxisMode(joint, a, mode.LIMITED);\n hknp.HP_Constraint_SetAxisMinLimit(joint, a, min);\n hknp.HP_Constraint_SetAxisMaxLimit(joint, a, max);\n };\n\n switch (type) {\n case PhysicsConstraintType.LOCK:\n lock(axis.LINEAR_X);\n lock(axis.LINEAR_Y);\n lock(axis.LINEAR_Z);\n lock(axis.ANGULAR_X);\n lock(axis.ANGULAR_Y);\n lock(axis.ANGULAR_Z);\n break;\n case PhysicsConstraintType.DISTANCE: {\n const d = options.maxDistance ?? 0;\n limit(axis.LINEAR_DISTANCE, d, d);\n break;\n }\n case PhysicsConstraintType.HINGE:\n lock(axis.LINEAR_X);\n lock(axis.LINEAR_Y);\n lock(axis.LINEAR_Z);\n lock(axis.ANGULAR_Y);\n lock(axis.ANGULAR_Z);\n break;\n case PhysicsConstraintType.PRISMATIC:\n lock(axis.LINEAR_Y);\n lock(axis.LINEAR_Z);\n lock(axis.ANGULAR_X);\n lock(axis.ANGULAR_Y);\n lock(axis.ANGULAR_Z);\n break;\n case PhysicsConstraintType.SLIDER:\n lock(axis.LINEAR_Y);\n lock(axis.LINEAR_Z);\n lock(axis.ANGULAR_Y);\n lock(axis.ANGULAR_Z);\n break;\n case PhysicsConstraintType.BALL_AND_SOCKET:\n lock(axis.LINEAR_X);\n lock(axis.LINEAR_Y);\n lock(axis.LINEAR_Z);\n break;\n case PhysicsConstraintType.SIX_DOF:\n for (const l of limits) {\n const nativeAxis = constraintAxisToNative(axis, l.axis);\n if ((l.minLimit ?? -1) === 0 && (l.maxLimit ?? -1) === 0) {\n lock(nativeAxis);\n } else {\n if (l.minLimit !== undefined || l.maxLimit !== undefined) {\n hknp.HP_Constraint_SetAxisMode(joint, nativeAxis, mode.LIMITED);\n }\n if (l.minLimit !== undefined) {\n hknp.HP_Constraint_SetAxisMinLimit(joint, nativeAxis, l.minLimit);\n }\n if (l.maxLimit !== undefined) {\n hknp.HP_Constraint_SetAxisMaxLimit(joint, nativeAxis, l.maxLimit);\n }\n }\n if (l.stiffness !== undefined) {\n hknp.HP_Constraint_SetAxisStiffness(joint, nativeAxis, l.stiffness);\n }\n if (l.damping !== undefined) {\n hknp.HP_Constraint_SetAxisDamping(joint, nativeAxis, l.damping);\n }\n }\n break;\n }\n}\n\nfunction constraintAxisToNative(axis: any, value: PhysicsConstraintAxis): any {\n switch (value) {\n case PhysicsConstraintAxis.LINEAR_X:\n return axis.LINEAR_X;\n case PhysicsConstraintAxis.LINEAR_Y:\n return axis.LINEAR_Y;\n case PhysicsConstraintAxis.LINEAR_Z:\n return axis.LINEAR_Z;\n case PhysicsConstraintAxis.ANGULAR_X:\n return axis.ANGULAR_X;\n case PhysicsConstraintAxis.ANGULAR_Y:\n return axis.ANGULAR_Y;\n case PhysicsConstraintAxis.ANGULAR_Z:\n return axis.ANGULAR_Z;\n case PhysicsConstraintAxis.LINEAR_DISTANCE:\n return axis.LINEAR_DISTANCE;\n }\n}\n\n// ─── Shape ───────────────────────────────────────────────────────────\n\ninterface HavokBuffer {\n offset: number;\n numObjects: number;\n}\n\nclass MeshAccumulator {\n private readonly _vertices: number[] = [];\n private readonly _indices: number[] = [];\n private readonly _collectIndices: boolean;\n\n public constructor(collectIndices: boolean) {\n this._collectIndices = collectIndices;\n }\n\n public addNodeMeshes(root: SceneNode, includeChildren: boolean): void {\n const invRoot = mat4Invert(root.worldMatrix as Mat4);\n if (!invRoot) {\n throw new Error(\"Cannot create physics mesh shape from a singular root transform.\");\n }\n\n const rootScale = mat4Scale(root.scaling.x, root.scaling.y, root.scaling.z);\n const rootToBody = mat4Multiply(rootScale, invRoot);\n this._addNodeMesh(root, rootToBody);\n\n if (includeChildren) {\n for (const child of root.children) {\n this._addDescendantMeshes(child, rootToBody);\n }\n }\n\n if (this._vertices.length === 0) {\n throw new Error(\"Cannot create physics mesh shape without vertex positions.\");\n }\n if (this._collectIndices && this._indices.length === 0) {\n throw new Error(\"Cannot create physics mesh shape without triangle indices.\");\n }\n }\n\n public getVertices(hknp: any): HavokBuffer {\n const numObjects = this._vertices.length;\n const offset = hknp._malloc(numObjects * 4);\n new Float32Array(hknp.HEAPU8.buffer, offset, numObjects).set(this._vertices);\n return { offset, numObjects };\n }\n\n public getTriangles(hknp: any): HavokBuffer {\n const numObjects = this._indices.length;\n const offset = hknp._malloc(numObjects * 4);\n new Int32Array(hknp.HEAPU8.buffer, offset, numObjects).set(this._indices);\n return { offset, numObjects };\n }\n\n public freeBuffer(hknp: any, buffer: HavokBuffer): void {\n hknp._free(buffer.offset);\n }\n\n private _addDescendantMeshes(node: SceneNode, rootToBody: Mat4): void {\n this._addNodeMesh(node, rootToBody);\n for (const child of node.children) {\n this._addDescendantMeshes(child, rootToBody);\n }\n }\n\n private _addNodeMesh(node: SceneNode, rootToBody: Mat4): void {\n if (!isMesh(node)) {\n return;\n }\n const positions = node._cpuPositions;\n if (!positions || positions.length === 0) {\n return;\n }\n\n const meshToBody = mat4Multiply(rootToBody, node.worldMatrix as Mat4);\n const indexOffset = this._vertices.length / 3;\n for (let i = 0; i < positions.length; i += 3) {\n transformPositionInto(this._vertices, meshToBody, positions[i]!, positions[i + 1]!, positions[i + 2]!);\n }\n\n if (!this._collectIndices) {\n return;\n }\n\n const indices = node._cpuIndices;\n if (!indices) {\n return;\n }\n for (let i = 0; i < indices.length; i += 3) {\n const a = indices[i]! + indexOffset;\n const b = indices[i + 1]! + indexOffset;\n const c = indices[i + 2]! + indexOffset;\n // Babylon Lite scenes use Babylon.js' default left-handed winding, so\n // reverse triangle order for Havok's mesh-shape interior optimization.\n this._indices.push(c, b, a);\n }\n }\n}\n\nfunction isMesh(node: SceneNode): node is Mesh {\n return \"_gpu\" in node && \"_cpuPositions\" in node;\n}\n\nfunction transformPositionInto(dst: number[], m: Mat4, x: number, y: number, z: number): void {\n dst.push(m[0]! * x + m[4]! * y + m[8]! * z + m[12]!, m[1]! * x + m[5]! * y + m[9]! * z + m[13]!, m[2]! * x + m[6]! * y + m[10]! * z + m[14]!);\n}\n\n/**\n * Creates a collision shape from the given options.\n * @param world - The physics world.\n * @param options - The shape type and its geometry parameters.\n * @returns The created shape handle.\n */\nexport function createPhysicsShape(world: PhysicsWorld, options: PhysicsShapeOptions): PhysicsShape {\n const { _hknp: hknp } = world;\n const params = options.parameters ?? {};\n\n let hkShape: any;\n const primitiveShape = createPrimitivePhysicsShapeHandle(hknp, options.type, params);\n if (primitiveShape !== null) {\n return { _hkShape: primitiveShape, _type: options.type };\n }\n\n switch (options.type) {\n case PhysicsShapeType.CONTAINER: {\n hkShape = hknp.HP_Shape_CreateContainer()[1];\n break;\n }\n case PhysicsShapeType.CONVEX_HULL:\n case PhysicsShapeType.MESH: {\n if (!options.mesh) {\n throw new Error(\"Physics mesh shapes require a mesh or transform hierarchy.\");\n }\n const collectIndices = options.type === PhysicsShapeType.MESH;\n const accum = new MeshAccumulator(collectIndices);\n accum.addNodeMeshes(options.mesh, options.includeChildMeshes ?? false);\n const positions = accum.getVertices(hknp);\n const numVec3s = positions.numObjects / 3;\n if (options.type === PhysicsShapeType.CONVEX_HULL) {\n hkShape = hknp.HP_Shape_CreateConvexHull(positions.offset, numVec3s)[1];\n } else {\n const triangles = accum.getTriangles(hknp);\n const numTriangles = triangles.numObjects / 3;\n hkShape = hknp.HP_Shape_CreateMesh(positions.offset, numVec3s, triangles.offset, numTriangles)[1];\n accum.freeBuffer(hknp, triangles);\n }\n accum.freeBuffer(hknp, positions);\n break;\n }\n default:\n throw new Error(`Unsupported shape type: ${options.type}`);\n }\n\n return { _hkShape: hkShape, _type: options.type };\n}\n\nfunction createPrimitivePhysicsShapeHandle(hknp: any, type: PhysicsShapeType, params: PhysicsShapeParameters): any | null {\n switch (type) {\n case PhysicsShapeType.SPHERE: {\n const c = params.center ?? { x: 0, y: 0, z: 0 };\n const r = params.radius ?? 0.5;\n return hknp.HP_Shape_CreateSphere([c.x, c.y, c.z], r)[1];\n }\n case PhysicsShapeType.BOX: {\n const c = params.center ?? { x: 0, y: 0, z: 0 };\n const q = params.rotation ?? { x: 0, y: 0, z: 0, w: 1 };\n const e = params.extents ?? { x: 1, y: 1, z: 1 };\n return hknp.HP_Shape_CreateBox([c.x, c.y, c.z], [q.x, q.y, q.z, q.w], [e.x, e.y, e.z])[1];\n }\n case PhysicsShapeType.CAPSULE: {\n const a = params.pointA ?? { x: 0, y: 0, z: 0 };\n const b = params.pointB ?? { x: 0, y: 1, z: 0 };\n const r = params.radius ?? 0.5;\n return hknp.HP_Shape_CreateCapsule([a.x, a.y, a.z], [b.x, b.y, b.z], r)[1];\n }\n case PhysicsShapeType.CYLINDER: {\n const a = params.pointA ?? { x: 0, y: 0, z: 0 };\n const b = params.pointB ?? { x: 0, y: 1, z: 0 };\n const r = params.radius ?? 0.5;\n return hknp.HP_Shape_CreateCylinder([a.x, a.y, a.z], [b.x, b.y, b.z], r)[1];\n }\n default:\n return null;\n }\n}\n\n// ─── Shape ↔ Body wiring ─────────────────────────────────────────────\n\n/**\n * Assigns a collision shape to a body.\n * @param world - The physics world.\n * @param body - The body to attach the shape to.\n * @param shape - The collision shape.\n */\nexport function setPhysicsBodyShape(world: PhysicsWorld, body: PhysicsBody, shape: PhysicsShape): void {\n world._hknp.HP_Body_SetShape(body._hkBody, shape._hkShape);\n body._shape = shape;\n}\n\n/**\n * Adds a child shape to a container shape with an explicit local transform.\n * @param world - The physics world.\n * @param container - Parent container shape.\n * @param child - Child shape to append.\n * @param translation - Child translation in container space.\n * @param rotation - Child rotation in container space.\n * @param scale - Child scale in container space.\n */\nexport function addPhysicsShapeChild(world: PhysicsWorld, container: PhysicsShape, child: PhysicsShape, translation?: Vec3, rotation?: Quat, scale?: Vec3): void {\n const t = translation ?? { x: 0, y: 0, z: 0 };\n const r = rotation ?? { x: 0, y: 0, z: 0, w: 1 };\n const s = scale ?? { x: 1, y: 1, z: 1 };\n world._hknp.HP_Shape_AddChild(container._hkShape, child._hkShape, [\n [t.x, t.y, t.z],\n [r.x, r.y, r.z, r.w],\n [s.x, s.y, s.z],\n ]);\n}\n\n/**\n * Adds a child shape to a container, deriving its local transform from two scene nodes.\n * @param world - The physics world.\n * @param container - Parent container shape.\n * @param parentNode - Scene node associated with the container shape.\n * @param child - Child shape to append.\n * @param childNode - Scene node associated with the child shape.\n */\nexport function addPhysicsShapeChildFromParent(world: PhysicsWorld, container: PhysicsShape, parentNode: SceneNode, child: PhysicsShape, childNode: SceneNode): void {\n const invParent = mat4Invert(parentNode.worldMatrix as Mat4);\n if (!invParent) {\n throw new Error(\"Cannot add physics child shape from a singular parent transform.\");\n }\n const childToParent = mat4Multiply(invParent, childNode.worldMatrix as Mat4);\n const transform = mat4Decompose(childToParent);\n addPhysicsShapeChild(world, container, child, transform.translation, transform.rotation, transform.scale);\n}\n\n/**\n * Sets a shape's surface material properties.\n * @param world - The physics world.\n * @param shape - The collision shape.\n * @param friction - Friction coefficient (used for both static and dynamic friction).\n * @param restitution - Bounciness in `[0, 1]`.\n */\nexport function setPhysicsShapeMaterial(world: PhysicsWorld, shape: PhysicsShape, friction: number, restitution: number): void {\n // Material array: [staticFriction, dynamicFriction, restitution, frictionCombine, restitutionCombine].\n // Havok's combine modes are embind enum objects, not raw numbers.\n const combines = world._hknp.MaterialCombine;\n const material = [friction, friction, restitution, combines.MINIMUM, combines.MAXIMUM];\n world._hknp.HP_Shape_SetMaterial(shape._hkShape, material);\n}\n\n// ─── Mass ────────────────────────────────────────────────────────────\n\n/**\n * Sets a body's mass, preserving the shape-derived inertia tensor, centre of mass, and inertia\n * orientation (matching Babylon.js `HavokPlugin` — only the mass scalar is overridden). A body with\n * no shape attached yet has no inertia tensor to derive, so it falls back to an isotropic inertia\n * proportional to the mass until a shape is set.\n * @param world - The physics world.\n * @param body - The body to update.\n * @param mass - Mass in kilograms.\n * @param centerOfMass - Optional body-local centre of mass override. When omitted, the shape-derived\n * centre of mass is preserved. Use this when the collision shape is offset from the body's reference\n * frame (e.g. a prop whose body origin sits at its base but whose shape is centred on its middle)\n * so it tumbles around its real centre.\n */\nexport function setPhysicsBodyMass(world: PhysicsWorld, body: PhysicsBody, mass: number, centerOfMass?: Vec3): void {\n // Match Babylon.js HavokPlugin._internalUpdateMassProperties: for a body with a shape, start from\n // the shape-derived mass properties (correct anisotropic inertia tensor + centre of mass +\n // orientation) and override only the mass scalar. Writing a placeholder isotropic inertia would\n // make constrained/torqued bodies rotate at the wrong rate and break physics parity. A shape-less\n // body has no inertia to derive, so keep the previous mass-proportional isotropic fallback.\n const massProps = body._shape ? buildMassProperties(world, body) : [[0, 0, 0], mass, [mass, mass, mass], [0, 0, 0, 1]];\n massProps[1] = mass;\n if (centerOfMass) {\n massProps[0] = [centerOfMass.x, centerOfMass.y, centerOfMass.z];\n }\n world._hknp.HP_Body_SetMassProperties(body._hkBody, massProps);\n}\n\n/**\n * Sets a body's mass properties, preserving Havok's shape-derived values for omitted fields.\n * @param world - The physics world.\n * @param body - The body to update.\n * @param properties - Mass-property overrides.\n */\nexport function setPhysicsBodyMassProperties(world: PhysicsWorld, body: PhysicsBody, properties: PhysicsMassProperties): void {\n const massProps = buildMassProperties(world, body);\n if (properties.centerOfMass) {\n massProps[0] = [properties.centerOfMass.x, properties.centerOfMass.y, properties.centerOfMass.z];\n }\n if (properties.mass !== undefined) {\n massProps[1] = properties.mass;\n }\n if (properties.inertia) {\n massProps[2] = [properties.inertia.x, properties.inertia.y, properties.inertia.z];\n }\n if (properties.inertiaOrientation) {\n massProps[3] = [properties.inertiaOrientation.x, properties.inertiaOrientation.y, properties.inertiaOrientation.z, properties.inertiaOrientation.w];\n }\n world._hknp.HP_Body_SetMassProperties(body._hkBody, massProps);\n}\n\nfunction buildMassProperties(world: PhysicsWorld, body: PhysicsBody): any[] {\n const hknp = world._hknp;\n const ok = hknp.Result?.RESULT_OK ?? 0;\n const shape = hknp.HP_Body_GetShape(body._hkBody);\n if (shape[0] === ok) {\n const shapeMass = hknp.HP_Shape_BuildMassProperties(shape[1]);\n if (shapeMass[0] === ok) {\n return shapeMass[1];\n }\n }\n return [[0, 0, 0], 1, [1, 1, 1], [0, 0, 0, 1]];\n}\n\n// ─── Body control (impulse / velocity / motion type / transform) ─────\n// Runtime body controls used by gameplay: shoot/throw (impulse + velocity), grab (switch a body to\n// ANIMATED/kinematic while held, then back to DYNAMIC on release), and teleport (restore/load/undo).\n\n/**\n * Apply a one-shot linear impulse (kg·m/s) to a body at a world `point` (defaults to the body's\n * current position / centre of mass), waking it if asleep. Used to shoot, throw, or shove a prop.\n * @param world - The physics world.\n * @param body - The body to push.\n * @param impulse - World-space impulse vector (kg·m/s).\n * @param point - World point of application; defaults to the body's current position.\n */\nexport function applyPhysicsImpulse(world: PhysicsWorld, body: PhysicsBody, impulse: Vec3, point?: Vec3): void {\n const hknp = world._hknp;\n let loc = point;\n if (!loc) {\n const t = hknp.HP_Body_GetQTransform(body._hkBody)[1];\n loc = { x: t[0][0], y: t[0][1], z: t[0][2] };\n }\n hknp.HP_Body_ApplyImpulse(body._hkBody, [loc.x, loc.y, loc.z], [impulse.x, impulse.y, impulse.z]);\n}\n\n/**\n * Set a body's linear velocity (m/s) directly — e.g. to impart a throw velocity on release.\n */\nexport function setPhysicsBodyLinearVelocity(world: PhysicsWorld, body: PhysicsBody, velocity: Vec3): void {\n world._hknp.HP_Body_SetLinearVelocity(body._hkBody, [velocity.x, velocity.y, velocity.z]);\n}\n\n/**\n * Get a body's current linear velocity (m/s).\n */\nexport function getPhysicsBodyLinearVelocity(world: PhysicsWorld, body: PhysicsBody): Vec3 {\n const v = world._hknp.HP_Body_GetLinearVelocity(body._hkBody)[1];\n return { x: v[0], y: v[1], z: v[2] };\n}\n\n/**\n * Set a body's angular velocity (rad/s).\n */\nexport function setPhysicsBodyAngularVelocity(world: PhysicsWorld, body: PhysicsBody, velocity: Vec3): void {\n world._hknp.HP_Body_SetAngularVelocity(body._hkBody, [velocity.x, velocity.y, velocity.z]);\n}\n\n/**\n * Switch a body's motion type at runtime (e.g. ANIMATED/kinematic while a prop is grabbed, then\n * DYNAMIC on release). Mutates `body.motionType` so the per-frame step syncs it the right way\n * (ANIMATED: node → body before the step; DYNAMIC: body → node after).\n */\nexport function setPhysicsBodyMotionType(world: PhysicsWorld, body: PhysicsBody, motionType: PhysicsMotionType): void {\n const hknp = world._hknp;\n const hkMotion =\n motionType === PhysicsMotionType.STATIC ? hknp.MotionType.STATIC : motionType === PhysicsMotionType.ANIMATED ? hknp.MotionType.KINEMATIC : hknp.MotionType.DYNAMIC;\n hknp.HP_Body_SetMotionType(body._hkBody, hkMotion);\n (body as { motionType: PhysicsMotionType }).motionType = motionType;\n}\n\n/**\n * Teleport a body to a world position + orientation (a pure transform set — velocities are left\n * unchanged). For grab-follow, save-restore, and undo. Also updates the bound node so a render that\n * reads the node before the next physics step stays consistent.\n */\nexport function setPhysicsBodyTransform(world: PhysicsWorld, body: PhysicsBody, position: Vec3, rotation: Quat): void {\n world._hknp.HP_Body_SetQTransform(body._hkBody, [\n [position.x, position.y, position.z],\n [rotation.x, rotation.y, rotation.z, rotation.w],\n ]);\n body.node.position.set(position.x, position.y, position.z);\n body.node.rotationQuaternion.set(rotation.x, rotation.y, rotation.z, rotation.w);\n}\n\n// ─── Removal ─────────────────────────────────────────────────────────\n\n/**\n * Remove a single body from the world and release its native handle (the per-frame step skips it from\n * now on). After this the body must not be reused. A body that isn't in the world is ignored, so this is\n * safe to call once per body. Does NOT release the body's collision shape — release that separately with\n * {@link releasePhysicsShape} if it isn't shared.\n * @param world - The physics world.\n * @param body - The body to remove.\n */\nexport function removePhysicsBody(world: PhysicsWorld, body: PhysicsBody): void {\n const { _hknp: hknp, _hkWorld: hkWorld, _bodies: bodies } = world;\n const i = bodies.indexOf(body);\n if (i < 0) {\n return; // already removed / not part of this world\n }\n bodies.splice(i, 1);\n hknp.HP_World_RemoveBody(hkWorld, body._hkBody);\n hknp.HP_Body_Release(body._hkBody);\n}\n\n/**\n * Release a collision shape's native handle, freeing its WASM memory. Only call once no body still\n * references the shape (e.g. after {@link removePhysicsBody}). Useful when rebuilding a changing set of\n * static colliders so their shapes don't accumulate.\n * @param world - The physics world.\n * @param shape - The shape to release.\n */\nexport function releasePhysicsShape(world: PhysicsWorld, shape: PhysicsShape): void {\n world._hknp.HP_Shape_Release(shape._hkShape);\n}\n\n// ─── Aggregate (convenience) ─────────────────────────────────────────\n\n/**\n * Create a physics aggregate: body + shape + material wired together.\n * `mass === 0` → STATIC, `mass > 0` → DYNAMIC.\n * Primitive shape geometry is auto-sized from the mesh bounding box when not specified.\n */\nexport function createPhysicsAggregate(world: PhysicsWorld, node: Mesh, type: PhysicsShapeType, options: PhysicsAggregateOptions): PhysicsAggregate {\n const motionType = options.mass === 0 ? PhysicsMotionType.STATIC : PhysicsMotionType.DYNAMIC;\n\n // Use a caller-supplied pre-built shape if present (e.g. a mesh/convex-hull\n // shape built via createPhysicsShape); otherwise build a primitive shape.\n // Reading options.shape adds no mesh code to this function.\n let shape = options.shape;\n if (!shape) {\n // Build shape parameters, auto-sizing from bounding box if needed\n const shapeParams = _buildShapeParams(node, type, options);\n const hkShape = createPrimitivePhysicsShapeHandle(world._hknp, type, shapeParams);\n if (hkShape === null) {\n throw new Error(\"createPhysicsAggregate supports only primitive physics shapes.\");\n }\n shape = { _hkShape: hkShape, _type: type };\n }\n\n // Create body\n const body = createPhysicsBody(world, node, motionType, options.startAsleep);\n setPhysicsBodyShape(world, body, shape);\n\n // Set material (friction + restitution) after assigning the shape, matching\n // Babylon.js PhysicsAggregate/HavokPlugin ordering.\n const friction = options.friction ?? 0.2;\n const restitution = options.restitution ?? 0.2;\n setPhysicsShapeMaterial(world, shape, friction, restitution);\n\n // Set mass for dynamic bodies\n if (options.mass > 0) {\n setPhysicsBodyMass(world, body, options.mass);\n }\n\n return { body, shape };\n}\n\nfunction _buildShapeParams(node: Mesh, type: PhysicsShapeType, options: PhysicsAggregateOptions): PhysicsShapeParameters {\n const params: PhysicsShapeParameters = {};\n\n if (options.center) {\n params.center = options.center;\n }\n if (options.rotation) {\n params.rotation = options.rotation;\n }\n\n switch (type) {\n case PhysicsShapeType.SPHERE: {\n params.radius = options.radius ?? _boundingRadius(node);\n params.center = params.center ?? _boundingCenter(node);\n break;\n }\n case PhysicsShapeType.BOX: {\n params.extents = options.extents ?? _boundingExtents(node);\n params.center = params.center ?? _boundingCenter(node);\n break;\n }\n case PhysicsShapeType.CAPSULE:\n case PhysicsShapeType.CYLINDER: {\n params.radius = options.radius ?? _boundingRadius(node);\n params.pointA = options.pointA ?? { x: 0, y: 0, z: 0 };\n params.pointB = options.pointB ?? { x: 0, y: 1, z: 0 };\n break;\n }\n }\n return params;\n}\n\nfunction _boundingCenter(mesh: Mesh): Vec3 {\n if (mesh.boundMin && mesh.boundMax) {\n return {\n x: (mesh.boundMin[0] + mesh.boundMax[0]) * 0.5,\n y: (mesh.boundMin[1] + mesh.boundMax[1]) * 0.5,\n z: (mesh.boundMin[2] + mesh.boundMax[2]) * 0.5,\n };\n }\n return { x: 0, y: 0, z: 0 };\n}\n\nfunction _boundingExtents(mesh: Mesh): Vec3 {\n if (mesh.boundMin && mesh.boundMax) {\n return {\n x: mesh.boundMax[0] - mesh.boundMin[0],\n y: mesh.boundMax[1] - mesh.boundMin[1],\n z: mesh.boundMax[2] - mesh.boundMin[2],\n };\n }\n return { x: 1, y: 1, z: 1 };\n}\n\nfunction _boundingRadius(mesh: Mesh): number {\n if (mesh.boundMin && mesh.boundMax) {\n const dx = mesh.boundMax[0]! - mesh.boundMin[0]!;\n const dy = mesh.boundMax[1]! - mesh.boundMin[1]!;\n const dz = mesh.boundMax[2]! - mesh.boundMin[2]!;\n return Math.max(dx, dy, dz) * 0.5;\n }\n return 0.5;\n}\n\ninterface PhysicsDebugGeometry {\n positions: Float32Array;\n indices: Uint32Array;\n}\n\n/** @internal */\nexport function getPhysicsBodyDebugGeometry(world: PhysicsWorld, body: PhysicsBody): PhysicsDebugGeometry {\n const hknp = world._hknp;\n const shapeResult = hknp.HP_Body_GetShape(body._hkBody);\n const ok = hknp.Result?.RESULT_OK ?? 0;\n if (shapeResult[0] !== ok || !shapeResult[1]) {\n return { positions: new Float32Array(0), indices: new Uint32Array(0) };\n }\n const geometryResult = hknp.HP_Shape_CreateDebugDisplayGeometry(shapeResult[1]);\n if (geometryResult[0] !== ok) {\n return { positions: new Float32Array(0), indices: new Uint32Array(0) };\n }\n const geometryInfo = hknp.HP_DebugGeometry_GetInfo(geometryResult[1])[1];\n const positionsInPlugin = new Float32Array(hknp.HEAPU8.buffer, geometryInfo[0], geometryInfo[1] * 3);\n const indicesInPlugin = new Uint32Array(hknp.HEAPU8.buffer, geometryInfo[2], geometryInfo[3] * 3);\n const positions = positionsInPlugin.slice(0);\n const indices = indicesInPlugin.slice(0);\n hknp.HP_DebugGeometry_Release(geometryResult[1]);\n return { positions, indices };\n}\n\n// ─── Dispose ─────────────────────────────────────────────────────────\n\n/**\n * Removes and releases all bodies, then releases the native world. Call once when tearing down physics.\n * @param world - The physics world to dispose.\n */\nexport function disposePhysics(world: PhysicsWorld): void {\n // Stop per-frame stepping before any native world is released so a still-queued\n // _beforeRender callback can't step a freed world (use-after-free in Havok WASM).\n world._stopStep?.();\n world._stopStep = undefined;\n\n // Drop after-step hooks (e.g. the collision-event drain registered by\n // onPhysicsCollision). They read the native world via HP_World_GetCollisionEvents,\n // so they must not survive it — clear them alongside the step callback.\n world._afterStep = undefined;\n\n if (world._fo) {\n world._fo.dispose(world);\n return;\n }\n\n const { _hknp: hknp, _hkWorld: hkWorld, _bodies: bodies } = world;\n\n // Remove and release all bodies\n for (let i = bodies.length - 1; i >= 0; i--) {\n const b = bodies[i]!;\n hknp.HP_World_RemoveBody(hkWorld, b._hkBody);\n hknp.HP_Body_Release(b._hkBody);\n }\n bodies.length = 0;\n\n // Release world\n hknp.HP_World_Release(hkWorld);\n}\n"],"names":["PhysicsShapeType","PhysicsMotionType","PhysicsPrestepType","PhysicsConstraintType","PhysicsConstraintAxis","g"],"mappings":"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"}
@@ -26,7 +26,8 @@ function createGpuPicker(scene) {
26
26
  _rt: null,
27
27
  _sceneUbo: null,
28
28
  _sceneBG: null,
29
- _gsMeshResources: null
29
+ _gsMeshResources: null,
30
+ _pending: null
30
31
  };
31
32
  }
32
33
  function ensureTargets(engine, picker) {
@@ -97,7 +98,7 @@ function createPickDiscardBindGroup(engine, layout, discard, mesh, tempBuffers)
97
98
  entries
98
99
  });
99
100
  }
100
- async function pickAsync(picker, x, y, options) {
101
+ async function pickAsyncImpl(picker, x, y, options) {
101
102
  const scene = picker._scene;
102
103
  const pickFilter = options?.filter ?? null;
103
104
  const pickDiscard = options?.discard ?? null;
@@ -366,6 +367,19 @@ async function pickAsync(picker, x, y, options) {
366
367
  }
367
368
  return info;
368
369
  }
370
+ function pickAsync(picker, x, y, options) {
371
+ const prior = picker._pending ?? Promise.resolve();
372
+ const run = prior.then(
373
+ () => pickAsyncImpl(picker, x, y, options),
374
+ () => pickAsyncImpl(picker, x, y, options)
375
+ // a prior pick's rejection must not wedge the queue for this caller
376
+ );
377
+ picker._pending = run.then(
378
+ () => void 0,
379
+ () => void 0
380
+ );
381
+ return run;
382
+ }
369
383
  function disposePicker(picker) {
370
384
  if (picker._rt) {
371
385
  picker._rt.colorTex.destroy();