@babylonjs/lite 1.6.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 (88) 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 +321 -301
  5. package/dist/index.js.map +1 -1
  6. package/index.d.ts +294 -13
  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/depth-resolve-task.js +117 -0
  29. package/lib/frame-graph/depth-resolve-task.js.map +1 -0
  30. package/lib/frame-graph/frame-graph-actions.js +10 -1
  31. package/lib/frame-graph/frame-graph-actions.js.map +1 -1
  32. package/lib/frame-graph/render-task.js +7 -0
  33. package/lib/frame-graph/render-task.js.map +1 -1
  34. package/lib/frame-graph/transmission-depth-grab.js +88 -0
  35. package/lib/frame-graph/transmission-depth-grab.js.map +1 -0
  36. package/lib/frame-graph/transmission.js +34 -4
  37. package/lib/frame-graph/transmission.js.map +1 -1
  38. package/lib/gizmo/bounding-box-gizmo.js +1 -1
  39. package/lib/index.js +9 -6
  40. package/lib/index.js.map +1 -1
  41. package/lib/loader-gltf/gltf-feature-gpu-instancing.js +1 -1
  42. package/lib/loader-gltf/gltf-interleave.js +1 -1
  43. package/lib/loader-gltf/load-gltf.js +1 -1
  44. package/lib/material/shader/shader-material.js +4 -2
  45. package/lib/material/shader/shader-material.js.map +1 -1
  46. package/lib/material/shader/shader-pipeline.js +11 -1
  47. package/lib/material/shader/shader-pipeline.js.map +1 -1
  48. package/lib/material/shader/shader-renderable.js +42 -14
  49. package/lib/material/shader/shader-renderable.js.map +1 -1
  50. package/lib/material/shader/shader-thin-instance.js +1 -1
  51. package/lib/material/shader/shader-thin-instance.js.map +1 -1
  52. package/lib/math/aabb.js +1 -1
  53. package/lib/math/compute-aabb.js +63 -1
  54. package/lib/math/compute-aabb.js.map +1 -1
  55. package/lib/math/index.js +1 -1
  56. package/lib/mesh/csg2.js +3 -2
  57. package/lib/mesh/csg2.js.map +1 -1
  58. package/lib/mesh/mesh-factories.js +1 -1
  59. package/lib/mesh/thin-instance-gpu-culling.js +4 -2
  60. package/lib/mesh/thin-instance-gpu-culling.js.map +1 -1
  61. package/lib/mesh/thin-instance.js +8 -1
  62. package/lib/mesh/thin-instance.js.map +1 -1
  63. package/lib/navigation/index.js +1 -1
  64. package/lib/navigation/navigation.js +9 -1
  65. package/lib/navigation/navigation.js.map +1 -1
  66. package/lib/physics/character-controller.js +2 -2
  67. package/lib/physics/character-controller.js.map +1 -1
  68. package/lib/physics/havok-floating-origin.js +2 -2
  69. package/lib/physics/havok-floating-origin.js.map +1 -1
  70. package/lib/physics/havok.js +40 -13
  71. package/lib/physics/havok.js.map +1 -1
  72. package/lib/picking/gpu-picker.js +16 -2
  73. package/lib/picking/gpu-picker.js.map +1 -1
  74. package/lib/scene/scene-core.js +14 -5
  75. package/lib/scene/scene-core.js.map +1 -1
  76. package/lib/scene/scene-remove.js +8 -0
  77. package/lib/scene/scene-remove.js.map +1 -1
  78. package/lib/shadow/csm-shadow-task-hooks.js +14 -6
  79. package/lib/shadow/csm-shadow-task-hooks.js.map +1 -1
  80. package/lib/shadow/pcf-shadow-task-hooks.js +6 -0
  81. package/lib/shadow/pcf-shadow-task-hooks.js.map +1 -1
  82. package/lib/texture/pixels-texture.js +31 -1
  83. package/lib/texture/pixels-texture.js.map +1 -1
  84. package/lib/vat/vat-baker.js +41 -2
  85. package/lib/vat/vat-baker.js.map +1 -1
  86. package/package.json +15 -3
  87. package/lib/_chunks/__vite-browser-external-BFTKbDcV.js +0 -68
  88. package/lib/_chunks/__vite-browser-external-BFTKbDcV.js.map +0 -1
@@ -1 +1 @@
1
- {"version":3,"file":"havok-floating-origin.js","sources":["../../../src/physics/havok-floating-origin.ts"],"sourcesContent":["/**\n * Havok multi-region floating origin (Large World Rendering).\n *\n * This module is **dynamic-imported only when the engine has `useFloatingOrigin: true`**\n * (from `createHavokWorld`), so non-floating-origin physics scenes never pull this code into\n * their bundle.\n *\n * Under floating origin, bodies far apart in world space are simulated in separate regions —\n * each a native Havok world with a fixed `origin`. Bodies are stored in region-local coordinates\n * (`worldPos - origin`, near zero), so the float32 Havok solver keeps full precision at large\n * world coordinates. Node transforms remain true world coordinates; the eye-relative render path\n * is handled independently.\n *\n * Mirrors Babylon.js's `scene.floatingOriginMode` + Havok plugin `floatingOriginWorldRadius`.\n */\n\nimport type { Vec3 } from \"../math/types.js\";\nimport type { PhysicsBody, PhysicsWorld } from \"./havok.js\";\nimport { PhysicsMotionType } from \"./havok.js\";\n\n/**\n * A simulation region: a native Havok world whose bodies are simulated relative to a fixed\n * `origin`. `_regions[0]` is the default region (origin at the world origin).\n */\nexport interface WorldRegion {\n /** @internal */ _world: any;\n /** Floating origin (world-space centre) this region's bodies are stored relative to. */\n origin: Vec3;\n /** This region's gravity vector `[x, y, z]`. */\n gravity: number[];\n}\n\n/**\n * Floating-origin runtime stored on `PhysicsWorld._fo` (present only when floating origin is on).\n * Holds region state plus the standalone hooks the core physics module calls in place of its\n * single-world fast path.\n */\nexport interface HavokFloatingOriginContext {\n /** All simulation regions; `regions[0]` is the default (origin-centred) region. */\n regions: WorldRegion[];\n /** Region capture radius (metres). */\n radius: number;\n /** Most recently set world-wide gravity `[x, y, z]`; seeds newly created regions. */\n gravity: number[];\n placeBody(world: PhysicsWorld, body: PhysicsBody, startsAsleep: boolean): void;\n step(world: PhysicsWorld): void;\n setGravity(world: PhysicsWorld, gravity: number[], worldPosition?: Vec3): void;\n getRegionGravity(world: PhysicsWorld, worldPosition: Vec3): number[];\n setVelocityLimits(world: PhysicsWorld, maxLinear: number, maxAngular: number): void;\n dispose(world: PhysicsWorld): void;\n}\n\n/**\n * Builds the floating-origin context, seeding it with the world's default region (the native world\n * already created by `createHavokWorld`, centred at the origin).\n */\nexport function createHavokFloatingOriginContext(hkWorld: any, gravity: number[], radius: number): HavokFloatingOriginContext {\n return {\n regions: [{ _world: hkWorld, origin: { x: 0, y: 0, z: 0 }, gravity: [...gravity] }],\n radius,\n gravity: [...gravity],\n placeBody: _placeBody,\n step: _step,\n setGravity: _setGravity,\n getRegionGravity: _getRegionGravity,\n setVelocityLimits: _setVelocityLimits,\n dispose: _dispose,\n };\n}\n\n// ─── Region lookup / creation ────────────────────────────────────────\n\n/** Returns the region whose origin is within the capture radius of `pos`, or null. */\nfunction _findRegion(fo: HavokFloatingOriginContext, pos: Vec3): WorldRegion | null {\n const r2 = fo.radius * fo.radius;\n for (const region of fo.regions) {\n const dx = pos.x - region.origin.x;\n const dy = pos.y - region.origin.y;\n const dz = pos.z - region.origin.z;\n if (dx * dx + dy * dy + dz * dz <= r2) {\n return region;\n }\n }\n return null;\n}\n\n/** Returns an existing region containing `pos`, or creates a new one centred at `pos`. */\nfunction _getOrCreateRegion(world: PhysicsWorld, pos: Vec3): WorldRegion {\n const fo = world._fo!;\n const found = _findRegion(fo, pos);\n if (found) {\n return found;\n }\n const hknp = world._hknp;\n const newWorld = hknp.HP_World_Create()[1];\n hknp.HP_World_SetGravity(newWorld, fo.gravity);\n const limits = hknp.HP_World_GetSpeedLimit(world._hkWorld);\n hknp.HP_World_SetSpeedLimit(newWorld, limits[1], limits[2]);\n const region: WorldRegion = {\n _world: newWorld,\n origin: { x: pos.x, y: pos.y, z: pos.z },\n gravity: [...fo.gravity],\n };\n fo.regions.push(region);\n return region;\n}\n\n// ─── Hooks ───────────────────────────────────────────────────────────\n\nfunction _placeBody(world: PhysicsWorld, body: PhysicsBody, startsAsleep: boolean): void {\n const hknp = world._hknp;\n const node = body.node;\n const region = _getOrCreateRegion(world, node.position);\n hknp.HP_World_AddBody(region._world, body._hkBody, startsAsleep);\n const p = node.position;\n const q = node.rotationQuaternion;\n const o = region.origin;\n hknp.HP_Body_SetQTransform(body._hkBody, [\n [p.x - o.x, p.y - o.y, p.z - o.z],\n [q.x, q.y, q.z, q.w],\n ]);\n body._region = region;\n}\n\nfunction _step(world: PhysicsWorld): void {\n const hknp = world._hknp;\n const bodies = world._bodies;\n const regions = world._fo!.regions;\n\n // Re-region bodies that drifted out of their region BEFORE stepping.\n for (let i = 0; i < bodies.length; i++) {\n _reRegionBody(world, bodies[i]!);\n }\n\n // Pre-step: sync ANIMATED bodies from node → Havok.\n for (let i = 0; i < bodies.length; i++) {\n const b = bodies[i]!;\n if (b.motionType === (PhysicsMotionType.ANIMATED as number)) {\n _syncNodeToBody(hknp, b);\n }\n }\n\n // Step every region world.\n for (let i = 0; i < regions.length; i++) {\n hknp.HP_World_Step(regions[i]!._world, world._timestep);\n }\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 // Reclaim regions emptied by migration.\n _gcRegions(world);\n}\n\nfunction _setGravity(world: PhysicsWorld, gravity: number[], worldPosition?: Vec3): void {\n const fo = world._fo!;\n const hknp = world._hknp;\n if (worldPosition) {\n const region = _getOrCreateRegion(world, worldPosition);\n region.gravity = gravity;\n hknp.HP_World_SetGravity(region._world, gravity);\n return;\n }\n fo.gravity = gravity;\n for (const region of fo.regions) {\n region.gravity = gravity;\n hknp.HP_World_SetGravity(region._world, gravity);\n }\n}\n\nfunction _getRegionGravity(world: PhysicsWorld, worldPosition: Vec3): number[] {\n return _getOrCreateRegion(world, worldPosition).gravity;\n}\n\nfunction _setVelocityLimits(world: PhysicsWorld, maxLinear: number, maxAngular: number): void {\n for (const region of world._fo!.regions) {\n world._hknp.HP_World_SetSpeedLimit(region._world, maxLinear, maxAngular);\n }\n}\n\nfunction _dispose(world: PhysicsWorld): void {\n const hknp = world._hknp;\n const bodies = world._bodies;\n for (let i = bodies.length - 1; i >= 0; i--) {\n const b = bodies[i]!;\n hknp.HP_World_RemoveBody(b._region!._world, b._hkBody);\n hknp.HP_Body_Release(b._hkBody);\n }\n bodies.length = 0;\n const regions = world._fo!.regions;\n for (const region of regions) {\n hknp.HP_World_Release(region._world);\n }\n regions.length = 0;\n}\n\n// ─── Migration & sync ────────────────────────────────────────────────\n\n/**\n * Moves a body to the correct region if it has drifted past `radius * 1.2` (hysteresis) from its\n * current region's origin, preserving linear and angular velocity. Uses a one-second velocity\n * look-ahead to prefer joining an existing target region over spawning a throwaway one.\n */\nfunction _reRegionBody(world: PhysicsWorld, body: PhysicsBody): void {\n const hknp = world._hknp;\n const fo = world._fo!;\n const current = body._region!;\n\n const t = hknp.HP_Body_GetQTransform(body._hkBody)[1];\n const localPos = t[0];\n const orientation = t[1];\n\n // Distance from region origin == magnitude of the local position.\n const margin = fo.radius * 1.2;\n if (localPos[0] * localPos[0] + localPos[1] * localPos[1] + localPos[2] * localPos[2] <= margin * margin) {\n return;\n }\n\n const wx = localPos[0] + current.origin.x;\n const wy = localPos[1] + current.origin.y;\n const wz = localPos[2] + current.origin.z;\n\n const linVel = hknp.HP_Body_GetLinearVelocity(body._hkBody)[1];\n const angVel = hknp.HP_Body_GetAngularVelocity(body._hkBody)[1];\n\n const worldPos: Vec3 = { x: wx, y: wy, z: wz };\n const lookAhead: Vec3 = { x: wx + linVel[0], y: wy + linVel[1], z: wz + linVel[2] };\n\n let next = _findRegion(fo, lookAhead);\n if (!next || next === current) {\n next = _findRegion(fo, worldPos);\n }\n if (!next || next === current) {\n next = _getOrCreateRegion(world, worldPos);\n }\n if (next === current) {\n return;\n }\n\n hknp.HP_World_RemoveBody(current._world, body._hkBody);\n const o = next.origin;\n hknp.HP_Body_SetQTransform(body._hkBody, [[wx - o.x, wy - o.y, wz - o.z], orientation]);\n hknp.HP_World_AddBody(next._world, body._hkBody, false);\n hknp.HP_Body_SetLinearVelocity(body._hkBody, linVel);\n hknp.HP_Body_SetAngularVelocity(body._hkBody, angVel);\n body._region = next;\n}\n\n/** Releases any non-default region that no longer holds any bodies. */\nfunction _gcRegions(world: PhysicsWorld): void {\n const regions = world._fo!.regions;\n if (regions.length <= 1) {\n return;\n }\n const hknp = world._hknp;\n const used = new Set<WorldRegion>();\n for (let i = 0; i < world._bodies.length; i++) {\n used.add(world._bodies[i]!._region!);\n }\n for (let i = regions.length - 1; i >= 1; i--) {\n const region = regions[i]!;\n if (!used.has(region)) {\n hknp.HP_World_Release(region._world);\n regions.splice(i, 1);\n }\n }\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] in region-local space\n const rot = t[1]; // [x, y, z, w]\n const o = body._region!.origin;\n const node = body.node;\n node.position.set(pos[0] + o.x, pos[1] + o.y, pos[2] + o.z);\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 const o = body._region!.origin;\n hknp.HP_Body_SetQTransform(body._hkBody, [\n [p.x - o.x, p.y - o.y, p.z - o.z],\n [q.x, q.y, q.z, q.w],\n ]);\n}\n"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"havok-floating-origin.js","sources":["../../../src/physics/havok-floating-origin.ts"],"sourcesContent":["/**\n * Havok multi-region floating origin (Large World Rendering).\n *\n * This module is **dynamic-imported only when the engine has `useFloatingOrigin: true`**\n * (from `createHavokWorld`), so non-floating-origin physics scenes never pull this code into\n * their bundle.\n *\n * Under floating origin, bodies far apart in world space are simulated in separate regions —\n * each a native Havok world with a fixed `origin`. Bodies are stored in region-local coordinates\n * (`worldPos - origin`, near zero), so the float32 Havok solver keeps full precision at large\n * world coordinates. Node transforms remain true world coordinates; the eye-relative render path\n * is handled independently.\n *\n * Mirrors Babylon.js's `scene.floatingOriginMode` + Havok plugin `floatingOriginWorldRadius`.\n */\n\nimport type { Vec3 } from \"../math/types.js\";\nimport type { PhysicsBody, PhysicsWorld } from \"./havok.js\";\nimport { PhysicsMotionType } from \"./havok.js\";\n\n/**\n * A simulation region: a native Havok world whose bodies are simulated relative to a fixed\n * `origin`. `_regions[0]` is the default region (origin at the world origin).\n */\nexport interface WorldRegion {\n /** @internal */ _world: any;\n /** Floating origin (world-space centre) this region's bodies are stored relative to. */\n origin: Vec3;\n /** This region's gravity vector `[x, y, z]`. */\n gravity: number[];\n}\n\n/**\n * Floating-origin runtime stored on `PhysicsWorld._fo` (present only when floating origin is on).\n * Holds region state plus the standalone hooks the core physics module calls in place of its\n * single-world fast path.\n */\nexport interface HavokFloatingOriginContext {\n /** All simulation regions; `regions[0]` is the default (origin-centred) region. */\n regions: WorldRegion[];\n /** Region capture radius (metres). */\n radius: number;\n /** Most recently set world-wide gravity `[x, y, z]`; seeds newly created regions. */\n gravity: number[];\n placeBody(world: PhysicsWorld, body: PhysicsBody, startsAsleep: boolean): void;\n step(world: PhysicsWorld, dt: number): void;\n setGravity(world: PhysicsWorld, gravity: number[], worldPosition?: Vec3): void;\n getRegionGravity(world: PhysicsWorld, worldPosition: Vec3): number[];\n setVelocityLimits(world: PhysicsWorld, maxLinear: number, maxAngular: number): void;\n dispose(world: PhysicsWorld): void;\n}\n\n/**\n * Builds the floating-origin context, seeding it with the world's default region (the native world\n * already created by `createHavokWorld`, centred at the origin).\n */\nexport function createHavokFloatingOriginContext(hkWorld: any, gravity: number[], radius: number): HavokFloatingOriginContext {\n return {\n regions: [{ _world: hkWorld, origin: { x: 0, y: 0, z: 0 }, gravity: [...gravity] }],\n radius,\n gravity: [...gravity],\n placeBody: _placeBody,\n step: _step,\n setGravity: _setGravity,\n getRegionGravity: _getRegionGravity,\n setVelocityLimits: _setVelocityLimits,\n dispose: _dispose,\n };\n}\n\n// ─── Region lookup / creation ────────────────────────────────────────\n\n/** Returns the region whose origin is within the capture radius of `pos`, or null. */\nfunction _findRegion(fo: HavokFloatingOriginContext, pos: Vec3): WorldRegion | null {\n const r2 = fo.radius * fo.radius;\n for (const region of fo.regions) {\n const dx = pos.x - region.origin.x;\n const dy = pos.y - region.origin.y;\n const dz = pos.z - region.origin.z;\n if (dx * dx + dy * dy + dz * dz <= r2) {\n return region;\n }\n }\n return null;\n}\n\n/** Returns an existing region containing `pos`, or creates a new one centred at `pos`. */\nfunction _getOrCreateRegion(world: PhysicsWorld, pos: Vec3): WorldRegion {\n const fo = world._fo!;\n const found = _findRegion(fo, pos);\n if (found) {\n return found;\n }\n const hknp = world._hknp;\n const newWorld = hknp.HP_World_Create()[1];\n hknp.HP_World_SetGravity(newWorld, fo.gravity);\n const limits = hknp.HP_World_GetSpeedLimit(world._hkWorld);\n hknp.HP_World_SetSpeedLimit(newWorld, limits[1], limits[2]);\n const region: WorldRegion = {\n _world: newWorld,\n origin: { x: pos.x, y: pos.y, z: pos.z },\n gravity: [...fo.gravity],\n };\n fo.regions.push(region);\n return region;\n}\n\n// ─── Hooks ───────────────────────────────────────────────────────────\n\nfunction _placeBody(world: PhysicsWorld, body: PhysicsBody, startsAsleep: boolean): void {\n const hknp = world._hknp;\n const node = body.node;\n const region = _getOrCreateRegion(world, node.position);\n hknp.HP_World_AddBody(region._world, body._hkBody, startsAsleep);\n const p = node.position;\n const q = node.rotationQuaternion;\n const o = region.origin;\n hknp.HP_Body_SetQTransform(body._hkBody, [\n [p.x - o.x, p.y - o.y, p.z - o.z],\n [q.x, q.y, q.z, q.w],\n ]);\n body._region = region;\n}\n\nfunction _step(world: PhysicsWorld, dt: number): void {\n const hknp = world._hknp;\n const bodies = world._bodies;\n const regions = world._fo!.regions;\n\n // Re-region bodies that drifted out of their region BEFORE stepping.\n for (let i = 0; i < bodies.length; i++) {\n _reRegionBody(world, bodies[i]!);\n }\n\n // Pre-step: sync ANIMATED bodies from node → Havok.\n for (let i = 0; i < bodies.length; i++) {\n const b = bodies[i]!;\n if (b.motionType === (PhysicsMotionType.ANIMATED as number)) {\n _syncNodeToBody(hknp, b);\n }\n }\n\n // Step every region world.\n for (let i = 0; i < regions.length; i++) {\n hknp.HP_World_Step(regions[i]!._world, dt);\n }\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 // Reclaim regions emptied by migration.\n _gcRegions(world);\n}\n\nfunction _setGravity(world: PhysicsWorld, gravity: number[], worldPosition?: Vec3): void {\n const fo = world._fo!;\n const hknp = world._hknp;\n if (worldPosition) {\n const region = _getOrCreateRegion(world, worldPosition);\n region.gravity = gravity;\n hknp.HP_World_SetGravity(region._world, gravity);\n return;\n }\n fo.gravity = gravity;\n for (const region of fo.regions) {\n region.gravity = gravity;\n hknp.HP_World_SetGravity(region._world, gravity);\n }\n}\n\nfunction _getRegionGravity(world: PhysicsWorld, worldPosition: Vec3): number[] {\n return _getOrCreateRegion(world, worldPosition).gravity;\n}\n\nfunction _setVelocityLimits(world: PhysicsWorld, maxLinear: number, maxAngular: number): void {\n for (const region of world._fo!.regions) {\n world._hknp.HP_World_SetSpeedLimit(region._world, maxLinear, maxAngular);\n }\n}\n\nfunction _dispose(world: PhysicsWorld): void {\n const hknp = world._hknp;\n const bodies = world._bodies;\n for (let i = bodies.length - 1; i >= 0; i--) {\n const b = bodies[i]!;\n hknp.HP_World_RemoveBody(b._region!._world, b._hkBody);\n hknp.HP_Body_Release(b._hkBody);\n }\n bodies.length = 0;\n const regions = world._fo!.regions;\n for (const region of regions) {\n hknp.HP_World_Release(region._world);\n }\n regions.length = 0;\n}\n\n// ─── Migration & sync ────────────────────────────────────────────────\n\n/**\n * Moves a body to the correct region if it has drifted past `radius * 1.2` (hysteresis) from its\n * current region's origin, preserving linear and angular velocity. Uses a one-second velocity\n * look-ahead to prefer joining an existing target region over spawning a throwaway one.\n */\nfunction _reRegionBody(world: PhysicsWorld, body: PhysicsBody): void {\n const hknp = world._hknp;\n const fo = world._fo!;\n const current = body._region!;\n\n const t = hknp.HP_Body_GetQTransform(body._hkBody)[1];\n const localPos = t[0];\n const orientation = t[1];\n\n // Distance from region origin == magnitude of the local position.\n const margin = fo.radius * 1.2;\n if (localPos[0] * localPos[0] + localPos[1] * localPos[1] + localPos[2] * localPos[2] <= margin * margin) {\n return;\n }\n\n const wx = localPos[0] + current.origin.x;\n const wy = localPos[1] + current.origin.y;\n const wz = localPos[2] + current.origin.z;\n\n const linVel = hknp.HP_Body_GetLinearVelocity(body._hkBody)[1];\n const angVel = hknp.HP_Body_GetAngularVelocity(body._hkBody)[1];\n\n const worldPos: Vec3 = { x: wx, y: wy, z: wz };\n const lookAhead: Vec3 = { x: wx + linVel[0], y: wy + linVel[1], z: wz + linVel[2] };\n\n let next = _findRegion(fo, lookAhead);\n if (!next || next === current) {\n next = _findRegion(fo, worldPos);\n }\n if (!next || next === current) {\n next = _getOrCreateRegion(world, worldPos);\n }\n if (next === current) {\n return;\n }\n\n hknp.HP_World_RemoveBody(current._world, body._hkBody);\n const o = next.origin;\n hknp.HP_Body_SetQTransform(body._hkBody, [[wx - o.x, wy - o.y, wz - o.z], orientation]);\n hknp.HP_World_AddBody(next._world, body._hkBody, false);\n hknp.HP_Body_SetLinearVelocity(body._hkBody, linVel);\n hknp.HP_Body_SetAngularVelocity(body._hkBody, angVel);\n body._region = next;\n}\n\n/** Releases any non-default region that no longer holds any bodies. */\nfunction _gcRegions(world: PhysicsWorld): void {\n const regions = world._fo!.regions;\n if (regions.length <= 1) {\n return;\n }\n const hknp = world._hknp;\n const used = new Set<WorldRegion>();\n for (let i = 0; i < world._bodies.length; i++) {\n used.add(world._bodies[i]!._region!);\n }\n for (let i = regions.length - 1; i >= 1; i--) {\n const region = regions[i]!;\n if (!used.has(region)) {\n hknp.HP_World_Release(region._world);\n regions.splice(i, 1);\n }\n }\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] in region-local space\n const rot = t[1]; // [x, y, z, w]\n const o = body._region!.origin;\n const node = body.node;\n node.position.set(pos[0] + o.x, pos[1] + o.y, pos[2] + o.z);\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 const o = body._region!.origin;\n hknp.HP_Body_SetQTransform(body._hkBody, [\n [p.x - o.x, p.y - o.y, p.z - o.z],\n [q.x, q.y, q.z, q.w],\n ]);\n}\n"],"names":[],"mappings":"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"}
@@ -1,4 +1,3 @@
1
- import { onBeforeRender } from '../scene/scene-core.js';
2
1
  import { mat4Invert } from '../math/mat4-invert.js';
3
2
  import { mat4Multiply } from '../math/mat4-multiply.js';
4
3
  import { mat4Scale } from '../math/mat4-scale.js';
@@ -55,26 +54,36 @@ function createHavokWorld(scene, hknp, gravity) {
55
54
  _hknp: hknp,
56
55
  _hkWorld: hkWorld,
57
56
  _bodies: [],
58
- _timestep: 1 / 60,
57
+ _scene: scene,
58
+ _fixedDeltaMs: 0,
59
59
  _gravity: [g.x, g.y, g.z]
60
60
  };
61
- onBeforeRender(scene, (deltaMs) => {
61
+ const stepCb = (deltaMs) => {
62
62
  _stepWorld(world, deltaMs);
63
- });
63
+ };
64
+ scene._beforeRender.unshift(stepCb);
65
+ world._stopStep = () => {
66
+ const i = scene._beforeRender.indexOf(stepCb);
67
+ if (i >= 0) {
68
+ scene._beforeRender.splice(i, 1);
69
+ }
70
+ };
64
71
  return world;
65
72
  }
66
73
  async function enableHavokFloatingOrigin(world, floatingOriginWorldRadius = 1e5) {
67
74
  const fo = await import('./havok-floating-origin.js');
68
75
  world._fo = fo.createHavokFloatingOriginContext(world._hkWorld, world._gravity, floatingOriginWorldRadius);
69
76
  }
77
+ const MAX_STEP_MS = 100;
70
78
  function _stepWorld(world, deltaMs) {
71
79
  const { _hknp: hknp, _hkWorld: hkWorld, _bodies: bodies } = world;
72
- const dt = Math.min(deltaMs / 1e3, 0.1);
73
- if (dt <= 0) {
80
+ const stepMs = world._fixedDeltaMs > 0 ? world._fixedDeltaMs : deltaMs;
81
+ if (!Number.isFinite(stepMs) || stepMs <= 0) {
74
82
  return;
75
83
  }
84
+ const dt = Math.min(stepMs, MAX_STEP_MS) / 1e3;
76
85
  if (world._fo) {
77
- world._fo.step(world);
86
+ world._fo.step(world, dt);
78
87
  return;
79
88
  }
80
89
  for (let i = 0; i < bodies.length; i++) {
@@ -87,7 +96,7 @@ function _stepWorld(world, deltaMs) {
87
96
  }
88
97
  }
89
98
  }
90
- hknp.HP_World_Step(hkWorld, world._timestep);
99
+ hknp.HP_World_Step(hkWorld, dt);
91
100
  for (let i = 0; i < bodies.length; i++) {
92
101
  const b = bodies[i];
93
102
  if (b.motionType === 2 /* DYNAMIC */) {
@@ -97,7 +106,7 @@ function _stepWorld(world, deltaMs) {
97
106
  if (world._afterStep) {
98
107
  const cbs = world._afterStep;
99
108
  for (let i = 0; i < cbs.length; i++) {
100
- cbs[i](world._timestep);
109
+ cbs[i](dt);
101
110
  }
102
111
  }
103
112
  }
@@ -146,10 +155,24 @@ function getPhysicsGravity(world, worldPosition) {
146
155
  return { x: g[0], y: g[1], z: g[2] };
147
156
  }
148
157
  function setPhysicsTimestep(world, dt) {
149
- world._timestep = dt;
158
+ world._fixedDeltaMs = dt * 1e3;
150
159
  }
151
160
  function getPhysicsTimestep(world) {
152
- return world._timestep;
161
+ return world._fixedDeltaMs / 1e3;
162
+ }
163
+ function setPhysicsTimestepMs(world, fixedDeltaMs) {
164
+ world._fixedDeltaMs = fixedDeltaMs;
165
+ }
166
+ function getPhysicsTimestepMs(world) {
167
+ return world._fixedDeltaMs;
168
+ }
169
+ function worldStepSeconds(world) {
170
+ const scene = world._scene;
171
+ const stepMs = world._fixedDeltaMs > 0 ? world._fixedDeltaMs : scene.fixedDeltaMs > 0 ? scene.fixedDeltaMs : scene.surface.engine._currentDelta;
172
+ if (!Number.isFinite(stepMs) || stepMs <= 0) {
173
+ return 0;
174
+ }
175
+ return Math.min(stepMs, MAX_STEP_MS) / 1e3;
153
176
  }
154
177
  function setPhysicsVelocityLimits(world, maxLinear, maxAngular) {
155
178
  if (world._fo) {
@@ -204,7 +227,8 @@ function applyPhysicsBodyImpulse(body, impulse, location) {
204
227
  hknp.HP_Body_ApplyImpulse(body._hkBody, [location.x, location.y, location.z], [impulse.x, impulse.y, impulse.z]);
205
228
  }
206
229
  function applyPhysicsBodyForce(world, body, force, location) {
207
- applyPhysicsBodyImpulse(body, { x: force.x * world._timestep, y: force.y * world._timestep, z: force.z * world._timestep }, location);
230
+ const dt = worldStepSeconds(world);
231
+ applyPhysicsBodyImpulse(body, { x: force.x * dt, y: force.y * dt, z: force.z * dt }, location);
208
232
  }
209
233
  function createPhysicsConstraint(world, bodyA, bodyB, type, options = {}, limits = []) {
210
234
  const hknp = world._hknp;
@@ -704,6 +728,9 @@ function getPhysicsBodyDebugGeometry(world, body) {
704
728
  return { positions, indices };
705
729
  }
706
730
  function disposePhysics(world) {
731
+ world._stopStep?.();
732
+ world._stopStep = void 0;
733
+ world._afterStep = void 0;
707
734
  if (world._fo) {
708
735
  world._fo.dispose(world);
709
736
  return;
@@ -718,5 +745,5 @@ function disposePhysics(world) {
718
745
  hknp.HP_World_Release(hkWorld);
719
746
  }
720
747
 
721
- export { PhysicsConstraintAxis, PhysicsConstraintType, PhysicsMotionType, PhysicsPrestepType, PhysicsShapeType, addPhysicsShapeChild, addPhysicsShapeChildFromParent, applyPhysicsBodyForce, applyPhysicsBodyImpulse, applyPhysicsImpulse, createHavokWorld, createPhysicsAggregate, createPhysicsBody, createPhysicsConstraint, createPhysicsShape, disposePhysics, enableHavokFloatingOrigin, getPhysicsBodyDebugGeometry, getPhysicsBodyLinearVelocity, getPhysicsGravity, getPhysicsTimestep, getPhysicsVelocityLimits, onPhysicsAfterStep, releasePhysicsShape, removePhysicsBody, setPhysicsBodyAngularVelocity, setPhysicsBodyLinearVelocity, setPhysicsBodyMass, setPhysicsBodyMassProperties, setPhysicsBodyMotionType, setPhysicsBodyPreStep, setPhysicsBodyPrestepType, setPhysicsBodyShape, setPhysicsBodyTransform, setPhysicsGravity, setPhysicsShapeFilterCollideMask, setPhysicsShapeFilterMembershipMask, setPhysicsShapeMaterial, setPhysicsTimestep, setPhysicsVelocityLimits };
748
+ export { PhysicsConstraintAxis, PhysicsConstraintType, PhysicsMotionType, PhysicsPrestepType, PhysicsShapeType, addPhysicsShapeChild, addPhysicsShapeChildFromParent, applyPhysicsBodyForce, applyPhysicsBodyImpulse, applyPhysicsImpulse, createHavokWorld, createPhysicsAggregate, createPhysicsBody, createPhysicsConstraint, createPhysicsShape, disposePhysics, enableHavokFloatingOrigin, getPhysicsBodyDebugGeometry, getPhysicsBodyLinearVelocity, getPhysicsGravity, getPhysicsTimestep, getPhysicsTimestepMs, getPhysicsVelocityLimits, onPhysicsAfterStep, releasePhysicsShape, removePhysicsBody, setPhysicsBodyAngularVelocity, setPhysicsBodyLinearVelocity, setPhysicsBodyMass, setPhysicsBodyMassProperties, setPhysicsBodyMotionType, setPhysicsBodyPreStep, setPhysicsBodyPrestepType, setPhysicsBodyShape, setPhysicsBodyTransform, setPhysicsGravity, setPhysicsShapeFilterCollideMask, setPhysicsShapeFilterMembershipMask, setPhysicsShapeMaterial, setPhysicsTimestep, setPhysicsTimestepMs, setPhysicsVelocityLimits, worldStepSeconds };
722
749
  //# sourceMappingURL=havok.js.map