@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.
- package/CHANGELOG.md +735 -0
- package/README.md +26 -1
- package/THIRD_PARTY_NOTICES.txt +139 -0
- package/dist/index.js +321 -301
- package/dist/index.js.map +1 -1
- package/index.d.ts +294 -13
- package/lib/_chunks/vendor/{manifold-Sh8xE2da.js → manifold-DtI3BJoR.js} +2 -2
- package/lib/_chunks/vendor/{manifold-Sh8xE2da.js.map → manifold-DtI3BJoR.js.map} +1 -1
- package/lib/animation/animation-group-task.js +1 -1
- package/lib/animation/animation-group-task.js.map +1 -1
- package/lib/animation/animation-group.js +20 -15
- package/lib/animation/animation-group.js.map +1 -1
- package/lib/animation/animation-tick.js +10 -0
- package/lib/animation/animation-tick.js.map +1 -0
- package/lib/animation/property-animation.js +2 -1
- package/lib/animation/property-animation.js.map +1 -1
- package/lib/animation/weighted-gltf-mixer.js +1 -1
- package/lib/animation/weighted-gltf-mixer.js.map +1 -1
- package/lib/animation/weighted-pointer-mixer.js +1 -1
- package/lib/animation/weighted-pointer-mixer.js.map +1 -1
- package/lib/engine/device-lost-recovery.js +1 -0
- package/lib/engine/device-lost-recovery.js.map +1 -1
- package/lib/engine/engine.js +1 -1
- package/lib/engine/null-engine.js +29 -0
- package/lib/engine/null-engine.js.map +1 -0
- package/lib/frame-graph/depth-pyramid.js +158 -0
- package/lib/frame-graph/depth-pyramid.js.map +1 -0
- package/lib/frame-graph/depth-resolve-task.js +117 -0
- package/lib/frame-graph/depth-resolve-task.js.map +1 -0
- package/lib/frame-graph/frame-graph-actions.js +10 -1
- package/lib/frame-graph/frame-graph-actions.js.map +1 -1
- package/lib/frame-graph/render-task.js +7 -0
- package/lib/frame-graph/render-task.js.map +1 -1
- package/lib/frame-graph/transmission-depth-grab.js +88 -0
- package/lib/frame-graph/transmission-depth-grab.js.map +1 -0
- package/lib/frame-graph/transmission.js +34 -4
- package/lib/frame-graph/transmission.js.map +1 -1
- package/lib/gizmo/bounding-box-gizmo.js +1 -1
- package/lib/index.js +9 -6
- package/lib/index.js.map +1 -1
- package/lib/loader-gltf/gltf-feature-gpu-instancing.js +1 -1
- package/lib/loader-gltf/gltf-interleave.js +1 -1
- package/lib/loader-gltf/load-gltf.js +1 -1
- package/lib/material/shader/shader-material.js +4 -2
- package/lib/material/shader/shader-material.js.map +1 -1
- package/lib/material/shader/shader-pipeline.js +11 -1
- package/lib/material/shader/shader-pipeline.js.map +1 -1
- package/lib/material/shader/shader-renderable.js +42 -14
- package/lib/material/shader/shader-renderable.js.map +1 -1
- package/lib/material/shader/shader-thin-instance.js +1 -1
- package/lib/material/shader/shader-thin-instance.js.map +1 -1
- package/lib/math/aabb.js +1 -1
- package/lib/math/compute-aabb.js +63 -1
- package/lib/math/compute-aabb.js.map +1 -1
- package/lib/math/index.js +1 -1
- package/lib/mesh/csg2.js +3 -2
- package/lib/mesh/csg2.js.map +1 -1
- package/lib/mesh/mesh-factories.js +1 -1
- package/lib/mesh/thin-instance-gpu-culling.js +4 -2
- package/lib/mesh/thin-instance-gpu-culling.js.map +1 -1
- package/lib/mesh/thin-instance.js +8 -1
- package/lib/mesh/thin-instance.js.map +1 -1
- package/lib/navigation/index.js +1 -1
- package/lib/navigation/navigation.js +9 -1
- package/lib/navigation/navigation.js.map +1 -1
- package/lib/physics/character-controller.js +2 -2
- package/lib/physics/character-controller.js.map +1 -1
- package/lib/physics/havok-floating-origin.js +2 -2
- package/lib/physics/havok-floating-origin.js.map +1 -1
- package/lib/physics/havok.js +40 -13
- package/lib/physics/havok.js.map +1 -1
- package/lib/picking/gpu-picker.js +16 -2
- package/lib/picking/gpu-picker.js.map +1 -1
- package/lib/scene/scene-core.js +14 -5
- package/lib/scene/scene-core.js.map +1 -1
- package/lib/scene/scene-remove.js +8 -0
- package/lib/scene/scene-remove.js.map +1 -1
- package/lib/shadow/csm-shadow-task-hooks.js +14 -6
- package/lib/shadow/csm-shadow-task-hooks.js.map +1 -1
- package/lib/shadow/pcf-shadow-task-hooks.js +6 -0
- package/lib/shadow/pcf-shadow-task-hooks.js.map +1 -1
- package/lib/texture/pixels-texture.js +31 -1
- package/lib/texture/pixels-texture.js.map +1 -1
- package/lib/vat/vat-baker.js +41 -2
- package/lib/vat/vat-baker.js.map +1 -1
- package/package.json +15 -3
- package/lib/_chunks/__vite-browser-external-BFTKbDcV.js +0 -68
- package/lib/_chunks/__vite-browser-external-BFTKbDcV.js.map +0 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"character-controller.js","sources":["../../../src/physics/character-controller.ts"],"sourcesContent":["/**\n * Havok Physics V2 character controller for Babylon Lite — a collide-and-slide kinematic\n * character built entirely on the Havok shapecast / shapeproximity query primitives.\n *\n * Kept in a standalone, tree-shakeable module: the per-frame `_stepWorld` core in `havok.ts`\n * never references this code, so only scenes that import {@link createPhysicsCharacterController}\n * pay for it. The controller sweeps a capsule shape through the world each step, builds a contact\n * manifold from the cast + proximity hits, turns the contacts into surface constraints, then runs\n * a simplex velocity solver (1D/2D/3D plane clipping) to compute a collision-free displacement.\n *\n * ```ts\n * const cc = createPhysicsCharacterController(world, { x: 0, y: 1, z: 0 }, { capsuleHeight: 1.8, capsuleRadius: 0.6 });\n * onPhysicsAfterStep(world, () => {\n * cc.moveWithCollisions({ x: 0, y: -0.05, z: 0.02 });\n * const p = cc.getPosition();\n * displayMesh.position.set(p.x, p.y, p.z);\n * });\n * ```\n *\n * The algorithm follows Babylon.js' `PhysicsCharacterController` (Apache-2.0), re-expressed with\n * Lite's plain-data `Vec3` math and free-function physics API. Left-handed, +Y up.\n */\n\nimport type { Quat, Vec3 } from \"../math/types.js\";\nimport { mat4Invert } from \"../math/mat4-invert.js\";\nimport type { Mat4 } from \"../math/types.js\";\nimport { createTransformNode } from \"../scene/transform-node.js\";\nimport type { TransformNode } from \"../scene/transform-node.js\";\nimport {\n createPhysicsBody,\n createPhysicsShape,\n PhysicsMotionType,\n PhysicsShapeType,\n removePhysicsBody,\n setPhysicsBodyMassProperties,\n setPhysicsBodyPreStep,\n setPhysicsBodyShape,\n} from \"./havok.js\";\nimport type { PhysicsBody, PhysicsShape, PhysicsWorld } from \"./havok.js\";\n\n// ─── Public types ────────────────────────────────────────────────────\n\n/** Contact state of the character against the geometry beneath it. */\nexport const enum CharacterSupportedState {\n /** No surface within reach. */\n UNSUPPORTED = 0,\n /** Touching a surface too steep to stand on; the character slides. */\n SLIDING = 1,\n /** Standing on a walkable surface. */\n SUPPORTED = 2,\n}\n\n/** Options describing the character's collision capsule. */\nexport interface PhysicsCharacterControllerOptions {\n /** Total capsule height (tip to tip), in metres. Default `1.8`. */\n capsuleHeight: number;\n /** Capsule radius, in metres. Default `0.6`. */\n capsuleRadius: number;\n}\n\n/**\n * Collision event fired by {@link PhysicsCharacterController.onTriggerCollisionObservable}\n * for every dynamic body the character pushes during a step. Mirrors Babylon.js'\n * `onTriggerCollisionObservable` payload (minus its `colliderIndex`, which has no Lite equivalent).\n */\nexport interface CharacterCollisionEvent {\n /** The dynamic physics body the character contacted. Its `.node.name` identifies the collider. */\n collider: PhysicsBody;\n /** Impulse (world space) the character applied to the collider at the contact point. */\n impulse: Vec3;\n /** World-space position of the contact at which the impulse was applied. */\n impulsePosition: Vec3;\n}\n\n/**\n * Minimal single-event observable used by {@link PhysicsCharacterController} for collision\n * callbacks. Kept local to the physics module (no dependency on gizmo/observable code) so the\n * character-controller graph stays self-contained and tree-shakeable.\n */\nexport class CharacterCollisionObservable {\n private _subs: ((event: CharacterCollisionEvent) => void)[] = [];\n\n /**\n * Subscribe to collision events.\n * @param cb - Callback invoked for each dynamic-body contact during a step.\n * @returns A disposer that removes the subscription when called.\n */\n public add(cb: (event: CharacterCollisionEvent) => void): () => void {\n this._subs.push(cb);\n return () => {\n const i = this._subs.indexOf(cb);\n if (i >= 0) {\n this._subs.splice(i, 1);\n }\n };\n }\n\n /**\n * Notify all subscribers of a collision event.\n * @param event - The collision event payload.\n */\n public notify(event: CharacterCollisionEvent): void {\n for (const s of this._subs) {\n s(event);\n }\n }\n}\n\n/** Surface information returned by {@link PhysicsCharacterController.checkSupport}. */\nexport interface CharacterSurfaceInfo {\n /** Whether the supporting surface belongs to a dynamic (simulated) body. */\n isSurfaceDynamic: boolean;\n /** Whether the character is unsupported, sliding, or supported. */\n supportedState: CharacterSupportedState;\n /** Average normal of the supporting surfaces (world space). */\n averageSurfaceNormal: Vec3;\n /** Average linear velocity induced by the supporting surfaces. */\n averageSurfaceVelocity: Vec3;\n /** Average angular velocity induced by the supporting surfaces. */\n averageAngularSurfaceVelocity: Vec3;\n}\n\n// ─── Internal data structures ────────────────────────────────────────\n\ninterface Contact {\n position: Vec3;\n normal: Vec3;\n distance: number;\n fraction: number;\n body: PhysicsBody | null;\n allowedPenetration: number;\n}\n\ninterface SurfaceConstraint {\n planeNormal: Vec3;\n planeDistance: number;\n staticFriction: number;\n dynamicFriction: number;\n extraUpStaticFriction: number;\n extraDownStaticFriction: number;\n velocity: Vec3;\n angularVelocity: Vec3;\n priority: number;\n}\n\nconst enum InteractionStatus {\n OK = 0,\n FAILURE_3D = 1,\n FAILURE_2D = 2,\n}\n\ninterface PlaneInteraction {\n touched: boolean;\n stopped: boolean;\n surfaceTime: number;\n penaltyDistance: number;\n status: InteractionStatus;\n}\n\ninterface ActivePlane {\n index: number;\n constraint: SurfaceConstraint;\n interaction: PlaneInteraction;\n}\n\ninterface SolverInfo {\n supportPlanes: ActivePlane[];\n numSupportPlanes: number;\n currentTime: number;\n inputConstraints: SurfaceConstraint[];\n outputInteractions: PlaneInteraction[];\n}\n\ninterface SolverOutput {\n position: Vec3;\n velocity: Vec3;\n deltaTime: number;\n planeInteractions: PlaneInteraction[];\n}\n\ninterface BodyTracking {\n prev: number[];\n frameId: number;\n}\n\n// ─── Vec3 helpers (plain-data, allocation-friendly) ──────────────────\n\nfunction v(x = 0, y = 0, z = 0): Vec3 {\n return { x, y, z };\n}\nfunction vclone(a: Vec3): Vec3 {\n return { x: a.x, y: a.y, z: a.z };\n}\nfunction vcopy(d: Vec3, s: Vec3): void {\n d.x = s.x;\n d.y = s.y;\n d.z = s.z;\n}\nfunction vset(d: Vec3, x: number, y: number, z: number): void {\n d.x = x;\n d.y = y;\n d.z = z;\n}\nfunction vadd(a: Vec3, b: Vec3): Vec3 {\n return { x: a.x + b.x, y: a.y + b.y, z: a.z + b.z };\n}\nfunction vsub(a: Vec3, b: Vec3): Vec3 {\n return { x: a.x - b.x, y: a.y - b.y, z: a.z - b.z };\n}\nfunction vscale(a: Vec3, s: number): Vec3 {\n return { x: a.x * s, y: a.y * s, z: a.z * s };\n}\nfunction vaddIn(d: Vec3, a: Vec3): void {\n d.x += a.x;\n d.y += a.y;\n d.z += a.z;\n}\nfunction vsubIn(d: Vec3, a: Vec3): void {\n d.x -= a.x;\n d.y -= a.y;\n d.z -= a.z;\n}\nfunction vscaleIn(d: Vec3, s: number): void {\n d.x *= s;\n d.y *= s;\n d.z *= s;\n}\nfunction vdot(a: Vec3, b: Vec3): number {\n return a.x * b.x + a.y * b.y + a.z * b.z;\n}\nfunction vcross(a: Vec3, b: Vec3): Vec3 {\n return { x: a.y * b.z - a.z * b.y, y: a.z * b.x - a.x * b.z, z: a.x * b.y - a.y * b.x };\n}\nfunction vlenSq(a: Vec3): number {\n return a.x * a.x + a.y * a.y + a.z * a.z;\n}\nfunction vlen(a: Vec3): number {\n return Math.sqrt(vlenSq(a));\n}\nfunction vnormIn(a: Vec3): void {\n const l = vlen(a);\n if (l > 1e-12) {\n const inv = 1 / l;\n a.x *= inv;\n a.y *= inv;\n a.z *= inv;\n }\n}\nfunction vequalsEps(a: Vec3, b: Vec3, eps: number): boolean {\n return Math.abs(a.x - b.x) <= eps && Math.abs(a.y - b.y) <= eps && Math.abs(a.z - b.z) <= eps;\n}\nfunction clamp(value: number, lo: number, hi: number): number {\n return Math.min(Math.max(value, lo), hi);\n}\n\n/** Transform a position by a column-major 4×4 matrix (with translation). */\nfunction transformCoord(m: ArrayLike<number>, p: Vec3): Vec3 {\n return {\n x: p.x * m[0]! + p.y * m[4]! + p.z * m[8]! + m[12]!,\n y: p.x * m[1]! + p.y * m[5]! + p.z * m[9]! + m[13]!,\n z: p.x * m[2]! + p.y * m[6]! + p.z * m[10]! + m[14]!,\n };\n}\n\n// ─── Controller ──────────────────────────────────────────────────────\n\n/**\n * A physics-driven character controller. Create one with\n * {@link createPhysicsCharacterController}; drive it each physics step with\n * {@link PhysicsCharacterController.moveWithCollisions} and read back the resolved position\n * with {@link PhysicsCharacterController.getPosition}.\n */\nexport class PhysicsCharacterController {\n /** Minimum separation kept from surfaces, in metres. Default `0.05`. */\n public keepDistance = 0.05;\n /** Extra distance over which a contact is still tracked. Default `0.1`. */\n public keepContactTolerance = 0.1;\n /** Maximum number of cast iterations per integration step. Default `10`. */\n public maxCastIterations = 10;\n /** Speed at which penetrations are pushed out. Default `1.0`. */\n public penetrationRecoverySpeed = 1.0;\n /** Static-friction coefficient against surfaces. Default `0`. */\n public staticFriction = 0;\n /** Dynamic-friction coefficient against surfaces. Default `1`. */\n public dynamicFriction = 1;\n /** Cosine of the steepest slope the character can stand on. Default `0.5` (60°). */\n public maxSlopeCosine = 0.5;\n /** Upper bound on per-solve character speed. Default `10`. */\n public maxCharacterSpeedForSolver = 10.0;\n /** World up vector. Default `(0, 1, 0)`. */\n public up: Vec3 = { x: 0, y: 1, z: 0 };\n /** Push strength applied to dynamic bodies the character contacts. Default `1e38`. */\n public characterStrength = 1e38;\n /** Acceleration factor used by {@link calculateMovement}. Default `0.05`. */\n public acceleration = 0.05;\n /** Maximum world-space acceleration used by {@link calculateMovement}. Default `50`. */\n public maxAcceleration = 50;\n /** Character mass used when reacting to gravity against dynamic bodies. Default `0`. */\n public characterMass = 0;\n\n /**\n * Fires once per dynamic body the character pushes during a step, just before the reactive\n * impulse is applied. Mirrors Babylon.js' `onTriggerCollisionObservable`. Subscribe with\n * `.add(cb)`; the returned disposer removes the subscription.\n */\n public readonly onTriggerCollisionObservable = new CharacterCollisionObservable();\n\n private readonly _world: PhysicsWorld;\n private readonly _shape: PhysicsShape;\n private readonly _node: TransformNode;\n private readonly _body: PhysicsBody;\n private readonly _startCollector: any;\n private readonly _castCollector: any;\n\n private _position: Vec3;\n private _velocity: Vec3 = v();\n private _lastVelocity: Vec3 = v();\n private _lastDisplacement: Vec3 = v();\n private _orientation: Quat = { x: 0, y: 0, z: 0, w: 1 };\n private _manifold: Contact[] = [];\n private _lastInvDeltaTime = 60;\n private _frameId = 0;\n private readonly _contactAngleSensitivity = 10.0;\n private readonly _displacementEps = 1e-4;\n private readonly _bodyTracking = new Map<PhysicsBody, BodyTracking>();\n\n /** Construct a controller. Prefer the {@link createPhysicsCharacterController} factory. */\n public constructor(world: PhysicsWorld, position: Vec3, options: PhysicsCharacterControllerOptions) {\n this._world = world;\n this._position = vclone(position);\n\n const r = options.capsuleRadius ?? 0.6;\n const h = options.capsuleHeight ?? 1.8;\n this._shape = createPhysicsShape(world, {\n type: PhysicsShapeType.CAPSULE,\n parameters: { pointA: { x: 0, y: h * 0.5 - r, z: 0 }, pointB: { x: 0, y: -h * 0.5 + r, z: 0 }, radius: r },\n });\n\n this._node = createTransformNode(\"CCTransformNode\", position.x, position.y, position.z);\n this._body = createPhysicsBody(world, this._node, PhysicsMotionType.ANIMATED);\n setPhysicsBodyShape(world, this._body, this._shape);\n setPhysicsBodyMassProperties(world, this._body, { inertia: { x: 0, y: 0, z: 0 } });\n setPhysicsBodyPreStep(this._body, true);\n\n const hknp = world._hknp;\n this._startCollector = hknp.HP_QueryCollector_Create(16)[1];\n this._castCollector = hknp.HP_QueryCollector_Create(16)[1];\n }\n\n /** Release the controller's body, shape, and query collectors. */\n public dispose(): void {\n const hknp = this._world._hknp;\n removePhysicsBody(this._world, this._body);\n hknp.HP_Shape_Release(this._shape._hkShape);\n hknp.HP_QueryCollector_Release(this._startCollector);\n hknp.HP_QueryCollector_Release(this._castCollector);\n }\n\n /** Get the current character position (world space). The returned vector is owned by the controller. */\n public getPosition(): Vec3 {\n return this._position;\n }\n\n /** Teleport the character to a new position, clearing any swept motion. */\n public setPosition(position: Vec3): void {\n vcopy(this._position, position);\n this._node.position.set(position.x, position.y, position.z);\n }\n\n /** Get the current character velocity (world space). The returned vector is owned by the controller. */\n public getVelocity(): Vec3 {\n return this._velocity;\n }\n\n /** Set the character velocity (world space). */\n public setVelocity(velocity: Vec3): void {\n vcopy(this._velocity, velocity);\n }\n\n /**\n * Move the character by a displacement this physics step, sliding along any geometry it meets.\n * @param displacement - Requested world-space displacement for this step.\n */\n public moveWithCollisions(displacement: Vec3): void {\n const deltaTime = this._world._timestep;\n if (!deltaTime || deltaTime <= 0) {\n return;\n }\n const invDeltaTime = 1 / deltaTime;\n this._frameId++;\n vcopy(this._velocity, vscale(displacement, invDeltaTime));\n vcopy(this._lastDisplacement, displacement);\n vcopy(this._lastVelocity, this._velocity);\n this._lastInvDeltaTime = invDeltaTime;\n this._integrateManifolds(deltaTime, ZERO);\n }\n\n /**\n * Advance the controller using a velocity already chosen for this step (instead of a raw\n * displacement). Mirrors Babylon.js' `integrate`: it picks a cast direction from the current\n * velocity and surface info, then runs the collide-and-slide.\n * @param deltaTime - Step duration in seconds.\n * @param surfaceInfo - Surface info from a prior {@link checkSupport} call.\n * @param gravity - Gravity applied to the character this step.\n */\n public integrate(deltaTime: number, surfaceInfo: CharacterSurfaceInfo, gravity: Vec3): void {\n const invDeltaTime = 1 / deltaTime;\n const tolerance = this._displacementEps * invDeltaTime;\n if (vequalsEps(this._velocity, this._lastVelocity, tolerance)) {\n vscaleIn(this._lastDisplacement, deltaTime * this._lastInvDeltaTime);\n } else {\n const displacementVelocity = vclone(this._velocity);\n if (surfaceInfo.supportedState === CharacterSupportedState.SUPPORTED) {\n const relative = vsub(this._velocity, surfaceInfo.averageSurfaceVelocity);\n const normalDotVelocity = vdot(surfaceInfo.averageSurfaceNormal, relative);\n if (normalDotVelocity < 0) {\n vsubIn(relative, vscale(surfaceInfo.averageSurfaceNormal, normalDotVelocity));\n vcopy(displacementVelocity, relative);\n vaddIn(displacementVelocity, surfaceInfo.averageSurfaceVelocity);\n }\n }\n vcopy(this._lastDisplacement, vscale(displacementVelocity, deltaTime));\n }\n vcopy(this._lastVelocity, this._velocity);\n this._lastInvDeltaTime = invDeltaTime;\n this._frameId++;\n this._integrateManifolds(deltaTime, gravity);\n }\n\n /**\n * Probe the surface under the character along a direction (usually gravity) to classify support.\n * @param deltaTime - Step duration in seconds.\n * @param direction - Direction to probe, usually the gravity direction.\n * @returns Support classification and averaged surface motion/normal.\n */\n public checkSupport(deltaTime: number, direction: Vec3): CharacterSurfaceInfo {\n const eps = 1e-4;\n const info: CharacterSurfaceInfo = {\n isSurfaceDynamic: false,\n supportedState: CharacterSupportedState.UNSUPPORTED,\n averageSurfaceNormal: v(),\n averageSurfaceVelocity: v(),\n averageAngularSurfaceVelocity: v(),\n };\n this._validateManifold();\n const constraints = this._createConstraintsFromManifold(deltaTime, 0);\n const storedVelocities: Vec3[] = [];\n for (const c of constraints) {\n storedVelocities.push(vclone(c.velocity));\n vset(c.velocity, 0, 0, 0);\n }\n const maxSurfaceVelocity = v(this.maxCharacterSpeedForSolver, this.maxCharacterSpeedForSolver, this.maxCharacterSpeedForSolver);\n const output = this._simplexSolverSolve(constraints, direction, deltaTime, deltaTime, maxSurfaceVelocity);\n if (vequalsEps(output.velocity, direction, eps)) {\n info.supportedState = CharacterSupportedState.UNSUPPORTED;\n return info;\n }\n if (vlenSq(output.velocity) < eps) {\n info.supportedState = CharacterSupportedState.SUPPORTED;\n } else {\n vnormIn(output.velocity);\n const angleSin = vdot(output.velocity, direction);\n const cosSqr = 1 - angleSin * angleSin;\n info.supportedState = cosSqr < this.maxSlopeCosine * this.maxSlopeCosine ? CharacterSupportedState.SLIDING : CharacterSupportedState.SUPPORTED;\n }\n let numTouching = 0;\n for (let i = 0; i < constraints.length; i++) {\n if (output.planeInteractions[i]!.touched && vdot(constraints[i]!.planeNormal, direction) < -0.08) {\n vaddIn(info.averageSurfaceNormal, constraints[i]!.planeNormal);\n vaddIn(info.averageSurfaceVelocity, storedVelocities[i]!);\n vaddIn(info.averageAngularSurfaceVelocity, constraints[i]!.angularVelocity);\n numTouching++;\n }\n }\n if (numTouching > 0) {\n vnormIn(info.averageSurfaceNormal);\n vscaleIn(info.averageSurfaceVelocity, 1 / numTouching);\n vscaleIn(info.averageAngularSurfaceVelocity, 1 / numTouching);\n }\n if (info.supportedState === CharacterSupportedState.SUPPORTED) {\n for (const m of this._manifold) {\n if (vdot(m.normal, direction) < -0.08 && m.body?.motionType === (PhysicsMotionType.DYNAMIC as number)) {\n info.isSurfaceDynamic = true;\n break;\n }\n }\n }\n return info;\n }\n\n /**\n * Compute a target velocity from the current state, a desired velocity, and surface info — a\n * helper for steering input into surface-aware motion.\n * @param deltaTime - Step duration in seconds.\n * @param forwardWorld - Character forward direction (world space).\n * @param surfaceNormal - Supporting surface normal.\n * @param currentVelocity - Current character velocity.\n * @param surfaceVelocity - Velocity induced by the surface.\n * @param desiredVelocity - Desired character velocity.\n * @param upWorld - Up vector (world space).\n * @returns The new velocity vector.\n */\n public calculateMovement(deltaTime: number, forwardWorld: Vec3, surfaceNormal: Vec3, currentVelocity: Vec3, surfaceVelocity: Vec3, desiredVelocity: Vec3, upWorld: Vec3): Vec3 {\n const eps = 1e-5;\n let binorm = vcross(forwardWorld, upWorld);\n if (vlenSq(binorm) < eps) {\n return v();\n }\n vnormIn(binorm);\n const tangent = vcross(binorm, surfaceNormal);\n vnormIn(tangent);\n binorm = vcross(tangent, surfaceNormal);\n vnormIn(binorm);\n // Orthonormal surface frame rows: tangent, binorm, surfaceNormal. Its inverse is the transpose.\n const rel = vsub(currentVelocity, surfaceVelocity);\n const relative = { x: vdot(rel, tangent), y: vdot(rel, binorm), z: vdot(rel, surfaceNormal) };\n const sideVec = vcross(upWorld, forwardWorld);\n const fwd = vdot(desiredVelocity, forwardWorld);\n const side = vdot(desiredVelocity, sideVec);\n const len = vlen(desiredVelocity);\n const desiredSF = v(-fwd, side, 0);\n vnormIn(desiredSF);\n vscaleIn(desiredSF, len);\n const diff = vsub(desiredSF, relative);\n const lenSq = vlenSq(diff);\n const maxVelocityDelta = this.maxAcceleration * deltaTime;\n const factor = lenSq * this.acceleration * this.acceleration > maxVelocityDelta * maxVelocityDelta ? maxVelocityDelta / Math.sqrt(lenSq) : this.acceleration;\n vscaleIn(diff, factor);\n vaddIn(relative, diff);\n // Transform back to world via the frame rows.\n const result = {\n x: relative.x * tangent.x + relative.y * binorm.x + relative.z * surfaceNormal.x,\n y: relative.x * tangent.y + relative.y * binorm.y + relative.z * surfaceNormal.y,\n z: relative.x * tangent.z + relative.y * binorm.z + relative.z * surfaceNormal.z,\n };\n vaddIn(result, surfaceVelocity);\n return result;\n }\n\n // ─── Manifold integration ────────────────────────────────────────\n\n private _integrateManifolds(deltaTime: number, gravity: Vec3): void {\n const epsSqrd = 1e-8;\n let newVelocity = v();\n let remainingTime = deltaTime;\n this._validateManifold();\n for (let iter = 0; iter < this.maxCastIterations && remainingTime > 1e-5; iter++) {\n this._castWithCollectors(this._position, vadd(this._position, this._lastDisplacement));\n const updateResult = this._updateManifold(this._lastDisplacement);\n const constraints = this._createConstraintsFromManifold(deltaTime, deltaTime - remainingTime);\n const maxSurfaceVelocity = v(this.maxCharacterSpeedForSolver, this.maxCharacterSpeedForSolver, this.maxCharacterSpeedForSolver);\n const minDeltaTime = vlenSq(this._velocity) === 0 ? 0 : (0.5 * this.keepDistance) / vlen(this._velocity);\n const solveResults = this._simplexSolverSolve(constraints, this._velocity, remainingTime, minDeltaTime, maxSurfaceVelocity);\n const newDisplacement = solveResults.position;\n const solverDeltaTime = solveResults.deltaTime;\n newVelocity = solveResults.velocity;\n this._resolveContacts(deltaTime, gravity);\n\n let newContactIndex = -1;\n if (updateResult !== 0 || (vlenSq(newDisplacement) > epsSqrd && !vequalsEps(this._lastDisplacement, newDisplacement, this._displacementEps))) {\n this._castWithCollectors(this._position, vadd(this._position, newDisplacement), true);\n const hknp = this._world._hknp;\n const numCastHits = hknp.HP_QueryCollector_GetNumHits(this._castCollector)[1];\n for (let i = 0; i < numCastHits; i++) {\n const [fraction, , hitWorld] = hknp.HP_QueryCollector_GetShapeCastResult(this._castCollector, i)[1];\n const newContact = this._contactFromCast(hitWorld, newDisplacement, fraction);\n if (this._findContact(newContact, this._manifold, 0.1) === -1) {\n newContactIndex = this._manifold.length;\n this._manifold.push(newContact);\n break;\n }\n }\n }\n\n if (newContactIndex >= 0) {\n const newContact = this._manifold[newContactIndex]!;\n const displacementLengthInv = 1 / vlen(newDisplacement);\n const angleBetween = vdot(newDisplacement, newContact.normal) * displacementLengthInv;\n const keepDistanceAlongMovement = this.keepDistance / -angleBetween;\n let fraction = newContact.fraction - keepDistanceAlongMovement * displacementLengthInv;\n fraction = clamp(fraction, 0, 1);\n vaddIn(this._position, vscale(newDisplacement, fraction));\n remainingTime -= solverDeltaTime * fraction;\n } else {\n vaddIn(this._position, newDisplacement);\n remainingTime -= solverDeltaTime;\n }\n vcopy(this._lastDisplacement, newDisplacement);\n }\n vcopy(this._velocity, newVelocity);\n this._node.position.set(this._position.x, this._position.y, this._position.z);\n }\n\n private _castWithCollectors(startPos: Vec3, endPos: Vec3, castOnly = false): void {\n const hknp = this._world._hknp;\n const hkWorld = this._world._hkWorld;\n const shapeHandle = this._shape._hkShape;\n const startNative = [startPos.x, startPos.y, startPos.z];\n const orientation = [this._orientation.x, this._orientation.y, this._orientation.z, this._orientation.w];\n const ignoreSelf = [this._body._hkBody[0]];\n if (!castOnly) {\n const proxQuery = [shapeHandle, startNative, orientation, this.keepDistance + this.keepContactTolerance, false, ignoreSelf];\n hknp.HP_World_ShapeProximityWithCollector(hkWorld, this._startCollector, proxQuery);\n }\n const castQuery = [shapeHandle, orientation, startNative, [endPos.x, endPos.y, endPos.z], false, ignoreSelf];\n hknp.HP_World_ShapeCastWithCollector(hkWorld, this._castCollector, castQuery);\n }\n\n private _findBody(id: unknown): PhysicsBody | null {\n const bodies = this._world._bodies;\n for (let i = 0; i < bodies.length; i++) {\n if (bodies[i]!._hkBody[0] === id) {\n return bodies[i]!;\n }\n }\n return null;\n }\n\n private _contactFromCast(cp: any, castPath: Vec3, hitFraction: number): Contact {\n const normal = v(cp[4][0], cp[4][1], cp[4][2]);\n const dist = -hitFraction * vdot(castPath, normal);\n return {\n position: v(cp[3][0], cp[3][1], cp[3][2]),\n normal,\n distance: dist,\n fraction: hitFraction,\n body: this._findBody(cp[0][0]),\n allowedPenetration: clamp(this.keepDistance - dist, 0, this.keepDistance),\n };\n }\n\n private _validateManifold(): void {\n this._manifold = this._manifold.filter((c) => c.body === null || this._world._bodies.indexOf(c.body) !== -1);\n }\n\n private _updateManifold(castPath: Vec3): number {\n const hknp = this._world._hknp;\n const numProximityHits = hknp.HP_QueryCollector_GetNumHits(this._startCollector)[1];\n if (numProximityHits > 0) {\n const newContacts: Contact[] = [];\n let minDistance = 1e38;\n for (let i = 0; i < numProximityHits; i++) {\n const [distance, , contactWorld] = hknp.HP_QueryCollector_GetShapeProximityResult(this._startCollector, i)[1];\n minDistance = Math.min(minDistance, distance);\n newContacts.push({\n position: v(contactWorld[3][0], contactWorld[3][1], contactWorld[3][2]),\n normal: v(contactWorld[4][0], contactWorld[4][1], contactWorld[4][2]),\n distance,\n fraction: 0,\n body: this._findBody(contactWorld[0][0]),\n allowedPenetration: clamp(this.keepDistance - distance, 0, this.keepDistance),\n });\n }\n for (let i = this._manifold.length - 1; i >= 0; i--) {\n const bestMatch = this._findContact(this._manifold[i]!, newContacts, 1.1);\n if (bestMatch >= 0) {\n const newAllowed = Math.min(clamp(this.keepDistance - newContacts[bestMatch]!.distance, 0, this.keepDistance), this._manifold[i]!.allowedPenetration);\n this._manifold[i] = newContacts[bestMatch]!;\n this._manifold[i]!.allowedPenetration = newAllowed;\n newContacts.splice(bestMatch, 1);\n } else {\n this._manifold.splice(i, 1);\n }\n }\n const closestContactIndex = newContacts.findIndex((c) => c.distance === minDistance);\n if (closestContactIndex >= 0) {\n const closest = newContacts[closestContactIndex]!;\n const bestMatch = this._findContact(closest, this._manifold, 0.1);\n if (bestMatch >= 0) {\n const newAllowed = Math.min(clamp(this.keepDistance - closest.distance, 0, this.keepDistance), this._manifold[bestMatch]!.allowedPenetration);\n this._manifold[bestMatch] = closest;\n this._manifold[bestMatch]!.allowedPenetration = newAllowed;\n } else {\n this._manifold.push(closest);\n }\n }\n } else {\n this._manifold.length = 0;\n }\n\n let numHitBodies = 0;\n const numCastHits = hknp.HP_QueryCollector_GetNumHits(this._castCollector)[1];\n if (numCastHits > 0) {\n let closestHitBodyId: unknown = null;\n for (let i = 0; i < numCastHits; i++) {\n const [fraction, , hitWorld] = hknp.HP_QueryCollector_GetShapeCastResult(this._castCollector, i)[1];\n if (closestHitBodyId === null) {\n const contact = this._contactFromCast(hitWorld, castPath, fraction);\n closestHitBodyId = hitWorld[0][0];\n if (this._findContact(contact, this._manifold, 0.1) === -1) {\n this._manifold.push(contact);\n }\n if (contact.body?.motionType === (PhysicsMotionType.STATIC as number) || contact.body === null) {\n break;\n }\n } else if (hitWorld[0][0] !== closestHitBodyId) {\n numHitBodies++;\n break;\n }\n }\n }\n return numHitBodies;\n }\n\n // ─── Contact comparison ──────────────────────────────────────────\n\n private _compareContacts(a: Contact, b: Contact): number {\n const angSquared = (1 - vdot(a.normal, b.normal)) * this._contactAngleSensitivity * this._contactAngleSensitivity;\n const planeDistSquared = (a.distance - b.distance) * (a.distance * b.distance);\n const aVel = this._getPointVelocity(a.body, a.position);\n const bVel = this._getPointVelocity(b.body, b.position);\n const velocityDiffSquared = vlenSq(vsub(aVel, bVel));\n return angSquared * 10 + velocityDiffSquared * 0.1 + planeDistSquared;\n }\n\n private _findContact(reference: Contact, list: Contact[], threshold: number): number {\n let bestIdx = -1;\n let bestFitness = threshold;\n for (let i = 0; i < list.length; i++) {\n const fitness = this._compareContacts(reference, list[i]!);\n if (fitness < bestFitness) {\n bestFitness = fitness;\n bestIdx = i;\n }\n }\n return bestIdx;\n }\n\n // ─── Body kinematics ─────────────────────────────────────────────\n\n private _getMassProperties(body: PhysicsBody): any {\n return this._world._hknp.HP_Body_GetMassProperties(body._hkBody)[1];\n }\n\n private _getComWorld(body: PhysicsBody): Vec3 {\n const com = this._getMassProperties(body)[0];\n return transformCoord(body.node.worldMatrix, v(com[0], com[1], com[2]));\n }\n\n private _getPointVelocity(body: PhysicsBody | null, pointWorld: Vec3): Vec3 {\n if (!body) {\n return v();\n }\n const hknp = this._world._hknp;\n const comWorld = this._getComWorld(body);\n const relPos = vsub(pointWorld, comWorld);\n const avArr = hknp.HP_Body_GetAngularVelocity(body._hkBody)[1];\n const av = v(avArr[0], avArr[1], avArr[2]);\n const lvArr = hknp.HP_Body_GetLinearVelocity(body._hkBody)[1];\n return vadd(vcross(av, relPos), v(lvArr[0], lvArr[1], lvArr[2]));\n }\n\n private _getInvMass(body: PhysicsBody): number {\n const mass = this._getMassProperties(body)[1];\n return mass > 0 ? 1 / mass : 0;\n }\n\n // ─── Surface constraints ─────────────────────────────────────────\n\n private _createSurfaceConstraint(dt: number, contact: Contact, timeTravelled: number): SurfaceConstraint {\n const constraint: SurfaceConstraint = {\n planeNormal: vclone(contact.normal),\n planeDistance: contact.distance,\n staticFriction: this.staticFriction,\n dynamicFriction: this.dynamicFriction,\n extraUpStaticFriction: 0,\n extraDownStaticFriction: 0,\n velocity: v(),\n angularVelocity: v(),\n priority: 0,\n };\n const maxSlopeCosine = Math.max(this.maxSlopeCosine, 0.1);\n const normalDotUp = vdot(contact.normal, this.up);\n if (normalDotUp > maxSlopeCosine) {\n const com = this._position;\n const contactArm = vsub(contact.position, com);\n const scale = vdot(contact.normal, contactArm);\n contact.position.x = com.x + this.up.x * scale;\n contact.position.y = com.y + this.up.y * scale;\n contact.position.z = com.z + this.up.z * scale;\n }\n const motionType = contact.body?.motionType ?? (PhysicsMotionType.STATIC as number);\n const shift = vdot(constraint.velocity, constraint.planeNormal) * timeTravelled;\n constraint.planeDistance -= shift;\n if (motionType === (PhysicsMotionType.STATIC as number)) {\n constraint.priority = 2;\n } else if (motionType === (PhysicsMotionType.ANIMATED as number) && contact.body) {\n const body = contact.body;\n const currentWorld = matToArray(body.node.worldMatrix);\n const tracking = this._bodyTracking.get(body);\n if (!tracking) {\n this._bodyTracking.set(body, { prev: currentWorld, frameId: this._frameId });\n } else {\n if (tracking.frameId + 1 === this._frameId) {\n const inv = mat4Invert(body.node.worldMatrix);\n if (inv) {\n const characterLocal = transformCoord(inv, this._position);\n const characterWorld = transformCoord(tracking.prev, characterLocal);\n const playerDelta = vsub(this._position, characterWorld);\n vcopy(constraint.velocity, playerDelta);\n vscaleIn(constraint.velocity, 1 / dt);\n constraint.priority = 1;\n }\n }\n tracking.prev = currentWorld;\n tracking.frameId = this._frameId;\n }\n }\n return constraint;\n }\n\n private _addMaxSlopePlane(maxSlopeCos: number, index: number, constraints: SurfaceConstraint[], allowedPenetration: number): void {\n const src = constraints[index]!;\n const verticalComponent = vdot(src.planeNormal, this.up);\n if (verticalComponent > 0.01 && verticalComponent < maxSlopeCos) {\n const newConstraint: SurfaceConstraint = {\n planeNormal: vclone(src.planeNormal),\n planeDistance: src.planeDistance,\n velocity: vclone(src.velocity),\n angularVelocity: vclone(src.angularVelocity),\n priority: src.priority,\n dynamicFriction: src.dynamicFriction,\n staticFriction: src.staticFriction,\n extraDownStaticFriction: src.extraDownStaticFriction,\n extraUpStaticFriction: src.extraUpStaticFriction,\n };\n const distance = newConstraint.planeDistance;\n vsubIn(newConstraint.planeNormal, vscale(this.up, verticalComponent));\n vnormIn(newConstraint.planeNormal);\n if (distance >= 0) {\n newConstraint.planeDistance = distance * vdot(newConstraint.planeNormal, src.planeNormal);\n } else {\n const penetrationToResolve = Math.min(0, distance + allowedPenetration);\n newConstraint.planeDistance = penetrationToResolve / vdot(newConstraint.planeNormal, src.planeNormal);\n src.planeDistance = 0;\n this._resolveConstraintPenetration(newConstraint);\n }\n constraints.push(newConstraint);\n }\n }\n\n private _resolveConstraintPenetration(constraint: SurfaceConstraint): void {\n if (constraint.planeDistance < -1e-6) {\n vsubIn(constraint.velocity, vscale(constraint.planeNormal, constraint.planeDistance * this.penetrationRecoverySpeed));\n }\n }\n\n private _createConstraintsFromManifold(dt: number, timeTravelled: number): SurfaceConstraint[] {\n const constraints: SurfaceConstraint[] = [];\n for (let i = 0; i < this._manifold.length; i++) {\n const surfaceConstraint = this._createSurfaceConstraint(dt, this._manifold[i]!, timeTravelled);\n constraints.push(surfaceConstraint);\n this._addMaxSlopePlane(this.maxSlopeCosine, i, constraints, this._manifold[i]!.allowedPenetration);\n this._resolveConstraintPenetration(surfaceConstraint);\n }\n return constraints;\n }\n\n // ─── Contact resolution (push dynamic bodies) ────────────────────\n\n private _resolveContacts(deltaTime: number, gravity: Vec3): void {\n const eps = 1e-12;\n const hknp = this._world._hknp;\n for (const contact of this._manifold) {\n const body = contact.body;\n if (!body || body.motionType !== (PhysicsMotionType.DYNAMIC as number)) {\n continue;\n }\n const pointRelVel = this._getPointVelocity(body, contact.position);\n vsubIn(pointRelVel, this._velocity);\n const inputProjectedVelocity = vdot(pointRelVel, contact.normal);\n let deltaVelocity = -inputProjectedVelocity * 0.9;\n if (contact.distance < 0) {\n deltaVelocity += (contact.distance * 0.4) / deltaTime;\n }\n let outputImpulse = v();\n if (deltaVelocity < 0) {\n const comWorld = this._getComWorld(body);\n const r = vsub(contact.position, comWorld);\n const jacAng = vcross(r, contact.normal);\n // Inertia is treated as isotropic for the impulse magnitude (Lite bodies use diagonal inertia).\n const inputObjectMassInv = vlenSq(jacAng) * this._getInvMass(body) + this._getInvMass(body);\n let impulseMag = inputObjectMassInv > 0 ? deltaVelocity / inputObjectMassInv : 0;\n const maxPushImpulse = -this.characterStrength * deltaTime;\n if (impulseMag < maxPushImpulse) {\n impulseMag = maxPushImpulse;\n }\n outputImpulse = vscale(contact.normal, impulseMag);\n }\n let relVelN = vdot(contact.normal, vscale(gravity, deltaTime));\n if (inputProjectedVelocity < 0) {\n relVelN -= inputProjectedVelocity;\n }\n if (relVelN < -eps) {\n vaddIn(outputImpulse, vscale(contact.normal, this.characterMass * relVelN));\n }\n this.onTriggerCollisionObservable.notify({ collider: body, impulse: outputImpulse, impulsePosition: contact.position });\n hknp.HP_Body_ApplyImpulse(body._hkBody, [contact.position.x, contact.position.y, contact.position.z], [outputImpulse.x, outputImpulse.y, outputImpulse.z]);\n }\n }\n\n // ─── Simplex velocity solver ─────────────────────────────────────\n\n private _getOutput(info: SolverInfo, constraint: SurfaceConstraint): PlaneInteraction {\n return info.outputInteractions[info.inputConstraints.indexOf(constraint)]!;\n }\n\n private _sortInfo(info: SolverInfo): void {\n for (let i = 0; i < info.numSupportPlanes - 1; i++) {\n for (let j = i + 1; j < info.numSupportPlanes; j++) {\n const p0 = info.supportPlanes[i]!;\n const p1 = info.supportPlanes[j]!;\n if (p0.constraint.priority < p1.constraint.priority) {\n continue;\n }\n if (p0.constraint.priority === p1.constraint.priority && vlenSq(p0.constraint.velocity) < vlenSq(p1.constraint.velocity)) {\n continue;\n }\n info.supportPlanes[i] = p1;\n info.supportPlanes[j] = p0;\n }\n }\n }\n\n private _solve1d(sci: SurfaceConstraint, velocityIn: Vec3, velocityOut: Vec3): void {\n const eps = 1e-5;\n const groundVelocity = sci.velocity;\n const relativeVelocity = vsub(velocityIn, groundVelocity);\n const planeVel = vdot(relativeVelocity, sci.planeNormal);\n const origVelocity2 = vlenSq(relativeVelocity);\n vsubIn(relativeVelocity, vscale(sci.planeNormal, planeVel));\n const vp2 = planeVel * planeVel;\n const extraStaticFriction = vdot(relativeVelocity, this.up) > 0 ? sci.extraUpStaticFriction : sci.extraDownStaticFriction;\n if (extraStaticFriction > 0) {\n const horizontal = vcross(this.up, sci.planeNormal);\n const hor2 = vlenSq(horizontal);\n let horVel = 0;\n if (hor2 > eps) {\n vscaleIn(horizontal, 1 / Math.sqrt(hor2));\n horVel = vdot(relativeVelocity, horizontal);\n const horVel2 = horVel * horVel;\n const f2 = sci.staticFriction * sci.staticFriction;\n if (vp2 * f2 >= horVel2) {\n vsubIn(relativeVelocity, vscale(horizontal, horVel));\n horVel = 0;\n }\n }\n const vertVel2 = origVelocity2 - horVel * horVel - vp2;\n const f2 = (sci.staticFriction + extraStaticFriction) * (sci.staticFriction + extraStaticFriction);\n if (vp2 * f2 >= vertVel2 && horVel === 0) {\n vcopy(velocityOut, groundVelocity);\n return;\n }\n } else {\n const f2 = sci.staticFriction * sci.staticFriction;\n if (vp2 * (1 + f2) >= origVelocity2) {\n vcopy(velocityOut, groundVelocity);\n return;\n }\n }\n if (sci.dynamicFriction < 1) {\n const velOut2 = vlenSq(relativeVelocity);\n if (velOut2 >= eps && velOut2 > 1e-4 * origVelocity2) {\n let f = Math.sqrt(origVelocity2 / velOut2);\n f = sci.dynamicFriction + (1 - sci.dynamicFriction) * f;\n vscaleIn(relativeVelocity, f);\n const p = vdot(sci.planeNormal, relativeVelocity);\n vsubIn(relativeVelocity, vscale(sci.planeNormal, p));\n }\n }\n vcopy(velocityOut, relativeVelocity);\n vaddIn(velocityOut, groundVelocity);\n }\n\n private _solveTest1d(sci: SurfaceConstraint, velocityIn: Vec3): boolean {\n const relativeVelocity = vsub(velocityIn, sci.velocity);\n return vdot(relativeVelocity, sci.planeNormal) < -1e-3;\n }\n\n private _solve2d(info: SolverInfo, maxSurfaceVelocity: Vec3, sci0: SurfaceConstraint, sci1: SurfaceConstraint, velocityIn: Vec3, velocityOut: Vec3): void {\n const eps = 1e-5;\n const axis = vcross(sci0.planeNormal, sci1.planeNormal);\n const axisLen2 = vlenSq(axis);\n let solveSequentially = false;\n let axisVel = v();\n\n while (true) {\n if (axisLen2 <= eps || solveSequentially) {\n this._getOutput(info, sci0).status = InteractionStatus.FAILURE_2D;\n this._getOutput(info, sci1).status = InteractionStatus.FAILURE_2D;\n if (sci0.priority > sci1.priority) {\n this._solve1d(sci1, velocityIn, velocityOut);\n this._solve1d(sci0, velocityIn, velocityOut);\n } else {\n this._solve1d(sci0, velocityIn, velocityOut);\n this._solve1d(sci1, velocityIn, velocityOut);\n }\n return;\n }\n const invAxisLen = 1 / Math.sqrt(axisLen2);\n vscaleIn(axis, invAxisLen);\n const r0 = vcross(sci0.planeNormal, sci1.planeNormal);\n const r1 = vcross(sci1.planeNormal, axis);\n const r2 = vcross(axis, sci0.planeNormal);\n const sVel = vadd(sci0.velocity, sci1.velocity);\n const t = v(0.5 * vdot(axis, sVel), vdot(sci0.planeNormal, sci0.velocity), vdot(sci1.planeNormal, sci1.velocity));\n axisVel = v(vdot(t, r0), vdot(t, r1), vdot(t, r2));\n vscaleIn(axisVel, invAxisLen);\n if (Math.abs(axisVel.x) > maxSurfaceVelocity.x || Math.abs(axisVel.y) > maxSurfaceVelocity.y || Math.abs(axisVel.z) > maxSurfaceVelocity.z) {\n solveSequentially = true;\n } else {\n break;\n }\n }\n const groundVelocity = axisVel;\n const relativeVelocity = vsub(velocityIn, groundVelocity);\n const vel2 = vlenSq(relativeVelocity);\n const axisVert = vdot(this.up, axis);\n let axisProjVelocity = vdot(relativeVelocity, axis);\n let staticFriction = sci0.staticFriction + sci1.staticFriction;\n if (axisVert * axisProjVelocity > 0) {\n staticFriction += (sci0.extraUpStaticFriction + sci1.extraUpStaticFriction) * axisVert;\n } else {\n staticFriction += (sci0.extraDownStaticFriction + sci1.extraDownStaticFriction) * axisVert;\n }\n staticFriction *= 0.5;\n const dynamicFriction = (sci0.dynamicFriction + sci1.dynamicFriction) * 0.5;\n const f2 = staticFriction * staticFriction;\n const av2 = axisProjVelocity * axisProjVelocity;\n if ((vel2 - av2) * f2 >= av2) {\n vcopy(velocityOut, groundVelocity);\n return;\n }\n if (dynamicFriction < 1 && axisProjVelocity * axisProjVelocity > 1e-4 * vel2) {\n const f = Math.abs(1 / axisProjVelocity) * Math.sqrt(vel2) * (1 - dynamicFriction) + dynamicFriction;\n axisProjVelocity *= f;\n }\n vcopy(velocityOut, groundVelocity);\n vaddIn(velocityOut, vscale(axis, axisProjVelocity));\n }\n\n private _solve3d(\n info: SolverInfo,\n maxSurfaceVelocity: Vec3,\n sci0: SurfaceConstraint,\n sci1: SurfaceConstraint,\n sci2: SurfaceConstraint,\n allowResort: boolean,\n velocityIn: Vec3,\n velocityOut: Vec3\n ): void {\n const eps = 1e-5;\n let pointVel = v();\n let r0 = vcross(sci1.planeNormal, sci2.planeNormal);\n let r1 = vcross(sci2.planeNormal, sci0.planeNormal);\n let r2 = vcross(sci0.planeNormal, sci1.planeNormal);\n let det = vdot(r0, sci0.planeNormal);\n let solveSequentially = false;\n\n while (true) {\n if (Math.abs(det) < eps || solveSequentially) {\n if (allowResort) {\n this._sortInfo(info);\n sci0 = info.supportPlanes[0]!.constraint;\n sci1 = info.supportPlanes[1]!.constraint;\n sci2 = info.supportPlanes[2]!.constraint;\n }\n this._getOutput(info, sci0).status = InteractionStatus.FAILURE_3D;\n this._getOutput(info, sci1).status = InteractionStatus.FAILURE_3D;\n this._getOutput(info, sci2).status = InteractionStatus.FAILURE_3D;\n const oldNum = info.numSupportPlanes;\n this._solve2d(info, maxSurfaceVelocity, sci0, sci1, velocityIn, velocityOut);\n if (oldNum === info.numSupportPlanes) {\n this._solve2d(info, maxSurfaceVelocity, sci0, sci2, velocityIn, velocityOut);\n }\n if (oldNum === info.numSupportPlanes) {\n this._solve2d(info, maxSurfaceVelocity, sci1, sci2, velocityIn, velocityOut);\n }\n return;\n }\n const t = v(vdot(sci0.planeNormal, sci0.velocity), vdot(sci1.planeNormal, sci1.velocity), vdot(sci2.planeNormal, sci2.velocity));\n pointVel = {\n x: t.x * r0.x + t.y * r1.x + t.z * r2.x,\n y: t.x * r0.y + t.y * r1.y + t.z * r2.y,\n z: t.x * r0.z + t.y * r1.z + t.z * r2.z,\n };\n vscaleIn(pointVel, 1 / det);\n if (Math.abs(pointVel.x) > maxSurfaceVelocity.x || Math.abs(pointVel.y) > maxSurfaceVelocity.y || Math.abs(pointVel.z) > maxSurfaceVelocity.z) {\n solveSequentially = true;\n } else {\n break;\n }\n // Recompute basis after a resort if it happens on a later pass.\n r0 = vcross(sci1.planeNormal, sci2.planeNormal);\n r1 = vcross(sci2.planeNormal, sci0.planeNormal);\n r2 = vcross(sci0.planeNormal, sci1.planeNormal);\n det = vdot(r0, sci0.planeNormal);\n }\n vcopy(velocityOut, pointVel);\n }\n\n private _examineActivePlanes(info: SolverInfo, maxSurfaceVelocity: Vec3, velocityIn: Vec3, velocityOut: Vec3): void {\n while (true) {\n switch (info.numSupportPlanes) {\n case 1: {\n this._solve1d(info.supportPlanes[0]!.constraint, velocityIn, velocityOut);\n return;\n }\n case 2: {\n const velocity = v();\n this._solve1d(info.supportPlanes[1]!.constraint, velocityIn, velocity);\n if (!this._solveTest1d(info.supportPlanes[0]!.constraint, velocity)) {\n this._copyPlane(info.supportPlanes[0]!, info.supportPlanes[1]!);\n info.numSupportPlanes = 1;\n vcopy(velocityOut, velocity);\n } else {\n this._solve2d(info, maxSurfaceVelocity, info.supportPlanes[0]!.constraint, info.supportPlanes[1]!.constraint, velocityIn, velocityOut);\n }\n return;\n }\n case 3: {\n {\n const velocity = v();\n this._solve1d(info.supportPlanes[2]!.constraint, velocityIn, velocityOut);\n if (!this._solveTest1d(info.supportPlanes[0]!.constraint, velocity) && !this._solveTest1d(info.supportPlanes[1]!.constraint, velocity)) {\n vcopy(velocityOut, velocity);\n this._copyPlane(info.supportPlanes[0]!, info.supportPlanes[2]!);\n info.numSupportPlanes = 1;\n continue;\n }\n }\n {\n let droppedAPlane = false;\n for (let testPlane = 0; testPlane < 2; testPlane++) {\n this._solve2d(info, maxSurfaceVelocity, info.supportPlanes[testPlane]!.constraint, info.supportPlanes[2]!.constraint, velocityIn, velocityOut);\n if (!this._solveTest1d(info.supportPlanes[1 - testPlane]!.constraint, velocityOut)) {\n this._copyPlane(info.supportPlanes[0]!, info.supportPlanes[testPlane]!);\n this._copyPlane(info.supportPlanes[1]!, info.supportPlanes[2]!);\n info.numSupportPlanes--;\n droppedAPlane = true;\n break;\n }\n }\n if (droppedAPlane) {\n continue;\n }\n }\n this._solve3d(\n info,\n maxSurfaceVelocity,\n info.supportPlanes[0]!.constraint,\n info.supportPlanes[1]!.constraint,\n info.supportPlanes[2]!.constraint,\n true,\n velocityIn,\n velocityOut\n );\n return;\n }\n case 4: {\n this._sortInfo(info);\n let droppedAPlane = false;\n for (let i = 0; i < 3; i++) {\n const velocity = v();\n this._solve3d(\n info,\n maxSurfaceVelocity,\n info.supportPlanes[(i + 1) % 3]!.constraint,\n info.supportPlanes[(i + 2) % 3]!.constraint,\n info.supportPlanes[3]!.constraint,\n false,\n velocityIn,\n velocity\n );\n if (!this._solveTest1d(info.supportPlanes[i]!.constraint, velocity)) {\n this._copyPlane(info.supportPlanes[i]!, info.supportPlanes[2]!);\n this._copyPlane(info.supportPlanes[2]!, info.supportPlanes[3]!);\n info.numSupportPlanes = 3;\n droppedAPlane = true;\n break;\n }\n }\n if (droppedAPlane) {\n continue;\n }\n {\n const velocity = vclone(velocityIn);\n this._solve3d(\n info,\n maxSurfaceVelocity,\n info.supportPlanes[0]!.constraint,\n info.supportPlanes[1]!.constraint,\n info.supportPlanes[2]!.constraint,\n false,\n velocity,\n velocity\n );\n vcopy(velocityOut, velocity);\n }\n {\n let maxStatus = InteractionStatus.OK;\n for (let i = 0; i < 4; i++) {\n maxStatus = Math.max(maxStatus, info.supportPlanes[i]!.interaction.status);\n }\n for (let i = 0; i < 4; i++) {\n if (maxStatus === info.supportPlanes[i]!.interaction.status) {\n this._copyPlane(info.supportPlanes[i]!, info.supportPlanes[3]!);\n break;\n }\n info.numSupportPlanes--;\n }\n }\n for (let i = 0; i < 3; i++) {\n info.supportPlanes[i]!.interaction.status = InteractionStatus.OK;\n }\n continue;\n }\n default:\n return;\n }\n }\n }\n\n private _copyPlane(dst: ActivePlane, src: ActivePlane): void {\n dst.index = src.index;\n dst.constraint = src.constraint;\n dst.interaction = src.interaction;\n }\n\n private _simplexSolverSolve(constraints: SurfaceConstraint[], velocity: Vec3, deltaTime: number, minDeltaTime: number, maxSurfaceVelocity: Vec3): SolverOutput {\n const eps = 1e-6;\n const output: SolverOutput = {\n position: v(),\n velocity: vclone(velocity),\n deltaTime,\n planeInteractions: [],\n };\n for (let i = 0; i < constraints.length; i++) {\n output.planeInteractions.push({ touched: false, stopped: false, surfaceTime: 0, penaltyDistance: 0, status: InteractionStatus.OK });\n }\n const info: SolverInfo = {\n supportPlanes: [],\n numSupportPlanes: 0,\n currentTime: 0,\n inputConstraints: constraints,\n outputInteractions: output.planeInteractions,\n };\n const emptyConstraint = (): SurfaceConstraint => ({\n planeNormal: v(),\n planeDistance: 0,\n staticFriction: 0,\n dynamicFriction: 0,\n extraUpStaticFriction: 0,\n extraDownStaticFriction: 0,\n velocity: v(),\n angularVelocity: v(),\n priority: 0,\n });\n const emptyInteraction = (): PlaneInteraction => ({ touched: false, stopped: false, surfaceTime: 0, penaltyDistance: 0, status: InteractionStatus.OK });\n for (let i = 0; i < 4; i++) {\n info.supportPlanes.push({ index: -1, constraint: emptyConstraint(), interaction: emptyInteraction() });\n }\n let remainingTime = deltaTime;\n while (remainingTime > 0) {\n let hitIndex = -1;\n let minCollisionTime = remainingTime;\n for (let i = 0; i < constraints.length; i++) {\n if (info.numSupportPlanes >= 1 && info.supportPlanes[0]!.index === i) {\n continue;\n }\n if (info.numSupportPlanes >= 2 && info.supportPlanes[1]!.index === i) {\n continue;\n }\n if (info.numSupportPlanes >= 3 && info.supportPlanes[2]!.index === i) {\n continue;\n }\n if (output.planeInteractions[i]!.status !== InteractionStatus.OK) {\n continue;\n }\n const sci = constraints[i]!;\n const relativeVel = vsub(output.velocity, sci.velocity);\n const relativeProjectedVel = -vdot(relativeVel, sci.planeNormal);\n if (relativeProjectedVel <= 0) {\n continue;\n }\n const relativePos = vsub(output.position, vscale(sci.velocity, info.currentTime));\n let projectedPos = vdot(sci.planeNormal, relativePos);\n const penaltyDist = output.planeInteractions[i]!.penaltyDistance;\n if (penaltyDist < eps) {\n projectedPos = 0;\n }\n projectedPos += penaltyDist;\n if (projectedPos < minCollisionTime * relativeProjectedVel) {\n minCollisionTime = projectedPos / relativeProjectedVel;\n hitIndex = i;\n }\n }\n if (minCollisionTime > 1e-4) {\n info.currentTime += minCollisionTime;\n remainingTime -= minCollisionTime;\n vaddIn(output.position, vscale(output.velocity, minCollisionTime));\n for (let i = 0; i < info.numSupportPlanes; i++) {\n info.supportPlanes[i]!.interaction.surfaceTime += minCollisionTime;\n info.supportPlanes[i]!.interaction.touched = true;\n }\n output.deltaTime = info.currentTime;\n if (info.currentTime > minDeltaTime) {\n return output;\n }\n }\n if (hitIndex < 0) {\n output.deltaTime = deltaTime;\n break;\n }\n const supportPlane = info.supportPlanes[info.numSupportPlanes++]!;\n supportPlane.constraint = constraints[hitIndex]!;\n supportPlane.interaction = output.planeInteractions[hitIndex]!;\n supportPlane.interaction.penaltyDistance = (supportPlane.interaction.penaltyDistance + eps) * 2;\n supportPlane.index = hitIndex;\n this._examineActivePlanes(info, maxSurfaceVelocity, velocity, output.velocity);\n }\n return output;\n }\n}\n\nconst ZERO: Vec3 = { x: 0, y: 0, z: 0 };\n\nfunction matToArray(m: Mat4): number[] {\n const out: number[] = new Array(16);\n for (let i = 0; i < 16; i++) {\n out[i] = m[i]!;\n }\n return out;\n}\n\n/**\n * Create a Havok physics character controller.\n *\n * The controller adds a kinematic capsule body to `world` and resolves collisions by sweeping\n * that capsule each step. Drive it from a per-physics-step callback (e.g. `onPhysicsAfterStep`)\n * by calling {@link PhysicsCharacterController.moveWithCollisions} with the desired displacement,\n * then read {@link PhysicsCharacterController.getPosition} to update your display mesh.\n * @param world - The physics world to add the character to.\n * @param position - Initial world-space position of the character.\n * @param options - Capsule dimensions.\n * @returns The character controller instance.\n */\nexport function createPhysicsCharacterController(world: PhysicsWorld, position: Vec3, options: PhysicsCharacterControllerOptions): PhysicsCharacterController {\n return new PhysicsCharacterController(world, position, options);\n}\n"],"names":["CharacterSupportedState","f2"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"character-controller.js","sources":["../../../src/physics/character-controller.ts"],"sourcesContent":["/**\n * Havok Physics V2 character controller for Babylon Lite — a collide-and-slide kinematic\n * character built entirely on the Havok shapecast / shapeproximity query primitives.\n *\n * Kept in a standalone, tree-shakeable module: the per-frame `_stepWorld` core in `havok.ts`\n * never references this code, so only scenes that import {@link createPhysicsCharacterController}\n * pay for it. The controller sweeps a capsule shape through the world each step, builds a contact\n * manifold from the cast + proximity hits, turns the contacts into surface constraints, then runs\n * a simplex velocity solver (1D/2D/3D plane clipping) to compute a collision-free displacement.\n *\n * ```ts\n * const cc = createPhysicsCharacterController(world, { x: 0, y: 1, z: 0 }, { capsuleHeight: 1.8, capsuleRadius: 0.6 });\n * onPhysicsAfterStep(world, () => {\n * cc.moveWithCollisions({ x: 0, y: -0.05, z: 0.02 });\n * const p = cc.getPosition();\n * displayMesh.position.set(p.x, p.y, p.z);\n * });\n * ```\n *\n * The algorithm follows Babylon.js' `PhysicsCharacterController` (Apache-2.0), re-expressed with\n * Lite's plain-data `Vec3` math and free-function physics API. Left-handed, +Y up.\n */\n\nimport type { Quat, Vec3 } from \"../math/types.js\";\nimport { mat4Invert } from \"../math/mat4-invert.js\";\nimport type { Mat4 } from \"../math/types.js\";\nimport { createTransformNode } from \"../scene/transform-node.js\";\nimport type { TransformNode } from \"../scene/transform-node.js\";\nimport {\n createPhysicsBody,\n createPhysicsShape,\n PhysicsMotionType,\n PhysicsShapeType,\n removePhysicsBody,\n setPhysicsBodyMassProperties,\n setPhysicsBodyPreStep,\n setPhysicsBodyShape,\n worldStepSeconds,\n} from \"./havok.js\";\nimport type { PhysicsBody, PhysicsShape, PhysicsWorld } from \"./havok.js\";\n\n// ─── Public types ────────────────────────────────────────────────────\n\n/** Contact state of the character against the geometry beneath it. */\nexport const enum CharacterSupportedState {\n /** No surface within reach. */\n UNSUPPORTED = 0,\n /** Touching a surface too steep to stand on; the character slides. */\n SLIDING = 1,\n /** Standing on a walkable surface. */\n SUPPORTED = 2,\n}\n\n/** Options describing the character's collision capsule. */\nexport interface PhysicsCharacterControllerOptions {\n /** Total capsule height (tip to tip), in metres. Default `1.8`. */\n capsuleHeight: number;\n /** Capsule radius, in metres. Default `0.6`. */\n capsuleRadius: number;\n}\n\n/**\n * Collision event fired by {@link PhysicsCharacterController.onTriggerCollisionObservable}\n * for every dynamic body the character pushes during a step. Mirrors Babylon.js'\n * `onTriggerCollisionObservable` payload (minus its `colliderIndex`, which has no Lite equivalent).\n */\nexport interface CharacterCollisionEvent {\n /** The dynamic physics body the character contacted. Its `.node.name` identifies the collider. */\n collider: PhysicsBody;\n /** Impulse (world space) the character applied to the collider at the contact point. */\n impulse: Vec3;\n /** World-space position of the contact at which the impulse was applied. */\n impulsePosition: Vec3;\n}\n\n/**\n * Minimal single-event observable used by {@link PhysicsCharacterController} for collision\n * callbacks. Kept local to the physics module (no dependency on gizmo/observable code) so the\n * character-controller graph stays self-contained and tree-shakeable.\n */\nexport class CharacterCollisionObservable {\n private _subs: ((event: CharacterCollisionEvent) => void)[] = [];\n\n /**\n * Subscribe to collision events.\n * @param cb - Callback invoked for each dynamic-body contact during a step.\n * @returns A disposer that removes the subscription when called.\n */\n public add(cb: (event: CharacterCollisionEvent) => void): () => void {\n this._subs.push(cb);\n return () => {\n const i = this._subs.indexOf(cb);\n if (i >= 0) {\n this._subs.splice(i, 1);\n }\n };\n }\n\n /**\n * Notify all subscribers of a collision event.\n * @param event - The collision event payload.\n */\n public notify(event: CharacterCollisionEvent): void {\n for (const s of this._subs) {\n s(event);\n }\n }\n}\n\n/** Surface information returned by {@link PhysicsCharacterController.checkSupport}. */\nexport interface CharacterSurfaceInfo {\n /** Whether the supporting surface belongs to a dynamic (simulated) body. */\n isSurfaceDynamic: boolean;\n /** Whether the character is unsupported, sliding, or supported. */\n supportedState: CharacterSupportedState;\n /** Average normal of the supporting surfaces (world space). */\n averageSurfaceNormal: Vec3;\n /** Average linear velocity induced by the supporting surfaces. */\n averageSurfaceVelocity: Vec3;\n /** Average angular velocity induced by the supporting surfaces. */\n averageAngularSurfaceVelocity: Vec3;\n}\n\n// ─── Internal data structures ────────────────────────────────────────\n\ninterface Contact {\n position: Vec3;\n normal: Vec3;\n distance: number;\n fraction: number;\n body: PhysicsBody | null;\n allowedPenetration: number;\n}\n\ninterface SurfaceConstraint {\n planeNormal: Vec3;\n planeDistance: number;\n staticFriction: number;\n dynamicFriction: number;\n extraUpStaticFriction: number;\n extraDownStaticFriction: number;\n velocity: Vec3;\n angularVelocity: Vec3;\n priority: number;\n}\n\nconst enum InteractionStatus {\n OK = 0,\n FAILURE_3D = 1,\n FAILURE_2D = 2,\n}\n\ninterface PlaneInteraction {\n touched: boolean;\n stopped: boolean;\n surfaceTime: number;\n penaltyDistance: number;\n status: InteractionStatus;\n}\n\ninterface ActivePlane {\n index: number;\n constraint: SurfaceConstraint;\n interaction: PlaneInteraction;\n}\n\ninterface SolverInfo {\n supportPlanes: ActivePlane[];\n numSupportPlanes: number;\n currentTime: number;\n inputConstraints: SurfaceConstraint[];\n outputInteractions: PlaneInteraction[];\n}\n\ninterface SolverOutput {\n position: Vec3;\n velocity: Vec3;\n deltaTime: number;\n planeInteractions: PlaneInteraction[];\n}\n\ninterface BodyTracking {\n prev: number[];\n frameId: number;\n}\n\n// ─── Vec3 helpers (plain-data, allocation-friendly) ──────────────────\n\nfunction v(x = 0, y = 0, z = 0): Vec3 {\n return { x, y, z };\n}\nfunction vclone(a: Vec3): Vec3 {\n return { x: a.x, y: a.y, z: a.z };\n}\nfunction vcopy(d: Vec3, s: Vec3): void {\n d.x = s.x;\n d.y = s.y;\n d.z = s.z;\n}\nfunction vset(d: Vec3, x: number, y: number, z: number): void {\n d.x = x;\n d.y = y;\n d.z = z;\n}\nfunction vadd(a: Vec3, b: Vec3): Vec3 {\n return { x: a.x + b.x, y: a.y + b.y, z: a.z + b.z };\n}\nfunction vsub(a: Vec3, b: Vec3): Vec3 {\n return { x: a.x - b.x, y: a.y - b.y, z: a.z - b.z };\n}\nfunction vscale(a: Vec3, s: number): Vec3 {\n return { x: a.x * s, y: a.y * s, z: a.z * s };\n}\nfunction vaddIn(d: Vec3, a: Vec3): void {\n d.x += a.x;\n d.y += a.y;\n d.z += a.z;\n}\nfunction vsubIn(d: Vec3, a: Vec3): void {\n d.x -= a.x;\n d.y -= a.y;\n d.z -= a.z;\n}\nfunction vscaleIn(d: Vec3, s: number): void {\n d.x *= s;\n d.y *= s;\n d.z *= s;\n}\nfunction vdot(a: Vec3, b: Vec3): number {\n return a.x * b.x + a.y * b.y + a.z * b.z;\n}\nfunction vcross(a: Vec3, b: Vec3): Vec3 {\n return { x: a.y * b.z - a.z * b.y, y: a.z * b.x - a.x * b.z, z: a.x * b.y - a.y * b.x };\n}\nfunction vlenSq(a: Vec3): number {\n return a.x * a.x + a.y * a.y + a.z * a.z;\n}\nfunction vlen(a: Vec3): number {\n return Math.sqrt(vlenSq(a));\n}\nfunction vnormIn(a: Vec3): void {\n const l = vlen(a);\n if (l > 1e-12) {\n const inv = 1 / l;\n a.x *= inv;\n a.y *= inv;\n a.z *= inv;\n }\n}\nfunction vequalsEps(a: Vec3, b: Vec3, eps: number): boolean {\n return Math.abs(a.x - b.x) <= eps && Math.abs(a.y - b.y) <= eps && Math.abs(a.z - b.z) <= eps;\n}\nfunction clamp(value: number, lo: number, hi: number): number {\n return Math.min(Math.max(value, lo), hi);\n}\n\n/** Transform a position by a column-major 4×4 matrix (with translation). */\nfunction transformCoord(m: ArrayLike<number>, p: Vec3): Vec3 {\n return {\n x: p.x * m[0]! + p.y * m[4]! + p.z * m[8]! + m[12]!,\n y: p.x * m[1]! + p.y * m[5]! + p.z * m[9]! + m[13]!,\n z: p.x * m[2]! + p.y * m[6]! + p.z * m[10]! + m[14]!,\n };\n}\n\n// ─── Controller ──────────────────────────────────────────────────────\n\n/**\n * A physics-driven character controller. Create one with\n * {@link createPhysicsCharacterController}; drive it each physics step with\n * {@link PhysicsCharacterController.moveWithCollisions} and read back the resolved position\n * with {@link PhysicsCharacterController.getPosition}.\n */\nexport class PhysicsCharacterController {\n /** Minimum separation kept from surfaces, in metres. Default `0.05`. */\n public keepDistance = 0.05;\n /** Extra distance over which a contact is still tracked. Default `0.1`. */\n public keepContactTolerance = 0.1;\n /** Maximum number of cast iterations per integration step. Default `10`. */\n public maxCastIterations = 10;\n /** Speed at which penetrations are pushed out. Default `1.0`. */\n public penetrationRecoverySpeed = 1.0;\n /** Static-friction coefficient against surfaces. Default `0`. */\n public staticFriction = 0;\n /** Dynamic-friction coefficient against surfaces. Default `1`. */\n public dynamicFriction = 1;\n /** Cosine of the steepest slope the character can stand on. Default `0.5` (60°). */\n public maxSlopeCosine = 0.5;\n /** Upper bound on per-solve character speed. Default `10`. */\n public maxCharacterSpeedForSolver = 10.0;\n /** World up vector. Default `(0, 1, 0)`. */\n public up: Vec3 = { x: 0, y: 1, z: 0 };\n /** Push strength applied to dynamic bodies the character contacts. Default `1e38`. */\n public characterStrength = 1e38;\n /** Acceleration factor used by {@link calculateMovement}. Default `0.05`. */\n public acceleration = 0.05;\n /** Maximum world-space acceleration used by {@link calculateMovement}. Default `50`. */\n public maxAcceleration = 50;\n /** Character mass used when reacting to gravity against dynamic bodies. Default `0`. */\n public characterMass = 0;\n\n /**\n * Fires once per dynamic body the character pushes during a step, just before the reactive\n * impulse is applied. Mirrors Babylon.js' `onTriggerCollisionObservable`. Subscribe with\n * `.add(cb)`; the returned disposer removes the subscription.\n */\n public readonly onTriggerCollisionObservable = new CharacterCollisionObservable();\n\n private readonly _world: PhysicsWorld;\n private readonly _shape: PhysicsShape;\n private readonly _node: TransformNode;\n private readonly _body: PhysicsBody;\n private readonly _startCollector: any;\n private readonly _castCollector: any;\n\n private _position: Vec3;\n private _velocity: Vec3 = v();\n private _lastVelocity: Vec3 = v();\n private _lastDisplacement: Vec3 = v();\n private _orientation: Quat = { x: 0, y: 0, z: 0, w: 1 };\n private _manifold: Contact[] = [];\n private _lastInvDeltaTime = 60;\n private _frameId = 0;\n private readonly _contactAngleSensitivity = 10.0;\n private readonly _displacementEps = 1e-4;\n private readonly _bodyTracking = new Map<PhysicsBody, BodyTracking>();\n\n /** Construct a controller. Prefer the {@link createPhysicsCharacterController} factory. */\n public constructor(world: PhysicsWorld, position: Vec3, options: PhysicsCharacterControllerOptions) {\n this._world = world;\n this._position = vclone(position);\n\n const r = options.capsuleRadius ?? 0.6;\n const h = options.capsuleHeight ?? 1.8;\n this._shape = createPhysicsShape(world, {\n type: PhysicsShapeType.CAPSULE,\n parameters: { pointA: { x: 0, y: h * 0.5 - r, z: 0 }, pointB: { x: 0, y: -h * 0.5 + r, z: 0 }, radius: r },\n });\n\n this._node = createTransformNode(\"CCTransformNode\", position.x, position.y, position.z);\n this._body = createPhysicsBody(world, this._node, PhysicsMotionType.ANIMATED);\n setPhysicsBodyShape(world, this._body, this._shape);\n setPhysicsBodyMassProperties(world, this._body, { inertia: { x: 0, y: 0, z: 0 } });\n setPhysicsBodyPreStep(this._body, true);\n\n const hknp = world._hknp;\n this._startCollector = hknp.HP_QueryCollector_Create(16)[1];\n this._castCollector = hknp.HP_QueryCollector_Create(16)[1];\n }\n\n /** Release the controller's body, shape, and query collectors. */\n public dispose(): void {\n const hknp = this._world._hknp;\n removePhysicsBody(this._world, this._body);\n hknp.HP_Shape_Release(this._shape._hkShape);\n hknp.HP_QueryCollector_Release(this._startCollector);\n hknp.HP_QueryCollector_Release(this._castCollector);\n }\n\n /** Get the current character position (world space). The returned vector is owned by the controller. */\n public getPosition(): Vec3 {\n return this._position;\n }\n\n /** Teleport the character to a new position, clearing any swept motion. */\n public setPosition(position: Vec3): void {\n vcopy(this._position, position);\n this._node.position.set(position.x, position.y, position.z);\n }\n\n /** Get the current character velocity (world space). The returned vector is owned by the controller. */\n public getVelocity(): Vec3 {\n return this._velocity;\n }\n\n /** Set the character velocity (world space). */\n public setVelocity(velocity: Vec3): void {\n vcopy(this._velocity, velocity);\n }\n\n /**\n * Move the character by a displacement this physics step, sliding along any geometry it meets.\n * @param displacement - Requested world-space displacement for this step.\n */\n public moveWithCollisions(displacement: Vec3): void {\n // Physics step in seconds: the world's fixed step, or the scene's current per-frame delta when\n // no fixed step is set (see `worldStepSeconds`). If that is 0 (e.g. the first frame) the guard\n // below skips the move.\n const deltaTime = worldStepSeconds(this._world);\n if (!deltaTime || deltaTime <= 0) {\n return;\n }\n const invDeltaTime = 1 / deltaTime;\n this._frameId++;\n vcopy(this._velocity, vscale(displacement, invDeltaTime));\n vcopy(this._lastDisplacement, displacement);\n vcopy(this._lastVelocity, this._velocity);\n this._lastInvDeltaTime = invDeltaTime;\n this._integrateManifolds(deltaTime, ZERO);\n }\n\n /**\n * Advance the controller using a velocity already chosen for this step (instead of a raw\n * displacement). Mirrors Babylon.js' `integrate`: it picks a cast direction from the current\n * velocity and surface info, then runs the collide-and-slide.\n * @param deltaTime - Step duration in seconds.\n * @param surfaceInfo - Surface info from a prior {@link checkSupport} call.\n * @param gravity - Gravity applied to the character this step.\n */\n public integrate(deltaTime: number, surfaceInfo: CharacterSurfaceInfo, gravity: Vec3): void {\n const invDeltaTime = 1 / deltaTime;\n const tolerance = this._displacementEps * invDeltaTime;\n if (vequalsEps(this._velocity, this._lastVelocity, tolerance)) {\n vscaleIn(this._lastDisplacement, deltaTime * this._lastInvDeltaTime);\n } else {\n const displacementVelocity = vclone(this._velocity);\n if (surfaceInfo.supportedState === CharacterSupportedState.SUPPORTED) {\n const relative = vsub(this._velocity, surfaceInfo.averageSurfaceVelocity);\n const normalDotVelocity = vdot(surfaceInfo.averageSurfaceNormal, relative);\n if (normalDotVelocity < 0) {\n vsubIn(relative, vscale(surfaceInfo.averageSurfaceNormal, normalDotVelocity));\n vcopy(displacementVelocity, relative);\n vaddIn(displacementVelocity, surfaceInfo.averageSurfaceVelocity);\n }\n }\n vcopy(this._lastDisplacement, vscale(displacementVelocity, deltaTime));\n }\n vcopy(this._lastVelocity, this._velocity);\n this._lastInvDeltaTime = invDeltaTime;\n this._frameId++;\n this._integrateManifolds(deltaTime, gravity);\n }\n\n /**\n * Probe the surface under the character along a direction (usually gravity) to classify support.\n * @param deltaTime - Step duration in seconds.\n * @param direction - Direction to probe, usually the gravity direction.\n * @returns Support classification and averaged surface motion/normal.\n */\n public checkSupport(deltaTime: number, direction: Vec3): CharacterSurfaceInfo {\n const eps = 1e-4;\n const info: CharacterSurfaceInfo = {\n isSurfaceDynamic: false,\n supportedState: CharacterSupportedState.UNSUPPORTED,\n averageSurfaceNormal: v(),\n averageSurfaceVelocity: v(),\n averageAngularSurfaceVelocity: v(),\n };\n this._validateManifold();\n const constraints = this._createConstraintsFromManifold(deltaTime, 0);\n const storedVelocities: Vec3[] = [];\n for (const c of constraints) {\n storedVelocities.push(vclone(c.velocity));\n vset(c.velocity, 0, 0, 0);\n }\n const maxSurfaceVelocity = v(this.maxCharacterSpeedForSolver, this.maxCharacterSpeedForSolver, this.maxCharacterSpeedForSolver);\n const output = this._simplexSolverSolve(constraints, direction, deltaTime, deltaTime, maxSurfaceVelocity);\n if (vequalsEps(output.velocity, direction, eps)) {\n info.supportedState = CharacterSupportedState.UNSUPPORTED;\n return info;\n }\n if (vlenSq(output.velocity) < eps) {\n info.supportedState = CharacterSupportedState.SUPPORTED;\n } else {\n vnormIn(output.velocity);\n const angleSin = vdot(output.velocity, direction);\n const cosSqr = 1 - angleSin * angleSin;\n info.supportedState = cosSqr < this.maxSlopeCosine * this.maxSlopeCosine ? CharacterSupportedState.SLIDING : CharacterSupportedState.SUPPORTED;\n }\n let numTouching = 0;\n for (let i = 0; i < constraints.length; i++) {\n if (output.planeInteractions[i]!.touched && vdot(constraints[i]!.planeNormal, direction) < -0.08) {\n vaddIn(info.averageSurfaceNormal, constraints[i]!.planeNormal);\n vaddIn(info.averageSurfaceVelocity, storedVelocities[i]!);\n vaddIn(info.averageAngularSurfaceVelocity, constraints[i]!.angularVelocity);\n numTouching++;\n }\n }\n if (numTouching > 0) {\n vnormIn(info.averageSurfaceNormal);\n vscaleIn(info.averageSurfaceVelocity, 1 / numTouching);\n vscaleIn(info.averageAngularSurfaceVelocity, 1 / numTouching);\n }\n if (info.supportedState === CharacterSupportedState.SUPPORTED) {\n for (const m of this._manifold) {\n if (vdot(m.normal, direction) < -0.08 && m.body?.motionType === (PhysicsMotionType.DYNAMIC as number)) {\n info.isSurfaceDynamic = true;\n break;\n }\n }\n }\n return info;\n }\n\n /**\n * Compute a target velocity from the current state, a desired velocity, and surface info — a\n * helper for steering input into surface-aware motion.\n * @param deltaTime - Step duration in seconds.\n * @param forwardWorld - Character forward direction (world space).\n * @param surfaceNormal - Supporting surface normal.\n * @param currentVelocity - Current character velocity.\n * @param surfaceVelocity - Velocity induced by the surface.\n * @param desiredVelocity - Desired character velocity.\n * @param upWorld - Up vector (world space).\n * @returns The new velocity vector.\n */\n public calculateMovement(deltaTime: number, forwardWorld: Vec3, surfaceNormal: Vec3, currentVelocity: Vec3, surfaceVelocity: Vec3, desiredVelocity: Vec3, upWorld: Vec3): Vec3 {\n const eps = 1e-5;\n let binorm = vcross(forwardWorld, upWorld);\n if (vlenSq(binorm) < eps) {\n return v();\n }\n vnormIn(binorm);\n const tangent = vcross(binorm, surfaceNormal);\n vnormIn(tangent);\n binorm = vcross(tangent, surfaceNormal);\n vnormIn(binorm);\n // Orthonormal surface frame rows: tangent, binorm, surfaceNormal. Its inverse is the transpose.\n const rel = vsub(currentVelocity, surfaceVelocity);\n const relative = { x: vdot(rel, tangent), y: vdot(rel, binorm), z: vdot(rel, surfaceNormal) };\n const sideVec = vcross(upWorld, forwardWorld);\n const fwd = vdot(desiredVelocity, forwardWorld);\n const side = vdot(desiredVelocity, sideVec);\n const len = vlen(desiredVelocity);\n const desiredSF = v(-fwd, side, 0);\n vnormIn(desiredSF);\n vscaleIn(desiredSF, len);\n const diff = vsub(desiredSF, relative);\n const lenSq = vlenSq(diff);\n const maxVelocityDelta = this.maxAcceleration * deltaTime;\n const factor = lenSq * this.acceleration * this.acceleration > maxVelocityDelta * maxVelocityDelta ? maxVelocityDelta / Math.sqrt(lenSq) : this.acceleration;\n vscaleIn(diff, factor);\n vaddIn(relative, diff);\n // Transform back to world via the frame rows.\n const result = {\n x: relative.x * tangent.x + relative.y * binorm.x + relative.z * surfaceNormal.x,\n y: relative.x * tangent.y + relative.y * binorm.y + relative.z * surfaceNormal.y,\n z: relative.x * tangent.z + relative.y * binorm.z + relative.z * surfaceNormal.z,\n };\n vaddIn(result, surfaceVelocity);\n return result;\n }\n\n // ─── Manifold integration ────────────────────────────────────────\n\n private _integrateManifolds(deltaTime: number, gravity: Vec3): void {\n const epsSqrd = 1e-8;\n let newVelocity = v();\n let remainingTime = deltaTime;\n this._validateManifold();\n for (let iter = 0; iter < this.maxCastIterations && remainingTime > 1e-5; iter++) {\n this._castWithCollectors(this._position, vadd(this._position, this._lastDisplacement));\n const updateResult = this._updateManifold(this._lastDisplacement);\n const constraints = this._createConstraintsFromManifold(deltaTime, deltaTime - remainingTime);\n const maxSurfaceVelocity = v(this.maxCharacterSpeedForSolver, this.maxCharacterSpeedForSolver, this.maxCharacterSpeedForSolver);\n const minDeltaTime = vlenSq(this._velocity) === 0 ? 0 : (0.5 * this.keepDistance) / vlen(this._velocity);\n const solveResults = this._simplexSolverSolve(constraints, this._velocity, remainingTime, minDeltaTime, maxSurfaceVelocity);\n const newDisplacement = solveResults.position;\n const solverDeltaTime = solveResults.deltaTime;\n newVelocity = solveResults.velocity;\n this._resolveContacts(deltaTime, gravity);\n\n let newContactIndex = -1;\n if (updateResult !== 0 || (vlenSq(newDisplacement) > epsSqrd && !vequalsEps(this._lastDisplacement, newDisplacement, this._displacementEps))) {\n this._castWithCollectors(this._position, vadd(this._position, newDisplacement), true);\n const hknp = this._world._hknp;\n const numCastHits = hknp.HP_QueryCollector_GetNumHits(this._castCollector)[1];\n for (let i = 0; i < numCastHits; i++) {\n const [fraction, , hitWorld] = hknp.HP_QueryCollector_GetShapeCastResult(this._castCollector, i)[1];\n const newContact = this._contactFromCast(hitWorld, newDisplacement, fraction);\n if (this._findContact(newContact, this._manifold, 0.1) === -1) {\n newContactIndex = this._manifold.length;\n this._manifold.push(newContact);\n break;\n }\n }\n }\n\n if (newContactIndex >= 0) {\n const newContact = this._manifold[newContactIndex]!;\n const displacementLengthInv = 1 / vlen(newDisplacement);\n const angleBetween = vdot(newDisplacement, newContact.normal) * displacementLengthInv;\n const keepDistanceAlongMovement = this.keepDistance / -angleBetween;\n let fraction = newContact.fraction - keepDistanceAlongMovement * displacementLengthInv;\n fraction = clamp(fraction, 0, 1);\n vaddIn(this._position, vscale(newDisplacement, fraction));\n remainingTime -= solverDeltaTime * fraction;\n } else {\n vaddIn(this._position, newDisplacement);\n remainingTime -= solverDeltaTime;\n }\n vcopy(this._lastDisplacement, newDisplacement);\n }\n vcopy(this._velocity, newVelocity);\n this._node.position.set(this._position.x, this._position.y, this._position.z);\n }\n\n private _castWithCollectors(startPos: Vec3, endPos: Vec3, castOnly = false): void {\n const hknp = this._world._hknp;\n const hkWorld = this._world._hkWorld;\n const shapeHandle = this._shape._hkShape;\n const startNative = [startPos.x, startPos.y, startPos.z];\n const orientation = [this._orientation.x, this._orientation.y, this._orientation.z, this._orientation.w];\n const ignoreSelf = [this._body._hkBody[0]];\n if (!castOnly) {\n const proxQuery = [shapeHandle, startNative, orientation, this.keepDistance + this.keepContactTolerance, false, ignoreSelf];\n hknp.HP_World_ShapeProximityWithCollector(hkWorld, this._startCollector, proxQuery);\n }\n const castQuery = [shapeHandle, orientation, startNative, [endPos.x, endPos.y, endPos.z], false, ignoreSelf];\n hknp.HP_World_ShapeCastWithCollector(hkWorld, this._castCollector, castQuery);\n }\n\n private _findBody(id: unknown): PhysicsBody | null {\n const bodies = this._world._bodies;\n for (let i = 0; i < bodies.length; i++) {\n if (bodies[i]!._hkBody[0] === id) {\n return bodies[i]!;\n }\n }\n return null;\n }\n\n private _contactFromCast(cp: any, castPath: Vec3, hitFraction: number): Contact {\n const normal = v(cp[4][0], cp[4][1], cp[4][2]);\n const dist = -hitFraction * vdot(castPath, normal);\n return {\n position: v(cp[3][0], cp[3][1], cp[3][2]),\n normal,\n distance: dist,\n fraction: hitFraction,\n body: this._findBody(cp[0][0]),\n allowedPenetration: clamp(this.keepDistance - dist, 0, this.keepDistance),\n };\n }\n\n private _validateManifold(): void {\n this._manifold = this._manifold.filter((c) => c.body === null || this._world._bodies.indexOf(c.body) !== -1);\n }\n\n private _updateManifold(castPath: Vec3): number {\n const hknp = this._world._hknp;\n const numProximityHits = hknp.HP_QueryCollector_GetNumHits(this._startCollector)[1];\n if (numProximityHits > 0) {\n const newContacts: Contact[] = [];\n let minDistance = 1e38;\n for (let i = 0; i < numProximityHits; i++) {\n const [distance, , contactWorld] = hknp.HP_QueryCollector_GetShapeProximityResult(this._startCollector, i)[1];\n minDistance = Math.min(minDistance, distance);\n newContacts.push({\n position: v(contactWorld[3][0], contactWorld[3][1], contactWorld[3][2]),\n normal: v(contactWorld[4][0], contactWorld[4][1], contactWorld[4][2]),\n distance,\n fraction: 0,\n body: this._findBody(contactWorld[0][0]),\n allowedPenetration: clamp(this.keepDistance - distance, 0, this.keepDistance),\n });\n }\n for (let i = this._manifold.length - 1; i >= 0; i--) {\n const bestMatch = this._findContact(this._manifold[i]!, newContacts, 1.1);\n if (bestMatch >= 0) {\n const newAllowed = Math.min(clamp(this.keepDistance - newContacts[bestMatch]!.distance, 0, this.keepDistance), this._manifold[i]!.allowedPenetration);\n this._manifold[i] = newContacts[bestMatch]!;\n this._manifold[i]!.allowedPenetration = newAllowed;\n newContacts.splice(bestMatch, 1);\n } else {\n this._manifold.splice(i, 1);\n }\n }\n const closestContactIndex = newContacts.findIndex((c) => c.distance === minDistance);\n if (closestContactIndex >= 0) {\n const closest = newContacts[closestContactIndex]!;\n const bestMatch = this._findContact(closest, this._manifold, 0.1);\n if (bestMatch >= 0) {\n const newAllowed = Math.min(clamp(this.keepDistance - closest.distance, 0, this.keepDistance), this._manifold[bestMatch]!.allowedPenetration);\n this._manifold[bestMatch] = closest;\n this._manifold[bestMatch]!.allowedPenetration = newAllowed;\n } else {\n this._manifold.push(closest);\n }\n }\n } else {\n this._manifold.length = 0;\n }\n\n let numHitBodies = 0;\n const numCastHits = hknp.HP_QueryCollector_GetNumHits(this._castCollector)[1];\n if (numCastHits > 0) {\n let closestHitBodyId: unknown = null;\n for (let i = 0; i < numCastHits; i++) {\n const [fraction, , hitWorld] = hknp.HP_QueryCollector_GetShapeCastResult(this._castCollector, i)[1];\n if (closestHitBodyId === null) {\n const contact = this._contactFromCast(hitWorld, castPath, fraction);\n closestHitBodyId = hitWorld[0][0];\n if (this._findContact(contact, this._manifold, 0.1) === -1) {\n this._manifold.push(contact);\n }\n if (contact.body?.motionType === (PhysicsMotionType.STATIC as number) || contact.body === null) {\n break;\n }\n } else if (hitWorld[0][0] !== closestHitBodyId) {\n numHitBodies++;\n break;\n }\n }\n }\n return numHitBodies;\n }\n\n // ─── Contact comparison ──────────────────────────────────────────\n\n private _compareContacts(a: Contact, b: Contact): number {\n const angSquared = (1 - vdot(a.normal, b.normal)) * this._contactAngleSensitivity * this._contactAngleSensitivity;\n const planeDistSquared = (a.distance - b.distance) * (a.distance * b.distance);\n const aVel = this._getPointVelocity(a.body, a.position);\n const bVel = this._getPointVelocity(b.body, b.position);\n const velocityDiffSquared = vlenSq(vsub(aVel, bVel));\n return angSquared * 10 + velocityDiffSquared * 0.1 + planeDistSquared;\n }\n\n private _findContact(reference: Contact, list: Contact[], threshold: number): number {\n let bestIdx = -1;\n let bestFitness = threshold;\n for (let i = 0; i < list.length; i++) {\n const fitness = this._compareContacts(reference, list[i]!);\n if (fitness < bestFitness) {\n bestFitness = fitness;\n bestIdx = i;\n }\n }\n return bestIdx;\n }\n\n // ─── Body kinematics ─────────────────────────────────────────────\n\n private _getMassProperties(body: PhysicsBody): any {\n return this._world._hknp.HP_Body_GetMassProperties(body._hkBody)[1];\n }\n\n private _getComWorld(body: PhysicsBody): Vec3 {\n const com = this._getMassProperties(body)[0];\n return transformCoord(body.node.worldMatrix, v(com[0], com[1], com[2]));\n }\n\n private _getPointVelocity(body: PhysicsBody | null, pointWorld: Vec3): Vec3 {\n if (!body) {\n return v();\n }\n const hknp = this._world._hknp;\n const comWorld = this._getComWorld(body);\n const relPos = vsub(pointWorld, comWorld);\n const avArr = hknp.HP_Body_GetAngularVelocity(body._hkBody)[1];\n const av = v(avArr[0], avArr[1], avArr[2]);\n const lvArr = hknp.HP_Body_GetLinearVelocity(body._hkBody)[1];\n return vadd(vcross(av, relPos), v(lvArr[0], lvArr[1], lvArr[2]));\n }\n\n private _getInvMass(body: PhysicsBody): number {\n const mass = this._getMassProperties(body)[1];\n return mass > 0 ? 1 / mass : 0;\n }\n\n // ─── Surface constraints ─────────────────────────────────────────\n\n private _createSurfaceConstraint(dt: number, contact: Contact, timeTravelled: number): SurfaceConstraint {\n const constraint: SurfaceConstraint = {\n planeNormal: vclone(contact.normal),\n planeDistance: contact.distance,\n staticFriction: this.staticFriction,\n dynamicFriction: this.dynamicFriction,\n extraUpStaticFriction: 0,\n extraDownStaticFriction: 0,\n velocity: v(),\n angularVelocity: v(),\n priority: 0,\n };\n const maxSlopeCosine = Math.max(this.maxSlopeCosine, 0.1);\n const normalDotUp = vdot(contact.normal, this.up);\n if (normalDotUp > maxSlopeCosine) {\n const com = this._position;\n const contactArm = vsub(contact.position, com);\n const scale = vdot(contact.normal, contactArm);\n contact.position.x = com.x + this.up.x * scale;\n contact.position.y = com.y + this.up.y * scale;\n contact.position.z = com.z + this.up.z * scale;\n }\n const motionType = contact.body?.motionType ?? (PhysicsMotionType.STATIC as number);\n const shift = vdot(constraint.velocity, constraint.planeNormal) * timeTravelled;\n constraint.planeDistance -= shift;\n if (motionType === (PhysicsMotionType.STATIC as number)) {\n constraint.priority = 2;\n } else if (motionType === (PhysicsMotionType.ANIMATED as number) && contact.body) {\n const body = contact.body;\n const currentWorld = matToArray(body.node.worldMatrix);\n const tracking = this._bodyTracking.get(body);\n if (!tracking) {\n this._bodyTracking.set(body, { prev: currentWorld, frameId: this._frameId });\n } else {\n if (tracking.frameId + 1 === this._frameId) {\n const inv = mat4Invert(body.node.worldMatrix);\n if (inv) {\n const characterLocal = transformCoord(inv, this._position);\n const characterWorld = transformCoord(tracking.prev, characterLocal);\n const playerDelta = vsub(this._position, characterWorld);\n vcopy(constraint.velocity, playerDelta);\n vscaleIn(constraint.velocity, 1 / dt);\n constraint.priority = 1;\n }\n }\n tracking.prev = currentWorld;\n tracking.frameId = this._frameId;\n }\n }\n return constraint;\n }\n\n private _addMaxSlopePlane(maxSlopeCos: number, index: number, constraints: SurfaceConstraint[], allowedPenetration: number): void {\n const src = constraints[index]!;\n const verticalComponent = vdot(src.planeNormal, this.up);\n if (verticalComponent > 0.01 && verticalComponent < maxSlopeCos) {\n const newConstraint: SurfaceConstraint = {\n planeNormal: vclone(src.planeNormal),\n planeDistance: src.planeDistance,\n velocity: vclone(src.velocity),\n angularVelocity: vclone(src.angularVelocity),\n priority: src.priority,\n dynamicFriction: src.dynamicFriction,\n staticFriction: src.staticFriction,\n extraDownStaticFriction: src.extraDownStaticFriction,\n extraUpStaticFriction: src.extraUpStaticFriction,\n };\n const distance = newConstraint.planeDistance;\n vsubIn(newConstraint.planeNormal, vscale(this.up, verticalComponent));\n vnormIn(newConstraint.planeNormal);\n if (distance >= 0) {\n newConstraint.planeDistance = distance * vdot(newConstraint.planeNormal, src.planeNormal);\n } else {\n const penetrationToResolve = Math.min(0, distance + allowedPenetration);\n newConstraint.planeDistance = penetrationToResolve / vdot(newConstraint.planeNormal, src.planeNormal);\n src.planeDistance = 0;\n this._resolveConstraintPenetration(newConstraint);\n }\n constraints.push(newConstraint);\n }\n }\n\n private _resolveConstraintPenetration(constraint: SurfaceConstraint): void {\n if (constraint.planeDistance < -1e-6) {\n vsubIn(constraint.velocity, vscale(constraint.planeNormal, constraint.planeDistance * this.penetrationRecoverySpeed));\n }\n }\n\n private _createConstraintsFromManifold(dt: number, timeTravelled: number): SurfaceConstraint[] {\n const constraints: SurfaceConstraint[] = [];\n for (let i = 0; i < this._manifold.length; i++) {\n const surfaceConstraint = this._createSurfaceConstraint(dt, this._manifold[i]!, timeTravelled);\n constraints.push(surfaceConstraint);\n this._addMaxSlopePlane(this.maxSlopeCosine, i, constraints, this._manifold[i]!.allowedPenetration);\n this._resolveConstraintPenetration(surfaceConstraint);\n }\n return constraints;\n }\n\n // ─── Contact resolution (push dynamic bodies) ────────────────────\n\n private _resolveContacts(deltaTime: number, gravity: Vec3): void {\n const eps = 1e-12;\n const hknp = this._world._hknp;\n for (const contact of this._manifold) {\n const body = contact.body;\n if (!body || body.motionType !== (PhysicsMotionType.DYNAMIC as number)) {\n continue;\n }\n const pointRelVel = this._getPointVelocity(body, contact.position);\n vsubIn(pointRelVel, this._velocity);\n const inputProjectedVelocity = vdot(pointRelVel, contact.normal);\n let deltaVelocity = -inputProjectedVelocity * 0.9;\n if (contact.distance < 0) {\n deltaVelocity += (contact.distance * 0.4) / deltaTime;\n }\n let outputImpulse = v();\n if (deltaVelocity < 0) {\n const comWorld = this._getComWorld(body);\n const r = vsub(contact.position, comWorld);\n const jacAng = vcross(r, contact.normal);\n // Inertia is treated as isotropic for the impulse magnitude (Lite bodies use diagonal inertia).\n const inputObjectMassInv = vlenSq(jacAng) * this._getInvMass(body) + this._getInvMass(body);\n let impulseMag = inputObjectMassInv > 0 ? deltaVelocity / inputObjectMassInv : 0;\n const maxPushImpulse = -this.characterStrength * deltaTime;\n if (impulseMag < maxPushImpulse) {\n impulseMag = maxPushImpulse;\n }\n outputImpulse = vscale(contact.normal, impulseMag);\n }\n let relVelN = vdot(contact.normal, vscale(gravity, deltaTime));\n if (inputProjectedVelocity < 0) {\n relVelN -= inputProjectedVelocity;\n }\n if (relVelN < -eps) {\n vaddIn(outputImpulse, vscale(contact.normal, this.characterMass * relVelN));\n }\n this.onTriggerCollisionObservable.notify({ collider: body, impulse: outputImpulse, impulsePosition: contact.position });\n hknp.HP_Body_ApplyImpulse(body._hkBody, [contact.position.x, contact.position.y, contact.position.z], [outputImpulse.x, outputImpulse.y, outputImpulse.z]);\n }\n }\n\n // ─── Simplex velocity solver ─────────────────────────────────────\n\n private _getOutput(info: SolverInfo, constraint: SurfaceConstraint): PlaneInteraction {\n return info.outputInteractions[info.inputConstraints.indexOf(constraint)]!;\n }\n\n private _sortInfo(info: SolverInfo): void {\n for (let i = 0; i < info.numSupportPlanes - 1; i++) {\n for (let j = i + 1; j < info.numSupportPlanes; j++) {\n const p0 = info.supportPlanes[i]!;\n const p1 = info.supportPlanes[j]!;\n if (p0.constraint.priority < p1.constraint.priority) {\n continue;\n }\n if (p0.constraint.priority === p1.constraint.priority && vlenSq(p0.constraint.velocity) < vlenSq(p1.constraint.velocity)) {\n continue;\n }\n info.supportPlanes[i] = p1;\n info.supportPlanes[j] = p0;\n }\n }\n }\n\n private _solve1d(sci: SurfaceConstraint, velocityIn: Vec3, velocityOut: Vec3): void {\n const eps = 1e-5;\n const groundVelocity = sci.velocity;\n const relativeVelocity = vsub(velocityIn, groundVelocity);\n const planeVel = vdot(relativeVelocity, sci.planeNormal);\n const origVelocity2 = vlenSq(relativeVelocity);\n vsubIn(relativeVelocity, vscale(sci.planeNormal, planeVel));\n const vp2 = planeVel * planeVel;\n const extraStaticFriction = vdot(relativeVelocity, this.up) > 0 ? sci.extraUpStaticFriction : sci.extraDownStaticFriction;\n if (extraStaticFriction > 0) {\n const horizontal = vcross(this.up, sci.planeNormal);\n const hor2 = vlenSq(horizontal);\n let horVel = 0;\n if (hor2 > eps) {\n vscaleIn(horizontal, 1 / Math.sqrt(hor2));\n horVel = vdot(relativeVelocity, horizontal);\n const horVel2 = horVel * horVel;\n const f2 = sci.staticFriction * sci.staticFriction;\n if (vp2 * f2 >= horVel2) {\n vsubIn(relativeVelocity, vscale(horizontal, horVel));\n horVel = 0;\n }\n }\n const vertVel2 = origVelocity2 - horVel * horVel - vp2;\n const f2 = (sci.staticFriction + extraStaticFriction) * (sci.staticFriction + extraStaticFriction);\n if (vp2 * f2 >= vertVel2 && horVel === 0) {\n vcopy(velocityOut, groundVelocity);\n return;\n }\n } else {\n const f2 = sci.staticFriction * sci.staticFriction;\n if (vp2 * (1 + f2) >= origVelocity2) {\n vcopy(velocityOut, groundVelocity);\n return;\n }\n }\n if (sci.dynamicFriction < 1) {\n const velOut2 = vlenSq(relativeVelocity);\n if (velOut2 >= eps && velOut2 > 1e-4 * origVelocity2) {\n let f = Math.sqrt(origVelocity2 / velOut2);\n f = sci.dynamicFriction + (1 - sci.dynamicFriction) * f;\n vscaleIn(relativeVelocity, f);\n const p = vdot(sci.planeNormal, relativeVelocity);\n vsubIn(relativeVelocity, vscale(sci.planeNormal, p));\n }\n }\n vcopy(velocityOut, relativeVelocity);\n vaddIn(velocityOut, groundVelocity);\n }\n\n private _solveTest1d(sci: SurfaceConstraint, velocityIn: Vec3): boolean {\n const relativeVelocity = vsub(velocityIn, sci.velocity);\n return vdot(relativeVelocity, sci.planeNormal) < -1e-3;\n }\n\n private _solve2d(info: SolverInfo, maxSurfaceVelocity: Vec3, sci0: SurfaceConstraint, sci1: SurfaceConstraint, velocityIn: Vec3, velocityOut: Vec3): void {\n const eps = 1e-5;\n const axis = vcross(sci0.planeNormal, sci1.planeNormal);\n const axisLen2 = vlenSq(axis);\n let solveSequentially = false;\n let axisVel = v();\n\n while (true) {\n if (axisLen2 <= eps || solveSequentially) {\n this._getOutput(info, sci0).status = InteractionStatus.FAILURE_2D;\n this._getOutput(info, sci1).status = InteractionStatus.FAILURE_2D;\n if (sci0.priority > sci1.priority) {\n this._solve1d(sci1, velocityIn, velocityOut);\n this._solve1d(sci0, velocityIn, velocityOut);\n } else {\n this._solve1d(sci0, velocityIn, velocityOut);\n this._solve1d(sci1, velocityIn, velocityOut);\n }\n return;\n }\n const invAxisLen = 1 / Math.sqrt(axisLen2);\n vscaleIn(axis, invAxisLen);\n const r0 = vcross(sci0.planeNormal, sci1.planeNormal);\n const r1 = vcross(sci1.planeNormal, axis);\n const r2 = vcross(axis, sci0.planeNormal);\n const sVel = vadd(sci0.velocity, sci1.velocity);\n const t = v(0.5 * vdot(axis, sVel), vdot(sci0.planeNormal, sci0.velocity), vdot(sci1.planeNormal, sci1.velocity));\n axisVel = v(vdot(t, r0), vdot(t, r1), vdot(t, r2));\n vscaleIn(axisVel, invAxisLen);\n if (Math.abs(axisVel.x) > maxSurfaceVelocity.x || Math.abs(axisVel.y) > maxSurfaceVelocity.y || Math.abs(axisVel.z) > maxSurfaceVelocity.z) {\n solveSequentially = true;\n } else {\n break;\n }\n }\n const groundVelocity = axisVel;\n const relativeVelocity = vsub(velocityIn, groundVelocity);\n const vel2 = vlenSq(relativeVelocity);\n const axisVert = vdot(this.up, axis);\n let axisProjVelocity = vdot(relativeVelocity, axis);\n let staticFriction = sci0.staticFriction + sci1.staticFriction;\n if (axisVert * axisProjVelocity > 0) {\n staticFriction += (sci0.extraUpStaticFriction + sci1.extraUpStaticFriction) * axisVert;\n } else {\n staticFriction += (sci0.extraDownStaticFriction + sci1.extraDownStaticFriction) * axisVert;\n }\n staticFriction *= 0.5;\n const dynamicFriction = (sci0.dynamicFriction + sci1.dynamicFriction) * 0.5;\n const f2 = staticFriction * staticFriction;\n const av2 = axisProjVelocity * axisProjVelocity;\n if ((vel2 - av2) * f2 >= av2) {\n vcopy(velocityOut, groundVelocity);\n return;\n }\n if (dynamicFriction < 1 && axisProjVelocity * axisProjVelocity > 1e-4 * vel2) {\n const f = Math.abs(1 / axisProjVelocity) * Math.sqrt(vel2) * (1 - dynamicFriction) + dynamicFriction;\n axisProjVelocity *= f;\n }\n vcopy(velocityOut, groundVelocity);\n vaddIn(velocityOut, vscale(axis, axisProjVelocity));\n }\n\n private _solve3d(\n info: SolverInfo,\n maxSurfaceVelocity: Vec3,\n sci0: SurfaceConstraint,\n sci1: SurfaceConstraint,\n sci2: SurfaceConstraint,\n allowResort: boolean,\n velocityIn: Vec3,\n velocityOut: Vec3\n ): void {\n const eps = 1e-5;\n let pointVel = v();\n let r0 = vcross(sci1.planeNormal, sci2.planeNormal);\n let r1 = vcross(sci2.planeNormal, sci0.planeNormal);\n let r2 = vcross(sci0.planeNormal, sci1.planeNormal);\n let det = vdot(r0, sci0.planeNormal);\n let solveSequentially = false;\n\n while (true) {\n if (Math.abs(det) < eps || solveSequentially) {\n if (allowResort) {\n this._sortInfo(info);\n sci0 = info.supportPlanes[0]!.constraint;\n sci1 = info.supportPlanes[1]!.constraint;\n sci2 = info.supportPlanes[2]!.constraint;\n }\n this._getOutput(info, sci0).status = InteractionStatus.FAILURE_3D;\n this._getOutput(info, sci1).status = InteractionStatus.FAILURE_3D;\n this._getOutput(info, sci2).status = InteractionStatus.FAILURE_3D;\n const oldNum = info.numSupportPlanes;\n this._solve2d(info, maxSurfaceVelocity, sci0, sci1, velocityIn, velocityOut);\n if (oldNum === info.numSupportPlanes) {\n this._solve2d(info, maxSurfaceVelocity, sci0, sci2, velocityIn, velocityOut);\n }\n if (oldNum === info.numSupportPlanes) {\n this._solve2d(info, maxSurfaceVelocity, sci1, sci2, velocityIn, velocityOut);\n }\n return;\n }\n const t = v(vdot(sci0.planeNormal, sci0.velocity), vdot(sci1.planeNormal, sci1.velocity), vdot(sci2.planeNormal, sci2.velocity));\n pointVel = {\n x: t.x * r0.x + t.y * r1.x + t.z * r2.x,\n y: t.x * r0.y + t.y * r1.y + t.z * r2.y,\n z: t.x * r0.z + t.y * r1.z + t.z * r2.z,\n };\n vscaleIn(pointVel, 1 / det);\n if (Math.abs(pointVel.x) > maxSurfaceVelocity.x || Math.abs(pointVel.y) > maxSurfaceVelocity.y || Math.abs(pointVel.z) > maxSurfaceVelocity.z) {\n solveSequentially = true;\n } else {\n break;\n }\n // Recompute basis after a resort if it happens on a later pass.\n r0 = vcross(sci1.planeNormal, sci2.planeNormal);\n r1 = vcross(sci2.planeNormal, sci0.planeNormal);\n r2 = vcross(sci0.planeNormal, sci1.planeNormal);\n det = vdot(r0, sci0.planeNormal);\n }\n vcopy(velocityOut, pointVel);\n }\n\n private _examineActivePlanes(info: SolverInfo, maxSurfaceVelocity: Vec3, velocityIn: Vec3, velocityOut: Vec3): void {\n while (true) {\n switch (info.numSupportPlanes) {\n case 1: {\n this._solve1d(info.supportPlanes[0]!.constraint, velocityIn, velocityOut);\n return;\n }\n case 2: {\n const velocity = v();\n this._solve1d(info.supportPlanes[1]!.constraint, velocityIn, velocity);\n if (!this._solveTest1d(info.supportPlanes[0]!.constraint, velocity)) {\n this._copyPlane(info.supportPlanes[0]!, info.supportPlanes[1]!);\n info.numSupportPlanes = 1;\n vcopy(velocityOut, velocity);\n } else {\n this._solve2d(info, maxSurfaceVelocity, info.supportPlanes[0]!.constraint, info.supportPlanes[1]!.constraint, velocityIn, velocityOut);\n }\n return;\n }\n case 3: {\n {\n const velocity = v();\n this._solve1d(info.supportPlanes[2]!.constraint, velocityIn, velocityOut);\n if (!this._solveTest1d(info.supportPlanes[0]!.constraint, velocity) && !this._solveTest1d(info.supportPlanes[1]!.constraint, velocity)) {\n vcopy(velocityOut, velocity);\n this._copyPlane(info.supportPlanes[0]!, info.supportPlanes[2]!);\n info.numSupportPlanes = 1;\n continue;\n }\n }\n {\n let droppedAPlane = false;\n for (let testPlane = 0; testPlane < 2; testPlane++) {\n this._solve2d(info, maxSurfaceVelocity, info.supportPlanes[testPlane]!.constraint, info.supportPlanes[2]!.constraint, velocityIn, velocityOut);\n if (!this._solveTest1d(info.supportPlanes[1 - testPlane]!.constraint, velocityOut)) {\n this._copyPlane(info.supportPlanes[0]!, info.supportPlanes[testPlane]!);\n this._copyPlane(info.supportPlanes[1]!, info.supportPlanes[2]!);\n info.numSupportPlanes--;\n droppedAPlane = true;\n break;\n }\n }\n if (droppedAPlane) {\n continue;\n }\n }\n this._solve3d(\n info,\n maxSurfaceVelocity,\n info.supportPlanes[0]!.constraint,\n info.supportPlanes[1]!.constraint,\n info.supportPlanes[2]!.constraint,\n true,\n velocityIn,\n velocityOut\n );\n return;\n }\n case 4: {\n this._sortInfo(info);\n let droppedAPlane = false;\n for (let i = 0; i < 3; i++) {\n const velocity = v();\n this._solve3d(\n info,\n maxSurfaceVelocity,\n info.supportPlanes[(i + 1) % 3]!.constraint,\n info.supportPlanes[(i + 2) % 3]!.constraint,\n info.supportPlanes[3]!.constraint,\n false,\n velocityIn,\n velocity\n );\n if (!this._solveTest1d(info.supportPlanes[i]!.constraint, velocity)) {\n this._copyPlane(info.supportPlanes[i]!, info.supportPlanes[2]!);\n this._copyPlane(info.supportPlanes[2]!, info.supportPlanes[3]!);\n info.numSupportPlanes = 3;\n droppedAPlane = true;\n break;\n }\n }\n if (droppedAPlane) {\n continue;\n }\n {\n const velocity = vclone(velocityIn);\n this._solve3d(\n info,\n maxSurfaceVelocity,\n info.supportPlanes[0]!.constraint,\n info.supportPlanes[1]!.constraint,\n info.supportPlanes[2]!.constraint,\n false,\n velocity,\n velocity\n );\n vcopy(velocityOut, velocity);\n }\n {\n let maxStatus = InteractionStatus.OK;\n for (let i = 0; i < 4; i++) {\n maxStatus = Math.max(maxStatus, info.supportPlanes[i]!.interaction.status);\n }\n for (let i = 0; i < 4; i++) {\n if (maxStatus === info.supportPlanes[i]!.interaction.status) {\n this._copyPlane(info.supportPlanes[i]!, info.supportPlanes[3]!);\n break;\n }\n info.numSupportPlanes--;\n }\n }\n for (let i = 0; i < 3; i++) {\n info.supportPlanes[i]!.interaction.status = InteractionStatus.OK;\n }\n continue;\n }\n default:\n return;\n }\n }\n }\n\n private _copyPlane(dst: ActivePlane, src: ActivePlane): void {\n dst.index = src.index;\n dst.constraint = src.constraint;\n dst.interaction = src.interaction;\n }\n\n private _simplexSolverSolve(constraints: SurfaceConstraint[], velocity: Vec3, deltaTime: number, minDeltaTime: number, maxSurfaceVelocity: Vec3): SolverOutput {\n const eps = 1e-6;\n const output: SolverOutput = {\n position: v(),\n velocity: vclone(velocity),\n deltaTime,\n planeInteractions: [],\n };\n for (let i = 0; i < constraints.length; i++) {\n output.planeInteractions.push({ touched: false, stopped: false, surfaceTime: 0, penaltyDistance: 0, status: InteractionStatus.OK });\n }\n const info: SolverInfo = {\n supportPlanes: [],\n numSupportPlanes: 0,\n currentTime: 0,\n inputConstraints: constraints,\n outputInteractions: output.planeInteractions,\n };\n const emptyConstraint = (): SurfaceConstraint => ({\n planeNormal: v(),\n planeDistance: 0,\n staticFriction: 0,\n dynamicFriction: 0,\n extraUpStaticFriction: 0,\n extraDownStaticFriction: 0,\n velocity: v(),\n angularVelocity: v(),\n priority: 0,\n });\n const emptyInteraction = (): PlaneInteraction => ({ touched: false, stopped: false, surfaceTime: 0, penaltyDistance: 0, status: InteractionStatus.OK });\n for (let i = 0; i < 4; i++) {\n info.supportPlanes.push({ index: -1, constraint: emptyConstraint(), interaction: emptyInteraction() });\n }\n let remainingTime = deltaTime;\n while (remainingTime > 0) {\n let hitIndex = -1;\n let minCollisionTime = remainingTime;\n for (let i = 0; i < constraints.length; i++) {\n if (info.numSupportPlanes >= 1 && info.supportPlanes[0]!.index === i) {\n continue;\n }\n if (info.numSupportPlanes >= 2 && info.supportPlanes[1]!.index === i) {\n continue;\n }\n if (info.numSupportPlanes >= 3 && info.supportPlanes[2]!.index === i) {\n continue;\n }\n if (output.planeInteractions[i]!.status !== InteractionStatus.OK) {\n continue;\n }\n const sci = constraints[i]!;\n const relativeVel = vsub(output.velocity, sci.velocity);\n const relativeProjectedVel = -vdot(relativeVel, sci.planeNormal);\n if (relativeProjectedVel <= 0) {\n continue;\n }\n const relativePos = vsub(output.position, vscale(sci.velocity, info.currentTime));\n let projectedPos = vdot(sci.planeNormal, relativePos);\n const penaltyDist = output.planeInteractions[i]!.penaltyDistance;\n if (penaltyDist < eps) {\n projectedPos = 0;\n }\n projectedPos += penaltyDist;\n if (projectedPos < minCollisionTime * relativeProjectedVel) {\n minCollisionTime = projectedPos / relativeProjectedVel;\n hitIndex = i;\n }\n }\n if (minCollisionTime > 1e-4) {\n info.currentTime += minCollisionTime;\n remainingTime -= minCollisionTime;\n vaddIn(output.position, vscale(output.velocity, minCollisionTime));\n for (let i = 0; i < info.numSupportPlanes; i++) {\n info.supportPlanes[i]!.interaction.surfaceTime += minCollisionTime;\n info.supportPlanes[i]!.interaction.touched = true;\n }\n output.deltaTime = info.currentTime;\n if (info.currentTime > minDeltaTime) {\n return output;\n }\n }\n if (hitIndex < 0) {\n output.deltaTime = deltaTime;\n break;\n }\n const supportPlane = info.supportPlanes[info.numSupportPlanes++]!;\n supportPlane.constraint = constraints[hitIndex]!;\n supportPlane.interaction = output.planeInteractions[hitIndex]!;\n supportPlane.interaction.penaltyDistance = (supportPlane.interaction.penaltyDistance + eps) * 2;\n supportPlane.index = hitIndex;\n this._examineActivePlanes(info, maxSurfaceVelocity, velocity, output.velocity);\n }\n return output;\n }\n}\n\nconst ZERO: Vec3 = { x: 0, y: 0, z: 0 };\n\nfunction matToArray(m: Mat4): number[] {\n const out: number[] = new Array(16);\n for (let i = 0; i < 16; i++) {\n out[i] = m[i]!;\n }\n return out;\n}\n\n/**\n * Create a Havok physics character controller.\n *\n * The controller adds a kinematic capsule body to `world` and resolves collisions by sweeping\n * that capsule each step. Drive it from a per-physics-step callback (e.g. `onPhysicsAfterStep`)\n * by calling {@link PhysicsCharacterController.moveWithCollisions} with the desired displacement,\n * then read {@link PhysicsCharacterController.getPosition} to update your display mesh.\n * @param world - The physics world to add the character to.\n * @param position - Initial world-space position of the character.\n * @param options - Capsule dimensions.\n * @returns The character controller instance.\n */\nexport function createPhysicsCharacterController(world: PhysicsWorld, position: Vec3, options: PhysicsCharacterControllerOptions): PhysicsCharacterController {\n return new PhysicsCharacterController(world, position, options);\n}\n"],"names":["CharacterSupportedState","f2"],"mappings":"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"}
|
|
@@ -58,7 +58,7 @@ function _placeBody(world, body, startsAsleep) {
|
|
|
58
58
|
]);
|
|
59
59
|
body._region = region;
|
|
60
60
|
}
|
|
61
|
-
function _step(world) {
|
|
61
|
+
function _step(world, dt) {
|
|
62
62
|
const hknp = world._hknp;
|
|
63
63
|
const bodies = world._bodies;
|
|
64
64
|
const regions = world._fo.regions;
|
|
@@ -72,7 +72,7 @@ function _step(world) {
|
|
|
72
72
|
}
|
|
73
73
|
}
|
|
74
74
|
for (let i = 0; i < regions.length; i++) {
|
|
75
|
-
hknp.HP_World_Step(regions[i]._world,
|
|
75
|
+
hknp.HP_World_Step(regions[i]._world, dt);
|
|
76
76
|
}
|
|
77
77
|
for (let i = 0; i < bodies.length; i++) {
|
|
78
78
|
const b = bodies[i];
|