@forgeax/engine-physics-rapier3d 0.1.28 → 0.1.30
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/dist/__tests__/contact-observation.unit.test.d.ts +2 -0
- package/dist/__tests__/contact-observation.unit.test.d.ts.map +1 -0
- package/dist/index.d.ts +4 -4
- package/dist/index.d.ts.map +1 -1
- package/dist/index.mjs +512 -321
- package/dist/index.mjs.map +1 -1
- package/dist/rapier-physics-world-3d.d.ts +4 -2
- package/dist/rapier-physics-world-3d.d.ts.map +1 -1
- package/package.json +7 -7
- package/src/__tests__/contact-observation.unit.test.ts +113 -0
- package/src/__tests__/derived-physics.unit.test.ts +482 -1
- package/src/index.ts +4 -4
- package/src/rapier-physics-world-3d.ts +643 -384
package/dist/index.mjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/rapier-physics-world-3d.ts","../src/wasm-loader.ts"],"names":["PhysicsError"],"mappings":"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","file":"index.mjs","sourcesContent":["import { componentDefinition, Disabled, FixedTime, FixedUpdate } from '@forgeax/engine-ecs';\n// @forgeax/engine-physics-rapier3d — RapierPhysicsWorld3D class and three-phase\n// tick systems (syncBackend / stepSimulation / writeback).\n//\n// RapierPhysicsWorld3D implements the PhysicsWorld interface from\n// @forgeax/engine-physics and holds a Rapier 3D World instance as its\n// simulation backend.\n//\n// Three-phase pipeline (plan-strategy D-1):\n// 1. syncBackend: apply pending teleports, update kinematic positions.\n// 2. stepSimulation: call rapierWorld.step(eventQueue).\n// 3. writeback: read Rapier body positions (dynamic only).\n//\n// Entity-to-body mapping (plan-strategy D-7): Rapier RigidBody.userData holds\n// the ECS entity raw value for reverse lookup in collision events.\n//\n// Despawn cleanup (plan-strategy D-5): removeEntity() removes the Rapier body\n// and colliders from the physics world.\n\nimport type { Component, EntityHandle, Query, SystemHandle, World } from '@forgeax/engine-ecs';\nimport { defineSystem } from '@forgeax/engine-ecs';\nimport { componentId } from '@forgeax/engine-ecs/internal';\nimport { readStructuralEvidence } from '@forgeax/engine-ecs/projection';\nimport { mat4, quat, type Vec3, vec3 } from '@forgeax/engine-math';\nimport {\n CharacterController,\n Collider,\n CollidingEntities,\n cloneDerivedPhysicsInput,\n colliderShapeFromF32,\n DERIVED_PHYSICS_LIMITS,\n type DerivedPhysicsCandidate,\n type DerivedPhysicsCandidateInput,\n type DerivedPhysicsCandidateState,\n DerivedPhysicsError,\n type DerivedPhysicsFailure,\n type DerivedPhysicsMotion,\n type DerivedPhysicsPublication,\n type DerivedPhysicsSnapshot,\n type DerivedShapeSeamInput,\n type DerivedShapeState,\n estimateDerivedPhysicsInputBytes,\n PHYSICS_ERROR_HINTS,\n type PhysicsConstraintInput,\n type PhysicsContactObservation,\n PhysicsError,\n type PhysicsMassProperties,\n type PhysicsQuaternion,\n PhysicsSet,\n type PhysicsVector,\n type PhysicsWorld,\n preserveCenterOfMassVelocity,\n type RaycastHit,\n RIGID_BODY_TYPE_STATIC,\n RigidBody,\n registerPhysicsComponents,\n rigidBodyTypeFromF32,\n type VoxelShapeInput,\n validateMassProperties,\n} from '@forgeax/engine-physics';\nimport { ChildOf } from '@forgeax/engine-scene';\nimport { err, ok, type Result } from '@forgeax/engine-types';\nimport type { Rapier3DModule } from './wasm-loader';\n\ninterface Rapier3DKinematicControllerState {\n readonly entity: number;\n readonly offset: number;\n}\n\n/**\n * Per-entity physics record — tracks the Rapier body handle for\n * each ECS entity.\n */\ninterface PhysicsEntityRecord {\n bodyHandle: number;\n /** Authored additional mass used to restore automatic derived policy. */\n additionalMass: number;\n /** Additional mass currently applied to Rapier's automatic mass policy. */\n automaticAdditionalMass: number;\n /** Base collider density before an explicit derived mass override. */\n authoredDensity: number | undefined;\n}\n\ninterface PhysicsTransform3D {\n readonly position: { readonly x: number; readonly y: number; readonly z: number };\n readonly rotation: {\n readonly x: number;\n readonly y: number;\n readonly z: number;\n readonly w: number;\n };\n readonly scale: { readonly x: number; readonly y: number; readonly z: number };\n}\n\ninterface PhysicsCollider3D {\n readonly shape: number;\n readonly halfExtents: readonly [number, number, number];\n readonly radius: number;\n readonly halfHeight: number;\n readonly friction: number;\n readonly restitution: number;\n readonly density: number;\n readonly isSensor: number;\n readonly collisionGroups: number;\n readonly solverGroups: number;\n}\n\ninterface PhysicsSyncQueryRow {\n readonly entity: EntityHandle;\n has(component: Component): boolean;\n get(component: Component): Record<string, unknown> | undefined;\n}\n\ninterface PhysicsSyncQuery extends Iterable<PhysicsSyncQueryRow> {\n at(entity: EntityHandle): PhysicsSyncQueryRow | undefined;\n}\n\ninterface PhysicsSyncState {\n readonly world: World;\n readonly transformComponent: Component;\n readonly globalTransformComponent: Component;\n readonly queries: readonly PhysicsSyncQuery[];\n readonly changeQueries: readonly PhysicsChangeQuery[];\n structuralCursor: number;\n structureEpoch: number;\n initialized: boolean;\n}\n\ninterface PhysicsChangeQuery {\n readonly component: Component;\n readonly query: Query;\n}\n\ninterface PhysicsSyncDescriptor {\n readonly entity: EntityHandle;\n readonly transform: PhysicsTransform3D;\n readonly rigidBody: {\n readonly type: number;\n readonly mass: number;\n readonly linearDamping: number;\n readonly angularDamping: number;\n readonly gravityScale: number;\n readonly ccdEnabled: number;\n };\n readonly collider: PhysicsCollider3D | undefined;\n readonly hasCharacterController: boolean;\n readonly characterControllerOffset: number | undefined;\n}\n\ninterface PhysicsEntityDelta {\n transformChanged: boolean;\n colliderChanged: boolean;\n rigidBodyChanged: boolean;\n characterControllerChanged: boolean;\n characterControllerStructureChanged: boolean;\n}\n\nfunction createPhysicsChangeQueries(\n world: World,\n components: readonly Component[],\n): readonly PhysicsChangeQuery[] {\n return components.map((component) => {\n const result = world.query({ changed: [component] });\n if (!result.ok) throw result.error;\n return { component, query: result.value };\n });\n}\n\nfunction drainPhysicsChangeQueries(queries: readonly PhysicsChangeQuery[]): void {\n for (const entry of queries) {\n for (const _span of entry.query.spans().unwrap()) {\n // Advance the persistent Query's observation epoch after reconciliation.\n }\n }\n}\n\nfunction ensurePhysicsDelta(\n deltas: Map<EntityHandle, PhysicsEntityDelta>,\n entity: EntityHandle,\n): PhysicsEntityDelta {\n let delta = deltas.get(entity);\n if (delta === undefined) {\n delta = {\n transformChanged: false,\n colliderChanged: false,\n rigidBodyChanged: false,\n characterControllerChanged: false,\n characterControllerStructureChanged: false,\n };\n deltas.set(entity, delta);\n }\n return delta;\n}\n\nexport interface Rapier3DCollisionEvent {\n readonly type: 'started' | 'stopped';\n readonly entityA: number;\n readonly entityB: number;\n readonly fixedStep?: number;\n readonly shapeA?: string;\n readonly shapeB?: string;\n}\n\ninterface DerivedShapeRecord {\n readonly input: VoxelShapeInput & {\n readonly cells: Int32Array;\n readonly origin: PhysicsVector;\n readonly rotation: PhysicsQuaternion;\n };\n readonly colliderHandle: number;\n}\n\ninterface DerivedBodyRecord {\n readonly entity: number;\n readonly sourceKey: string;\n readonly generation: number;\n readonly revision: number;\n readonly bodyType: 'static' | 'dynamic' | 'kinematic' | undefined;\n readonly velocityPolicy: 'preserve' | 'reset' | undefined;\n readonly candidateId: string;\n readonly shapes: readonly DerivedShapeRecord[];\n readonly seams: readonly DerivedShapeSeamInput[];\n readonly massProperties: PhysicsMassProperties | undefined;\n readonly constraints: readonly PhysicsConstraintInput[];\n}\n\ninterface DerivedCandidateRecord {\n token: DerivedPhysicsCandidate;\n readonly nativeColliders: readonly { readonly handle: number }[];\n readonly input: DerivedPhysicsCandidateInput;\n readonly bytes: number;\n state: DerivedPhysicsCandidateState;\n commitGeometry?: () => Result<void, Error>;\n}\n\ninterface DerivedConstraintRecord {\n readonly input: PhysicsConstraintInput;\n readonly handle: number;\n}\n\ninterface DerivedBodySource {\n readonly sourceKey: string;\n readonly revision: number;\n}\n\n// biome-ignore lint/suspicious/noExplicitAny: Rapier types from dynamically loaded module\ntype RapierWorld = any;\n// biome-ignore lint/suspicious/noExplicitAny: Rapier types from dynamically loaded module\ntype RapierEventQueue = any;\n// biome-ignore lint/suspicious/noExplicitAny: Rapier types from dynamically loaded module\ntype RapierRigidBody = any;\n\n/** CharacterController tuning fields read per moveAndSlide call (degrees + world units). */\ninterface CharacterControllerTuning {\n offset: number;\n maxSlopeClimbDeg: number;\n minSlopeSlideDeg: number;\n autoStepMaxHeight: number;\n autoStepMinWidth: number;\n snapToGroundDist: number;\n}\n\nconst DEG_TO_RAD = Math.PI / 180;\n\n/**\n * Re-apply all KCC setters from the component tuning every call (plan-strategy\n * D-7: full reset, no dirty tracking). Degrees -> radians for the two slope\n * setters; offset / autostep / snap pass through as world units. A zero value\n * for auto-step / snap calls `disable*()` rather than `enable*(0)`.\n */\n// biome-ignore lint/suspicious/noExplicitAny: Rapier KinematicCharacterController from dynamic module\nfunction applyKccTuning(ctrl: any, cc: CharacterControllerTuning): void {\n ctrl.setMaxSlopeClimbAngle(cc.maxSlopeClimbDeg * DEG_TO_RAD);\n ctrl.setMinSlopeSlideAngle(cc.minSlopeSlideDeg * DEG_TO_RAD);\n ctrl.setSlideEnabled(true);\n if (cc.autoStepMaxHeight === 0) {\n ctrl.disableAutostep();\n } else {\n ctrl.enableAutostep(cc.autoStepMaxHeight, cc.autoStepMinWidth, false); // D-7: includeDynamicBodies=false\n }\n if (cc.snapToGroundDist === 0) {\n ctrl.disableSnapToGround();\n } else {\n ctrl.enableSnapToGround(cc.snapToGroundDist);\n }\n}\n\n/**\n * Map a Rapier RigidBodyType enum value to the engine's string union for the\n * `controller-requires-kinematic` error detail.\n */\nfunction rapierBodyTypeToString(\n rapier: { readonly RigidBodyType: { readonly Dynamic: number; readonly Fixed: number } },\n bodyType: number,\n): 'static' | 'dynamic' | 'kinematic' {\n if (bodyType === rapier.RigidBodyType.Dynamic) return 'dynamic';\n if (bodyType === rapier.RigidBodyType.Fixed) return 'static';\n return 'kinematic';\n}\n\nfunction validateConstraintInput(\n input: PhysicsConstraintInput,\n): Result<PhysicsConstraintInput, DerivedPhysicsError> {\n const finiteVector = (value: readonly number[]): boolean =>\n value.length === 3 && value.every(Number.isFinite);\n if (\n typeof input.id !== 'string' ||\n input.id.trim().length === 0 ||\n !Number.isInteger(input.revision) ||\n input.revision < 0 ||\n !Number.isInteger(input.bodyA) ||\n !Number.isInteger(input.bodyB) ||\n input.bodyA === input.bodyB ||\n !finiteVector(input.anchorA) ||\n !finiteVector(input.anchorB)\n ) {\n return err(\n new DerivedPhysicsError(\n 'derived-constraint-invalid',\n 'constraint identity, revision, endpoint bodies, and anchors are valid',\n 'supply two distinct live bodies and finite local anchors',\n { constraintId: input.id },\n ),\n );\n }\n if (input.kind === 'spring') {\n if (\n !Number.isFinite(input.restLength) ||\n input.restLength < 0 ||\n !Number.isFinite(input.stiffness) ||\n input.stiffness < 0 ||\n !Number.isFinite(input.damping) ||\n input.damping < 0\n ) {\n return err(\n new DerivedPhysicsError(\n 'derived-constraint-invalid',\n 'spring rest length, stiffness, and damping are finite and non-negative',\n 'repair spring tuning before native creation',\n { constraintId: input.id },\n ),\n );\n }\n } else if (\n !finiteVector(input.axis) ||\n Math.hypot(input.axis[0], input.axis[1], input.axis[2]) < 1e-6 ||\n (input.limits !== undefined &&\n (!Number.isFinite(input.limits[0]) ||\n !Number.isFinite(input.limits[1]) ||\n input.limits[0] > input.limits[1]))\n ) {\n return err(\n new DerivedPhysicsError(\n 'derived-constraint-invalid',\n 'hinge axis is non-zero and optional limits are ordered finite values',\n 'normalize the hinge axis and set minLimit <= maxLimit',\n { constraintId: input.id },\n ),\n );\n }\n return ok(input);\n}\n\n/**\n * RapierPhysicsWorld3D — Rapier 3D WASM backend implementing the PhysicsWorld\n * interface.\n */\nexport class RapierPhysicsWorld3D implements PhysicsWorld {\n /** Rapier 3D World instance owning all bodies, colliders, and pipeline. */\n raw: RapierWorld;\n\n private readonly rapierModule: Rapier3DModule;\n\n /** Entity (raw number) -> PhysicsEntityRecord mapping. */\n private readonly entityMap = new Map<number, PhysicsEntityRecord>();\n\n /** Pending teleports: entity -> target position, applied on next sync. */\n private readonly pendingTeleports = new Map<number, { x: number; y: number; z: number }>();\n\n /** Event queue for collision events. */\n private eventQueue: RapierEventQueue;\n\n /**\n * Active overlap set per entity, maintained by draining the event queue each\n * step. `started` events add the pair both ways; `stopped` events remove it.\n * Read out into each entity's `CollidingEntities` component by\n * `writebackCollidingEntities`. Covers both solid contacts and sensor\n * intersections (Rapier emits CollisionEvent for both).\n */\n private readonly collisionPairs = new Map<number, Set<number>>();\n\n private readonly pendingCollisionEvents: Rapier3DCollisionEvent[] = [];\n\n private readonly collisionEventHistory: Rapier3DCollisionEvent[] = [];\n\n /** One backend owns every derived shape; these maps are not a second world. */\n private readonly derivedBodies = new Map<number, DerivedBodyRecord>();\n private readonly derivedCandidates = new Map<string, DerivedCandidateRecord>();\n private readonly pendingDerivedCandidates = new Set<string>();\n private readonly retiredDerivedBodies: DerivedBodyRecord[] = [];\n private readonly derivedColliderToShape = new Map<number, { entity: number; id: string }>();\n private readonly derivedConstraints = new Map<string, DerivedConstraintRecord>();\n private readonly derivedBodySources = new Map<number, DerivedBodySource>();\n private readonly derivedPublications = new Map<number, DerivedPhysicsPublication>();\n private readonly derivedFailures = new Map<number, DerivedPhysicsFailure>();\n private readonly derivedContacts: PhysicsContactObservation[] = [];\n private readonly derivedPoisonedEntities = new Set<number>();\n private readonly physicsOwner = {};\n private candidateSequence = 0;\n private derivedCandidateBytes = 0;\n private backendGeneration = 1;\n private fixedStep = 0;\n private derivedPublicationPending = false;\n private worldIdentity: object | undefined;\n private activeDerivedAdmission: DerivedCandidateRecord | undefined;\n\n private currentGravity: { x: number; y: number; z: number };\n\n /**\n * Lazily-built Rapier KinematicCharacterController per character entity\n * (plan-strategy D-1/D-3). `moveAndSlide` creates one on first call; the\n * `Collider.onRemove` hook (registerPhysicsSystems) clears it on despawn.\n * Public so AC-11 despawn tests can assert `kccCache.size === 0`.\n */\n // biome-ignore lint/suspicious/noExplicitAny: Rapier KinematicCharacterController from dynamic module\n readonly kccCache = new Map<number, any>();\n\n private readonly kccOffsets = new Map<number, number>();\n\n /**\n * ECS World + components wired in by `registerPhysicsSystems`, so\n * `moveAndSlide` can read CharacterController tuning and write Transform +\n * grounded back. Undefined until systems are registered — the input-validation\n * error paths (body / collider) fire before these are read, so direct\n * `pw.moveAndSlide()` calls in error tests need no World.\n */\n private moveContext:\n | { world: World; transform: Component; characterController: Component }\n | undefined;\n\n /** Persistent ECS query + projection cursor for incremental backend sync. */\n private syncState: PhysicsSyncState | undefined;\n\n private disposed = false;\n\n constructor(rapier: Rapier3DModule) {\n this.rapierModule = rapier;\n // biome-ignore lint/suspicious/noExplicitAny: Rapier World constructor is a class exported from a namespace module\n this.raw = new (rapier as any).World({ x: 0, y: -9.81, z: 0 }) as RapierWorld;\n // biome-ignore lint/suspicious/noExplicitAny: Rapier EventQueue constructor comes from a namespace module\n this.eventQueue = new (rapier as any).EventQueue(true) as RapierEventQueue;\n this.currentGravity = { x: 0, y: -9.81, z: 0 };\n }\n\n // ─── PhysicsWorld interface ────────────────────────────────────────────\n\n setGravity(gravity: Vec3): void {\n this.assertActive('setGravity');\n const x = gravity[0] ?? 0;\n const y = gravity[1] ?? 0;\n const z = gravity[2] ?? 0;\n this.raw.gravity = { x, y, z };\n this.currentGravity = { x, y, z };\n }\n\n getGravity(): Vec3 {\n const { x, y, z } = this.currentGravity;\n return vec3.create(x, y, z);\n }\n\n raycast(\n origin: Vec3,\n direction: Vec3,\n maxDist: number,\n filterMask?: number,\n ): RaycastHit | undefined {\n this.assertActive('raycast');\n if (this.recoveryBlocked()) {\n throw new DerivedPhysicsError(\n 'derived-recovery-invalid',\n 'raycasts observe a complete healthy physics state',\n 'rebuild the PhysicsWorld before querying after an unrecoverable admission',\n {},\n );\n }\n const RAPIER = this.rapierModule;\n // biome-ignore lint/suspicious/noExplicitAny: Rapier Ray constructor comes from a namespace module\n const RayCtor = (RAPIER as any).Ray as new (\n origin: { x: number; y: number; z: number },\n dir: { x: number; y: number; z: number },\n ) => { pointAt(t: number): { x: number; y: number; z: number } };\n const ray = new RayCtor(\n { x: origin[0] ?? 0, y: origin[1] ?? 0, z: origin[2] ?? 0 },\n { x: direction[0] ?? 0, y: direction[1] ?? 0, z: direction[2] ?? 0 },\n );\n // biome-ignore lint/suspicious/noExplicitAny: Rapier World castRayAndGetNormal\n const hit = (this.raw as any).castRayAndGetNormal(\n ray,\n maxDist,\n true,\n undefined,\n filterMask,\n ) as {\n collider: { parent(): { userData: number } | null };\n timeOfImpact: number;\n normal: { x: number; y: number; z: number };\n } | null;\n\n if (hit === null) return undefined;\n\n const point = ray.pointAt(hit.timeOfImpact);\n // `hit.collider.parent()` already returns the owning RigidBody OBJECT (compat\n // build), whose userData holds the ECS entity — read it directly, mirroring\n // `colliderHandleToEntity` (the proven CollidingEntities path). The prior code\n // treated the object as a body HANDLE and re-resolved it via `bodies.get(...)`,\n // which returned a DIFFERENT body → raycast reported the wrong entity.\n const colliderParentBody = hit.collider.parent();\n const entity = colliderParentBody !== null ? colliderParentBody.userData : 0;\n\n return {\n entity,\n point: vec3.create(point.x, point.y, point.z),\n normal: vec3.create(hit.normal.x, hit.normal.y, hit.normal.z),\n timeOfImpact: hit.timeOfImpact,\n };\n }\n\n teleport(entity: number, position: Vec3): void {\n this.assertActive('teleport');\n this.pendingTeleports.set(entity, {\n x: position[0] ?? 0,\n y: position[1] ?? 0,\n z: position[2] ?? 0,\n });\n }\n\n step(deltaTime: number): void {\n this.assertActive('step');\n void deltaTime;\n try {\n this.processDerivedCandidates();\n // A failed native rollback is an explicit rebuild boundary. Physics does\n // not advance or publish a mixed state after this point.\n if (this.derivedPoisonedEntities.size > 0) return;\n // biome-ignore lint/suspicious/noExplicitAny: Rapier World.step\n (this.raw as any).step(this.eventQueue);\n this.fixedStep = this.syncState?.world.getResource(FixedTime).tick ?? this.fixedStep + 1;\n this.drainRapierCollisionEvents();\n this.derivedPublicationPending = true;\n // Direct PhysicsWorld consumers do not have ECS writeback systems. Keep\n // that public path useful while ECS-bound worlds finalize after writeback\n // and collision component synchronization below.\n if (this.syncState === undefined) this.finalizeDerivedFixedStep();\n } catch (cause) {\n // A native step or contact drain may have advanced before throwing.\n // Geometry may already be committed; neither domain can claim LKG.\n const error = new DerivedPhysicsError(\n 'derived-backend-failed',\n 'native fixed-step execution and publication complete together',\n 'rebuild the World and PhysicsWorld from the last committed snapshot',\n { reason: cause instanceof Error ? cause.message : String(cause) },\n );\n for (const entity of this.entityMap.keys()) this.derivedPoisonedEntities.add(entity);\n this.derivedPublicationPending = false;\n this.derivedPublications.clear();\n for (const record of this.derivedCandidates.values()) {\n this.rememberDerivedFailure(record, error, 'rebuild-required');\n }\n throw error;\n }\n }\n\n /** Publish only after the fixed-step ECS writeback/contact boundary. */\n finalizeDerivedFixedStep(): void {\n if (!this.derivedPublicationPending) return;\n this.derivedPublicationPending = false;\n if (this.derivedPoisonedEntities.size > 0) return;\n this.publishDerivedCandidates();\n this.retireDerivedBodies();\n }\n\n /**\n * Drain the Rapier event queue into `collisionPairs`. Each event names two\n * collider handles + a `started` flag; we resolve each collider to its owning\n * entity (collider.parent() -> body.userData) and add/remove the symmetric\n * pair. This is what populates `CollidingEntities` for sensor pickup + contact\n * queries (the queue is otherwise drained-on-overflow and never observed).\n */\n private drainRapierCollisionEvents(): void {\n this.eventQueue.drainCollisionEvents((handle1: number, handle2: number, started: boolean) => {\n const a = this.colliderHandleToEntity(handle1);\n const b = this.colliderHandleToEntity(handle2);\n if (a === undefined || b === undefined) return;\n const shapeA = this.derivedColliderToShape.get(handle1);\n const shapeB = this.derivedColliderToShape.get(handle2);\n this.recordContactObservation(\n {\n phase: started ? 'started' : 'stopped',\n fixedStep: this.fixedStep,\n entityA: a,\n entityB: b,\n ...(shapeA === undefined ? {} : { shapeA: shapeA.id }),\n ...(shapeB === undefined ? {} : { shapeB: shapeB.id }),\n },\n handle1,\n handle2,\n );\n const changed = started ? this.addPair(a, b) : this.removePair(a, b);\n if (!changed) return;\n this.pushCollisionEvent({\n type: started ? 'started' : 'stopped',\n entityA: a,\n entityB: b,\n fixedStep: this.fixedStep,\n ...(shapeA === undefined ? {} : { shapeA: shapeA.id }),\n ...(shapeB === undefined ? {} : { shapeB: shapeB.id }),\n });\n });\n }\n\n private recordContactObservation(\n observation: PhysicsContactObservation,\n handleA: number,\n handleB: number,\n ): void {\n let point: PhysicsVector | undefined;\n let normal: PhysicsVector | undefined;\n try {\n const colliderA = (this.raw as RapierWorld).getCollider(handleA);\n const colliderB = (this.raw as RapierWorld).getCollider(handleB);\n if (colliderA !== null && colliderB !== null) {\n (this.raw as RapierWorld).contactPair(\n colliderA,\n colliderB,\n (manifold: RapierWorld, flipped: boolean) => {\n if (manifold.numSolverContacts?.() > 0) {\n const contact = manifold.solverContactPoint(0);\n const n = manifold.normal();\n if (contact !== null && contact !== undefined) {\n point = [contact.x, contact.y, contact.z];\n }\n if (n !== null && n !== undefined) {\n const direction = flipped ? -1 : 1;\n normal = [n.x * direction, n.y * direction, n.z * direction];\n }\n }\n },\n );\n }\n } catch {\n // Contact events remain useful without optional manifold sampling. The\n // public type makes point/normal optional rather than inventing values.\n }\n this.derivedContacts.push({\n ...observation,\n ...(point === undefined ? {} : { point }),\n ...(normal === undefined ? {} : { normal }),\n });\n if (this.derivedContacts.length > 256)\n this.derivedContacts.splice(0, this.derivedContacts.length - 256);\n }\n\n /** Resolve a Rapier collider handle to its owning ECS entity, or undefined. */\n private colliderHandleToEntity(colliderHandle: number): number | undefined {\n // getCollider(handle).parent() returns the owning RigidBody (compat build),\n // whose userData holds the ECS entity raw value (set in ensureBody).\n // biome-ignore lint/suspicious/noExplicitAny: Rapier World.getCollider from dynamic module\n const collider = (this.raw as any).getCollider(colliderHandle) as {\n parent(): { userData: number } | null;\n } | null;\n if (collider === null || collider === undefined) return undefined;\n const body = collider.parent();\n if (body === null || body === undefined) return undefined;\n return body.userData;\n }\n\n private addPair(a: number, b: number): boolean {\n let setA = this.collisionPairs.get(a);\n if (!setA) {\n setA = new Set<number>();\n this.collisionPairs.set(a, setA);\n }\n if (setA.has(b)) return false;\n setA.add(b);\n let setB = this.collisionPairs.get(b);\n if (!setB) {\n setB = new Set<number>();\n this.collisionPairs.set(b, setB);\n }\n setB.add(a);\n return true;\n }\n\n private removePair(a: number, b: number): boolean {\n const removedA = this.collisionPairs.get(a)?.delete(b) ?? false;\n const removedB = this.collisionPairs.get(b)?.delete(a) ?? false;\n return removedA || removedB;\n }\n\n private pushCollisionEvent(event: Rapier3DCollisionEvent): void {\n const ordered =\n event.entityA <= event.entityB\n ? event\n : {\n type: event.type,\n entityA: event.entityB,\n entityB: event.entityA,\n ...(event.fixedStep === undefined ? {} : { fixedStep: event.fixedStep }),\n ...(event.shapeB === undefined ? {} : { shapeA: event.shapeB }),\n ...(event.shapeA === undefined ? {} : { shapeB: event.shapeA }),\n };\n this.pendingCollisionEvents.push(ordered);\n this.collisionEventHistory.push(ordered);\n }\n\n /**\n * Write the current overlap set into each entity's `CollidingEntities`\n * component (entities that carry it). Called by the PhysicsCollisionSync\n * system after writeback. Entities with no current overlaps get an empty set,\n * so a Core that the player has left clears correctly. Only entities that own\n * a CollidingEntities component are written (others are skipped).\n */\n writebackCollidingEntities(world: World, collidingComponent: Component): void {\n for (const [entity, others] of this.collisionPairs) {\n const handle = entity as EntityHandle;\n if (!world.get(handle, collidingComponent).ok) continue;\n world.set(handle, collidingComponent, { entities: [...others] });\n }\n }\n\n drainCollisionEvents(): Rapier3DCollisionEvent[] {\n return this.pendingCollisionEvents.splice(0);\n }\n\n getCollisionPairs(): Map<number, Set<number>> {\n return new Map([...this.collisionPairs].map(([entity, others]) => [entity, new Set(others)]));\n }\n\n getCollisionEventHistory(): readonly Rapier3DCollisionEvent[] {\n return [...this.collisionEventHistory];\n }\n\n /** Detached fixed-step contact facts; no Rapier manifolds or handles escape. */\n getContactObservations(): readonly PhysicsContactObservation[] {\n if (this.recoveryBlocked()) return [];\n return this.derivedContacts.map((contact) => ({\n ...contact,\n ...(contact.point === undefined ? {} : { point: [...contact.point] as PhysicsVector }),\n ...(contact.normal === undefined ? {} : { normal: [...contact.normal] as PhysicsVector }),\n }));\n }\n\n /** Prepare disabled native Voxels for one entity without changing queries. */\n prepareDerivedShapeCandidate(\n input: DerivedPhysicsCandidateInput,\n ): ReturnType<NonNullable<PhysicsWorld['prepareDerivedShapeCandidate']>> {\n this.assertActive('prepareDerivedShapeCandidate');\n if (input.worldIdentity !== undefined && input.worldIdentity !== this.worldIdentity) {\n return err(\n new DerivedPhysicsError(\n 'derived-world-mismatch',\n 'candidate belongs to the ECS World bound to this PhysicsWorld',\n 'submit the candidate to the PhysicsWorld that owns its entity',\n { entity: input.entity },\n ),\n );\n }\n if (!this.entityMap.has(input.entity)) {\n return err(\n new DerivedPhysicsError(\n 'derived-body-not-found',\n 'candidate entity has a committed body in this PhysicsWorld',\n 'wait for physics reconciliation before preparing derived shapes',\n { entity: input.entity },\n ),\n );\n }\n if (this.derivedPoisonedEntities.has(input.entity)) {\n return err(\n new DerivedPhysicsError(\n 'derived-recovery-invalid',\n 'the entity has a recoverable committed native PhysicsWorld state',\n 'rebuild the PhysicsWorld from the last portable snapshot before retrying',\n { entity: input.entity },\n ),\n );\n }\n const active = this.derivedBodies.get(input.entity);\n if (active !== undefined && input.revision <= active.revision) {\n return err(\n new DerivedPhysicsError(\n 'derived-candidate-stale',\n 'candidate revision is newer than the committed derived shape revision',\n 'read the latest publication and advance the consumer revision',\n { entity: input.entity, actual: input.revision, expected: `>${active.revision}` },\n ),\n );\n }\n for (const pendingId of this.pendingDerivedCandidates) {\n const pending = this.derivedCandidates.get(pendingId);\n if (pending?.input.entity === input.entity) {\n return err(\n new DerivedPhysicsError(\n 'derived-candidate-pending',\n 'one body has at most one queued derived-shape candidate',\n 'cancel or let the current candidate publish before preparing another',\n { entity: input.entity, candidateId: pendingId },\n ),\n );\n }\n }\n const copied = cloneDerivedPhysicsInput(input);\n if (!copied.ok) return copied;\n const mass = validateMassProperties(copied.value.massProperties);\n if (!mass.ok) return mass;\n const body = this.bodyForEntity(input.entity);\n if (body === undefined) {\n return err(\n new DerivedPhysicsError(\n 'derived-body-not-found',\n 'candidate entity resolves to a live native body',\n 'wait for the next ECS physics sync',\n { entity: input.entity },\n ),\n );\n }\n if (this.derivedCandidates.size >= DERIVED_PHYSICS_LIMITS.maxCandidates) {\n return err(\n new DerivedPhysicsError(\n 'derived-candidate-budget-exceeded',\n `this PhysicsWorld keeps at most ${DERIVED_PHYSICS_LIMITS.maxCandidates} candidates`,\n 'cancel or publish an existing candidate before preparing another',\n { entity: input.entity, actual: this.derivedCandidates.size },\n ),\n );\n }\n const candidateInput = Object.freeze({\n ...copied.value,\n ...(mass.value === undefined ? {} : { massProperties: mass.value }),\n });\n // Keep the public token's copied POD separate from the private record. A\n // readonly typed-array field is still writable at runtime; admission must\n // never consume caller mutations made after prepare() returned.\n const privateInput = cloneDerivedPhysicsInput(candidateInput);\n if (!privateInput.ok) return privateInput;\n const publicInput = cloneDerivedPhysicsInput(privateInput.value);\n if (!publicInput.ok) return publicInput;\n const nativeColliders: { handle: number }[] = [];\n try {\n for (const shape of privateInput.value.shapes) {\n const collider = this.createDerivedCollider(body, shape);\n nativeColliders.push({ handle: collider.handle });\n }\n } catch (cause) {\n for (const collider of nativeColliders) this.removeNativeCollider(collider.handle);\n return err(\n new DerivedPhysicsError(\n 'derived-backend-failed',\n 'Rapier can create every candidate voxel collider while it remains disabled',\n 'reduce the candidate or rebuild the PhysicsWorld after a native failure',\n { entity: input.entity, reason: cause instanceof Error ? cause.message : String(cause) },\n ),\n );\n }\n const candidateBytes = estimateDerivedPhysicsInputBytes(privateInput.value);\n if (this.derivedCandidateBytes + candidateBytes > DERIVED_PHYSICS_LIMITS.maxCandidateBytes) {\n for (const collider of nativeColliders) this.removeNativeCollider(collider.handle);\n return err(\n new DerivedPhysicsError(\n 'derived-candidate-budget-exceeded',\n `staged candidate bytes remain within ${DERIVED_PHYSICS_LIMITS.maxCandidateBytes}`,\n 'cancel or retire an in-flight candidate before retrying',\n { entity: input.entity, actual: this.derivedCandidateBytes + candidateBytes },\n ),\n );\n }\n const candidateId = `derived:${this.backendGeneration}:${input.entity}:${++this.candidateSequence}:${input.revision}`;\n const token: DerivedPhysicsCandidate = Object.freeze({\n candidateId,\n generation: this.backendGeneration,\n owner: this.physicsOwner,\n input: publicInput.value,\n state: 'ready',\n });\n this.derivedCandidates.set(candidateId, {\n token,\n nativeColliders,\n input: privateInput.value,\n bytes: candidateBytes,\n state: 'ready',\n });\n this.derivedCandidateBytes += candidateBytes;\n return ok(token);\n }\n\n /** Queue a prepared candidate for the next call to `step()`. */\n admitDerivedShapeCandidate(\n candidate: DerivedPhysicsCandidate,\n commitGeometry?: () => Result<void, Error>,\n ): ReturnType<NonNullable<PhysicsWorld['admitDerivedShapeCandidate']>> {\n const admitted = this.admitDerivedShapeCandidateInternal(candidate);\n if (admitted.ok && commitGeometry !== undefined) {\n const record = this.derivedCandidates.get(candidate.candidateId);\n if (record !== undefined) record.commitGeometry = commitGeometry;\n }\n return admitted;\n }\n\n getDerivedAdmission(\n entity?: number,\n ):\n | { readonly entity: number; readonly revision: number; readonly fixedStep: number }\n | undefined {\n const record = this.activeDerivedAdmission;\n if (record === undefined || (entity !== undefined && record.input.entity !== entity))\n return undefined;\n return {\n entity: record.input.entity,\n revision: record.input.revision,\n fixedStep: this.syncState?.world.getResource(FixedTime).tick ?? this.fixedStep + 1,\n };\n }\n\n private admitDerivedShapeCandidateInternal(\n candidate: DerivedPhysicsCandidate,\n sourceOverrides?: ReadonlyMap<number, DerivedBodySource>,\n ): ReturnType<NonNullable<PhysicsWorld['admitDerivedShapeCandidate']>> {\n this.assertActive('admitDerivedShapeCandidate');\n const record = this.derivedCandidates.get(candidate.candidateId);\n if (\n record === undefined ||\n candidate.owner !== this.physicsOwner ||\n record.token.owner !== candidate.owner ||\n candidate.generation !== this.backendGeneration\n ) {\n return err(\n new DerivedPhysicsError(\n 'derived-candidate-not-found',\n 'candidate belongs to the current PhysicsWorld generation',\n 'discard stale candidate credentials and prepare from committed input again',\n { candidateId: candidate.candidateId },\n ),\n );\n }\n if (this.derivedPoisonedEntities.has(record?.input.entity ?? -1)) {\n return err(\n new DerivedPhysicsError(\n 'derived-recovery-invalid',\n 'the candidate entity is stopped after an unrecoverable native admission failure',\n 'rebuild the PhysicsWorld from its portable snapshot before retrying',\n { entity: record?.input.entity, candidateId: candidate.candidateId },\n ),\n );\n }\n if (record.state === 'cancelled' || record.state === 'invalidated') {\n return err(\n new DerivedPhysicsError(\n 'derived-candidate-cancelled',\n 'candidate has not been cancelled or invalidated',\n 'prepare a new candidate from the latest committed revision',\n { candidateId: candidate.candidateId },\n ),\n );\n }\n if (record.state !== 'ready') {\n return err(\n new DerivedPhysicsError(\n 'derived-candidate-pending',\n 'a prepared candidate is admitted at most once',\n 'retain the returned queued receipt and wait for fixed-step publication',\n { candidateId: candidate.candidateId },\n ),\n );\n }\n const pendingSources = this.pendingDerivedSources();\n if (sourceOverrides !== undefined) {\n for (const [entity, source] of sourceOverrides) pendingSources.set(entity, source);\n }\n pendingSources.set(record.input.entity, {\n sourceKey: record.input.sourceKey,\n revision: record.input.revision,\n });\n const admissionError = this.validateDerivedAdmission(record.input, pendingSources);\n if (admissionError !== undefined) {\n this.rejectPreparedCandidate(record, admissionError);\n return err(admissionError);\n }\n const active = this.derivedBodies.get(record.input.entity);\n if (active !== undefined && record.input.revision <= active.revision) {\n const stale = new DerivedPhysicsError(\n 'derived-candidate-stale',\n 'candidate revision is newer than the committed shape revision',\n 'advance the consumer revision before admission',\n { entity: record.input.entity, candidateId: candidate.candidateId },\n );\n this.rejectPreparedCandidate(record, stale);\n return err(stale);\n }\n const newestPendingRevision = this.newestPendingRevision(record.input.entity);\n if (newestPendingRevision !== undefined && record.input.revision <= newestPendingRevision) {\n const stale = new DerivedPhysicsError(\n 'derived-candidate-stale',\n 'candidate revision advances every already queued revision for the body',\n 'admit only the newest body revision at a fixed-step boundary',\n {\n entity: record.input.entity,\n candidateId: candidate.candidateId,\n expected: `>${newestPendingRevision}`,\n actual: record.input.revision,\n },\n );\n this.rejectPreparedCandidate(record, stale);\n return err(stale);\n }\n record.state = 'queued';\n this.pendingDerivedCandidates.add(candidate.candidateId);\n const queued = Object.freeze({ ...record.token, state: 'queued' as const });\n record.token = queued;\n // Revalidate the complete queued dependency projection after every\n // admission. A dependent candidate may have been queued before a newer\n // endpoint revision arrived; allowing it to survive until process() would\n // make the result depend on queue order and could silently bind the old\n // endpoint source.\n let changed = true;\n while (changed) {\n changed = false;\n const projectedSources = new Map(sourceOverrides ?? []);\n for (const [entity, source] of this.pendingDerivedSources()) {\n const current = projectedSources.get(entity);\n if (current === undefined || source.revision > current.revision)\n projectedSources.set(entity, source);\n }\n for (const queuedId of [...this.pendingDerivedCandidates]) {\n const queuedRecord = this.derivedCandidates.get(queuedId);\n if (queuedRecord?.state !== 'queued') continue;\n const projected = projectedSources.get(queuedRecord.input.entity);\n const staleRevision =\n projected !== undefined && queuedRecord.input.revision < projected.revision;\n const dependencyError = staleRevision\n ? new DerivedPhysicsError(\n 'derived-candidate-stale',\n 'queued candidates publish only the final revision submitted for an entity',\n 'discard the older queued candidate and submit one complete revision',\n {\n entity: queuedRecord.input.entity,\n candidateId: queuedRecord.token.candidateId,\n expected: `>=${projected.revision}`,\n actual: queuedRecord.input.revision,\n },\n )\n : this.validateDerivedAdmission(queuedRecord.input, projectedSources);\n if (dependencyError === undefined) continue;\n this.rejectPreparedCandidate(queuedRecord, dependencyError);\n changed = true;\n if (queuedId === candidate.candidateId) return err(dependencyError);\n }\n }\n return ok(queued);\n }\n\n /** Cancel candidate-native resources; the committed state remains untouched. */\n cancelDerivedShapeCandidate(\n candidate: DerivedPhysicsCandidate,\n ): ReturnType<NonNullable<PhysicsWorld['cancelDerivedShapeCandidate']>> {\n this.assertActive('cancelDerivedShapeCandidate');\n const record = this.derivedCandidates.get(candidate.candidateId);\n if (record === undefined || candidate.owner !== this.physicsOwner) {\n return err(\n new DerivedPhysicsError(\n 'derived-candidate-not-found',\n 'candidate belongs to the current PhysicsWorld',\n 'ignore already-retired credentials and prepare again when needed',\n { candidateId: candidate.candidateId },\n ),\n );\n }\n if (record.state === 'published') {\n return err(\n new DerivedPhysicsError(\n 'derived-candidate-cancelled',\n 'a published candidate remains the committed result until replaced',\n 'submit a newer candidate instead of cancelling committed state',\n { candidateId: candidate.candidateId },\n ),\n );\n }\n this.pendingDerivedCandidates.delete(candidate.candidateId);\n for (const collider of record.nativeColliders) this.removeNativeCollider(collider.handle);\n record.state = 'cancelled';\n this.releaseDerivedCandidate(candidate.candidateId);\n return ok(undefined);\n }\n\n /** Reject all in-flight derived work while preserving the last publication. */\n invalidateDerivedShapeCandidates(reason = 'consumer-invalidated'): void {\n const committedCandidateIds = new Set(\n [...this.derivedBodies.values()].map((body) => body.candidateId),\n );\n for (const [id, record] of this.derivedCandidates) {\n if (record.state === 'published' || committedCandidateIds.has(id)) continue;\n record.state = 'invalidated';\n for (const collider of record.nativeColliders) this.removeNativeCollider(collider.handle);\n this.releaseDerivedCandidate(id);\n }\n this.pendingDerivedCandidates.clear();\n void reason;\n }\n\n getDerivedPublication(entity: number): DerivedPhysicsPublication | undefined {\n this.assertActive('getDerivedPublication');\n if (this.recoveryBlocked()) return undefined;\n const publication = this.derivedPublications.get(entity);\n return publication === undefined\n ? undefined\n : { ...publication, shapeIds: [...publication.shapeIds] };\n }\n\n getDerivedFailure(entity: number): DerivedPhysicsFailure | undefined {\n const failure = this.derivedFailures.get(entity);\n return failure === undefined ? undefined : { ...failure };\n }\n\n getDerivedBodyType(entity: number): 'static' | 'dynamic' | 'kinematic' | undefined {\n this.assertActive('getDerivedBodyType');\n if (this.recoveryBlocked()) return undefined;\n const body = this.bodyForEntity(entity);\n if (body === undefined) return undefined;\n return rapierBodyTypeToString(this.rapierModule, body.bodyType());\n }\n\n getDerivedBodyMass(entity: number): number | undefined {\n this.assertActive('getDerivedBodyMass');\n if (this.recoveryBlocked()) return undefined;\n const body = this.bodyForEntity(entity);\n return body === undefined ? undefined : body.mass();\n }\n\n getDerivedMotion(entity: number): DerivedPhysicsMotion | undefined {\n this.assertActive('getDerivedMotion');\n if (this.recoveryBlocked() || !this.derivedBodies.has(entity)) return undefined;\n const body = this.bodyForEntity(entity);\n if (body === undefined) return undefined;\n const com = body.worldCom();\n const linear = body.linvel();\n const angular = body.angvel();\n return Object.freeze({\n centerOfMass: [com.x, com.y, com.z] as PhysicsVector,\n linearVelocity: [linear.x, linear.y, linear.z] as PhysicsVector,\n angularVelocity: [angular.x, angular.y, angular.z] as PhysicsVector,\n });\n }\n\n getDerivedRecoveryState(): 'ready' | 'rebuild-required' {\n return this.recoveryBlocked() ? 'rebuild-required' : 'ready';\n }\n\n getDerivedShapes(entity: number): readonly DerivedShapeState[] {\n this.assertActive('getDerivedShapes');\n if (this.recoveryBlocked()) return [];\n const body = this.derivedBodies.get(entity);\n if (body === undefined) return [];\n return body.shapes.map((shape) => ({\n id: shape.input.id,\n revision: shape.input.revision,\n entity,\n voxelSize: [...shape.input.voxelSize] as PhysicsVector,\n origin: [...shape.input.origin] as PhysicsVector,\n rotation: [...shape.input.rotation] as PhysicsQuaternion,\n generation: body.generation,\n }));\n }\n\n captureDerivedPhysicsState(): DerivedPhysicsSnapshot {\n this.assertActive('captureDerivedPhysicsState');\n return Object.freeze({\n generation: this.backendGeneration,\n fixedStep: this.fixedStep,\n bodies: Object.freeze(\n [...this.derivedBodies.values()].map((body) => ({\n entity: body.entity,\n revision: body.revision,\n sourceKey: body.sourceKey,\n ...(body.bodyType === undefined ? {} : { bodyType: body.bodyType }),\n ...(body.velocityPolicy === undefined ? {} : { velocityPolicy: body.velocityPolicy }),\n shapes: Object.freeze(\n body.shapes.map((shape) => ({\n ...shape.input,\n cells: new Int32Array(shape.input.cells),\n voxelSize: [...shape.input.voxelSize] as PhysicsVector,\n origin: [...shape.input.origin] as PhysicsVector,\n rotation: [...shape.input.rotation] as PhysicsQuaternion,\n })),\n ),\n seams: Object.freeze(\n body.seams.map((seam) => ({ ...seam, offset: [...seam.offset] as PhysicsVector })),\n ),\n ...(body.massProperties === undefined ? {} : { massProperties: body.massProperties }),\n ...(() => {\n const motion = this.getDerivedMotion(body.entity);\n return motion === undefined ? {} : { motion };\n })(),\n constraints: Object.freeze(this.constraintsForBody(body.entity)),\n })),\n ),\n });\n }\n\n restoreDerivedPhysicsState(\n snapshot: DerivedPhysicsSnapshot,\n ): ReturnType<NonNullable<PhysicsWorld['restoreDerivedPhysicsState']>> {\n this.assertActive('restoreDerivedPhysicsState');\n const snapshotSources = new Map<number, DerivedBodySource>();\n for (const body of snapshot.bodies) {\n if (snapshotSources.has(body.entity)) {\n return err(\n new DerivedPhysicsError(\n 'derived-candidate-invalid',\n 'a portable snapshot contains one committed body row per entity',\n 'capture the snapshot from one PhysicsWorld without duplicate entities',\n { entity: body.entity },\n ),\n );\n }\n snapshotSources.set(body.entity, {\n sourceKey: body.sourceKey,\n revision: body.revision,\n });\n }\n const preparedCandidates: DerivedPhysicsCandidate[] = [];\n const restoredConstraintIds = new Set<string>();\n for (const body of snapshot.bodies) {\n const prepared = this.prepareDerivedShapeCandidate({\n entity: body.entity,\n revision: body.revision,\n sourceKey: body.sourceKey,\n shapes: body.shapes,\n ...(body.seams === undefined || body.seams.length === 0 ? {} : { seams: body.seams }),\n ...(body.bodyType === undefined ? {} : { bodyType: body.bodyType }),\n ...(body.velocityPolicy === undefined ? {} : { velocityPolicy: body.velocityPolicy }),\n ...(body.motion === undefined ? {} : { motion: body.motion }),\n ...(body.massProperties === undefined ? {} : { massProperties: body.massProperties }),\n constraints: body.constraints.filter((constraint) => {\n if (restoredConstraintIds.has(constraint.id)) return false;\n restoredConstraintIds.add(constraint.id);\n return true;\n }),\n });\n if (!prepared.ok) {\n for (const candidate of preparedCandidates) this.cancelDerivedShapeCandidate(candidate);\n return prepared;\n }\n preparedCandidates.push(prepared.value);\n }\n const candidates: DerivedPhysicsCandidate[] = [];\n for (const prepared of preparedCandidates) {\n const admitted = this.admitDerivedShapeCandidateInternal(prepared, snapshotSources);\n if (!admitted.ok) {\n // Admission may have created disabled native colliders before a later\n // body/constraint row fails. Cancel every prepared credential, not\n // only rows that reached the local `candidates` list: the rejected\n // row and any rows after it also own native staging state.\n for (const candidate of preparedCandidates) this.cancelDerivedShapeCandidate(candidate);\n return admitted;\n }\n candidates.push(admitted.value);\n }\n return ok(candidates);\n }\n\n createDerivedConstraint(\n input: PhysicsConstraintInput,\n ): ReturnType<NonNullable<PhysicsWorld['createDerivedConstraint']>> {\n return this.installDerivedConstraint(input, false);\n }\n\n updateDerivedConstraint(\n input: PhysicsConstraintInput,\n ): ReturnType<NonNullable<PhysicsWorld['updateDerivedConstraint']>> {\n return this.installDerivedConstraint(input, true);\n }\n\n removeDerivedConstraint(\n id: string,\n ): ReturnType<NonNullable<PhysicsWorld['removeDerivedConstraint']>> {\n this.assertActive('removeDerivedConstraint');\n const existing = this.derivedConstraints.get(id);\n if (existing === undefined) {\n return err(\n new DerivedPhysicsError(\n 'derived-constraint-not-found',\n 'constraint identity is currently committed',\n 'ignore repeated cleanup or reconcile the owning constraint set',\n { constraintId: id },\n ),\n );\n }\n this.removeNativeConstraint(existing.handle);\n this.derivedConstraints.delete(id);\n return ok(undefined);\n }\n\n private createDerivedCollider(\n body: RapierRigidBody,\n shape: VoxelShapeInput,\n ): { readonly handle: number } {\n const RAPIER = this.rapierModule as RapierWorld;\n const desc = RAPIER.ColliderDesc.voxels(\n shape.cells instanceof Int32Array\n ? new Int32Array(shape.cells)\n : new Int32Array(shape.cells.flat()),\n { x: shape.voxelSize[0], y: shape.voxelSize[1], z: shape.voxelSize[2] },\n )\n .setTranslation(shape.origin?.[0] ?? 0, shape.origin?.[1] ?? 0, shape.origin?.[2] ?? 0)\n .setRotation({\n x: shape.rotation?.[0] ?? 0,\n y: shape.rotation?.[1] ?? 0,\n z: shape.rotation?.[2] ?? 0,\n w: shape.rotation?.[3] ?? 1,\n })\n .setFriction(shape.friction ?? 0.5)\n .setRestitution(shape.restitution ?? 0)\n // Disabled colliders still contribute native mass. Staging must be\n // massless; admission assigns density only to its committed shape set.\n .setDensity(0)\n .setCollisionGroups(shape.collisionGroups ?? 0xffffffff)\n .setSolverGroups(shape.solverGroups ?? 0xffffffff)\n .setActiveEvents(RAPIER.ActiveEvents.COLLISION_EVENTS)\n .setActiveCollisionTypes(RAPIER.ActiveCollisionTypes.ALL)\n .setEnabled(false);\n if (shape.isSensor === true) desc.setSensor(true);\n const collider = this.raw.createCollider(desc, body);\n this.derivedColliderToShape.set(collider.handle, { entity: body.userData, id: shape.id });\n return collider;\n }\n\n private removeNativeCollider(handle: number): void {\n this.derivedColliderToShape.delete(handle);\n try {\n const collider = (this.raw as RapierWorld).getCollider(handle);\n if (collider !== null && collider !== undefined) {\n (this.raw as RapierWorld).removeCollider(collider, false);\n }\n } catch {\n // Native removal is idempotent from the Engine lifecycle perspective.\n }\n }\n\n private createNativeConstraint(\n input: PhysicsConstraintInput,\n ): Result<{ readonly handle: number }, DerivedPhysicsError> {\n let native: RapierWorld | undefined;\n try {\n const RAPIER = this.rapierModule as RapierWorld;\n const bodyA = this.bodyForEntity(input.bodyA);\n const bodyB = this.bodyForEntity(input.bodyB);\n if (bodyA === undefined || bodyB === undefined) {\n return err(\n new DerivedPhysicsError(\n 'derived-body-not-found',\n 'both constraint endpoints have committed bodies in this PhysicsWorld',\n 'reconcile both entities before creating the constraint',\n { constraintId: input.id },\n ),\n );\n }\n const anchorA = { x: input.anchorA[0], y: input.anchorA[1], z: input.anchorA[2] };\n const anchorB = { x: input.anchorB[0], y: input.anchorB[1], z: input.anchorB[2] };\n const jointData =\n input.kind === 'spring'\n ? RAPIER.JointData.spring(\n input.restLength,\n input.stiffness,\n input.damping,\n anchorA,\n anchorB,\n )\n : RAPIER.JointData.revolute(anchorA, anchorB, {\n x: input.axis[0],\n y: input.axis[1],\n z: input.axis[2],\n });\n native = this.raw.createImpulseJoint(jointData, bodyA, bodyB, true);\n if (input.kind === 'hinge' && input.limits !== undefined)\n native.setLimits(input.limits[0], input.limits[1]);\n return ok({ handle: native.handle });\n } catch (cause) {\n if (native !== undefined) this.removeNativeConstraint(native.handle);\n return err(\n new DerivedPhysicsError(\n 'derived-backend-failed',\n 'the selected Rapier joint can be created for both endpoint bodies',\n 'repair endpoint state or use a supported spring/hinge input',\n {\n constraintId: input.id,\n reason: cause instanceof Error ? cause.message : String(cause),\n },\n ),\n );\n }\n }\n\n private rememberDerivedFailure(\n record: DerivedCandidateRecord,\n error: DerivedPhysicsError,\n recovery: DerivedPhysicsFailure['recovery'],\n ): void {\n record.state = 'failed';\n this.pendingDerivedCandidates.delete(record.token.candidateId);\n this.derivedFailures.set(\n record.input.entity,\n Object.freeze({\n candidateId: record.token.candidateId,\n entity: record.input.entity,\n revision: record.input.revision,\n fixedStep: this.fixedStep,\n error,\n recovery,\n }),\n );\n this.releaseDerivedCandidate(record.token.candidateId);\n }\n\n private rejectPreparedCandidate(\n record: DerivedCandidateRecord,\n error: DerivedPhysicsError,\n ): void {\n for (const collider of record.nativeColliders) this.removeNativeCollider(collider.handle);\n this.rememberDerivedFailure(record, error, 'old-state-retained');\n }\n\n private processDerivedCandidates(): void {\n if (this.pendingDerivedCandidates.size === 0) return;\n const pendingRecords = [...this.pendingDerivedCandidates]\n .map((id) => this.derivedCandidates.get(id))\n .filter((record): record is DerivedCandidateRecord => record?.state === 'queued');\n const pendingByEntity = new Map<number, DerivedCandidateRecord>();\n for (const record of pendingRecords) {\n const current = pendingByEntity.get(record.input.entity);\n if (current === undefined || record.input.revision > current.input.revision) {\n pendingByEntity.set(record.input.entity, record);\n }\n }\n // A candidate that names a queued endpoint must be processed after that\n // endpoint. This turns a queue-time source projection into a final\n // committed-source check: if the endpoint fails natively, its dependent\n // candidate sees the old source on the next iteration and is rejected.\n const ordered: DerivedCandidateRecord[] = [];\n const visiting = new Set<string>();\n const visited = new Set<string>();\n const visit = (record: DerivedCandidateRecord): void => {\n if (visited.has(record.token.candidateId)) return;\n if (visiting.has(record.token.candidateId)) return;\n visiting.add(record.token.candidateId);\n for (const constraint of record.input.constraints ?? []) {\n for (const endpoint of [\n [constraint.bodyA, constraint.bodyASource],\n [constraint.bodyB, constraint.bodyBSource],\n ] as const) {\n const dependency = endpoint[1];\n const target = pendingByEntity.get(endpoint[0]);\n if (\n target !== undefined &&\n target.input.sourceKey === dependency.sourceKey &&\n target.input.revision === dependency.revision\n ) {\n visit(target);\n }\n }\n }\n visiting.delete(record.token.candidateId);\n visited.add(record.token.candidateId);\n ordered.push(record);\n };\n for (const record of pendingRecords) visit(record);\n\n for (const record of ordered) {\n const id = record.token.candidateId;\n if (!this.pendingDerivedCandidates.has(id) || record.state !== 'queued') continue;\n const pendingSources = this.pendingDerivedSources();\n const projected = pendingSources.get(record.input.entity);\n if (projected !== undefined && record.input.revision < projected.revision) {\n this.rejectPreparedCandidate(\n record,\n new DerivedPhysicsError(\n 'derived-candidate-stale',\n 'fixed-step admission publishes only the newest queued body revision',\n 'discard the older queued candidate and submit the latest complete input',\n {\n entity: record.input.entity,\n candidateId: record.token.candidateId,\n expected: `>=${projected.revision}`,\n actual: record.input.revision,\n },\n ),\n );\n continue;\n }\n const admissionError = this.validateDerivedAdmission(record.input, pendingSources);\n if (admissionError !== undefined) {\n this.rejectPreparedCandidate(record, admissionError);\n continue;\n }\n const old = this.derivedBodies.get(record.input.entity);\n if (this.derivedPoisonedEntities.has(record.input.entity)) {\n for (const collider of record.nativeColliders) this.removeNativeCollider(collider.handle);\n this.rememberDerivedFailure(\n record,\n new DerivedPhysicsError(\n 'derived-recovery-invalid',\n 'the entity is stopped after an unrecoverable native admission failure',\n 'rebuild the PhysicsWorld from the last portable snapshot before retrying',\n { entity: record.input.entity, candidateId: record.token.candidateId },\n ),\n 'rebuild-required',\n );\n continue;\n }\n const body = this.bodyForEntity(record.input.entity);\n if (body === undefined) {\n for (const collider of record.nativeColliders) this.removeNativeCollider(collider.handle);\n this.rememberDerivedFailure(\n record,\n new DerivedPhysicsError(\n 'derived-body-not-found',\n 'candidate entity remains a live native body at fixed-step admission',\n 'reconcile the entity and submit a fresh candidate',\n { entity: record.input.entity, candidateId: record.token.candidateId },\n ),\n 'old-state-retained',\n );\n continue;\n }\n const oldBodyType = body.bodyType();\n const oldBodyEnabled = body.isEnabled();\n const oldVelocity = body.linvel();\n const oldAngularVelocity = body.angvel();\n const oldTranslation = body.translation();\n const oldRotation = body.rotation();\n const oldCom = body.worldCom();\n const oldMass = body.mass();\n const oldAutomaticAdditionalMass =\n this.entityMap.get(record.input.entity)?.automaticAdditionalMass ?? 0;\n const oldAutomaticRecordMass = this.entityMap.get(\n record.input.entity,\n )?.automaticAdditionalMass;\n const oldSource = this.derivedBodySources.get(record.input.entity);\n const oldPublication = this.derivedPublications.get(record.input.entity);\n const oldDensities = this.bodyColliders(body).map((collider) => ({\n collider,\n density: typeof collider.density === 'function' ? collider.density() : undefined,\n enabled: typeof collider.isEnabled === 'function' ? collider.isEnabled() : true,\n }));\n const oldConstraints = new Map(this.derivedConstraints);\n const stagedConstraints = new Map<string, DerivedConstraintRecord>();\n let geometryCommitUncertain = false;\n try {\n for (const constraint of record.input.constraints ?? []) {\n const created = this.createNativeConstraint(constraint);\n if (!created.ok) throw created.error;\n stagedConstraints.set(constraint.id, {\n input: { ...constraint },\n handle: created.value.handle,\n });\n }\n if (record.input.bodyType !== undefined) {\n const RAPIER = this.rapierModule as RapierWorld;\n const bodyType =\n record.input.bodyType === 'static'\n ? RAPIER.RigidBodyType.Fixed\n : record.input.bodyType === 'kinematic'\n ? RAPIER.RigidBodyType.KinematicPositionBased\n : RAPIER.RigidBodyType.Dynamic;\n body.setBodyType(bodyType, true);\n }\n for (const native of record.nativeColliders) {\n const collider = (this.raw as RapierWorld).getCollider(native.handle);\n if (collider === null || collider === undefined)\n throw new Error('candidate collider disappeared');\n collider.setEnabled(true);\n }\n const nativeById = new Map(\n record.input.shapes.map((shape: VoxelShapeInput, index: number) => [\n shape.id,\n record.nativeColliders[index]?.handle as number,\n ]),\n );\n for (const seam of record.input.seams ?? []) {\n const firstHandle = nativeById.get(seam.shapeA);\n const secondHandle = nativeById.get(seam.shapeB);\n const first =\n firstHandle === undefined\n ? undefined\n : (this.raw as RapierWorld).getCollider(firstHandle);\n const second =\n secondHandle === undefined\n ? undefined\n : (this.raw as RapierWorld).getCollider(secondHandle);\n if (first === undefined || second === undefined || first === null || second === null) {\n throw new Error(`derived seam references missing shape ${seam.shapeA}`);\n }\n first.combineVoxelStates(second, seam.offset[0], seam.offset[1], seam.offset[2]);\n }\n this.applyDerivedMass(\n body,\n record.input.massProperties,\n oldCom,\n record.input.velocityPolicy ?? 'preserve',\n this.entityMap.get(record.input.entity)?.additionalMass ?? 0,\n record.input.entity,\n record.input.shapes,\n record.nativeColliders,\n );\n if (record.input.motion !== undefined) {\n const currentCom = body.worldCom();\n const targetCom = record.input.motion.centerOfMass;\n const translation = body.translation();\n body.setTranslation(\n {\n x: translation.x + targetCom[0] - currentCom.x,\n y: translation.y + targetCom[1] - currentCom.y,\n z: translation.z + targetCom[2] - currentCom.z,\n },\n true,\n );\n body.setLinvel(\n {\n x: record.input.motion.linearVelocity[0],\n y: record.input.motion.linearVelocity[1],\n z: record.input.motion.linearVelocity[2],\n },\n true,\n );\n body.setAngvel(\n {\n x: record.input.motion.angularVelocity[0],\n y: record.input.motion.angularVelocity[1],\n z: record.input.motion.angularVelocity[2],\n },\n true,\n );\n }\n // A body revision invalidates any committed joint that still names\n // that body's previous source/revision. Keep this tied to the body\n // that is actually committing: a different queued endpoint may still\n // fail, in which case its old joint remains valid and must not be\n // removed speculatively.\n const committedSources = new Map(this.derivedBodySources);\n committedSources.set(record.input.entity, {\n sourceKey: record.input.sourceKey,\n revision: record.input.revision,\n });\n const replacementConstraintIds = new Set(\n (record.input.constraints ?? []).map((constraint) => constraint.id),\n );\n for (const [constraintId, current] of [...this.derivedConstraints]) {\n if (\n replacementConstraintIds.has(constraintId) ||\n this.constraintDependenciesMatch(current.input, committedSources)\n )\n continue;\n this.removeNativeConstraint(current.handle);\n this.derivedConstraints.delete(constraintId);\n }\n if (old !== undefined) {\n for (const shape of old.shapes) {\n const collider = (this.raw as RapierWorld).getCollider(shape.colliderHandle);\n if (collider !== null && collider !== undefined) collider.setEnabled(false);\n }\n this.retiredDerivedBodies.push(old);\n }\n for (const constraint of record.input.constraints ?? []) {\n const previous = this.derivedConstraints.get(constraint.id);\n if (previous !== undefined) this.removeNativeConstraint(previous.handle);\n const staged = stagedConstraints.get(constraint.id);\n if (staged !== undefined) this.derivedConstraints.set(constraint.id, staged);\n }\n const shapes: DerivedShapeRecord[] = record.input.shapes.map(\n (shape: VoxelShapeInput, index: number) => ({\n input: shape as DerivedShapeRecord['input'],\n colliderHandle: record.nativeColliders[index]?.handle as number,\n }),\n );\n const committed: DerivedBodyRecord = {\n entity: record.input.entity,\n sourceKey: record.input.sourceKey,\n generation: this.backendGeneration,\n revision: record.input.revision,\n bodyType: record.input.bodyType,\n velocityPolicy: record.input.velocityPolicy,\n candidateId: record.token.candidateId,\n shapes,\n seams: [...(record.input.seams ?? [])],\n massProperties: record.input.massProperties,\n constraints: [...(record.input.constraints ?? [])],\n };\n // The sole cross-domain observation boundary: no native operation\n // follows a successful geometry commit before recording this body.\n // A refused commit takes the same complete native rollback below.\n if (record.commitGeometry !== undefined) {\n this.activeDerivedAdmission = record;\n try {\n geometryCommitUncertain = true;\n const geometry = record.commitGeometry();\n geometryCommitUncertain = false;\n if (!geometry.ok) throw geometry.error;\n } finally {\n this.activeDerivedAdmission = undefined;\n }\n delete record.commitGeometry;\n }\n this.derivedBodies.set(record.input.entity, committed);\n const entityRecord = this.entityMap.get(record.input.entity);\n if (entityRecord !== undefined) {\n entityRecord.automaticAdditionalMass =\n record.input.massProperties?.mode === 'explicit' ? 0 : entityRecord.additionalMass;\n }\n this.derivedBodySources.set(record.input.entity, {\n sourceKey: record.input.sourceKey,\n revision: record.input.revision,\n });\n this.derivedFailures.delete(record.input.entity);\n record.state = 'queued';\n this.pendingDerivedCandidates.delete(id);\n } catch (cause) {\n for (const staged of stagedConstraints.values()) this.removeNativeConstraint(staged.handle);\n // The commit path may already have removed/replaced a native joint\n // before a later body mutation fails. Clear every current native joint\n // now; the old records are recreated after the body state is restored\n // instead of leaving a stale JS handle that no longer exists in\n // Rapier.\n for (const current of this.derivedConstraints.values())\n this.removeNativeConstraint(current.handle);\n this.derivedConstraints.clear();\n if (old !== undefined) {\n for (const shape of old.shapes) {\n const collider = (this.raw as RapierWorld).getCollider(shape.colliderHandle);\n if (collider !== null && collider !== undefined) collider.setEnabled(true);\n }\n const retiredIndex = this.retiredDerivedBodies.indexOf(old);\n if (retiredIndex >= 0) this.retiredDerivedBodies.splice(retiredIndex, 1);\n this.derivedBodies.set(record.input.entity, old);\n this.derivedBodySources.set(record.input.entity, {\n sourceKey: old.sourceKey,\n revision: old.revision,\n });\n }\n for (const native of record.nativeColliders) {\n const collider = (this.raw as RapierWorld).getCollider(native.handle);\n if (collider !== null && collider !== undefined) collider.setEnabled(false);\n }\n // Remove staged colliders before restoring mass. Rapier defers some\n // mass-property recomputation until a collider mutation; restoring\n // while a disabled candidate is still attached can leave an explicit\n // override behind for the next fixed step.\n for (const native of record.nativeColliders) this.removeNativeCollider(native.handle);\n for (const { collider, density, enabled } of oldDensities) {\n if (this.raw.getCollider(collider.handle) === null) continue;\n if (density !== undefined && typeof collider.setDensity === 'function')\n collider.setDensity(density);\n if (typeof collider.setEnabled === 'function') collider.setEnabled(enabled);\n }\n let restored = true;\n try {\n body.setBodyType(oldBodyType, true);\n this.restoreCommittedMass(body, old, oldAutomaticAdditionalMass);\n body.setTranslation(oldTranslation, true);\n body.setRotation(oldRotation, true);\n body.setLinvel(oldVelocity, true);\n body.setAngvel(oldAngularVelocity, true);\n body.setEnabled(oldBodyEnabled);\n } catch {\n restored = false;\n }\n if (restored && !this.restoreNativeConstraints(oldConstraints)) restored = false;\n if (restored) {\n const currentMass = body.mass();\n const currentCom = body.worldCom();\n const currentVelocity = body.linvel();\n const currentAngularVelocity = body.angvel();\n restored =\n Number.isFinite(currentMass) &&\n Math.abs(currentMass - oldMass) <= 1e-6 * Math.max(1, Math.abs(oldMass)) &&\n Math.abs(currentCom.x - oldCom.x) <= 1e-6 &&\n Math.abs(currentCom.y - oldCom.y) <= 1e-6 &&\n Math.abs(currentCom.z - oldCom.z) <= 1e-6 &&\n Math.abs(currentVelocity.x - oldVelocity.x) <= 1e-6 &&\n Math.abs(currentVelocity.y - oldVelocity.y) <= 1e-6 &&\n Math.abs(currentVelocity.z - oldVelocity.z) <= 1e-6 &&\n Math.abs(currentAngularVelocity.x - oldAngularVelocity.x) <= 1e-6 &&\n Math.abs(currentAngularVelocity.y - oldAngularVelocity.y) <= 1e-6 &&\n Math.abs(currentAngularVelocity.z - oldAngularVelocity.z) <= 1e-6 &&\n body.bodyType() === oldBodyType &&\n body.isEnabled() === oldBodyEnabled;\n }\n if (old === undefined) this.derivedBodies.delete(record.input.entity);\n else this.derivedBodies.set(record.input.entity, old);\n if (oldSource === undefined) this.derivedBodySources.delete(record.input.entity);\n else this.derivedBodySources.set(record.input.entity, oldSource);\n if (oldPublication === undefined) this.derivedPublications.delete(record.input.entity);\n else this.derivedPublications.set(record.input.entity, oldPublication);\n const entityRecord = this.entityMap.get(record.input.entity);\n if (entityRecord !== undefined && oldAutomaticRecordMass !== undefined)\n entityRecord.automaticAdditionalMass = oldAutomaticRecordMass;\n const error =\n cause instanceof DerivedPhysicsError\n ? cause\n : new DerivedPhysicsError(\n 'derived-backend-failed',\n 'derived admission either commits completely or preserves the prior body state',\n 'inspect the failure receipt and rebuild the PhysicsWorld if recovery is required',\n {\n entity: record.input.entity,\n candidateId: record.token.candidateId,\n reason: cause instanceof Error ? cause.message : String(cause),\n },\n );\n // A thrown consumer callback may already have changed its ECS domain.\n // Native rollback alone cannot certify the combined state in that case.\n if (geometryCommitUncertain) restored = false;\n if (!restored) {\n this.derivedPoisonedEntities.add(record.input.entity);\n this.derivedBodies.delete(record.input.entity);\n this.derivedPublications.delete(record.input.entity);\n }\n this.rememberDerivedFailure(\n record,\n error,\n restored ? 'old-state-retained' : 'rebuild-required',\n );\n }\n }\n }\n\n private publishDerivedCandidates(): void {\n for (const body of this.derivedBodies.values()) {\n const candidate = this.derivedCandidates.get(body.candidateId);\n if (candidate?.state !== 'queued') continue;\n this.derivedPublications.set(\n body.entity,\n Object.freeze({\n candidateId: body.candidateId,\n entity: body.entity,\n revision: body.revision,\n fixedStep: this.fixedStep,\n shapeIds: Object.freeze(body.shapes.map((shape) => shape.input.id)),\n generation: body.generation,\n }),\n );\n candidate.state = 'published';\n }\n }\n\n private retireDerivedBodies(): void {\n for (const body of this.retiredDerivedBodies.splice(0)) {\n for (const shape of body.shapes) this.removeNativeCollider(shape.colliderHandle);\n this.releaseDerivedCandidate(body.candidateId);\n }\n }\n\n private applyDerivedMass(\n body: RapierRigidBody,\n properties: PhysicsMassProperties | undefined,\n previousWorldCom: { x: number; y: number; z: number },\n velocityPolicy: 'preserve' | 'reset',\n authoredAdditionalMass: number,\n entity: number,\n candidateShapes: readonly VoxelShapeInput[],\n candidateColliders: readonly { readonly handle: number }[],\n ): void {\n const oldVelocity = body.linvel();\n const oldAngularVelocity = body.angvel();\n if (properties?.mode === 'explicit') {\n // Explicit mass is the sole source for this body. Zero every ordinary\n // and derived collider density first so Rapier does not add a hidden\n // density contribution to the authored value.\n this.rememberAuthoredDensity(entity, body);\n for (const collider of this.bodyColliders(body)) {\n if (typeof collider.setDensity === 'function') collider.setDensity(0);\n }\n const frame = properties.principalInertiaLocalFrame ?? [0, 0, 0, 1];\n body.setAdditionalMassProperties(\n properties.mass,\n {\n x: properties.centerOfMass[0],\n y: properties.centerOfMass[1],\n z: properties.centerOfMass[2],\n },\n {\n x: properties.principalInertia[0],\n y: properties.principalInertia[1],\n z: properties.principalInertia[2],\n },\n { x: frame[0], y: frame[1], z: frame[2], w: frame[3] },\n true,\n );\n } else {\n this.restoreAutomaticDensities(\n entity,\n body,\n properties?.mode === 'automatic' ? properties.density : undefined,\n candidateShapes,\n candidateColliders,\n );\n this.restoreAutomaticMass(body, authoredAdditionalMass);\n }\n if (velocityPolicy === 'reset') {\n body.setLinvel({ x: 0, y: 0, z: 0 }, true);\n body.setAngvel({ x: 0, y: 0, z: 0 }, true);\n return;\n }\n const nextWorldCom = body.worldCom();\n const next = preserveCenterOfMassVelocity(\n [oldVelocity.x, oldVelocity.y, oldVelocity.z],\n [oldAngularVelocity.x, oldAngularVelocity.y, oldAngularVelocity.z],\n [previousWorldCom.x, previousWorldCom.y, previousWorldCom.z],\n [nextWorldCom.x, nextWorldCom.y, nextWorldCom.z],\n );\n body.setLinvel({ x: next[0], y: next[1], z: next[2] }, true);\n body.setAngvel(oldAngularVelocity, true);\n }\n\n /** Restore the complete committed mass policy after a failed admission. */\n private restoreCommittedMass(\n body: RapierRigidBody,\n previous: DerivedBodyRecord | undefined,\n automaticAdditionalMass: number,\n ): void {\n if (previous?.massProperties?.mode === 'explicit') {\n const frame = previous.massProperties.principalInertiaLocalFrame ?? [0, 0, 0, 1];\n body.setAdditionalMassProperties(\n previous.massProperties.mass,\n {\n x: previous.massProperties.centerOfMass[0],\n y: previous.massProperties.centerOfMass[1],\n z: previous.massProperties.centerOfMass[2],\n },\n {\n x: previous.massProperties.principalInertia[0],\n y: previous.massProperties.principalInertia[1],\n z: previous.massProperties.principalInertia[2],\n },\n { x: frame[0], y: frame[1], z: frame[2], w: frame[3] },\n true,\n );\n return;\n }\n this.restoreAutomaticMass(body, automaticAdditionalMass);\n }\n\n /**\n * Rapier keeps `setAdditionalMassProperties` as native state even after a\n * collider recompute. Clear that override explicitly before recomputing so\n * automatic candidates and rollback really return to the authored policy.\n */\n private restoreAutomaticMass(body: RapierRigidBody, additionalMass: number): void {\n body.setAdditionalMass(Math.max(0, additionalMass), true);\n body.recomputeMassPropertiesFromColliders();\n }\n\n private rememberAuthoredDensity(entity: number, body: RapierRigidBody): void {\n const record = this.entityMap.get(entity);\n if (record === undefined || record.authoredDensity !== undefined) return;\n const authored = this.bodyColliders(body).find(\n (collider) => !this.derivedColliderToShape.has(collider.handle),\n );\n const density =\n authored !== undefined && typeof authored.density === 'function'\n ? authored.density()\n : undefined;\n if (density !== undefined && Number.isFinite(density) && density >= 0)\n record.authoredDensity = density;\n }\n\n private restoreAutomaticDensities(\n entity: number,\n body: RapierRigidBody,\n overrideDensity: number | undefined,\n candidateShapes: readonly VoxelShapeInput[],\n candidateColliders: readonly { readonly handle: number }[],\n ): void {\n const record = this.entityMap.get(entity);\n const candidateDensityByHandle = new Map<number, number>();\n for (const [index, collider] of candidateColliders.entries()) {\n const shape = candidateShapes[index];\n if (shape !== undefined) candidateDensityByHandle.set(collider.handle, shape.density ?? 1);\n }\n const authoredDensity = record?.authoredDensity ?? 1;\n for (const collider of this.bodyColliders(body)) {\n const candidateDensity = candidateDensityByHandle.get(collider.handle);\n const density =\n candidateDensity !== undefined\n ? (overrideDensity ?? candidateDensity)\n : this.derivedColliderToShape.has(collider.handle)\n ? 0\n : (overrideDensity ?? authoredDensity);\n if (typeof collider.setDensity === 'function') collider.setDensity(density);\n }\n }\n\n private restoreNativeConstraints(\n previous: ReadonlyMap<string, DerivedConstraintRecord>,\n ): boolean {\n for (const [constraintId, record] of previous) {\n const recreated = this.createNativeConstraint(record.input);\n if (!recreated.ok) {\n for (const current of this.derivedConstraints.values())\n this.removeNativeConstraint(current.handle);\n this.derivedConstraints.clear();\n return false;\n }\n this.derivedConstraints.set(constraintId, {\n input: { ...record.input },\n handle: recreated.value.handle,\n });\n }\n return true;\n }\n\n private bodyColliders(body: RapierRigidBody): RapierWorld[] {\n const result: RapierWorld[] = [];\n for (let index = 0; index < body.numColliders(); index += 1) {\n const collider = body.collider(index);\n if (collider !== null && collider !== undefined) result.push(collider);\n }\n return result;\n }\n\n private releaseDerivedCandidate(candidateId: string): void {\n const record = this.derivedCandidates.get(candidateId);\n if (record === undefined) return;\n this.derivedCandidateBytes = Math.max(0, this.derivedCandidateBytes - record.bytes);\n this.derivedCandidates.delete(candidateId);\n }\n\n private sourceForEntity(entity: number): DerivedBodySource {\n return (\n this.derivedBodySources.get(entity) ?? {\n sourceKey: `entity:${entity}`,\n revision: 0,\n }\n );\n }\n\n /**\n * Project the final source revision of every queued body. Constraint\n * dependencies are checked against this projection, not against whichever\n * queued candidate happens to be processed first.\n */\n private pendingDerivedSources(): Map<number, DerivedBodySource> {\n const sources = new Map<number, DerivedBodySource>();\n for (const candidateId of this.pendingDerivedCandidates) {\n const record = this.derivedCandidates.get(candidateId);\n if (record === undefined || record.state !== 'queued') continue;\n const current = sources.get(record.input.entity);\n if (current === undefined || record.input.revision > current.revision) {\n sources.set(record.input.entity, {\n sourceKey: record.input.sourceKey,\n revision: record.input.revision,\n });\n }\n }\n return sources;\n }\n\n private newestPendingRevision(entity: number): number | undefined {\n return this.pendingDerivedSources().get(entity)?.revision;\n }\n\n private recoveryBlocked(): boolean {\n return (\n this.derivedPoisonedEntities.size > 0 || this.syncState?.world.execution.health === 'poisoned'\n );\n }\n\n private validateConstraintDependencies(\n input: PhysicsConstraintInput,\n candidate?: DerivedPhysicsCandidateInput,\n sourceOverrides?: ReadonlyMap<number, DerivedBodySource>,\n ): DerivedPhysicsError | undefined {\n const endpoints = [\n [input.bodyA, input.bodyASource],\n [input.bodyB, input.bodyBSource],\n ] as const;\n for (const [entity, dependency] of endpoints) {\n if (this.derivedPoisonedEntities.has(entity)) {\n return new DerivedPhysicsError(\n 'derived-recovery-invalid',\n 'constraint endpoints belong to a healthy PhysicsWorld state',\n 'rebuild the PhysicsWorld before recreating constraints',\n { constraintId: input.id, entity },\n );\n }\n if (!this.entityMap.has(entity)) {\n return new DerivedPhysicsError(\n 'derived-body-not-found',\n 'both constraint endpoint entities have committed bodies',\n 'reconcile both endpoint entities before creating or migrating a constraint',\n { constraintId: input.id, entity },\n );\n }\n const expected =\n candidate !== undefined && entity === candidate.entity\n ? { sourceKey: candidate.sourceKey, revision: candidate.revision }\n : (sourceOverrides?.get(entity) ?? this.sourceForEntity(entity));\n if (\n dependency.sourceKey !== expected.sourceKey ||\n dependency.revision !== expected.revision\n ) {\n return new DerivedPhysicsError(\n 'derived-constraint-stale',\n 'constraint endpoint sourceKey and revision match the committed endpoint',\n 'refresh both endpoint dependencies and retry the complete candidate',\n {\n constraintId: input.id,\n entity,\n expected: `${expected.sourceKey}@${expected.revision}`,\n actual: `${dependency.sourceKey}@${dependency.revision}`,\n },\n );\n }\n }\n return undefined;\n }\n\n private constraintDependenciesMatch(\n input: PhysicsConstraintInput,\n sourceOverrides: ReadonlyMap<number, DerivedBodySource>,\n ): boolean {\n for (const [entity, dependency] of [\n [input.bodyA, input.bodyASource],\n [input.bodyB, input.bodyBSource],\n ] as const) {\n if (!this.entityMap.has(entity)) return false;\n const expected = sourceOverrides.get(entity) ?? this.sourceForEntity(entity);\n if (dependency.sourceKey !== expected.sourceKey || dependency.revision !== expected.revision)\n return false;\n }\n return true;\n }\n\n private validateDerivedAdmission(\n input: DerivedPhysicsCandidateInput,\n sourceOverrides?: ReadonlyMap<number, DerivedBodySource>,\n ): DerivedPhysicsError | undefined {\n if (\n input.bodyType !== undefined &&\n input.bodyType !== 'static' &&\n input.bodyType !== 'dynamic' &&\n input.bodyType !== 'kinematic'\n ) {\n return new DerivedPhysicsError(\n 'derived-candidate-invalid',\n 'candidate bodyType is one of static, dynamic, or kinematic',\n 'repair the motion type before admission',\n { entity: input.entity, actual: input.bodyType },\n );\n }\n const seen = new Set<string>();\n for (const constraint of input.constraints ?? []) {\n const validation = validateConstraintInput(constraint);\n if (!validation.ok) return validation.error;\n if (seen.has(constraint.id)) {\n return new DerivedPhysicsError(\n 'derived-constraint-invalid',\n 'candidate contains one constraint update per identity',\n 'merge duplicate updates before admission',\n { entity: input.entity, constraintId: constraint.id },\n );\n }\n seen.add(constraint.id);\n const dependencyError = this.validateConstraintDependencies(\n constraint,\n input,\n sourceOverrides,\n );\n if (dependencyError !== undefined) return dependencyError;\n const existing = this.derivedConstraints.get(constraint.id);\n if (existing !== undefined && constraint.revision <= existing.input.revision) {\n return new DerivedPhysicsError(\n 'derived-constraint-stale',\n 'migrated constraint revision advances the committed revision',\n 'submit both endpoint dependencies and a newer constraint revision',\n {\n entity: input.entity,\n constraintId: constraint.id,\n expected: `>${existing.input.revision}`,\n actual: constraint.revision,\n },\n );\n }\n }\n return undefined;\n }\n\n private constraintsForBody(entity: number): readonly PhysicsConstraintInput[] {\n return [...this.derivedConstraints.values()]\n .filter(\n (constraint) => constraint.input.bodyA === entity || constraint.input.bodyB === entity,\n )\n .map((constraint) => ({ ...constraint.input }));\n }\n\n private installDerivedConstraint(\n input: PhysicsConstraintInput,\n updating: boolean,\n ): ReturnType<NonNullable<PhysicsWorld['createDerivedConstraint']>> {\n this.assertActive(updating ? 'updateDerivedConstraint' : 'createDerivedConstraint');\n const validation = validateConstraintInput(input);\n if (!validation.ok) return validation;\n const dependencyError = this.validateConstraintDependencies(\n input,\n undefined,\n this.pendingDerivedSources(),\n );\n if (dependencyError !== undefined) return err(dependencyError);\n const existing = this.derivedConstraints.get(input.id);\n if (existing !== undefined && !updating) {\n return err(\n new DerivedPhysicsError(\n 'derived-constraint-stale',\n 'constraint identity is not already committed when creating it',\n 'call updateDerivedConstraint with a newer revision',\n { constraintId: input.id },\n ),\n );\n }\n if (existing !== undefined && input.revision <= existing.input.revision) {\n return err(\n new DerivedPhysicsError(\n 'derived-constraint-stale',\n 'constraint revision advances monotonically',\n 'submit a newer constraint revision',\n {\n constraintId: input.id,\n actual: input.revision,\n expected: `>${existing.input.revision}`,\n },\n ),\n );\n }\n const native = this.createNativeConstraint(input);\n if (!native.ok) return native;\n if (existing !== undefined) this.removeNativeConstraint(existing.handle);\n this.derivedConstraints.set(input.id, { input: { ...input }, handle: native.value.handle });\n return ok({ id: input.id, revision: input.revision });\n }\n\n private removeNativeConstraint(handle: number): void {\n try {\n const joint = (this.raw as RapierWorld).getImpulseJoint(handle);\n if (joint !== null && joint !== undefined)\n (this.raw as RapierWorld).removeImpulseJoint(joint, true);\n } catch {\n // Cleanup is idempotent across backend teardown and entity removal.\n }\n }\n\n getPendingTeleports(): readonly [\n number,\n { readonly x: number; readonly y: number; readonly z: number },\n ][] {\n return [...this.pendingTeleports].map(([entity, target]) => [entity, { ...target }]);\n }\n\n getKinematicControllerStates(): readonly Rapier3DKinematicControllerState[] {\n return [...this.kccOffsets]\n .sort(([first], [second]) => first - second)\n .map(([entity, offset]) => ({ entity, offset }));\n }\n\n dispose(): void {\n if (this.disposed) return;\n this.assertActive('dispose');\n this.invalidateDerivedShapeCandidates('physics-dispose');\n this.derivedCandidates.clear();\n this.pendingDerivedCandidates.clear();\n this.derivedBodies.clear();\n this.derivedBodySources.clear();\n this.derivedPublications.clear();\n this.derivedFailures.clear();\n this.derivedConstraints.clear();\n this.derivedContacts.length = 0;\n this.derivedPublicationPending = false;\n this.derivedPoisonedEntities.clear();\n this.derivedColliderToShape.clear();\n this.retiredDerivedBodies.length = 0;\n this.derivedCandidateBytes = 0;\n this.backendGeneration += 1;\n this.syncState = undefined;\n this.moveContext = undefined;\n if (typeof this.raw.free === 'function') this.raw.free();\n if (typeof this.eventQueue.free === 'function') this.eventQueue.free();\n this.entityMap.clear();\n this.pendingTeleports.clear();\n this.collisionPairs.clear();\n this.pendingCollisionEvents.length = 0;\n this.collisionEventHistory.length = 0;\n this.kccCache.clear();\n this.kccOffsets.clear();\n this.disposed = true;\n }\n\n getBodyCount(): number {\n return this.entityMap.size;\n }\n\n hasBody(entity: number): boolean {\n return this.entityMap.has(entity);\n }\n\n /**\n * Wire the ECS World + Transform / CharacterController components needed by\n * `moveAndSlide` to read tuning and write back pose + grounded. Called once by\n * `registerPhysicsSystems` (plan-strategy D-1/D-7).\n */\n setMoveContext(world: World, transform: Component, characterController: Component): void {\n this.assertActive('setMoveContext');\n this.moveContext = { world, transform, characterController };\n this.worldIdentity = world;\n }\n\n /** Release the persistent ECS readers owned by one system registration. */\n clearEcsContext(world: World): void {\n if (this.syncState?.world === world) this.syncState = undefined;\n if (this.moveContext?.world === world) this.moveContext = undefined;\n if (this.worldIdentity === world) this.worldIdentity = undefined;\n }\n\n moveAndSlide(entity: number, desiredDelta: Vec3): Vec3 {\n this.assertActive('moveAndSlide');\n return this.computeMove(entity, desiredDelta);\n }\n\n private assertActive(operation: string): void {\n if (this.activeDerivedAdmission !== undefined) {\n throw new DerivedPhysicsError(\n 'derived-candidate-pending',\n 'physics queries and mutations observe only complete fixed-step states',\n 'finish the paired geometry commit before querying or mutating physics',\n { entity: this.activeDerivedAdmission.input.entity, reason: operation },\n );\n }\n if (this.disposed) {\n throw new Error(`RapierPhysicsWorld3D.${operation} cannot run on a disposed instance`);\n }\n }\n\n /**\n * Shared moveAndSlide core (plan-strategy D-1/D-2/D-4/D-6/D-7).\n *\n * The three Fail-Fast entry checks (body / collider / kinematic) throw\n * structured PhysicsError before the World is read, so error-path tests can\n * call this without registered systems.\n */\n private computeMove(entity: number, desiredDelta: Vec3): Vec3 {\n // ── Fail-Fast entry checks (charter P3) ──\n const record = this.entityMap.get(entity);\n if (!record) {\n throw new PhysicsError({\n code: 'body-not-found',\n expected: 'a registered Rapier body for this entity',\n hint: PHYSICS_ERROR_HINTS['body-not-found'],\n detail: { code: 'body-not-found', entity },\n });\n }\n // biome-ignore lint/suspicious/noExplicitAny: Rapier bodies API needs any-cast\n const body = (this.raw as any).bodies.get(record.bodyHandle) as RapierRigidBody | null;\n if (!body) {\n throw new PhysicsError({\n code: 'body-not-found',\n expected: 'a registered Rapier body for this entity',\n hint: PHYSICS_ERROR_HINTS['body-not-found'],\n detail: { code: 'body-not-found', entity },\n });\n }\n if (body.numColliders() === 0) {\n // D-2: body exists but carries no collider — more precise than body-not-found.\n throw new PhysicsError({\n code: 'collider-not-found',\n expected: 'a Collider attached to this entity body',\n hint: PHYSICS_ERROR_HINTS['collider-not-found'],\n detail: { code: 'collider-not-found', entity },\n });\n }\n const RAPIER = this.rapierModule;\n if (body.bodyType() !== RAPIER.RigidBodyType.KinematicPositionBased) {\n throw new PhysicsError({\n code: 'controller-requires-kinematic',\n expected: \"RigidBody.type === 'kinematic'\",\n hint: PHYSICS_ERROR_HINTS['controller-requires-kinematic'],\n detail: {\n code: 'controller-requires-kinematic',\n entity,\n bodyType: rapierBodyTypeToString(RAPIER, body.bodyType()),\n },\n });\n }\n\n const collider = body.collider(0); // D-4: zero-schema reverse lookup\n\n // ── Read CharacterController tuning + lazily build/configure the KCC ──\n const cc = this.readCharacterController(entity);\n const ctrl = this.ensureKcc(entity, cc.offset);\n applyKccTuning(ctrl, cc);\n\n // ── Step 1: solve collisions (D-1 self-exclude predicate) ──\n // Rapier's filter predicate returns true to INCLUDE a collider as a\n // potential obstacle, false to skip it; this excludes the character's own\n // collider so it never collides with itself. EXCLUDE_SENSORS makes the KCC\n // treat sensor colliders as non-solid (their purpose is overlap detection,\n // not blocking) -- without it any sensor overlapping the character (e.g. a\n // pickup/attack trigger volume) walls the KCC and freezes it in place.\n const delta = { x: desiredDelta[0] ?? 0, y: desiredDelta[1] ?? 0, z: desiredDelta[2] ?? 0 };\n ctrl.computeColliderMovement(\n collider,\n delta,\n RAPIER.QueryFilterFlags.EXCLUDE_SENSORS,\n undefined,\n // biome-ignore lint/suspicious/noExplicitAny: Rapier Collider in filter predicate\n (other: any) => other.handle !== collider.handle,\n );\n\n // ── Step 2/3: read corrected movement + grounded ──\n const movement = ctrl.computedMovement() as { x: number; y: number; z: number };\n const grounded = ctrl.computedGrounded() as boolean;\n\n // ── Write back: push the kinematic body + ECS Transform + grounded ──\n const t = body.translation();\n const next = { x: t.x + movement.x, y: t.y + movement.y, z: t.z + movement.z };\n // setNextKinematicTranslation feeds the physics step pipeline; setTranslation\n // advances the body + its collider immediately so consecutive moveAndSlide\n // calls (without an intervening world.step) see the updated pose for the next\n // collision solve + grounded check. The query structures are refreshed so the\n // next computeColliderMovement reads the new position.\n body.setNextKinematicTranslation(next);\n body.setTranslation(next, true);\n // setTranslation marks the body modified but does not re-place its collider\n // in the collider set; propagate so the next computeColliderMovement\n // shape-casts the character from its updated pose.\n // biome-ignore lint/suspicious/noExplicitAny: Rapier World.propagateModifiedBodyPositionsToColliders\n (this.raw as any).propagateModifiedBodyPositionsToColliders();\n\n const ctx = this.moveContext;\n if (ctx) {\n // D-6: writeback Result ignored — entry checks already guard liveness.\n ctx.world.set(entity as EntityHandle, ctx.transform, {\n pos: [next.x, next.y, next.z],\n });\n ctx.world.set(entity as EntityHandle, ctx.characterController, { grounded });\n }\n\n return vec3.create(movement.x, movement.y, movement.z);\n }\n\n /**\n * Read CharacterController tuning fields for an entity from the ECS World,\n * falling back to schema defaults when the World is not wired (defensive;\n * the kinematic check upstream means a valid character always has the World).\n */\n private readCharacterController(entity: number): CharacterControllerTuning {\n const ctx = this.moveContext;\n if (ctx) {\n const r = ctx.world.get(entity as EntityHandle, ctx.characterController);\n if (r.ok) {\n const v = r.value as Record<string, number>;\n return {\n offset: v.offset as number,\n maxSlopeClimbDeg: v.maxSlopeClimbDeg as number,\n minSlopeSlideDeg: v.minSlopeSlideDeg as number,\n autoStepMaxHeight: v.autoStepMaxHeight as number,\n autoStepMinWidth: v.autoStepMinWidth as number,\n snapToGroundDist: v.snapToGroundDist as number,\n };\n }\n }\n // The ECS token owns the defaults; keep the defensive no-context path on\n // that projection so 3D cannot drift from the shared CharacterController schema.\n return componentDefinition(CharacterController)\n .defaults as unknown as CharacterControllerTuning;\n }\n\n /**\n * Lazily build a Rapier KinematicCharacterController for `entity` (cached).\n */\n // biome-ignore lint/suspicious/noExplicitAny: Rapier KinematicCharacterController from dynamic module\n private ensureKcc(entity: number, offset: number): any {\n const cached = this.kccCache.get(entity);\n if (cached) return cached;\n // biome-ignore lint/suspicious/noExplicitAny: Rapier World.createCharacterController\n const ctrl = (this.raw as any).createCharacterController(offset);\n this.kccCache.set(entity, ctrl);\n this.kccOffsets.set(entity, offset);\n return ctrl;\n }\n\n /** Remove backend rows whose Collider disappeared from the World query. */\n pruneMissingEntities(active: ReadonlySet<number>): void {\n for (const entity of this.entityMap.keys()) {\n if (!active.has(entity)) this.removeEntity(entity);\n }\n }\n\n private bodyForEntity(entity: number): RapierRigidBody | undefined {\n const record = this.entityMap.get(entity);\n if (!record) return undefined;\n // biome-ignore lint/suspicious/noExplicitAny: Rapier bodies API needs any-cast\n return ((this.raw as any).bodies.get(record.bodyHandle) as RapierRigidBody | null) ?? undefined;\n }\n\n private isCommittedFixedBody(entity: number): boolean {\n return this.bodyForEntity(entity)?.bodyType() === this.rapierModule.RigidBodyType.Fixed;\n }\n\n private reconcileTransformlessCompatibility(entity: number, staticByEcs: boolean): void {\n if (!staticByEcs || !this.isCommittedFixedBody(entity)) {\n this.removeEntity(entity);\n return;\n }\n // A fixed body cannot be controller-owned. Clear stale KCC state defensively\n // while retaining the already-committed body and collider receipt.\n this.removeKccController(entity);\n }\n\n private resetForFullReconcile(transformlessStatic: ReadonlySet<number>): void {\n // Without a descriptor/hash mirror, an overflow cannot prove which existing\n // Transform-backed body changed. Recreate those bodies from the final ECS\n // combination. Dynamic velocity/contact state is intentionally reset during\n // this recovery path so stale motion type or collider data cannot survive.\n for (const entity of [...this.entityMap.keys()]) {\n if (transformlessStatic.has(entity) && this.isCommittedFixedBody(entity)) {\n this.removeKccController(entity);\n continue;\n }\n this.removeEntity(entity);\n }\n }\n\n private fullReconcilePhysicsState(state: PhysicsSyncState): void {\n const descriptors: PhysicsSyncDescriptor[] = [];\n const transformlessStatic = new Set<number>();\n const committedDerived =\n this.derivedBodies.size > 0 ? this.captureDerivedPhysicsState() : undefined;\n for (const query of state.queries)\n for (const row of query) {\n if (!row.has(state.transformComponent)) {\n if (physicsRowIsStatic(row)) transformlessStatic.add(row.entity);\n continue;\n }\n const descriptor = readPhysicsSyncDescriptor(\n row,\n state.transformComponent,\n state.globalTransformComponent,\n );\n if (descriptor !== undefined) descriptors.push(descriptor);\n }\n\n this.resetForFullReconcile(transformlessStatic);\n for (const descriptor of descriptors) {\n this.ensureBody(\n descriptor.entity,\n descriptor.transform,\n descriptor.rigidBody,\n descriptor.collider,\n );\n }\n if (committedDerived !== undefined) {\n const restorableBodies = committedDerived.bodies.filter(\n (body) => this.entityMap.has(body.entity) && !this.derivedBodies.has(body.entity),\n );\n if (restorableBodies.length > 0) {\n const restorable = Object.freeze({\n ...committedDerived,\n bodies: Object.freeze(restorableBodies),\n });\n const restored = this.restoreDerivedPhysicsState(restorable);\n if (!restored.ok) {\n // A full ECS rebuild has already replaced native bodies. Keep the\n // rebuilt ordinary state queryable, but do not expose a mixed derived\n // result: pending candidates are invalidated and the next consumer\n // submission is the explicit recovery boundary.\n this.invalidateDerivedShapeCandidates('full-reconcile-restore-failed');\n }\n }\n }\n drainPhysicsChangeQueries(state.changeQueries);\n state.structuralCursor = readStructuralEvidence(state.world, state.structuralCursor).cursor;\n state.structureEpoch = state.world.getStructureEpoch();\n state.initialized = true;\n }\n\n private reconcilePhysicsDelta(\n state: PhysicsSyncState,\n entity: EntityHandle,\n delta: PhysicsEntityDelta,\n ): void {\n const row = state.queries.map((query) => query.at(entity)).find((entry) => entry !== undefined);\n if (row === undefined) {\n this.removeEntity(entity);\n return;\n }\n if (!row.has(state.transformComponent)) {\n // A lifecycle mutation cannot be applied without a pose. Keep only the\n // narrow migration case where Transform alone disappeared from an already\n // committed fixed body; never create or reshape a Transform-less row.\n if (delta.colliderChanged || delta.rigidBodyChanged) {\n this.removeEntity(entity);\n return;\n }\n this.reconcileTransformlessCompatibility(entity, physicsRowIsStatic(row));\n return;\n }\n\n const descriptor = readPhysicsSyncDescriptor(\n row,\n state.transformComponent,\n state.globalTransformComponent,\n );\n if (descriptor === undefined) {\n this.removeEntity(entity);\n return;\n }\n\n if (this.hasBody(entity) && (delta.colliderChanged || delta.rigidBodyChanged)) {\n // Derived shapes share this body and must survive ordinary authored\n // component changes. Update the base collider/body in place; entities\n // without a derived publication retain the legacy replacement path.\n if (this.derivedBodies.has(entity)) {\n this.syncDerivedCompatibleEcsMutation(entity, descriptor);\n } else {\n this.removeEntity(entity);\n }\n }\n if (!this.hasBody(entity)) {\n this.ensureBody(entity, descriptor.transform, descriptor.rigidBody, descriptor.collider);\n return;\n }\n\n if (delta.characterControllerChanged) {\n const cachedOffset = this.kccOffsets.get(entity);\n const hadCachedReceipt = this.kccCache.has(entity);\n const finalOffset = descriptor.characterControllerOffset;\n if (!descriptor.hasCharacterController) {\n this.removeKccController(entity);\n } else if (\n hadCachedReceipt &&\n (finalOffset === undefined || !Object.is(cachedOffset, finalOffset))\n ) {\n // Component removal is structural and reaches the full reconcile path.\n // A value change only rebuilds the receipt when its effective offset changed.\n this.removeKccController(entity);\n if (finalOffset !== undefined) this.ensureKcc(entity, finalOffset);\n }\n }\n if (\n !delta.transformChanged &&\n !(delta.characterControllerStructureChanged && !descriptor.hasCharacterController)\n ) {\n return;\n }\n\n const bodyType = rigidBodyTypeFromF32(descriptor.rigidBody.type);\n if (bodyType === 'static') {\n this.syncAuthoredPose(entity, descriptor.transform, descriptor.collider, 'static');\n } else if (bodyType === 'kinematic' && !descriptor.hasCharacterController) {\n this.syncAuthoredPose(entity, descriptor.transform, descriptor.collider, 'kinematic');\n }\n }\n\n private syncDerivedCompatibleEcsMutation(\n entity: number,\n descriptor: PhysicsSyncDescriptor,\n ): void {\n const body = this.bodyForEntity(entity);\n if (body === undefined) return;\n const bodyType = rigidBodyTypeFromF32(descriptor.rigidBody.type);\n const RAPIER = this.rapierModule as RapierWorld;\n // The native body is shared, but authored and derived colliders have\n // distinct owners. Never address an authored collider by array position.\n for (const collider of this.bodyColliders(body)) {\n if (!this.derivedColliderToShape.has(collider.handle)) {\n (this.raw as RapierWorld).removeCollider(collider, true);\n }\n }\n const committed = this.derivedBodies.get(entity);\n const record = this.entityMap.get(entity);\n if (record !== undefined) record.authoredDensity = descriptor.collider?.density;\n if (descriptor.collider !== undefined) {\n this.createAuthoredCollider(body, descriptor.transform, {\n ...descriptor.collider,\n density: committed?.massProperties?.mode === 'explicit' ? 0 : descriptor.collider.density,\n });\n }\n if (bodyType === 'static') {\n body.setBodyType(RAPIER.RigidBodyType.Fixed, true);\n this.syncAuthoredPose(entity, descriptor.transform, descriptor.collider, 'static');\n } else if (bodyType === 'kinematic') {\n body.setBodyType(RAPIER.RigidBodyType.KinematicPositionBased, true);\n this.syncAuthoredPose(entity, descriptor.transform, descriptor.collider, 'kinematic');\n } else {\n body.setBodyType(RAPIER.RigidBodyType.Dynamic, true);\n if (record !== undefined) record.additionalMass = Math.max(0, descriptor.rigidBody.mass);\n if (committed?.massProperties?.mode !== 'explicit') {\n this.restoreAutomaticMass(body, record?.additionalMass ?? 0);\n if (record !== undefined) record.automaticAdditionalMass = record.additionalMass;\n }\n body.setGravityScale(descriptor.rigidBody.gravityScale, true);\n body.setLinearDamping(descriptor.rigidBody.linearDamping);\n body.setAngularDamping(descriptor.rigidBody.angularDamping);\n }\n body.enableCcd(Boolean(descriptor.rigidBody.ccdEnabled));\n if (committed?.massProperties?.mode === 'explicit') {\n this.restoreCommittedMass(body, committed, 0);\n }\n }\n\n /** @internal ECS system bridge; consumers should register PhysicsSyncBackend. */\n _syncFromEcs(\n world: World,\n transformComponent: Component,\n globalTransformComponent = world.components.resolve('GlobalTransform'),\n ): void {\n this.assertActive('syncFromEcs');\n this.worldIdentity = world;\n if (globalTransformComponent === undefined) return;\n let state = this.syncState;\n if (\n state === undefined ||\n state.world !== world ||\n state.transformComponent !== transformComponent ||\n state.globalTransformComponent !== globalTransformComponent\n ) {\n const queryResult = world.query({\n read: [Collider],\n optional: [\n transformComponent,\n globalTransformComponent,\n RigidBody,\n CharacterController,\n ChildOf,\n ],\n });\n if (!queryResult.ok) return;\n const bodyQuery = world.query({\n read: [RigidBody],\n without: [Collider],\n optional: [transformComponent, globalTransformComponent, CharacterController, ChildOf],\n });\n if (!bodyQuery.ok) throw bodyQuery.error;\n state = {\n world,\n transformComponent,\n globalTransformComponent,\n queries: [queryResult.value, bodyQuery.value] as unknown as readonly PhysicsSyncQuery[],\n changeQueries: createPhysicsChangeQueries(world, [\n transformComponent,\n globalTransformComponent,\n Collider,\n RigidBody,\n CharacterController,\n ChildOf,\n ]),\n structuralCursor: readStructuralEvidence(world, 0).cursor,\n structureEpoch: world.getStructureEpoch(),\n initialized: false,\n };\n this.syncState = state;\n }\n\n if (!state.initialized) {\n this.fullReconcilePhysicsState(state);\n return;\n }\n\n const deltas = new Map<EntityHandle, PhysicsEntityDelta>();\n if (state.structureEpoch !== world.getStructureEpoch()) {\n const structural = readStructuralEvidence(world, state.structuralCursor);\n state.structuralCursor = structural.cursor;\n state.structureEpoch = world.getStructureEpoch();\n if (structural.status === 'overflow') {\n this.fullReconcilePhysicsState(state);\n return;\n }\n\n const transformId = componentId(transformComponent);\n const globalTransformId = componentId(globalTransformComponent);\n const colliderId = componentId(Collider);\n const rigidBodyId = componentId(RigidBody);\n const characterControllerId = componentId(CharacterController);\n const childOfId = componentId(ChildOf);\n const disabledId = componentId(Disabled);\n for (const evidence of structural.events) {\n const id = evidence.componentId;\n if (\n evidence.kind !== 'spawn' &&\n evidence.kind !== 'despawn' &&\n id !== transformId &&\n id !== globalTransformId &&\n id !== colliderId &&\n id !== rigidBodyId &&\n id !== characterControllerId &&\n id !== childOfId &&\n id !== disabledId\n ) {\n continue;\n }\n const delta = ensurePhysicsDelta(deltas, evidence.entity);\n if (evidence.kind === 'spawn' || evidence.kind === 'despawn') {\n delta.transformChanged = true;\n delta.colliderChanged = true;\n delta.rigidBodyChanged = true;\n delta.characterControllerChanged = true;\n delta.characterControllerStructureChanged = true;\n } else if (id === transformId || id === globalTransformId || id === childOfId) {\n delta.transformChanged = true;\n } else if (id === colliderId || id === disabledId) {\n delta.colliderChanged = true;\n } else if (id === rigidBodyId) {\n delta.rigidBodyChanged = true;\n } else if (id === characterControllerId) {\n delta.characterControllerChanged = true;\n delta.characterControllerStructureChanged = true;\n }\n }\n }\n\n for (const entry of state.changeQueries) {\n for (const span of entry.query.spans().unwrap()) {\n for (const rawEntity of span.entities) {\n const entity = rawEntity as EntityHandle;\n const delta = ensurePhysicsDelta(deltas, entity);\n if (\n entry.component === transformComponent ||\n entry.component === globalTransformComponent ||\n entry.component === ChildOf\n ) {\n delta.transformChanged = true;\n } else if (entry.component === Collider) {\n delta.colliderChanged = true;\n } else if (entry.component === RigidBody) {\n delta.rigidBodyChanged = true;\n } else if (entry.component === CharacterController) {\n delta.characterControllerChanged = true;\n }\n }\n }\n }\n\n if (deltas.size === 0) return;\n\n for (const [entity, delta] of deltas) this.reconcilePhysicsDelta(state, entity, delta);\n }\n\n /**\n * Remove an entity's cached KCC and unregister it from the Rapier world\n * (plan-strategy D-3). Idempotent — safe for entities that never moved.\n */\n removeKccController(entity: number): void {\n const ctrl = this.kccCache.get(entity);\n this.kccOffsets.delete(entity);\n if (!ctrl) return;\n // biome-ignore lint/suspicious/noExplicitAny: Rapier World.removeCharacterController\n (this.raw as any).removeCharacterController(ctrl);\n this.kccCache.delete(entity);\n }\n\n // ─── ECS→Rapier bridge (D-2) ──────────────────────────────────────────\n\n /**\n * Ensure a Rapier body and collider exist for an ECS entity (idempotent).\n *\n * When `entityMap` already contains the entity this returns immediately.\n * Otherwise creates a Rapier RigidBody (dynamic / fixed / kinematic) +\n * Collider (cuboid / ball / capsule) from the ECS component data, sets\n * `body.userData = entity`, and registers the pairing via `registerBody`.\n *\n * @param entity Raw ECS entity number (stored in Rapier body.userData).\n * @param transform ECS Transform fields: { posX, posY, posZ, ... }.\n * @param rigidBody ECS RigidBody fields: { type (enum num), mass, ... }.\n * @param collider ECS Collider fields: { shape (enum num), radius, ... }.\n *\n * Plan-strategy D-2 + D-3: enum→Rapier desc mapping consumes\n * rigidBodyTypeFromF32 / colliderShapeFromF32 helpers; closed switch with\n * no default — TypeScript enforces exhaustiveness on the string-union arms.\n */\n ensureBody(\n entity: number,\n transform: PhysicsTransform3D,\n rigidBody: {\n type: number;\n mass: number;\n linearDamping: number;\n angularDamping: number;\n gravityScale: number;\n ccdEnabled: number;\n },\n collider: PhysicsCollider3D | undefined,\n ): void {\n this.assertActive('ensureBody');\n if (this.entityMap.has(entity)) return; // M1 idempotent guard (D-2)\n\n const RAPIER = this.rapierModule;\n\n // ── Create RigidBodyDesc ──\n const rbType = rigidBodyTypeFromF32(rigidBody.type);\n let body: RapierRigidBody;\n switch (rbType) {\n case 'dynamic': {\n // biome-ignore lint/suspicious/noExplicitAny: Rapier RigidBodyDesc\n const desc = (RAPIER as any).RigidBodyDesc.dynamic()\n .setTranslation(transform.position.x, transform.position.y, transform.position.z)\n .setRotation(transform.rotation)\n .setLinearDamping(rigidBody.linearDamping)\n .setAngularDamping(rigidBody.angularDamping)\n .setGravityScale(rigidBody.gravityScale);\n if (rigidBody.mass > 0) {\n desc.setAdditionalMass(rigidBody.mass);\n }\n if (rigidBody.ccdEnabled) {\n desc.setCcdEnabled(true);\n }\n // biome-ignore lint/suspicious/noExplicitAny: Rapier World.createRigidBody\n body = (this.raw as any).createRigidBody(desc);\n break;\n }\n case 'static': {\n // biome-ignore lint/suspicious/noExplicitAny: Rapier RigidBodyDesc\n const desc = (RAPIER as any).RigidBodyDesc.fixed()\n .setTranslation(transform.position.x, transform.position.y, transform.position.z)\n .setRotation(transform.rotation);\n // biome-ignore lint/suspicious/noExplicitAny: Rapier World.createRigidBody\n body = (this.raw as any).createRigidBody(desc);\n break;\n }\n case 'kinematic': {\n // biome-ignore lint/suspicious/noExplicitAny: Rapier RigidBodyDesc\n const desc = (RAPIER as any).RigidBodyDesc.kinematicPositionBased()\n .setTranslation(transform.position.x, transform.position.y, transform.position.z)\n .setRotation(transform.rotation);\n // CCD sweeps the collider along its per-step kinematic translation so a\n // fast mover (player, bullet) reliably contacts dynamics instead of\n // tunneling through them on discrete steps.\n if (rigidBody.ccdEnabled) {\n desc.setCcdEnabled(true);\n }\n // biome-ignore lint/suspicious/noExplicitAny: Rapier World.createRigidBody\n body = (this.raw as any).createRigidBody(desc);\n break;\n }\n // No default — rigidBodyTypeFromF32 ensures only 3 arms; TS guards completeness.\n }\n\n body.userData = entity;\n this.registerBody(\n entity,\n body.handle,\n rbType === 'dynamic' ? Math.max(0, rigidBody.mass) : 0,\n collider?.density,\n );\n if (collider === undefined) {\n const record = this.entityMap.get(entity);\n if (record !== undefined) record.automaticAdditionalMass = record.additionalMass;\n return;\n }\n\n this.createAuthoredCollider(body, transform, collider);\n }\n\n private createAuthoredCollider(\n body: RapierRigidBody,\n transform: PhysicsTransform3D,\n collider: PhysicsCollider3D,\n ): void {\n const RAPIER = this.rapierModule;\n // ── Create ColliderDesc ──\n const scaleX = Math.abs(transform.scale.x);\n const scaleY = Math.abs(transform.scale.y);\n const scaleZ = Math.abs(transform.scale.z);\n // Enable collision events + all body-type combinations so sensors register\n // overlaps against kinematic/fixed bodies too (the default omits non-dynamic\n // pairs, which would silence kinematic-sensor-vs-kinematic-body pickup).\n // biome-ignore lint/suspicious/noExplicitAny: Rapier enums from dynamic module\n const activeEvents = (RAPIER as any).ActiveEvents.COLLISION_EVENTS as number;\n // biome-ignore lint/suspicious/noExplicitAny: Rapier enums from dynamic module\n const activeCollisionTypes = (RAPIER as any).ActiveCollisionTypes.ALL as number;\n const cShape = colliderShapeFromF32(collider.shape);\n switch (cShape) {\n case 'cuboid': {\n // biome-ignore lint/suspicious/noExplicitAny: Rapier ColliderDesc\n const desc = (RAPIER as any).ColliderDesc.cuboid(\n collider.halfExtents[0] * scaleX,\n collider.halfExtents[1] * scaleY,\n collider.halfExtents[2] * scaleZ,\n )\n .setFriction(collider.friction)\n .setRestitution(collider.restitution)\n .setDensity(collider.density)\n .setCollisionGroups(collider.collisionGroups)\n .setSolverGroups(collider.solverGroups)\n .setActiveEvents(activeEvents)\n .setActiveCollisionTypes(activeCollisionTypes);\n if (collider.isSensor) desc.setSensor(true);\n // biome-ignore lint/suspicious/noExplicitAny: Rapier World.createCollider\n (this.raw as any).createCollider(desc, body);\n break;\n }\n case 'sphere': {\n // biome-ignore lint/suspicious/noExplicitAny: Rapier ColliderDesc\n const desc = (RAPIER as any).ColliderDesc.ball(\n collider.radius * Math.max(scaleX, scaleY, scaleZ),\n )\n .setFriction(collider.friction)\n .setRestitution(collider.restitution)\n .setDensity(collider.density)\n .setCollisionGroups(collider.collisionGroups)\n .setSolverGroups(collider.solverGroups)\n .setActiveEvents(activeEvents)\n .setActiveCollisionTypes(activeCollisionTypes);\n if (collider.isSensor) desc.setSensor(true);\n // biome-ignore lint/suspicious/noExplicitAny: Rapier World.createCollider\n (this.raw as any).createCollider(desc, body);\n break;\n }\n case 'capsule': {\n // biome-ignore lint/suspicious/noExplicitAny: Rapier ColliderDesc\n const desc = (RAPIER as any).ColliderDesc.capsule(\n collider.halfHeight * scaleY,\n collider.radius * Math.max(scaleX, scaleZ),\n )\n .setFriction(collider.friction)\n .setRestitution(collider.restitution)\n .setDensity(collider.density)\n .setCollisionGroups(collider.collisionGroups)\n .setSolverGroups(collider.solverGroups)\n .setActiveEvents(activeEvents)\n .setActiveCollisionTypes(activeCollisionTypes);\n if (collider.isSensor) desc.setSensor(true);\n // biome-ignore lint/suspicious/noExplicitAny: Rapier World.createCollider\n (this.raw as any).createCollider(desc, body);\n break;\n }\n // No default — colliderShapeFromF32 ensures only 3 arms; TS guards completeness.\n }\n }\n\n /**\n * Synchronize a static or kinematic body's Rapier pose and collider shape from\n * the resolved Transform pose. Dynamic bodies own their pose after creation.\n */\n syncAuthoredPose(\n entity: number,\n transform: PhysicsTransform3D,\n collider: PhysicsCollider3D | undefined,\n bodyType: 'static' | 'kinematic',\n ): void {\n this.assertActive('syncAuthoredPose');\n const record = this.entityMap.get(entity);\n if (!record) return;\n // biome-ignore lint/suspicious/noExplicitAny: Rapier bodies API needs any-cast\n const body = (this.raw as any).bodies.get(record.bodyHandle) as RapierRigidBody | null;\n if (!body) return;\n\n if (bodyType === 'static') {\n body.setTranslation(transform.position, true);\n body.setRotation(transform.rotation, true);\n } else {\n body.setNextKinematicTranslation(transform.position);\n body.setNextKinematicRotation(transform.rotation);\n }\n\n if (collider === undefined) return;\n const rapierCollider = this.bodyColliders(body).find(\n (shape) => !this.derivedColliderToShape.has(shape.handle),\n );\n if (!rapierCollider) return;\n const scaleX = Math.abs(transform.scale.x);\n const scaleY = Math.abs(transform.scale.y);\n const scaleZ = Math.abs(transform.scale.z);\n switch (colliderShapeFromF32(collider.shape)) {\n case 'cuboid':\n rapierCollider.setHalfExtents({\n x: collider.halfExtents[0] * scaleX,\n y: collider.halfExtents[1] * scaleY,\n z: collider.halfExtents[2] * scaleZ,\n });\n break;\n case 'sphere':\n rapierCollider.setRadius(collider.radius * Math.max(scaleX, scaleY, scaleZ));\n break;\n case 'capsule':\n rapierCollider.setHalfHeight(collider.halfHeight * scaleY);\n rapierCollider.setRadius(collider.radius * Math.max(scaleX, scaleZ));\n break;\n }\n }\n\n // ─── ECS integration helpers ───────────────────────────────────────────\n\n /**\n * Register an ECS entity with its Rapier body handle.\n */\n registerBody(\n entity: number,\n bodyHandle: number,\n additionalMass = 0,\n authoredDensity?: number,\n ): void {\n this.entityMap.set(entity, {\n bodyHandle,\n additionalMass: Math.max(0, additionalMass),\n // `ensureBody` registers before its authored collider is attached.\n // Rapier recomputes the body from that collider and clears the\n // descriptor-only additional mass, so the native baseline is zero.\n // A later automatic derived admission records the actual additional\n // contribution after it has been applied. Keeping this separate from\n // `additionalMass` lets rollback restore native state rather than an\n // authored value that Rapier has not applied yet.\n automaticAdditionalMass: 0,\n authoredDensity:\n authoredDensity !== undefined && Number.isFinite(authoredDensity) && authoredDensity >= 0\n ? authoredDensity\n : undefined,\n });\n if (!this.derivedBodySources.has(entity)) {\n this.derivedBodySources.set(entity, { sourceKey: `entity:${entity}`, revision: 0 });\n }\n }\n\n /**\n * Apply all pending teleports to their respective bodies.\n */\n applyPendingTeleports(): void {\n for (const [entity, target] of this.pendingTeleports) {\n const record = this.entityMap.get(entity);\n if (!record) continue;\n // biome-ignore lint/suspicious/noExplicitAny: Rapier bodies API needs any-cast\n const body = (this.raw as any).bodies.get(record.bodyHandle) as RapierRigidBody | null;\n if (!body) continue;\n\n body.setTranslation({ x: target.x, y: target.y, z: target.z }, true);\n body.setLinvel({ x: 0, y: 0, z: 0 }, false);\n body.setAngvel({ x: 0, y: 0, z: 0 }, false);\n }\n this.pendingTeleports.clear();\n }\n\n /**\n * Set a kinematic body's next position from ECS transform.\n */\n setKinematicPosition(entity: number, pos: { x: number; y: number; z: number }): void {\n const record = this.entityMap.get(entity);\n if (!record) return;\n // biome-ignore lint/suspicious/noExplicitAny: Rapier bodies API needs any-cast\n const body = (this.raw as any).bodies.get(record.bodyHandle) as RapierRigidBody | null;\n if (!body) return;\n body.setNextKinematicTranslation({ x: pos.x, y: pos.y, z: pos.z });\n }\n\n /**\n * Write Rapier dynamic body poses back.\n */\n writebackDynamicBodies(): Array<{\n entity: number;\n pos: { x: number; y: number; z: number };\n rotation: { x: number; y: number; z: number; w: number };\n }> {\n const results: Array<{\n entity: number;\n pos: { x: number; y: number; z: number };\n rotation: { x: number; y: number; z: number; w: number };\n }> = [];\n for (const [entity, record] of this.entityMap) {\n // biome-ignore lint/suspicious/noExplicitAny: Rapier bodies API needs any-cast\n const body = (this.raw as any).bodies.get(record.bodyHandle) as RapierRigidBody | null;\n if (!body) continue;\n if (body.bodyType() !== this.rapierModule.RigidBodyType.Dynamic) continue;\n const translation = body.translation();\n const rotation = body.rotation();\n results.push({\n entity,\n pos: { x: translation.x, y: translation.y, z: translation.z },\n rotation: { x: rotation.x, y: rotation.y, z: rotation.z, w: rotation.w },\n });\n }\n return results;\n }\n\n /**\n * Remove a Rapier body and its colliders when the ECS entity is despawned.\n */\n removeEntity(entity: number): void {\n const record = this.entityMap.get(entity);\n if (!record) return;\n const derived = this.derivedBodies.get(entity);\n if (derived !== undefined) {\n for (const shape of derived.shapes) this.removeNativeCollider(shape.colliderHandle);\n this.derivedBodies.delete(entity);\n this.derivedPublications.delete(entity);\n }\n this.derivedFailures.delete(entity);\n this.derivedPoisonedEntities.delete(entity);\n for (const [id, constraint] of this.derivedConstraints) {\n if (constraint.input.bodyA === entity || constraint.input.bodyB === entity) {\n this.removeNativeConstraint(constraint.handle);\n this.derivedConstraints.delete(id);\n }\n }\n for (const [id, candidate] of this.derivedCandidates) {\n if (candidate.input.entity !== entity) continue;\n for (const collider of candidate.nativeColliders) this.removeNativeCollider(collider.handle);\n this.pendingDerivedCandidates.delete(id);\n this.releaseDerivedCandidate(id);\n }\n const ownPairs = [...(this.collisionPairs.get(entity) ?? [])];\n for (const other of ownPairs) {\n if (this.removePair(entity, other)) {\n this.pushCollisionEvent({ type: 'stopped', entityA: entity, entityB: other });\n }\n }\n this.removeKccController(entity); // D-3: clear cached KCC before body removal\n // biome-ignore lint/suspicious/noExplicitAny: Rapier World.removeRigidBody\n (this.raw as any).removeRigidBody({ handle: record.bodyHandle } as RapierRigidBody);\n this.entityMap.delete(entity);\n this.derivedBodySources.delete(entity);\n // Clear the despawned entity from every overlap set so a collected Core does\n // not linger in the player's CollidingEntities (Rapier emits no `stopped`\n // event when a collider is removed mid-overlap).\n const own = this.collisionPairs.get(entity);\n if (own) {\n for (const other of own) this.collisionPairs.get(other)?.delete(entity);\n this.collisionPairs.delete(entity);\n }\n }\n}\n\n/**\n * Create a new RapierPhysicsWorld3D instance.\n */\nexport function createRapier3DPhysicsWorld(rapier: Rapier3DModule): RapierPhysicsWorld3D {\n return new RapierPhysicsWorld3D(rapier);\n}\n\nfunction hasReadableWorldPose(world: Float32Array | undefined): world is Float32Array {\n return world !== undefined && world.length >= 16;\n}\n\n/** dt upper bound (plan-strategy D-4): skip step if dt exceeds this. */\nconst PHYSICS_DT_MAX = 0.1;\nconst poseScratchPosition = vec3.create();\nconst poseScratchRotation = quat.create();\nconst poseScratchScale = vec3.create();\nconst poseScratchWorld = new Float32Array(16);\n\nfunction physicsRowIsStatic(row: PhysicsSyncQueryRow): boolean {\n if (!row.has(RigidBody)) return true;\n const rigidBody = row.get(RigidBody) as { readonly type: number } | undefined;\n return rigidBody !== undefined && rigidBodyTypeFromF32(rigidBody.type) === 'static';\n}\n\nfunction readPhysicsSyncDescriptor(\n row: PhysicsSyncQueryRow,\n transformComponent: Component,\n globalTransformComponent: Component,\n): PhysicsSyncDescriptor | undefined {\n const transformData = row.get(transformComponent) as\n | {\n readonly pos: Float32Array;\n readonly quat: Float32Array;\n readonly scale: Float32Array;\n }\n | undefined;\n const globalTransformData = row.get(globalTransformComponent) as\n | { readonly world: Float32Array }\n | undefined;\n const colliderData = (row.has(Collider) ? row.get(Collider) : undefined) as\n | {\n readonly shape: number;\n readonly halfExtents: Float32Array;\n readonly radius: number;\n readonly halfHeight: number;\n readonly friction: number;\n readonly restitution: number;\n readonly density: number;\n readonly isSensor: number | boolean;\n readonly collisionGroups: number;\n readonly solverGroups: number;\n }\n | undefined;\n if (transformData === undefined || (colliderData === undefined && !row.has(RigidBody)))\n return undefined;\n\n // Root-local TRS is already a world pose. A ChildOf row, however, must use\n // Scene's derived GlobalTransform world matrix. Matrix contents cannot be a\n // validity sentinel: a legitimate parent/local composition can resolve to\n // identity.\n const useWorldPose = row.has(ChildOf) && hasReadableWorldPose(globalTransformData?.world);\n if (useWorldPose) {\n poseScratchWorld.set(globalTransformData.world);\n mat4.decompose(poseScratchPosition, poseScratchRotation, poseScratchScale, poseScratchWorld);\n } else {\n poseScratchPosition[0] = transformData.pos[0] ?? 0;\n poseScratchPosition[1] = transformData.pos[1] ?? 0;\n poseScratchPosition[2] = transformData.pos[2] ?? 0;\n poseScratchRotation[0] = transformData.quat[0] ?? 0;\n poseScratchRotation[1] = transformData.quat[1] ?? 0;\n poseScratchRotation[2] = transformData.quat[2] ?? 0;\n poseScratchRotation[3] = transformData.quat[3] ?? 1;\n poseScratchScale[0] = transformData.scale[0] ?? 1;\n poseScratchScale[1] = transformData.scale[1] ?? 1;\n poseScratchScale[2] = transformData.scale[2] ?? 1;\n }\n\n const rigidBodyData = row.has(RigidBody)\n ? (row.get(RigidBody) as\n | {\n readonly type: number;\n readonly mass: number;\n readonly linearDamping: number;\n readonly angularDamping: number;\n readonly gravityScale: number;\n readonly ccdEnabled: number | boolean;\n }\n | undefined)\n : undefined;\n const characterControllerData = row.has(CharacterController)\n ? (row.get(CharacterController) as { readonly offset: number } | undefined)\n : undefined;\n\n return {\n entity: row.entity,\n transform: {\n position: {\n x: poseScratchPosition[0] ?? 0,\n y: poseScratchPosition[1] ?? 0,\n z: poseScratchPosition[2] ?? 0,\n },\n rotation: {\n x: poseScratchRotation[0] ?? 0,\n y: poseScratchRotation[1] ?? 0,\n z: poseScratchRotation[2] ?? 0,\n w: poseScratchRotation[3] ?? 1,\n },\n scale: {\n x: poseScratchScale[0] ?? 1,\n y: poseScratchScale[1] ?? 1,\n z: poseScratchScale[2] ?? 1,\n },\n },\n rigidBody:\n rigidBodyData === undefined\n ? {\n type: RIGID_BODY_TYPE_STATIC,\n mass: 0,\n linearDamping: 0,\n angularDamping: 0,\n gravityScale: 1,\n ccdEnabled: 0,\n }\n : {\n type: rigidBodyData.type,\n mass: rigidBodyData.mass,\n linearDamping: rigidBodyData.linearDamping,\n angularDamping: rigidBodyData.angularDamping,\n gravityScale: rigidBodyData.gravityScale,\n ccdEnabled: Number(rigidBodyData.ccdEnabled),\n },\n collider:\n colliderData === undefined\n ? undefined\n : {\n shape: colliderData.shape,\n halfExtents: [\n colliderData.halfExtents[0] ?? 0,\n colliderData.halfExtents[1] ?? 0,\n colliderData.halfExtents[2] ?? 0,\n ],\n radius: colliderData.radius,\n halfHeight: colliderData.halfHeight,\n friction: colliderData.friction,\n restitution: colliderData.restitution,\n density: colliderData.density,\n isSensor: Number(colliderData.isSensor),\n collisionGroups: colliderData.collisionGroups,\n solverGroups: colliderData.solverGroups,\n },\n hasCharacterController: row.has(CharacterController),\n characterControllerOffset: characterControllerData?.offset,\n };\n}\n\n// ── System name constants ──\nconst PHYSICS_SYNC_BACKEND = 'physicsSyncBackend' as const;\nconst PHYSICS_STEP_SIMULATION = 'physicsStepSimulation' as const;\nconst PHYSICS_WRITEBACK = 'physicsWriteback' as const;\nconst PHYSICS_COLLISION_SYNC = 'physicsCollisionSync' as const;\n\n/**\n * Resolve the runtime `Transform` component token from the World-local ECS\n * registry (M2 — full resource-ification, D-3). physics already depends on\n * `@forgeax/engine-ecs`, so the catalog introduces no new dependency\n * and replaces the closure-captured `transformComponent` second parameter.\n * Returns `undefined` when Transform is not yet defined (the runtime package\n * defines it on import); callers early-out.\n */\nfunction resolveTransform(world: World): Component | undefined {\n return world.components.resolve('Transform');\n}\n\n/**\n * `physicsSyncBackend` system token (M2 — full resource-ification, D-4).\n *\n * After propagateTransforms, bootstrap/recovery performs one complete Collider\n * reconcile. Warm ticks poll the existing ECS projection and identity-read only\n * final changed rows. Bare Colliders remain implicit static bodies; Transform-less\n * fixed bodies are retained only as a migration defense and are never created.\n * Reads `world` from its first parameter; resolves Transform via the global\n * registry. Labelled `'physics'`.\n */\nexport const PhysicsSyncBackend: SystemHandle<readonly []> = defineSystem({\n name: PHYSICS_SYNC_BACKEND,\n queries: [],\n after: ['propagateTransformsFixed'],\n fn: (world) => {\n const transformComponent = resolveTransform(world);\n const globalTransformComponent = world.components.resolve('GlobalTransform');\n if (transformComponent === undefined || globalTransformComponent === undefined) return;\n let pw: RapierPhysicsWorld3D;\n try {\n pw = world.getResource<RapierPhysicsWorld3D>('PhysicsWorld');\n } catch {\n return; // C-2: PhysicsWorld resource not yet ready — safe early out\n }\n\n pw.applyPendingTeleports();\n pw._syncFromEcs(world, transformComponent, globalTransformComponent);\n },\n});\n\n/**\n * `physicsStepSimulation` system token (M2 — full resource-ification, D-4).\n *\n * After physicsSyncBackend — read FixedTime.delta and call pw.step() with dt-gating.\n */\nexport const PhysicsStepSimulation: SystemHandle<readonly []> = defineSystem({\n name: PHYSICS_STEP_SIMULATION,\n queries: [],\n after: [PHYSICS_SYNC_BACKEND],\n fn: (world) => {\n let pw: RapierPhysicsWorld3D;\n try {\n pw = world.getResource<RapierPhysicsWorld3D>('PhysicsWorld');\n } catch {\n return; // C-2: safe early out\n }\n\n const dt = world.getResource(FixedTime).delta;\n if (dt <= 0 || dt > PHYSICS_DT_MAX) return; // D-4: skip abnormal delta\n\n pw.step(dt);\n },\n});\n\n/**\n * `physicsWriteback` system token (M2 — full resource-ification, D-4).\n *\n * After physicsStepSimulation — call pw.writebackDynamicBodies() and write\n * positions back to ECS Transform (resolved via the global registry, D-3).\n */\nexport const PhysicsWriteback: SystemHandle<readonly []> = defineSystem({\n name: PHYSICS_WRITEBACK,\n queries: [],\n after: [PHYSICS_STEP_SIMULATION],\n fn: (world) => {\n const transformComponent = resolveTransform(world);\n if (transformComponent === undefined) return;\n let pw: RapierPhysicsWorld3D;\n try {\n pw = world.getResource<RapierPhysicsWorld3D>('PhysicsWorld');\n } catch {\n return; // C-2: safe early out\n }\n\n const results = pw.writebackDynamicBodies();\n for (const r of results) {\n const entity = r.entity as EntityHandle;\n world.set(entity, transformComponent, {\n pos: [r.pos.x, r.pos.y, r.pos.z],\n quat: [r.rotation.x, r.rotation.y, r.rotation.z, r.rotation.w],\n });\n }\n },\n});\n\n/**\n * `physicsCollisionSync` system token — writes the drained overlap set into each\n * entity's `CollidingEntities` component (the contact/sensor set-query path).\n *\n * Runs after writeback so the component reflects this step's contacts. Without\n * it the `CollidingEntities` component documented in the physics README never\n * updates (the event queue was drained-on-overflow only), so sensor pickup +\n * proximity queries silently saw an empty set.\n */\nexport const PhysicsCollisionSync: SystemHandle<readonly []> = defineSystem({\n name: PHYSICS_COLLISION_SYNC,\n queries: [],\n after: [PHYSICS_WRITEBACK],\n fn: (world) => {\n let pw: RapierPhysicsWorld3D;\n try {\n pw = world.getResource<RapierPhysicsWorld3D>('PhysicsWorld');\n } catch {\n return; // C-2: safe early out\n }\n pw.writebackCollidingEntities(world, CollidingEntities as unknown as Component);\n pw.finalizeDerivedFixedStep();\n },\n});\n\n/**\n * Register the physics tick systems into an ECS World.\n *\n * The systems ({@link PhysicsSyncBackend} / {@link PhysicsStepSimulation} /\n * {@link PhysicsWriteback} / {@link PhysicsCollisionSync}) are module-level\n * `defineSystem` tokens; this helper wires the moveAndSlide context + despawn\n * cleanup hook, then adds the tokens to the schedule.\n *\n * Transform is resolved from the World-local ECS component catalog,\n * D-3) — the previous `transformComponent` second parameter was redundant once\n * the system fns and moveContext resolve Transform themselves, so it is gone.\n *\n * @param world ECS World instance.\n */\nexport function registerPhysicsSystems(world: World): () => void {\n const releaseComponents = registerPhysicsComponents(world);\n // ── moveAndSlide context + despawn cleanup wiring (D-1/D-3) ──\n // Wire the World + Transform/CharacterController components into the backend\n // so moveAndSlide can read tuning and write pose/grounded back, and register\n // the backend for the global Collider.onRemove dispatch (despawn cleanup).\n const transformComponent = resolveTransform(world);\n try {\n const pw = world.getResource<RapierPhysicsWorld3D>('PhysicsWorld');\n if (transformComponent !== undefined) {\n pw.setMoveContext(world, transformComponent, CharacterController);\n }\n } catch {\n // PhysicsWorld resource not yet inserted — moveAndSlide falls back to\n // CharacterController schema defaults until a later registration wires it.\n }\n\n world\n .addSystems(FixedUpdate, PhysicsSet, [\n PhysicsSyncBackend,\n PhysicsStepSimulation,\n PhysicsWriteback,\n PhysicsCollisionSync,\n ])\n .unwrap();\n return () => {\n world.removeSystem(FixedUpdate, PHYSICS_COLLISION_SYNC);\n world.removeSystem(FixedUpdate, PHYSICS_WRITEBACK);\n world.removeSystem(FixedUpdate, PHYSICS_STEP_SIMULATION);\n world.removeSystem(FixedUpdate, PHYSICS_SYNC_BACKEND);\n try {\n world.getResource<RapierPhysicsWorld3D>('PhysicsWorld').clearEcsContext(world);\n } catch {\n // PhysicsWorld may already have been removed as part of outer teardown.\n }\n releaseComponents();\n };\n}\n","// @forgeax/engine-physics-rapier3d — WASM loader for Rapier 3D compat variant.\n//\n// Dynamic import of @dimforge/rapier3d-compat (plan-strategy D-4: compat variant,\n// zero Vite configuration).\n//\n// Usage:\n// const rapier = await loadRapier3D();\n// if ('code' in rapier) { /* handle PhysicsError */ }\n// const world = new rapier.World({ x: 0, y: -9.81, z: 0 });\n\nimport type { PhysicsErrorCode } from '@forgeax/engine-types';\nimport { PhysicsError } from '@forgeax/engine-types';\n\n/**\n * The RAPIER module namespace — all constructors, types, and helpers exposed\n * by @dimforge/rapier3d-compat after init(). This is the shape of the default\n * export of the compat package.\n */\n// biome-ignore lint/suspicious/noExplicitAny: Rapier compat namespace type\nexport type Rapier3DModule = any;\n\n/** Cached RAPIER instance — loaded once, reused across frames. */\nlet rapierInstance: Rapier3DModule | null = null;\n\n/** Loading promise — ensures concurrent callers share one init. */\nlet loadingPromise: Promise<Rapier3DModule | PhysicsError> | null = null;\n\n/**\n * Load the Rapier 3D WASM module and initialise it.\n *\n * Uses dynamic import of the compat variant (zero Vite configuration per\n * plan-strategy D-4). The init() call is async but self-hosted — no external\n * .wasm file needed (Base64-inlined JS).\n *\n * Concurrent callers share a single loading promise; after the first\n * successful load the cached instance is returned synchronously.\n *\n * @returns the RAPIER module namespace on success, or a PhysicsError with\n * code 'wasm-load-failed' if dynamic import or init() rejects.\n */\nexport async function loadRapier3D(): Promise<Rapier3DModule | PhysicsError> {\n if (rapierInstance !== null) return rapierInstance;\n if (loadingPromise !== null) return loadingPromise;\n\n loadingPromise = _doLoad();\n return loadingPromise;\n}\n\nasync function _doLoad(): Promise<Rapier3DModule | PhysicsError> {\n try {\n const RAPIER = await import('@dimforge/rapier3d-compat');\n await RAPIER.default.init();\n rapierInstance = RAPIER.default;\n loadingPromise = null;\n return RAPIER.default;\n } catch (cause) {\n const reason = cause instanceof Error ? cause.message : String(cause);\n loadingPromise = null;\n return new PhysicsError({\n code: 'wasm-load-failed' as PhysicsErrorCode,\n expected: 'successful dynamic import and init of @dimforge/rapier3d-compat',\n hint: `dynamic import or init() failed: ${reason}. Check network, file path, and that @dimforge/rapier3d-compat is installed.`,\n detail: { code: 'wasm-load-failed', reason },\n });\n }\n}\n"]}
|
|
1
|
+
{"version":3,"sources":["../src/rapier-physics-world-3d.ts","../src/wasm-loader.ts"],"names":["first","PhysicsError"],"mappings":"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","file":"index.mjs","sourcesContent":["import { componentDefinition, Disabled, FixedTime, FixedUpdate } from '@forgeax/engine-ecs';\n// @forgeax/engine-physics-rapier3d — RapierPhysicsWorld3D class and three-phase\n// tick systems (syncBackend / stepSimulation / writeback).\n//\n// RapierPhysicsWorld3D implements the PhysicsWorld interface from\n// @forgeax/engine-physics and holds a Rapier 3D World instance as its\n// simulation backend.\n//\n// Three-phase pipeline (plan-strategy D-1):\n// 1. syncBackend: apply pending teleports, update kinematic positions.\n// 2. stepSimulation: call rapierWorld.step(eventQueue).\n// 3. writeback: read Rapier body positions (dynamic only).\n//\n// Entity-to-body mapping (plan-strategy D-7): Rapier RigidBody.userData holds\n// the ECS entity raw value for reverse lookup in collision events.\n//\n// Despawn cleanup (plan-strategy D-5): removeEntity() removes the Rapier body\n// and colliders from the physics world.\n\nimport type { Component, EntityHandle, Query, SystemHandle, World } from '@forgeax/engine-ecs';\nimport { defineSystem } from '@forgeax/engine-ecs';\nimport { componentId } from '@forgeax/engine-ecs/internal';\nimport { readStructuralEvidence } from '@forgeax/engine-ecs/projection';\nimport { mat4, quat, type Vec3, vec3 } from '@forgeax/engine-math';\nimport {\n CharacterController,\n Collider,\n CollidingEntities,\n cloneDerivedPhysicsInput,\n colliderShapeFromF32,\n DERIVED_PHYSICS_LIMITS,\n type DerivedPhysicsCandidate,\n type DerivedPhysicsCandidateInput,\n type DerivedPhysicsCandidateState,\n DerivedPhysicsError,\n type DerivedPhysicsFailure,\n type DerivedPhysicsMotion,\n type DerivedPhysicsPublication,\n type DerivedPhysicsSnapshot,\n type DerivedShapeSeamInput,\n type DerivedShapeState,\n estimateDerivedPhysicsInputBytes,\n PHYSICS_ERROR_HINTS,\n type PhysicsConstraintInput,\n type PhysicsContactObservation,\n PhysicsError,\n type PhysicsMassProperties,\n type PhysicsQuaternion,\n PhysicsSet,\n type PhysicsVector,\n type PhysicsWorld,\n preserveCenterOfMassVelocity,\n type RaycastHit,\n RIGID_BODY_TYPE_STATIC,\n RigidBody,\n registerPhysicsComponents,\n rigidBodyTypeFromF32,\n type VoxelShapeInput,\n validateMassProperties,\n} from '@forgeax/engine-physics';\nimport { ChildOf } from '@forgeax/engine-scene';\nimport { err, ok, type Result } from '@forgeax/engine-types';\nimport type { Rapier3DModule } from './wasm-loader.js';\n\ninterface Rapier3DKinematicControllerState {\n readonly entity: number;\n readonly offset: number;\n}\n\n/**\n * Per-entity physics record — tracks the Rapier body handle for\n * each ECS entity.\n */\ninterface PhysicsEntityRecord {\n bodyHandle: number;\n /** Authored additional mass used to restore automatic derived policy. */\n additionalMass: number;\n /** Additional mass currently applied to Rapier's automatic mass policy. */\n automaticAdditionalMass: number;\n /** Base collider density before an explicit derived mass override. */\n authoredDensity: number | undefined;\n}\n\ninterface PhysicsTransform3D {\n readonly position: { readonly x: number; readonly y: number; readonly z: number };\n readonly rotation: {\n readonly x: number;\n readonly y: number;\n readonly z: number;\n readonly w: number;\n };\n readonly scale: { readonly x: number; readonly y: number; readonly z: number };\n}\n\ninterface PhysicsCollider3D {\n readonly shape: number;\n readonly halfExtents: readonly [number, number, number];\n readonly radius: number;\n readonly halfHeight: number;\n readonly friction: number;\n readonly restitution: number;\n readonly density: number;\n readonly isSensor: number;\n readonly collisionGroups: number;\n readonly solverGroups: number;\n}\n\ninterface PhysicsSyncQueryRow {\n readonly entity: EntityHandle;\n has(component: Component): boolean;\n get(component: Component): Record<string, unknown> | undefined;\n}\n\ninterface PhysicsSyncQuery extends Iterable<PhysicsSyncQueryRow> {\n at(entity: EntityHandle): PhysicsSyncQueryRow | undefined;\n}\n\ninterface PhysicsSyncState {\n readonly world: World;\n readonly transformComponent: Component;\n readonly globalTransformComponent: Component;\n readonly queries: readonly PhysicsSyncQuery[];\n readonly changeQueries: readonly PhysicsChangeQuery[];\n structuralCursor: number;\n structureEpoch: number;\n initialized: boolean;\n}\n\ninterface PhysicsChangeQuery {\n readonly component: Component;\n readonly query: Query;\n}\n\ninterface PhysicsSyncDescriptor {\n readonly entity: EntityHandle;\n readonly transform: PhysicsTransform3D;\n readonly rigidBody: {\n readonly type: number;\n readonly mass: number;\n readonly linearDamping: number;\n readonly angularDamping: number;\n readonly gravityScale: number;\n readonly ccdEnabled: number;\n };\n readonly collider: PhysicsCollider3D | undefined;\n readonly hasCharacterController: boolean;\n readonly characterControllerOffset: number | undefined;\n}\n\ninterface PhysicsEntityDelta {\n transformChanged: boolean;\n colliderChanged: boolean;\n rigidBodyChanged: boolean;\n characterControllerChanged: boolean;\n characterControllerStructureChanged: boolean;\n}\n\nfunction createPhysicsChangeQueries(\n world: World,\n components: readonly Component[],\n): readonly PhysicsChangeQuery[] {\n return components.map((component) => {\n const result = world.query({ changed: [component] });\n if (!result.ok) throw result.error;\n return { component, query: result.value };\n });\n}\n\nfunction drainPhysicsChangeQueries(queries: readonly PhysicsChangeQuery[]): void {\n for (const entry of queries) {\n for (const _span of entry.query.spans().unwrap()) {\n // Advance the persistent Query's observation epoch after reconciliation.\n }\n }\n}\n\nfunction ensurePhysicsDelta(\n deltas: Map<EntityHandle, PhysicsEntityDelta>,\n entity: EntityHandle,\n): PhysicsEntityDelta {\n let delta = deltas.get(entity);\n if (delta === undefined) {\n delta = {\n transformChanged: false,\n colliderChanged: false,\n rigidBodyChanged: false,\n characterControllerChanged: false,\n characterControllerStructureChanged: false,\n };\n deltas.set(entity, delta);\n }\n return delta;\n}\n\nexport interface Rapier3DCollisionEvent {\n readonly type: 'started' | 'stopped';\n readonly entityA: number;\n readonly entityB: number;\n readonly fixedStep?: number;\n readonly shapeA?: string;\n readonly shapeB?: string;\n}\n\ninterface DerivedShapeRecord {\n readonly input: VoxelShapeInput & {\n readonly cells: Int32Array;\n readonly origin: PhysicsVector;\n readonly rotation: PhysicsQuaternion;\n };\n readonly colliderHandle: number;\n}\n\ninterface DerivedBodyRecord {\n readonly entity: number;\n readonly sourceKey: string;\n readonly generation: number;\n readonly revision: number;\n readonly bodyType: 'static' | 'dynamic' | 'kinematic' | undefined;\n readonly velocityPolicy: 'preserve' | 'reset' | undefined;\n readonly candidateId: string;\n readonly shapes: readonly DerivedShapeRecord[];\n readonly seams: readonly DerivedShapeSeamInput[];\n readonly massProperties: PhysicsMassProperties | undefined;\n readonly constraints: readonly PhysicsConstraintInput[];\n}\n\ninterface DerivedCandidateRecord {\n token: DerivedPhysicsCandidate;\n readonly nativeColliders: readonly { readonly handle: number }[];\n readonly input: DerivedPhysicsCandidateInput;\n readonly bytes: number;\n state: DerivedPhysicsCandidateState;\n commitGeometry?: () => Result<void, Error>;\n batch?: DerivedAdmissionBatch;\n}\n\ninterface DerivedAdmissionBatch {\n readonly records: readonly DerivedCandidateRecord[];\n readonly commitGeometry?: () => Result<void, Error>;\n}\n\ninterface DerivedConstraintRecord {\n readonly input: PhysicsConstraintInput;\n readonly handle: number;\n}\n\ninterface DerivedBodySource {\n readonly sourceKey: string;\n readonly revision: number;\n}\n\n// biome-ignore lint/suspicious/noExplicitAny: Rapier types from dynamically loaded module\ntype RapierWorld = any;\n// biome-ignore lint/suspicious/noExplicitAny: Rapier types from dynamically loaded module\ntype RapierEventQueue = any;\n// biome-ignore lint/suspicious/noExplicitAny: Rapier types from dynamically loaded module\ntype RapierRigidBody = any;\n\n/** CharacterController tuning fields read per moveAndSlide call (degrees + world units). */\ninterface CharacterControllerTuning {\n offset: number;\n maxSlopeClimbDeg: number;\n minSlopeSlideDeg: number;\n autoStepMaxHeight: number;\n autoStepMinWidth: number;\n snapToGroundDist: number;\n}\n\nconst DEG_TO_RAD = Math.PI / 180;\n\n/**\n * Re-apply all KCC setters from the component tuning every call (plan-strategy\n * D-7: full reset, no dirty tracking). Degrees -> radians for the two slope\n * setters; offset / autostep / snap pass through as world units. A zero value\n * for auto-step / snap calls `disable*()` rather than `enable*(0)`.\n */\n// biome-ignore lint/suspicious/noExplicitAny: Rapier KinematicCharacterController from dynamic module\nfunction applyKccTuning(ctrl: any, cc: CharacterControllerTuning): void {\n ctrl.setMaxSlopeClimbAngle(cc.maxSlopeClimbDeg * DEG_TO_RAD);\n ctrl.setMinSlopeSlideAngle(cc.minSlopeSlideDeg * DEG_TO_RAD);\n ctrl.setSlideEnabled(true);\n if (cc.autoStepMaxHeight === 0) {\n ctrl.disableAutostep();\n } else {\n ctrl.enableAutostep(cc.autoStepMaxHeight, cc.autoStepMinWidth, false); // D-7: includeDynamicBodies=false\n }\n if (cc.snapToGroundDist === 0) {\n ctrl.disableSnapToGround();\n } else {\n ctrl.enableSnapToGround(cc.snapToGroundDist);\n }\n}\n\n/**\n * Map a Rapier RigidBodyType enum value to the engine's string union for the\n * `controller-requires-kinematic` error detail.\n */\nfunction rapierBodyTypeToString(\n rapier: { readonly RigidBodyType: { readonly Dynamic: number; readonly Fixed: number } },\n bodyType: number,\n): 'static' | 'dynamic' | 'kinematic' {\n if (bodyType === rapier.RigidBodyType.Dynamic) return 'dynamic';\n if (bodyType === rapier.RigidBodyType.Fixed) return 'static';\n return 'kinematic';\n}\n\nfunction validateConstraintInput(\n input: PhysicsConstraintInput,\n): Result<PhysicsConstraintInput, DerivedPhysicsError> {\n const finiteVector = (value: readonly number[]): boolean =>\n value.length === 3 && value.every(Number.isFinite);\n if (\n typeof input.id !== 'string' ||\n input.id.trim().length === 0 ||\n !Number.isInteger(input.revision) ||\n input.revision < 0 ||\n !Number.isInteger(input.bodyA) ||\n !Number.isInteger(input.bodyB) ||\n input.bodyA === input.bodyB ||\n !finiteVector(input.anchorA) ||\n !finiteVector(input.anchorB)\n ) {\n return err(\n new DerivedPhysicsError(\n 'derived-constraint-invalid',\n 'constraint identity, revision, endpoint bodies, and anchors are valid',\n 'supply two distinct live bodies and finite local anchors',\n { constraintId: input.id },\n ),\n );\n }\n if (input.kind === 'spring') {\n if (\n !Number.isFinite(input.restLength) ||\n input.restLength < 0 ||\n !Number.isFinite(input.stiffness) ||\n input.stiffness < 0 ||\n !Number.isFinite(input.damping) ||\n input.damping < 0\n ) {\n return err(\n new DerivedPhysicsError(\n 'derived-constraint-invalid',\n 'spring rest length, stiffness, and damping are finite and non-negative',\n 'repair spring tuning before native creation',\n { constraintId: input.id },\n ),\n );\n }\n } else if (\n !finiteVector(input.axis) ||\n Math.hypot(input.axis[0], input.axis[1], input.axis[2]) < 1e-6 ||\n (input.limits !== undefined &&\n (!Number.isFinite(input.limits[0]) ||\n !Number.isFinite(input.limits[1]) ||\n input.limits[0] > input.limits[1]))\n ) {\n return err(\n new DerivedPhysicsError(\n 'derived-constraint-invalid',\n 'hinge axis is non-zero and optional limits are ordered finite values',\n 'normalize the hinge axis and set minLimit <= maxLimit',\n { constraintId: input.id },\n ),\n );\n }\n return ok(input);\n}\n\n/**\n * RapierPhysicsWorld3D — Rapier 3D WASM backend implementing the PhysicsWorld\n * interface.\n */\nexport class RapierPhysicsWorld3D implements PhysicsWorld {\n /** Rapier 3D World instance owning all bodies, colliders, and pipeline. */\n raw: RapierWorld;\n\n private readonly rapierModule: Rapier3DModule;\n\n /** Entity (raw number) -> PhysicsEntityRecord mapping. */\n private readonly entityMap = new Map<number, PhysicsEntityRecord>();\n\n /** Pending teleports: entity -> target position, applied on next sync. */\n private readonly pendingTeleports = new Map<number, { x: number; y: number; z: number }>();\n\n /** Event queue for collision events. */\n private eventQueue: RapierEventQueue;\n\n /**\n * Active overlap set per entity, maintained by draining the event queue each\n * step. `started` events add the pair both ways; `stopped` events remove it.\n * Read out into each entity's `CollidingEntities` component by\n * `writebackCollidingEntities`. Covers both solid contacts and sensor\n * intersections (Rapier emits CollisionEvent for both).\n */\n private readonly collisionPairs = new Map<number, Set<number>>();\n\n private readonly pendingCollisionEvents: Rapier3DCollisionEvent[] = [];\n\n private readonly collisionEventHistory: Rapier3DCollisionEvent[] = [];\n\n /** One backend owns every derived shape; these maps are not a second world. */\n private readonly derivedBodies = new Map<number, DerivedBodyRecord>();\n private readonly derivedCandidates = new Map<string, DerivedCandidateRecord>();\n private readonly pendingDerivedCandidates = new Set<string>();\n private readonly retiredDerivedBodies: DerivedBodyRecord[] = [];\n private readonly derivedColliderToShape = new Map<number, { entity: number; id: string }>();\n private readonly derivedConstraints = new Map<string, DerivedConstraintRecord>();\n private readonly derivedBodySources = new Map<number, DerivedBodySource>();\n private readonly derivedPublications = new Map<number, DerivedPhysicsPublication>();\n private readonly derivedFailures = new Map<number, DerivedPhysicsFailure>();\n private readonly derivedContacts: PhysicsContactObservation[] = [];\n private readonly derivedPoisonedEntities = new Set<number>();\n private readonly physicsOwner = {};\n private candidateSequence = 0;\n private derivedCandidateBytes = 0;\n private backendGeneration = 1;\n private fixedStep = 0;\n private derivedPublicationPending = false;\n private worldIdentity: object | undefined;\n private activeDerivedAdmission: DerivedCandidateRecord | undefined;\n\n private currentGravity: { x: number; y: number; z: number };\n\n /**\n * Lazily-built Rapier KinematicCharacterController per character entity\n * (plan-strategy D-1/D-3). `moveAndSlide` creates one on first call; the\n * `Collider.onRemove` hook (registerPhysicsSystems) clears it on despawn.\n * Public so AC-11 despawn tests can assert `kccCache.size === 0`.\n */\n // biome-ignore lint/suspicious/noExplicitAny: Rapier KinematicCharacterController from dynamic module\n readonly kccCache = new Map<number, any>();\n\n private readonly kccOffsets = new Map<number, number>();\n\n /**\n * ECS World + components wired in by `registerPhysicsSystems`, so\n * `moveAndSlide` can read CharacterController tuning and write Transform +\n * grounded back. Undefined until systems are registered — the input-validation\n * error paths (body / collider) fire before these are read, so direct\n * `pw.moveAndSlide()` calls in error tests need no World.\n */\n private moveContext:\n | { world: World; transform: Component; characterController: Component }\n | undefined;\n\n /** Persistent ECS query + projection cursor for incremental backend sync. */\n private syncState: PhysicsSyncState | undefined;\n\n private disposed = false;\n\n constructor(rapier: Rapier3DModule) {\n this.rapierModule = rapier;\n // biome-ignore lint/suspicious/noExplicitAny: Rapier World constructor is a class exported from a namespace module\n this.raw = new (rapier as any).World({ x: 0, y: -9.81, z: 0 }) as RapierWorld;\n // biome-ignore lint/suspicious/noExplicitAny: Rapier EventQueue constructor comes from a namespace module\n this.eventQueue = new (rapier as any).EventQueue(true) as RapierEventQueue;\n this.currentGravity = { x: 0, y: -9.81, z: 0 };\n }\n\n // ─── PhysicsWorld interface ────────────────────────────────────────────\n\n setGravity(gravity: Vec3): void {\n this.assertActive('setGravity');\n const x = gravity[0] ?? 0;\n const y = gravity[1] ?? 0;\n const z = gravity[2] ?? 0;\n this.raw.gravity = { x, y, z };\n this.currentGravity = { x, y, z };\n }\n\n getGravity(): Vec3 {\n const { x, y, z } = this.currentGravity;\n return vec3.create(x, y, z);\n }\n\n raycast(\n origin: Vec3,\n direction: Vec3,\n maxDist: number,\n filterMask?: number,\n ): RaycastHit | undefined {\n this.assertActive('raycast');\n if (this.recoveryBlocked()) {\n throw new DerivedPhysicsError(\n 'derived-recovery-invalid',\n 'raycasts observe a complete healthy physics state',\n 'rebuild the PhysicsWorld before querying after an unrecoverable admission',\n {},\n );\n }\n const RAPIER = this.rapierModule;\n // biome-ignore lint/suspicious/noExplicitAny: Rapier Ray constructor comes from a namespace module\n const RayCtor = (RAPIER as any).Ray as new (\n origin: { x: number; y: number; z: number },\n dir: { x: number; y: number; z: number },\n ) => { pointAt(t: number): { x: number; y: number; z: number } };\n const ray = new RayCtor(\n { x: origin[0] ?? 0, y: origin[1] ?? 0, z: origin[2] ?? 0 },\n { x: direction[0] ?? 0, y: direction[1] ?? 0, z: direction[2] ?? 0 },\n );\n // biome-ignore lint/suspicious/noExplicitAny: Rapier World castRayAndGetNormal\n const hit = (this.raw as any).castRayAndGetNormal(\n ray,\n maxDist,\n true,\n undefined,\n filterMask,\n ) as {\n collider: { parent(): { userData: number } | null };\n timeOfImpact: number;\n normal: { x: number; y: number; z: number };\n } | null;\n\n if (hit === null) return undefined;\n\n const point = ray.pointAt(hit.timeOfImpact);\n // `hit.collider.parent()` already returns the owning RigidBody OBJECT (compat\n // build), whose userData holds the ECS entity — read it directly, mirroring\n // `colliderHandleToEntity` (the proven CollidingEntities path). The prior code\n // treated the object as a body HANDLE and re-resolved it via `bodies.get(...)`,\n // which returned a DIFFERENT body → raycast reported the wrong entity.\n const colliderParentBody = hit.collider.parent();\n const entity = colliderParentBody !== null ? colliderParentBody.userData : 0;\n\n return {\n entity,\n point: vec3.create(point.x, point.y, point.z),\n normal: vec3.create(hit.normal.x, hit.normal.y, hit.normal.z),\n timeOfImpact: hit.timeOfImpact,\n };\n }\n\n teleport(entity: number, position: Vec3): void {\n this.assertActive('teleport');\n this.pendingTeleports.set(entity, {\n x: position[0] ?? 0,\n y: position[1] ?? 0,\n z: position[2] ?? 0,\n });\n }\n\n step(deltaTime: number): void {\n this.assertActive('step');\n if (!Number.isFinite(deltaTime) || deltaTime <= 0 || deltaTime > PHYSICS_DT_MAX) return;\n try {\n // Native integration must consume the same fixed delta as force controllers.\n (this.raw as { timestep: number }).timestep = deltaTime;\n this.processDerivedCandidates();\n // A failed native rollback is an explicit rebuild boundary. Physics does\n // not advance or publish a mixed state after this point.\n if (this.derivedPoisonedEntities.size > 0) return;\n // biome-ignore lint/suspicious/noExplicitAny: Rapier World.step\n (this.raw as any).step(this.eventQueue);\n this.fixedStep = this.syncState?.world.getResource(FixedTime).tick ?? this.fixedStep + 1;\n this.drainRapierCollisionEvents();\n this.derivedPublicationPending = true;\n // Direct PhysicsWorld consumers do not have ECS writeback systems. Keep\n // that public path useful while ECS-bound worlds finalize after writeback\n // and collision component synchronization below.\n if (this.syncState === undefined) this.finalizeDerivedFixedStep();\n } catch (cause) {\n // A native step or contact drain may have advanced before throwing.\n // Geometry may already be committed; neither domain can claim LKG.\n const error = new DerivedPhysicsError(\n 'derived-backend-failed',\n 'native fixed-step execution and publication complete together',\n 'rebuild the World and PhysicsWorld from the last committed snapshot',\n { reason: cause instanceof Error ? cause.message : String(cause) },\n );\n for (const entity of this.entityMap.keys()) this.derivedPoisonedEntities.add(entity);\n this.derivedPublicationPending = false;\n this.derivedPublications.clear();\n for (const record of this.derivedCandidates.values()) {\n this.rememberDerivedFailure(record, error, 'rebuild-required');\n }\n throw error;\n }\n }\n\n /** Publish only after the fixed-step ECS writeback/contact boundary. */\n finalizeDerivedFixedStep(): void {\n if (!this.derivedPublicationPending) return;\n this.derivedPublicationPending = false;\n if (this.derivedPoisonedEntities.size > 0) return;\n this.publishDerivedCandidates();\n this.retireDerivedBodies();\n }\n\n /**\n * Drain the Rapier event queue into `collisionPairs`. Each event names two\n * collider handles + a `started` flag; we resolve each collider to its owning\n * entity (collider.parent() -> body.userData) and add/remove the symmetric\n * pair. This is what populates `CollidingEntities` for sensor pickup + contact\n * queries (the queue is otherwise drained-on-overflow and never observed).\n */\n private drainRapierCollisionEvents(): void {\n this.eventQueue.drainCollisionEvents((handle1: number, handle2: number, started: boolean) => {\n const a = this.colliderHandleToEntity(handle1);\n const b = this.colliderHandleToEntity(handle2);\n if (a === undefined || b === undefined) return;\n const shapeA = this.derivedColliderToShape.get(handle1);\n const shapeB = this.derivedColliderToShape.get(handle2);\n this.recordContactObservation(\n {\n phase: started ? 'started' : 'stopped',\n fixedStep: this.fixedStep,\n entityA: a,\n entityB: b,\n ...(shapeA === undefined ? {} : { shapeA: shapeA.id }),\n ...(shapeB === undefined ? {} : { shapeB: shapeB.id }),\n },\n handle1,\n handle2,\n );\n const changed = started ? this.addPair(a, b) : this.removePair(a, b);\n if (!changed) return;\n this.pushCollisionEvent({\n type: started ? 'started' : 'stopped',\n entityA: a,\n entityB: b,\n fixedStep: this.fixedStep,\n ...(shapeA === undefined ? {} : { shapeA: shapeA.id }),\n ...(shapeB === undefined ? {} : { shapeB: shapeB.id }),\n });\n });\n }\n\n private recordContactObservation(\n observation: PhysicsContactObservation,\n handleA: number,\n handleB: number,\n ): void {\n let point: PhysicsVector | undefined;\n let normal: PhysicsVector | undefined;\n let geometricPoint: PhysicsVector | undefined;\n let geometricNormal: PhysicsVector | undefined;\n try {\n const colliderA = (this.raw as RapierWorld).getCollider(handleA);\n const colliderB = (this.raw as RapierWorld).getCollider(handleB);\n if (colliderA !== null && colliderB !== null) {\n (this.raw as RapierWorld).contactPair(\n colliderA,\n colliderB,\n (manifold: RapierWorld, flipped: boolean) => {\n // A contact manifold can retain geometric points without solver\n // points. Composite local points are subshape-local, so only\n // transform points from the ordinary primitive collider surface.\n if (\n manifold.numSolverContacts() === 0 &&\n geometricPoint === undefined &&\n manifold.numContacts() > 0\n ) {\n const first = flipped ? colliderB : colliderA;\n const second = flipped ? colliderA : colliderB;\n const types = this.rapierModule.ShapeType;\n for (const [collider, local] of [\n [first, manifold.localContactPoint1(0)],\n [second, manifold.localContactPoint2(0)],\n ]) {\n if (\n local == null ||\n ![types.Ball, types.Cuboid, types.Capsule].includes(collider.shapeType())\n )\n continue;\n const rotation = collider.rotation();\n const rotated = quat.transformVec3(\n vec3.create(),\n [rotation.x, rotation.y, rotation.z, rotation.w],\n [local.x, local.y, local.z],\n );\n const position = collider.translation();\n geometricPoint = [\n rotated[0] + position.x,\n rotated[1] + position.y,\n rotated[2] + position.z,\n ];\n const n = manifold.normal();\n const direction = flipped ? -1 : 1;\n geometricNormal = [n.x * direction, n.y * direction, n.z * direction];\n break;\n }\n }\n if (manifold.numSolverContacts?.() > 0) {\n const contact = manifold.solverContactPoint(0);\n const n = manifold.normal();\n if (contact !== null && contact !== undefined) {\n point = [contact.x, contact.y, contact.z];\n }\n if (n !== null && n !== undefined) {\n const direction = flipped ? -1 : 1;\n normal = [n.x * direction, n.y * direction, n.z * direction];\n }\n }\n },\n );\n }\n } catch {\n // Contact events remain useful without optional manifold sampling. The\n // public type makes point/normal optional rather than inventing values.\n }\n if (point === undefined && geometricPoint !== undefined) {\n point = geometricPoint;\n normal = geometricNormal;\n }\n this.derivedContacts.push({\n ...observation,\n ...(point === undefined ? {} : { point }),\n ...(normal === undefined ? {} : { normal }),\n });\n if (this.derivedContacts.length > 256)\n this.derivedContacts.splice(0, this.derivedContacts.length - 256);\n }\n\n /** Resolve a Rapier collider handle to its owning ECS entity, or undefined. */\n private colliderHandleToEntity(colliderHandle: number): number | undefined {\n // getCollider(handle).parent() returns the owning RigidBody (compat build),\n // whose userData holds the ECS entity raw value (set in ensureBody).\n // biome-ignore lint/suspicious/noExplicitAny: Rapier World.getCollider from dynamic module\n const collider = (this.raw as any).getCollider(colliderHandle) as {\n parent(): { userData: number } | null;\n } | null;\n if (collider === null || collider === undefined) return undefined;\n const body = collider.parent();\n if (body === null || body === undefined) return undefined;\n return body.userData;\n }\n\n private addPair(a: number, b: number): boolean {\n let setA = this.collisionPairs.get(a);\n if (!setA) {\n setA = new Set<number>();\n this.collisionPairs.set(a, setA);\n }\n if (setA.has(b)) return false;\n setA.add(b);\n let setB = this.collisionPairs.get(b);\n if (!setB) {\n setB = new Set<number>();\n this.collisionPairs.set(b, setB);\n }\n setB.add(a);\n return true;\n }\n\n private removePair(a: number, b: number): boolean {\n const removedA = this.collisionPairs.get(a)?.delete(b) ?? false;\n const removedB = this.collisionPairs.get(b)?.delete(a) ?? false;\n return removedA || removedB;\n }\n\n private pushCollisionEvent(event: Rapier3DCollisionEvent): void {\n const ordered =\n event.entityA <= event.entityB\n ? event\n : {\n type: event.type,\n entityA: event.entityB,\n entityB: event.entityA,\n ...(event.fixedStep === undefined ? {} : { fixedStep: event.fixedStep }),\n ...(event.shapeB === undefined ? {} : { shapeA: event.shapeB }),\n ...(event.shapeA === undefined ? {} : { shapeB: event.shapeA }),\n };\n this.pendingCollisionEvents.push(ordered);\n this.collisionEventHistory.push(ordered);\n }\n\n /**\n * Write the current overlap set into each entity's `CollidingEntities`\n * component (entities that carry it). Called by the PhysicsCollisionSync\n * system after writeback. Entities with no current overlaps get an empty set,\n * so a Core that the player has left clears correctly. Only entities that own\n * a CollidingEntities component are written (others are skipped).\n */\n writebackCollidingEntities(world: World, collidingComponent: Component): void {\n for (const [entity, others] of this.collisionPairs) {\n const handle = entity as EntityHandle;\n if (!world.get(handle, collidingComponent).ok) continue;\n world.set(handle, collidingComponent, { entities: [...others] });\n }\n }\n\n drainCollisionEvents(): Rapier3DCollisionEvent[] {\n return this.pendingCollisionEvents.splice(0);\n }\n\n getCollisionPairs(): Map<number, Set<number>> {\n return new Map([...this.collisionPairs].map(([entity, others]) => [entity, new Set(others)]));\n }\n\n getCollisionEventHistory(): readonly Rapier3DCollisionEvent[] {\n return [...this.collisionEventHistory];\n }\n\n /** Detached fixed-step contact facts; no Rapier manifolds or handles escape. */\n getContactObservations(): readonly PhysicsContactObservation[] {\n if (this.recoveryBlocked()) return [];\n return this.derivedContacts.map((contact) => ({\n ...contact,\n ...(contact.point === undefined ? {} : { point: [...contact.point] as PhysicsVector }),\n ...(contact.normal === undefined ? {} : { normal: [...contact.normal] as PhysicsVector }),\n }));\n }\n\n /** Prepare disabled native Voxels for one entity without changing queries. */\n prepareDerivedShapeCandidate(\n input: DerivedPhysicsCandidateInput,\n ): ReturnType<NonNullable<PhysicsWorld['prepareDerivedShapeCandidate']>> {\n this.assertActive('prepareDerivedShapeCandidate');\n if (input.worldIdentity !== undefined && input.worldIdentity !== this.worldIdentity) {\n return err(\n new DerivedPhysicsError(\n 'derived-world-mismatch',\n 'candidate belongs to the ECS World bound to this PhysicsWorld',\n 'submit the candidate to the PhysicsWorld that owns its entity',\n { entity: input.entity },\n ),\n );\n }\n if (!this.entityMap.has(input.entity)) {\n return err(\n new DerivedPhysicsError(\n 'derived-body-not-found',\n 'candidate entity has a committed body in this PhysicsWorld',\n 'wait for physics reconciliation before preparing derived shapes',\n { entity: input.entity },\n ),\n );\n }\n if (this.derivedPoisonedEntities.has(input.entity)) {\n return err(\n new DerivedPhysicsError(\n 'derived-recovery-invalid',\n 'the entity has a recoverable committed native PhysicsWorld state',\n 'rebuild the PhysicsWorld from the last portable snapshot before retrying',\n { entity: input.entity },\n ),\n );\n }\n const active = this.derivedBodies.get(input.entity);\n if (active !== undefined && input.revision <= active.revision) {\n return err(\n new DerivedPhysicsError(\n 'derived-candidate-stale',\n 'candidate revision is newer than the committed derived shape revision',\n 'read the latest publication and advance the consumer revision',\n { entity: input.entity, actual: input.revision, expected: `>${active.revision}` },\n ),\n );\n }\n for (const pendingId of this.pendingDerivedCandidates) {\n const pending = this.derivedCandidates.get(pendingId);\n if (pending?.input.entity === input.entity) {\n return err(\n new DerivedPhysicsError(\n 'derived-candidate-pending',\n 'one body has at most one queued derived-shape candidate',\n 'cancel or let the current candidate publish before preparing another',\n { entity: input.entity, candidateId: pendingId },\n ),\n );\n }\n }\n const copied = cloneDerivedPhysicsInput(input);\n if (!copied.ok) return copied;\n const mass = validateMassProperties(copied.value.massProperties);\n if (!mass.ok) return mass;\n const body = this.bodyForEntity(input.entity);\n if (body === undefined) {\n return err(\n new DerivedPhysicsError(\n 'derived-body-not-found',\n 'candidate entity resolves to a live native body',\n 'wait for the next ECS physics sync',\n { entity: input.entity },\n ),\n );\n }\n if (this.derivedCandidates.size >= DERIVED_PHYSICS_LIMITS.maxCandidates) {\n return err(\n new DerivedPhysicsError(\n 'derived-candidate-budget-exceeded',\n `this PhysicsWorld keeps at most ${DERIVED_PHYSICS_LIMITS.maxCandidates} candidates`,\n 'cancel or publish an existing candidate before preparing another',\n { entity: input.entity, actual: this.derivedCandidates.size },\n ),\n );\n }\n const candidateInput = Object.freeze({\n ...copied.value,\n ...(mass.value === undefined ? {} : { massProperties: mass.value }),\n });\n // Keep the public token's copied POD separate from the private record. A\n // readonly typed-array field is still writable at runtime; admission must\n // never consume caller mutations made after prepare() returned.\n const privateInput = cloneDerivedPhysicsInput(candidateInput);\n if (!privateInput.ok) return privateInput;\n const publicInput = cloneDerivedPhysicsInput(privateInput.value);\n if (!publicInput.ok) return publicInput;\n const nativeColliders: { handle: number }[] = [];\n try {\n for (const shape of privateInput.value.shapes) {\n const collider = this.createDerivedCollider(body, shape);\n nativeColliders.push({ handle: collider.handle });\n }\n } catch (cause) {\n for (const collider of nativeColliders) this.removeNativeCollider(collider.handle);\n return err(\n new DerivedPhysicsError(\n 'derived-backend-failed',\n 'Rapier can create every candidate voxel collider while it remains disabled',\n 'reduce the candidate or rebuild the PhysicsWorld after a native failure',\n { entity: input.entity, reason: cause instanceof Error ? cause.message : String(cause) },\n ),\n );\n }\n const candidateBytes = estimateDerivedPhysicsInputBytes(privateInput.value);\n if (this.derivedCandidateBytes + candidateBytes > DERIVED_PHYSICS_LIMITS.maxCandidateBytes) {\n for (const collider of nativeColliders) this.removeNativeCollider(collider.handle);\n return err(\n new DerivedPhysicsError(\n 'derived-candidate-budget-exceeded',\n `staged candidate bytes remain within ${DERIVED_PHYSICS_LIMITS.maxCandidateBytes}`,\n 'cancel or retire an in-flight candidate before retrying',\n { entity: input.entity, actual: this.derivedCandidateBytes + candidateBytes },\n ),\n );\n }\n const candidateId = `derived:${this.backendGeneration}:${input.entity}:${++this.candidateSequence}:${input.revision}`;\n const token: DerivedPhysicsCandidate = Object.freeze({\n candidateId,\n generation: this.backendGeneration,\n owner: this.physicsOwner,\n input: publicInput.value,\n state: 'ready',\n });\n this.derivedCandidates.set(candidateId, {\n token,\n nativeColliders,\n input: privateInput.value,\n bytes: candidateBytes,\n state: 'ready',\n });\n this.derivedCandidateBytes += candidateBytes;\n return ok(token);\n }\n\n /** Queue a prepared candidate for the next call to `step()`. */\n admitDerivedShapeCandidate(\n candidate: DerivedPhysicsCandidate,\n commitGeometry?: () => Result<void, Error>,\n ): ReturnType<NonNullable<PhysicsWorld['admitDerivedShapeCandidate']>> {\n const admitted = this.admitDerivedShapeCandidateInternal(candidate);\n if (admitted.ok && commitGeometry !== undefined) {\n const record = this.derivedCandidates.get(candidate.candidateId);\n if (record !== undefined) record.commitGeometry = commitGeometry;\n }\n return admitted;\n }\n\n admitDerivedShapeCandidates(\n candidates: readonly DerivedPhysicsCandidate[],\n commitGeometry?: () => Result<void, Error>,\n ): ReturnType<NonNullable<PhysicsWorld['admitDerivedShapeCandidates']>> {\n this.assertActive('admitDerivedShapeCandidates');\n const records: DerivedCandidateRecord[] = [];\n const sources = new Map<number, DerivedBodySource>();\n const constraints = new Set<string>();\n const invalid = (reason: string) =>\n new DerivedPhysicsError(\n 'derived-candidate-invalid',\n 'one bounded admission contains distinct prepared bodies and constraint updates',\n 'prepare one candidate per body and submit the complete replacement together',\n { reason },\n );\n if (candidates.length === 0 || candidates.length > DERIVED_PHYSICS_LIMITS.maxCandidates)\n return err(invalid('invalid batch size'));\n // Resolve credentials before mutating the queue. Never use caller input as\n // the source projection or invalidate another owner's matching token ID.\n for (const candidate of candidates) {\n const record = this.derivedCandidates.get(candidate.candidateId);\n if (\n record === undefined ||\n candidate.owner !== this.physicsOwner ||\n candidate.generation !== this.backendGeneration ||\n record.state !== 'ready'\n )\n return err(invalid('batch member is not a current prepared candidate'));\n if (sources.has(record.input.entity)) return err(invalid('duplicate body'));\n for (const constraint of record.input.constraints ?? []) {\n if (constraints.has(constraint.id)) return err(invalid('duplicate constraint update'));\n constraints.add(constraint.id);\n }\n records.push(record);\n sources.set(record.input.entity, {\n sourceKey: record.input.sourceKey,\n revision: record.input.revision,\n });\n }\n for (const candidate of candidates) {\n const checked = this.admitDerivedShapeCandidateInternal(candidate, sources, true);\n if (!checked.ok) {\n for (const record of records) {\n if (this.derivedCandidates.has(record.token.candidateId))\n this.rejectPreparedCandidate(record, checked.error);\n }\n return checked;\n }\n }\n const batch: DerivedAdmissionBatch = Object.freeze({\n records: Object.freeze(records),\n ...(commitGeometry === undefined ? {} : { commitGeometry }),\n });\n for (const record of records) record.batch = batch;\n const queued: DerivedPhysicsCandidate[] = [];\n for (const candidate of candidates) {\n const admitted = this.admitDerivedShapeCandidateInternal(candidate, sources);\n if (!admitted.ok) {\n const first = records[0];\n if (first !== undefined) this.rejectPreparedCandidate(first, admitted.error);\n return admitted;\n }\n queued.push(admitted.value);\n }\n return ok(Object.freeze(queued));\n }\n\n getDerivedAdmission(\n entity?: number,\n ):\n | { readonly entity: number; readonly revision: number; readonly fixedStep: number }\n | undefined {\n const active = this.activeDerivedAdmission;\n const record =\n entity === undefined\n ? active\n : (active?.batch?.records.find((item) => item.input.entity === entity) ??\n (active?.input.entity === entity ? active : undefined));\n if (record === undefined) return undefined;\n return {\n entity: record.input.entity,\n revision: record.input.revision,\n fixedStep: this.syncState?.world.getResource(FixedTime).tick ?? this.fixedStep + 1,\n };\n }\n\n private admitDerivedShapeCandidateInternal(\n candidate: DerivedPhysicsCandidate,\n sourceOverrides?: ReadonlyMap<number, DerivedBodySource>,\n validateOnly = false,\n ): ReturnType<NonNullable<PhysicsWorld['admitDerivedShapeCandidate']>> {\n this.assertActive('admitDerivedShapeCandidate');\n const record = this.derivedCandidates.get(candidate.candidateId);\n if (\n record === undefined ||\n candidate.owner !== this.physicsOwner ||\n record.token.owner !== candidate.owner ||\n candidate.generation !== this.backendGeneration\n ) {\n return err(\n new DerivedPhysicsError(\n 'derived-candidate-not-found',\n 'candidate belongs to the current PhysicsWorld generation',\n 'discard stale candidate credentials and prepare from committed input again',\n { candidateId: candidate.candidateId },\n ),\n );\n }\n if (this.derivedPoisonedEntities.has(record?.input.entity ?? -1)) {\n return err(\n new DerivedPhysicsError(\n 'derived-recovery-invalid',\n 'the candidate entity is stopped after an unrecoverable native admission failure',\n 'rebuild the PhysicsWorld from its portable snapshot before retrying',\n { entity: record?.input.entity, candidateId: candidate.candidateId },\n ),\n );\n }\n if (record.state === 'cancelled' || record.state === 'invalidated') {\n return err(\n new DerivedPhysicsError(\n 'derived-candidate-cancelled',\n 'candidate has not been cancelled or invalidated',\n 'prepare a new candidate from the latest committed revision',\n { candidateId: candidate.candidateId },\n ),\n );\n }\n if (record.state !== 'ready') {\n return err(\n new DerivedPhysicsError(\n 'derived-candidate-pending',\n 'a prepared candidate is admitted at most once',\n 'retain the returned queued receipt and wait for fixed-step publication',\n { candidateId: candidate.candidateId },\n ),\n );\n }\n const pendingSources = this.pendingDerivedSources();\n if (sourceOverrides !== undefined) {\n for (const [entity, source] of sourceOverrides) pendingSources.set(entity, source);\n }\n pendingSources.set(record.input.entity, {\n sourceKey: record.input.sourceKey,\n revision: record.input.revision,\n });\n const admissionError = this.validateDerivedAdmission(record.input, pendingSources);\n if (admissionError !== undefined) {\n this.rejectPreparedCandidate(record, admissionError);\n return err(admissionError);\n }\n const active = this.derivedBodies.get(record.input.entity);\n if (active !== undefined && record.input.revision <= active.revision) {\n const stale = new DerivedPhysicsError(\n 'derived-candidate-stale',\n 'candidate revision is newer than the committed shape revision',\n 'advance the consumer revision before admission',\n { entity: record.input.entity, candidateId: candidate.candidateId },\n );\n this.rejectPreparedCandidate(record, stale);\n return err(stale);\n }\n const newestPendingRevision = this.newestPendingRevision(record.input.entity);\n if (newestPendingRevision !== undefined && record.input.revision <= newestPendingRevision) {\n const stale = new DerivedPhysicsError(\n 'derived-candidate-stale',\n 'candidate revision advances every already queued revision for the body',\n 'admit only the newest body revision at a fixed-step boundary',\n {\n entity: record.input.entity,\n candidateId: candidate.candidateId,\n expected: `>${newestPendingRevision}`,\n actual: record.input.revision,\n },\n );\n this.rejectPreparedCandidate(record, stale);\n return err(stale);\n }\n if (validateOnly) return ok(record.token);\n record.state = 'queued';\n this.pendingDerivedCandidates.add(candidate.candidateId);\n const queued = Object.freeze({ ...record.token, state: 'queued' as const });\n record.token = queued;\n // Revalidate the complete queued dependency projection after every\n // admission. A dependent candidate may have been queued before a newer\n // endpoint revision arrived; allowing it to survive until process() would\n // make the result depend on queue order and could silently bind the old\n // endpoint source.\n let changed = true;\n while (changed) {\n changed = false;\n const projectedSources = new Map(sourceOverrides ?? []);\n for (const [entity, source] of this.pendingDerivedSources()) {\n const current = projectedSources.get(entity);\n if (current === undefined || source.revision > current.revision)\n projectedSources.set(entity, source);\n }\n for (const queuedId of [...this.pendingDerivedCandidates]) {\n const queuedRecord = this.derivedCandidates.get(queuedId);\n if (queuedRecord?.state !== 'queued') continue;\n const projected = projectedSources.get(queuedRecord.input.entity);\n const staleRevision =\n projected !== undefined && queuedRecord.input.revision < projected.revision;\n const dependencyError = staleRevision\n ? new DerivedPhysicsError(\n 'derived-candidate-stale',\n 'queued candidates publish only the final revision submitted for an entity',\n 'discard the older queued candidate and submit one complete revision',\n {\n entity: queuedRecord.input.entity,\n candidateId: queuedRecord.token.candidateId,\n expected: `>=${projected.revision}`,\n actual: queuedRecord.input.revision,\n },\n )\n : this.validateDerivedAdmission(queuedRecord.input, projectedSources);\n if (dependencyError === undefined) continue;\n this.rejectPreparedCandidate(queuedRecord, dependencyError);\n changed = true;\n if (queuedId === candidate.candidateId) return err(dependencyError);\n }\n }\n return ok(queued);\n }\n\n /** Cancel candidate-native resources; the committed state remains untouched. */\n cancelDerivedShapeCandidate(\n candidate: DerivedPhysicsCandidate,\n ): ReturnType<NonNullable<PhysicsWorld['cancelDerivedShapeCandidate']>> {\n this.assertActive('cancelDerivedShapeCandidate');\n const record = this.derivedCandidates.get(candidate.candidateId);\n if (record === undefined || candidate.owner !== this.physicsOwner) {\n return err(\n new DerivedPhysicsError(\n 'derived-candidate-not-found',\n 'candidate belongs to the current PhysicsWorld',\n 'ignore already-retired credentials and prepare again when needed',\n { candidateId: candidate.candidateId },\n ),\n );\n }\n if (record.state === 'published') {\n return err(\n new DerivedPhysicsError(\n 'derived-candidate-cancelled',\n 'a published candidate remains the committed result until replaced',\n 'submit a newer candidate instead of cancelling committed state',\n { candidateId: candidate.candidateId },\n ),\n );\n }\n for (const member of record.batch?.records ?? [record]) {\n this.pendingDerivedCandidates.delete(member.token.candidateId);\n for (const collider of member.nativeColliders) this.removeNativeCollider(collider.handle);\n member.state = 'cancelled';\n this.releaseDerivedCandidate(member.token.candidateId);\n }\n return ok(undefined);\n }\n\n /** Reject all in-flight derived work while preserving the last publication. */\n invalidateDerivedShapeCandidates(reason = 'consumer-invalidated'): void {\n const committedCandidateIds = new Set(\n [...this.derivedBodies.values()].map((body) => body.candidateId),\n );\n for (const [id, record] of this.derivedCandidates) {\n if (record.state === 'published' || committedCandidateIds.has(id)) continue;\n record.state = 'invalidated';\n for (const collider of record.nativeColliders) this.removeNativeCollider(collider.handle);\n this.releaseDerivedCandidate(id);\n }\n this.pendingDerivedCandidates.clear();\n void reason;\n }\n\n getDerivedPublication(entity: number): DerivedPhysicsPublication | undefined {\n this.assertActive('getDerivedPublication');\n if (this.recoveryBlocked()) return undefined;\n const publication = this.derivedPublications.get(entity);\n return publication === undefined\n ? undefined\n : { ...publication, shapeIds: [...publication.shapeIds] };\n }\n\n getDerivedFailure(entity: number): DerivedPhysicsFailure | undefined {\n const failure = this.derivedFailures.get(entity);\n return failure === undefined ? undefined : { ...failure };\n }\n\n getDerivedBodyType(entity: number): 'static' | 'dynamic' | 'kinematic' | undefined {\n this.assertActive('getDerivedBodyType');\n if (this.recoveryBlocked()) return undefined;\n const body = this.bodyForEntity(entity);\n if (body === undefined) return undefined;\n return rapierBodyTypeToString(this.rapierModule, body.bodyType());\n }\n\n getDerivedBodyMass(entity: number): number | undefined {\n this.assertActive('getDerivedBodyMass');\n if (this.recoveryBlocked()) return undefined;\n const body = this.bodyForEntity(entity);\n return body === undefined ? undefined : body.mass();\n }\n\n getDerivedMotion(entity: number): DerivedPhysicsMotion | undefined {\n this.assertActive('getDerivedMotion');\n if (this.recoveryBlocked() || !this.derivedBodies.has(entity)) return undefined;\n const body = this.bodyForEntity(entity);\n if (body === undefined) return undefined;\n const com = body.worldCom();\n const linear = body.linvel();\n const angular = body.angvel();\n const rotation = body.rotation();\n return Object.freeze({\n centerOfMass: [com.x, com.y, com.z] as PhysicsVector,\n linearVelocity: [linear.x, linear.y, linear.z] as PhysicsVector,\n angularVelocity: [angular.x, angular.y, angular.z] as PhysicsVector,\n rotation: [rotation.x, rotation.y, rotation.z, rotation.w] as PhysicsQuaternion,\n });\n }\n\n applyDerivedImpulse(\n input: Parameters<NonNullable<PhysicsWorld['applyDerivedImpulse']>>[0],\n ): Result<void, DerivedPhysicsError> {\n this.assertActive('applyDerivedImpulse');\n const refuse = (code: DerivedPhysicsError['code'], expected: string) =>\n err(\n new DerivedPhysicsError(\n code,\n expected,\n 'read the committed dynamic body and submit a finite impulse outside pending admission',\n { entity: input.entity },\n ),\n );\n if (this.recoveryBlocked())\n return refuse('derived-recovery-invalid', 'PhysicsWorld is healthy');\n const record = this.derivedBodies.get(input.entity);\n const body = this.bodyForEntity(input.entity);\n if (record === undefined || body === undefined)\n return refuse('derived-body-not-found', 'a committed derived body exists');\n if (record.sourceKey !== input.sourceKey || record.revision !== input.revision)\n return refuse(\n 'derived-candidate-stale',\n 'impulse identity matches the committed body revision',\n );\n if (\n this.derivedPublicationPending ||\n [...this.pendingDerivedCandidates].some(\n (id) => this.derivedCandidates.get(id)?.input.entity === input.entity,\n )\n )\n return refuse('derived-candidate-pending', 'the body has no unpublished native mutation');\n if (\n rapierBodyTypeToString(this.rapierModule, body.bodyType()) !== 'dynamic' ||\n ![input.impulse, input.point].every(\n (vector) =>\n Array.isArray(vector) &&\n vector.length === 3 &&\n vector.every((value) => Number.isFinite(value) && Number.isFinite(Math.fround(value))),\n )\n )\n return refuse(\n 'derived-candidate-invalid',\n 'a dynamic body receives finite Float32 world vectors',\n );\n try {\n body.applyImpulseAtPoint(\n { x: input.impulse[0], y: input.impulse[1], z: input.impulse[2] },\n { x: input.point[0], y: input.point[1], z: input.point[2] },\n true,\n );\n const linear = body.linvel(),\n angular = body.angvel();\n if (![linear.x, linear.y, linear.z, angular.x, angular.y, angular.z].every(Number.isFinite))\n throw new Error('native impulse produced non-finite motion');\n return ok(undefined);\n } catch (cause) {\n this.derivedPoisonedEntities.add(input.entity);\n return err(\n new DerivedPhysicsError(\n 'derived-backend-failed',\n 'native impulse completes with finite motion',\n 'rebuild the World from a previously committed snapshot',\n { entity: input.entity, reason: cause instanceof Error ? cause.message : String(cause) },\n ),\n );\n }\n }\n\n getDerivedRecoveryState(): 'ready' | 'rebuild-required' {\n return this.recoveryBlocked() ? 'rebuild-required' : 'ready';\n }\n\n getDerivedShapes(entity: number): readonly DerivedShapeState[] {\n this.assertActive('getDerivedShapes');\n if (this.recoveryBlocked()) return [];\n const body = this.derivedBodies.get(entity);\n if (body === undefined) return [];\n return body.shapes.map((shape) => ({\n id: shape.input.id,\n revision: shape.input.revision,\n entity,\n voxelSize: [...shape.input.voxelSize] as PhysicsVector,\n origin: [...shape.input.origin] as PhysicsVector,\n rotation: [...shape.input.rotation] as PhysicsQuaternion,\n generation: body.generation,\n }));\n }\n\n captureDerivedPhysicsState(): DerivedPhysicsSnapshot {\n this.assertActive('captureDerivedPhysicsState');\n return Object.freeze({\n generation: this.backendGeneration,\n fixedStep: this.fixedStep,\n bodies: Object.freeze(\n [...this.derivedBodies.values()].map((body) => ({\n entity: body.entity,\n revision: body.revision,\n sourceKey: body.sourceKey,\n ...(body.bodyType === undefined ? {} : { bodyType: body.bodyType }),\n ...(body.velocityPolicy === undefined ? {} : { velocityPolicy: body.velocityPolicy }),\n shapes: Object.freeze(\n body.shapes.map((shape) => ({\n ...shape.input,\n cells: new Int32Array(shape.input.cells),\n voxelSize: [...shape.input.voxelSize] as PhysicsVector,\n origin: [...shape.input.origin] as PhysicsVector,\n rotation: [...shape.input.rotation] as PhysicsQuaternion,\n })),\n ),\n seams: Object.freeze(\n body.seams.map((seam) => ({ ...seam, offset: [...seam.offset] as PhysicsVector })),\n ),\n ...(body.massProperties === undefined ? {} : { massProperties: body.massProperties }),\n ...(() => {\n const motion = this.getDerivedMotion(body.entity);\n return motion === undefined ? {} : { motion };\n })(),\n constraints: Object.freeze(this.constraintsForBody(body.entity)),\n })),\n ),\n });\n }\n\n restoreDerivedPhysicsState(\n snapshot: DerivedPhysicsSnapshot,\n ): ReturnType<NonNullable<PhysicsWorld['restoreDerivedPhysicsState']>> {\n this.assertActive('restoreDerivedPhysicsState');\n const snapshotSources = new Map<number, DerivedBodySource>();\n for (const body of snapshot.bodies) {\n if (snapshotSources.has(body.entity)) {\n return err(\n new DerivedPhysicsError(\n 'derived-candidate-invalid',\n 'a portable snapshot contains one committed body row per entity',\n 'capture the snapshot from one PhysicsWorld without duplicate entities',\n { entity: body.entity },\n ),\n );\n }\n snapshotSources.set(body.entity, {\n sourceKey: body.sourceKey,\n revision: body.revision,\n });\n }\n const preparedCandidates: DerivedPhysicsCandidate[] = [];\n const restoredConstraintIds = new Set<string>();\n for (const body of snapshot.bodies) {\n const prepared = this.prepareDerivedShapeCandidate({\n entity: body.entity,\n revision: body.revision,\n sourceKey: body.sourceKey,\n shapes: body.shapes,\n ...(body.seams === undefined || body.seams.length === 0 ? {} : { seams: body.seams }),\n ...(body.bodyType === undefined ? {} : { bodyType: body.bodyType }),\n ...(body.velocityPolicy === undefined ? {} : { velocityPolicy: body.velocityPolicy }),\n ...(body.motion === undefined ? {} : { motion: body.motion }),\n ...(body.massProperties === undefined ? {} : { massProperties: body.massProperties }),\n constraints: body.constraints.filter((constraint) => {\n if (restoredConstraintIds.has(constraint.id)) return false;\n restoredConstraintIds.add(constraint.id);\n return true;\n }),\n });\n if (!prepared.ok) {\n for (const candidate of preparedCandidates) this.cancelDerivedShapeCandidate(candidate);\n return prepared;\n }\n preparedCandidates.push(prepared.value);\n }\n if (preparedCandidates.length === 0) return ok([]);\n return this.admitDerivedShapeCandidates(preparedCandidates);\n }\n\n createDerivedConstraint(\n input: PhysicsConstraintInput,\n ): ReturnType<NonNullable<PhysicsWorld['createDerivedConstraint']>> {\n return this.installDerivedConstraint(input, false);\n }\n\n updateDerivedConstraint(\n input: PhysicsConstraintInput,\n ): ReturnType<NonNullable<PhysicsWorld['updateDerivedConstraint']>> {\n return this.installDerivedConstraint(input, true);\n }\n\n removeDerivedConstraint(\n id: string,\n ): ReturnType<NonNullable<PhysicsWorld['removeDerivedConstraint']>> {\n this.assertActive('removeDerivedConstraint');\n const existing = this.derivedConstraints.get(id);\n if (existing === undefined) {\n return err(\n new DerivedPhysicsError(\n 'derived-constraint-not-found',\n 'constraint identity is currently committed',\n 'ignore repeated cleanup or reconcile the owning constraint set',\n { constraintId: id },\n ),\n );\n }\n this.removeNativeConstraint(existing.handle);\n this.derivedConstraints.delete(id);\n return ok(undefined);\n }\n\n private createDerivedCollider(\n body: RapierRigidBody,\n shape: VoxelShapeInput,\n ): { readonly handle: number } {\n const RAPIER = this.rapierModule as RapierWorld;\n const desc = RAPIER.ColliderDesc.voxels(\n shape.cells instanceof Int32Array\n ? new Int32Array(shape.cells)\n : new Int32Array(shape.cells.flat()),\n { x: shape.voxelSize[0], y: shape.voxelSize[1], z: shape.voxelSize[2] },\n )\n .setTranslation(shape.origin?.[0] ?? 0, shape.origin?.[1] ?? 0, shape.origin?.[2] ?? 0)\n .setRotation({\n x: shape.rotation?.[0] ?? 0,\n y: shape.rotation?.[1] ?? 0,\n z: shape.rotation?.[2] ?? 0,\n w: shape.rotation?.[3] ?? 1,\n })\n .setFriction(shape.friction ?? 0.5)\n .setRestitution(shape.restitution ?? 0)\n // Disabled colliders still contribute native mass. Staging must be\n // massless; admission assigns density only to its committed shape set.\n .setDensity(0)\n .setCollisionGroups(shape.collisionGroups ?? 0xffffffff)\n .setSolverGroups(shape.solverGroups ?? 0xffffffff)\n .setActiveEvents(RAPIER.ActiveEvents.COLLISION_EVENTS)\n .setActiveCollisionTypes(RAPIER.ActiveCollisionTypes.ALL)\n .setEnabled(false);\n if (shape.isSensor === true) desc.setSensor(true);\n const collider = this.raw.createCollider(desc, body);\n this.derivedColliderToShape.set(collider.handle, { entity: body.userData, id: shape.id });\n return collider;\n }\n\n private removeNativeCollider(handle: number): void {\n this.derivedColliderToShape.delete(handle);\n try {\n const collider = (this.raw as RapierWorld).getCollider(handle);\n if (collider !== null && collider !== undefined) {\n (this.raw as RapierWorld).removeCollider(collider, false);\n }\n } catch {\n // Native removal is idempotent from the Engine lifecycle perspective.\n }\n }\n\n private createNativeConstraint(\n input: PhysicsConstraintInput,\n ): Result<{ readonly handle: number }, DerivedPhysicsError> {\n let native: RapierWorld | undefined;\n try {\n const RAPIER = this.rapierModule as RapierWorld;\n const bodyA = this.bodyForEntity(input.bodyA);\n const bodyB = this.bodyForEntity(input.bodyB);\n if (bodyA === undefined || bodyB === undefined) {\n return err(\n new DerivedPhysicsError(\n 'derived-body-not-found',\n 'both constraint endpoints have committed bodies in this PhysicsWorld',\n 'reconcile both entities before creating the constraint',\n { constraintId: input.id },\n ),\n );\n }\n const anchorA = { x: input.anchorA[0], y: input.anchorA[1], z: input.anchorA[2] };\n const anchorB = { x: input.anchorB[0], y: input.anchorB[1], z: input.anchorB[2] };\n const jointData =\n input.kind === 'spring'\n ? RAPIER.JointData.spring(\n input.restLength,\n input.stiffness,\n input.damping,\n anchorA,\n anchorB,\n )\n : RAPIER.JointData.revolute(anchorA, anchorB, {\n x: input.axis[0],\n y: input.axis[1],\n z: input.axis[2],\n });\n native = this.raw.createImpulseJoint(jointData, bodyA, bodyB, true);\n if (input.kind === 'hinge' && input.limits !== undefined)\n native.setLimits(input.limits[0], input.limits[1]);\n return ok({ handle: native.handle });\n } catch (cause) {\n if (native !== undefined) this.removeNativeConstraint(native.handle);\n return err(\n new DerivedPhysicsError(\n 'derived-backend-failed',\n 'the selected Rapier joint can be created for both endpoint bodies',\n 'repair endpoint state or use a supported spring/hinge input',\n {\n constraintId: input.id,\n reason: cause instanceof Error ? cause.message : String(cause),\n },\n ),\n );\n }\n }\n\n private rememberDerivedFailure(\n record: DerivedCandidateRecord,\n error: DerivedPhysicsError,\n recovery: DerivedPhysicsFailure['recovery'],\n ): void {\n record.state = 'failed';\n this.pendingDerivedCandidates.delete(record.token.candidateId);\n this.derivedFailures.set(\n record.input.entity,\n Object.freeze({\n candidateId: record.token.candidateId,\n entity: record.input.entity,\n revision: record.input.revision,\n fixedStep: this.fixedStep,\n error,\n recovery,\n }),\n );\n this.releaseDerivedCandidate(record.token.candidateId);\n }\n\n private rejectPreparedCandidate(\n record: DerivedCandidateRecord,\n error: DerivedPhysicsError,\n ): void {\n for (const member of record.batch?.records ?? [record]) {\n if (!this.derivedCandidates.has(member.token.candidateId)) continue;\n for (const collider of member.nativeColliders) this.removeNativeCollider(collider.handle);\n this.rememberDerivedFailure(member, error, 'old-state-retained');\n }\n }\n\n private processDerivedCandidates(): void {\n if (this.pendingDerivedCandidates.size === 0) return;\n const pendingRecords = [...this.pendingDerivedCandidates]\n .map((id) => this.derivedCandidates.get(id))\n .filter((record): record is DerivedCandidateRecord => record?.state === 'queued');\n const pendingByEntity = new Map<number, DerivedCandidateRecord>();\n for (const record of pendingRecords) {\n const current = pendingByEntity.get(record.input.entity);\n if (current === undefined || record.input.revision > current.input.revision) {\n pendingByEntity.set(record.input.entity, record);\n }\n }\n // A candidate that names a queued endpoint must be processed after that\n // endpoint. This turns a queue-time source projection into a final\n // committed-source check: if the endpoint fails natively, its dependent\n // candidate sees the old source on the next iteration and is rejected.\n const ordered: (readonly DerivedCandidateRecord[])[] = [];\n const visiting = new Set<string>();\n const visited = new Set<string>();\n const visit = (record: DerivedCandidateRecord): void => {\n const group = record.batch?.records ?? [record];\n const key = group[0]?.token.candidateId ?? record.token.candidateId;\n if (visited.has(key)) return;\n if (visiting.has(key)) {\n this.rejectPreparedCandidate(\n record,\n new DerivedPhysicsError(\n 'derived-constraint-invalid',\n 'cyclic endpoint updates share one batch',\n 'submit mutually dependent body replacements together',\n { candidateId: key },\n ),\n );\n return;\n }\n visiting.add(key);\n for (const member of group) {\n for (const constraint of member.input.constraints ?? []) {\n for (const [entity, dependency] of [\n [constraint.bodyA, constraint.bodyASource],\n [constraint.bodyB, constraint.bodyBSource],\n ] as const) {\n const target = pendingByEntity.get(entity);\n if (\n target !== undefined &&\n !group.includes(target) &&\n target.input.sourceKey === dependency.sourceKey &&\n target.input.revision === dependency.revision\n )\n visit(target);\n }\n }\n }\n visiting.delete(key);\n visited.add(key);\n ordered.push(group);\n };\n for (const record of pendingRecords) visit(record);\n\n for (const group of ordered) {\n if (this.derivedPoisonedEntities.size > 0) break;\n const first = group[0];\n if (first === undefined) continue;\n if (\n group.some(\n (record) =>\n record.state !== 'queued' ||\n !this.pendingDerivedCandidates.has(record.token.candidateId),\n )\n )\n continue;\n // Validate the whole final projection before any native body changes.\n const sources = this.pendingDerivedSources();\n let rejected: DerivedPhysicsError | undefined;\n for (const record of group) {\n const projected = sources.get(record.input.entity);\n if (projected !== undefined && record.input.revision < projected.revision) {\n rejected = new DerivedPhysicsError(\n 'derived-candidate-stale',\n 'fixed-step admission publishes the final queued body revisions',\n 'discard the older group and prepare a complete replacement',\n { entity: record.input.entity },\n );\n } else if (this.derivedPoisonedEntities.has(record.input.entity)) {\n rejected = new DerivedPhysicsError(\n 'derived-recovery-invalid',\n 'every batch body has recoverable native state',\n 'rebuild the PhysicsWorld before retrying',\n { entity: record.input.entity },\n );\n } else if (this.bodyForEntity(record.input.entity) === undefined) {\n rejected = new DerivedPhysicsError(\n 'derived-body-not-found',\n 'every batch body remains live through admission',\n 'reconcile entities and prepare again',\n { entity: record.input.entity },\n );\n } else rejected = this.validateDerivedAdmission(record.input, sources);\n if (rejected !== undefined) break;\n }\n if (rejected !== undefined) {\n this.rejectPreparedCandidate(first, rejected);\n continue;\n }\n const undos: (() => boolean)[] = [];\n for (const record of group) {\n const id = record.token.candidateId;\n const old = this.derivedBodies.get(record.input.entity);\n const body = this.bodyForEntity(record.input.entity);\n const oldBodyType = body.bodyType();\n const oldBodyEnabled = body.isEnabled();\n const oldVelocity = body.linvel();\n const oldAngularVelocity = body.angvel();\n const oldTranslation = body.translation();\n const oldRotation = body.rotation();\n const oldCom = body.worldCom();\n const oldMass = body.mass();\n const oldAutomaticAdditionalMass =\n this.entityMap.get(record.input.entity)?.automaticAdditionalMass ?? 0;\n const oldAutomaticRecordMass = this.entityMap.get(\n record.input.entity,\n )?.automaticAdditionalMass;\n const oldSource = this.derivedBodySources.get(record.input.entity);\n const oldPublication = this.derivedPublications.get(record.input.entity);\n const oldDensities = this.bodyColliders(body).map((collider) => ({\n collider,\n density: typeof collider.density === 'function' ? collider.density() : undefined,\n enabled: typeof collider.isEnabled === 'function' ? collider.isEnabled() : true,\n }));\n const oldConstraints = new Map(this.derivedConstraints);\n const stagedConstraints = new Map<string, DerivedConstraintRecord>();\n let geometryCommitUncertain = false;\n const rollback = (): boolean => {\n for (const staged of stagedConstraints.values())\n this.removeNativeConstraint(staged.handle);\n // The commit path may already have removed/replaced a native joint\n // before a later body mutation fails. Clear every current native joint\n // now; the old records are recreated after the body state is restored\n // instead of leaving a stale JS handle that no longer exists in\n // Rapier.\n for (const current of this.derivedConstraints.values())\n this.removeNativeConstraint(current.handle);\n this.derivedConstraints.clear();\n if (old !== undefined) {\n for (const shape of old.shapes) {\n const collider = (this.raw as RapierWorld).getCollider(shape.colliderHandle);\n if (collider !== null && collider !== undefined) collider.setEnabled(true);\n }\n const retiredIndex = this.retiredDerivedBodies.indexOf(old);\n if (retiredIndex >= 0) this.retiredDerivedBodies.splice(retiredIndex, 1);\n this.derivedBodies.set(record.input.entity, old);\n this.derivedBodySources.set(record.input.entity, {\n sourceKey: old.sourceKey,\n revision: old.revision,\n });\n }\n for (const native of record.nativeColliders) {\n const collider = (this.raw as RapierWorld).getCollider(native.handle);\n if (collider !== null && collider !== undefined) collider.setEnabled(false);\n }\n // Remove staged colliders before restoring mass. Rapier defers some\n // mass-property recomputation until a collider mutation; restoring\n // while a disabled candidate is still attached can leave an explicit\n // override behind for the next fixed step.\n for (const native of record.nativeColliders) this.removeNativeCollider(native.handle);\n for (const { collider, density, enabled } of oldDensities) {\n if (this.raw.getCollider(collider.handle) === null) continue;\n if (density !== undefined && typeof collider.setDensity === 'function')\n collider.setDensity(density);\n if (typeof collider.setEnabled === 'function') collider.setEnabled(enabled);\n }\n let restored = true;\n try {\n body.setBodyType(oldBodyType, true);\n this.restoreCommittedMass(body, old, oldAutomaticAdditionalMass);\n body.setTranslation(oldTranslation, true);\n body.setRotation(oldRotation, true);\n body.setLinvel(oldVelocity, true);\n body.setAngvel(oldAngularVelocity, true);\n body.setEnabled(oldBodyEnabled);\n } catch {\n restored = false;\n }\n if (restored && !this.restoreNativeConstraints(oldConstraints)) restored = false;\n if (restored) {\n const currentMass = body.mass();\n const currentCom = body.worldCom();\n const currentVelocity = body.linvel();\n const currentAngularVelocity = body.angvel();\n const currentRotation = body.rotation();\n restored =\n Number.isFinite(currentMass) &&\n Math.abs(currentMass - oldMass) <= 1e-6 * Math.max(1, Math.abs(oldMass)) &&\n Math.abs(currentCom.x - oldCom.x) <= 1e-6 &&\n Math.abs(currentCom.y - oldCom.y) <= 1e-6 &&\n Math.abs(currentCom.z - oldCom.z) <= 1e-6 &&\n Math.abs(currentVelocity.x - oldVelocity.x) <= 1e-6 &&\n Math.abs(currentVelocity.y - oldVelocity.y) <= 1e-6 &&\n Math.abs(currentVelocity.z - oldVelocity.z) <= 1e-6 &&\n Math.abs(currentAngularVelocity.x - oldAngularVelocity.x) <= 1e-6 &&\n Math.abs(currentAngularVelocity.y - oldAngularVelocity.y) <= 1e-6 &&\n Math.abs(currentAngularVelocity.z - oldAngularVelocity.z) <= 1e-6 &&\n Math.abs(\n currentRotation.x * oldRotation.x +\n currentRotation.y * oldRotation.y +\n currentRotation.z * oldRotation.z +\n currentRotation.w * oldRotation.w,\n ) >=\n 1 - 1e-6 &&\n body.bodyType() === oldBodyType &&\n body.isEnabled() === oldBodyEnabled;\n }\n if (old === undefined) this.derivedBodies.delete(record.input.entity);\n else this.derivedBodies.set(record.input.entity, old);\n if (oldSource === undefined) this.derivedBodySources.delete(record.input.entity);\n else this.derivedBodySources.set(record.input.entity, oldSource);\n if (oldPublication === undefined) this.derivedPublications.delete(record.input.entity);\n else this.derivedPublications.set(record.input.entity, oldPublication);\n const entityRecord = this.entityMap.get(record.input.entity);\n if (entityRecord !== undefined && oldAutomaticRecordMass !== undefined)\n entityRecord.automaticAdditionalMass = oldAutomaticRecordMass;\n return restored;\n };\n const restore = (undo: () => boolean): boolean => {\n try {\n return undo();\n } catch {\n return false;\n }\n };\n try {\n for (const constraint of record.input.constraints ?? []) {\n const created = this.createNativeConstraint(constraint);\n if (!created.ok) throw created.error;\n stagedConstraints.set(constraint.id, {\n input: { ...constraint },\n handle: created.value.handle,\n });\n }\n if (record.input.bodyType !== undefined) {\n const RAPIER = this.rapierModule as RapierWorld;\n const bodyType =\n record.input.bodyType === 'static'\n ? RAPIER.RigidBodyType.Fixed\n : record.input.bodyType === 'kinematic'\n ? RAPIER.RigidBodyType.KinematicPositionBased\n : RAPIER.RigidBodyType.Dynamic;\n body.setBodyType(bodyType, true);\n }\n for (const native of record.nativeColliders) {\n const collider = (this.raw as RapierWorld).getCollider(native.handle);\n if (collider === null || collider === undefined)\n throw new Error('candidate collider disappeared');\n collider.setEnabled(true);\n }\n const nativeById = new Map(\n record.input.shapes.map((shape: VoxelShapeInput, index: number) => [\n shape.id,\n record.nativeColliders[index]?.handle as number,\n ]),\n );\n for (const seam of record.input.seams ?? []) {\n const firstHandle = nativeById.get(seam.shapeA);\n const secondHandle = nativeById.get(seam.shapeB);\n const first =\n firstHandle === undefined\n ? undefined\n : (this.raw as RapierWorld).getCollider(firstHandle);\n const second =\n secondHandle === undefined\n ? undefined\n : (this.raw as RapierWorld).getCollider(secondHandle);\n if (first === undefined || second === undefined || first === null || second === null) {\n throw new Error(`derived seam references missing shape ${seam.shapeA}`);\n }\n first.combineVoxelStates(second, seam.offset[0], seam.offset[1], seam.offset[2]);\n }\n if (record.input.motion?.rotation !== undefined) {\n const [x, y, z, w] = record.input.motion.rotation;\n body.setRotation({ x, y, z, w }, true);\n }\n this.applyDerivedMass(\n body,\n record.input.massProperties,\n oldCom,\n record.input.velocityPolicy ?? 'preserve',\n this.entityMap.get(record.input.entity)?.additionalMass ?? 0,\n record.input.entity,\n record.input.shapes,\n record.nativeColliders,\n );\n if (record.input.motion !== undefined) {\n const currentCom = body.worldCom();\n const targetCom = record.input.motion.centerOfMass;\n const translation = body.translation();\n body.setTranslation(\n {\n x: translation.x + targetCom[0] - currentCom.x,\n y: translation.y + targetCom[1] - currentCom.y,\n z: translation.z + targetCom[2] - currentCom.z,\n },\n true,\n );\n body.setLinvel(\n {\n x: record.input.motion.linearVelocity[0],\n y: record.input.motion.linearVelocity[1],\n z: record.input.motion.linearVelocity[2],\n },\n true,\n );\n body.setAngvel(\n {\n x: record.input.motion.angularVelocity[0],\n y: record.input.motion.angularVelocity[1],\n z: record.input.motion.angularVelocity[2],\n },\n true,\n );\n }\n // A body revision invalidates any committed joint that still names\n // that body's previous source/revision. Keep this tied to the body\n // that is actually committing: a different queued endpoint may still\n // fail, in which case its old joint remains valid and must not be\n // removed speculatively.\n const committedSources = new Map(this.derivedBodySources);\n committedSources.set(record.input.entity, {\n sourceKey: record.input.sourceKey,\n revision: record.input.revision,\n });\n const replacementConstraintIds = new Set(\n (record.input.constraints ?? []).map((constraint) => constraint.id),\n );\n for (const [constraintId, current] of [...this.derivedConstraints]) {\n if (\n replacementConstraintIds.has(constraintId) ||\n this.constraintDependenciesMatch(current.input, committedSources)\n )\n continue;\n this.removeNativeConstraint(current.handle);\n this.derivedConstraints.delete(constraintId);\n }\n if (old !== undefined) {\n for (const shape of old.shapes) {\n const collider = (this.raw as RapierWorld).getCollider(shape.colliderHandle);\n if (collider !== null && collider !== undefined) collider.setEnabled(false);\n }\n this.retiredDerivedBodies.push(old);\n }\n for (const constraint of record.input.constraints ?? []) {\n const previous = this.derivedConstraints.get(constraint.id);\n if (previous !== undefined) this.removeNativeConstraint(previous.handle);\n const staged = stagedConstraints.get(constraint.id);\n if (staged !== undefined) this.derivedConstraints.set(constraint.id, staged);\n }\n const shapes: DerivedShapeRecord[] = record.input.shapes.map(\n (shape: VoxelShapeInput, index: number) => ({\n input: shape as DerivedShapeRecord['input'],\n colliderHandle: record.nativeColliders[index]?.handle as number,\n }),\n );\n const committed: DerivedBodyRecord = {\n entity: record.input.entity,\n sourceKey: record.input.sourceKey,\n generation: this.backendGeneration,\n revision: record.input.revision,\n bodyType: record.input.bodyType,\n velocityPolicy: record.input.velocityPolicy,\n candidateId: record.token.candidateId,\n shapes,\n seams: [...(record.input.seams ?? [])],\n massProperties: record.input.massProperties,\n constraints: [...(record.input.constraints ?? [])],\n };\n // The sole cross-domain observation boundary: no native operation\n // follows a successful geometry commit before recording this body.\n // A refused commit takes the same complete native rollback below.\n const commitGeometry =\n record === group[group.length - 1]\n ? (record.batch?.commitGeometry ?? record.commitGeometry)\n : undefined;\n if (commitGeometry !== undefined) {\n this.activeDerivedAdmission = record;\n try {\n geometryCommitUncertain = true;\n const geometry = commitGeometry();\n geometryCommitUncertain = false;\n if (!geometry.ok) throw geometry.error;\n } finally {\n this.activeDerivedAdmission = undefined;\n }\n delete record.commitGeometry;\n }\n this.derivedBodies.set(record.input.entity, committed);\n const entityRecord = this.entityMap.get(record.input.entity);\n if (entityRecord !== undefined) {\n entityRecord.automaticAdditionalMass =\n record.input.massProperties?.mode === 'explicit' ? 0 : entityRecord.additionalMass;\n }\n this.derivedBodySources.set(record.input.entity, {\n sourceKey: record.input.sourceKey,\n revision: record.input.revision,\n });\n this.derivedFailures.delete(record.input.entity);\n record.state = 'queued';\n this.pendingDerivedCandidates.delete(id);\n undos.push(rollback);\n } catch (cause) {\n let restored = restore(rollback);\n for (const undo of undos.reverse()) {\n if (!restore(undo)) restored = false;\n }\n const error =\n cause instanceof DerivedPhysicsError\n ? cause\n : new DerivedPhysicsError(\n 'derived-backend-failed',\n 'derived admission either commits completely or preserves the prior body state',\n 'inspect the failure receipt and rebuild the PhysicsWorld if recovery is required',\n {\n entity: record.input.entity,\n candidateId: record.token.candidateId,\n reason: cause instanceof Error ? cause.message : String(cause),\n },\n );\n // A thrown consumer callback can have changed ECS state. Native\n // rollback alone cannot certify any member of that combined group.\n if (geometryCommitUncertain) restored = false;\n for (const member of group) {\n if (!restored) {\n this.derivedPoisonedEntities.add(member.input.entity);\n this.derivedBodies.delete(member.input.entity);\n this.derivedPublications.delete(member.input.entity);\n }\n this.rememberDerivedFailure(\n member,\n error,\n restored ? 'old-state-retained' : 'rebuild-required',\n );\n }\n break;\n }\n }\n }\n }\n\n private publishDerivedCandidates(): void {\n for (const body of this.derivedBodies.values()) {\n const candidate = this.derivedCandidates.get(body.candidateId);\n if (candidate?.state !== 'queued') continue;\n this.derivedPublications.set(\n body.entity,\n Object.freeze({\n candidateId: body.candidateId,\n entity: body.entity,\n revision: body.revision,\n fixedStep: this.fixedStep,\n shapeIds: Object.freeze(body.shapes.map((shape) => shape.input.id)),\n generation: body.generation,\n }),\n );\n candidate.state = 'published';\n // Admission membership is transient. A long-lived sibling must not keep\n // a replaced member's private shape buffers or callback closure alive.\n delete candidate.batch;\n }\n }\n\n private retireDerivedBodies(): void {\n for (const body of this.retiredDerivedBodies.splice(0)) {\n for (const shape of body.shapes) this.removeNativeCollider(shape.colliderHandle);\n this.releaseDerivedCandidate(body.candidateId);\n }\n }\n\n private applyDerivedMass(\n body: RapierRigidBody,\n properties: PhysicsMassProperties | undefined,\n previousWorldCom: { x: number; y: number; z: number },\n velocityPolicy: 'preserve' | 'reset',\n authoredAdditionalMass: number,\n entity: number,\n candidateShapes: readonly VoxelShapeInput[],\n candidateColliders: readonly { readonly handle: number }[],\n ): void {\n const oldVelocity = body.linvel();\n const oldAngularVelocity = body.angvel();\n if (properties?.mode === 'explicit') {\n // Explicit mass is the sole source for this body. Zero every ordinary\n // and derived collider density first so Rapier does not add a hidden\n // density contribution to the authored value.\n this.rememberAuthoredDensity(entity, body);\n for (const collider of this.bodyColliders(body)) {\n if (typeof collider.setDensity === 'function') collider.setDensity(0);\n }\n const frame = properties.principalInertiaLocalFrame ?? [0, 0, 0, 1];\n body.setAdditionalMassProperties(\n properties.mass,\n {\n x: properties.centerOfMass[0],\n y: properties.centerOfMass[1],\n z: properties.centerOfMass[2],\n },\n {\n x: properties.principalInertia[0],\n y: properties.principalInertia[1],\n z: properties.principalInertia[2],\n },\n { x: frame[0], y: frame[1], z: frame[2], w: frame[3] },\n true,\n );\n // Rapier defers additional mass updates. Admission reads worldCom below\n // before stepping, so refresh now or COM restoration shifts the body twice.\n body.recomputeMassPropertiesFromColliders();\n } else {\n this.restoreAutomaticDensities(\n entity,\n body,\n properties?.mode === 'automatic' ? properties.density : undefined,\n candidateShapes,\n candidateColliders,\n );\n this.restoreAutomaticMass(body, authoredAdditionalMass);\n }\n if (velocityPolicy === 'reset') {\n body.setLinvel({ x: 0, y: 0, z: 0 }, true);\n body.setAngvel({ x: 0, y: 0, z: 0 }, true);\n return;\n }\n const nextWorldCom = body.worldCom();\n const next = preserveCenterOfMassVelocity(\n [oldVelocity.x, oldVelocity.y, oldVelocity.z],\n [oldAngularVelocity.x, oldAngularVelocity.y, oldAngularVelocity.z],\n [previousWorldCom.x, previousWorldCom.y, previousWorldCom.z],\n [nextWorldCom.x, nextWorldCom.y, nextWorldCom.z],\n );\n body.setLinvel({ x: next[0], y: next[1], z: next[2] }, true);\n body.setAngvel(oldAngularVelocity, true);\n }\n\n /** Restore the complete committed mass policy after a failed admission. */\n private restoreCommittedMass(\n body: RapierRigidBody,\n previous: DerivedBodyRecord | undefined,\n automaticAdditionalMass: number,\n ): void {\n if (previous?.massProperties?.mode === 'explicit') {\n const frame = previous.massProperties.principalInertiaLocalFrame ?? [0, 0, 0, 1];\n body.setAdditionalMassProperties(\n previous.massProperties.mass,\n {\n x: previous.massProperties.centerOfMass[0],\n y: previous.massProperties.centerOfMass[1],\n z: previous.massProperties.centerOfMass[2],\n },\n {\n x: previous.massProperties.principalInertia[0],\n y: previous.massProperties.principalInertia[1],\n z: previous.massProperties.principalInertia[2],\n },\n { x: frame[0], y: frame[1], z: frame[2], w: frame[3] },\n true,\n );\n body.recomputeMassPropertiesFromColliders();\n return;\n }\n this.restoreAutomaticMass(body, automaticAdditionalMass);\n }\n\n /**\n * Rapier keeps `setAdditionalMassProperties` as native state even after a\n * collider recompute. Clear that override explicitly before recomputing so\n * automatic candidates and rollback really return to the authored policy.\n */\n private restoreAutomaticMass(body: RapierRigidBody, additionalMass: number): void {\n body.setAdditionalMass(Math.max(0, additionalMass), true);\n body.recomputeMassPropertiesFromColliders();\n }\n\n private rememberAuthoredDensity(entity: number, body: RapierRigidBody): void {\n const record = this.entityMap.get(entity);\n if (record === undefined || record.authoredDensity !== undefined) return;\n const authored = this.bodyColliders(body).find(\n (collider) => !this.derivedColliderToShape.has(collider.handle),\n );\n const density =\n authored !== undefined && typeof authored.density === 'function'\n ? authored.density()\n : undefined;\n if (density !== undefined && Number.isFinite(density) && density >= 0)\n record.authoredDensity = density;\n }\n\n private restoreAutomaticDensities(\n entity: number,\n body: RapierRigidBody,\n overrideDensity: number | undefined,\n candidateShapes: readonly VoxelShapeInput[],\n candidateColliders: readonly { readonly handle: number }[],\n ): void {\n const record = this.entityMap.get(entity);\n const candidateDensityByHandle = new Map<number, number>();\n for (const [index, collider] of candidateColliders.entries()) {\n const shape = candidateShapes[index];\n if (shape !== undefined) candidateDensityByHandle.set(collider.handle, shape.density ?? 1);\n }\n const authoredDensity = record?.authoredDensity ?? 1;\n for (const collider of this.bodyColliders(body)) {\n const candidateDensity = candidateDensityByHandle.get(collider.handle);\n const density =\n candidateDensity !== undefined\n ? (overrideDensity ?? candidateDensity)\n : this.derivedColliderToShape.has(collider.handle)\n ? 0\n : (overrideDensity ?? authoredDensity);\n if (typeof collider.setDensity === 'function') collider.setDensity(density);\n }\n }\n\n private restoreNativeConstraints(\n previous: ReadonlyMap<string, DerivedConstraintRecord>,\n ): boolean {\n for (const [constraintId, record] of previous) {\n const recreated = this.createNativeConstraint(record.input);\n if (!recreated.ok) {\n for (const current of this.derivedConstraints.values())\n this.removeNativeConstraint(current.handle);\n this.derivedConstraints.clear();\n return false;\n }\n this.derivedConstraints.set(constraintId, {\n input: { ...record.input },\n handle: recreated.value.handle,\n });\n }\n return true;\n }\n\n private bodyColliders(body: RapierRigidBody): RapierWorld[] {\n const result: RapierWorld[] = [];\n for (let index = 0; index < body.numColliders(); index += 1) {\n const collider = body.collider(index);\n if (collider !== null && collider !== undefined) result.push(collider);\n }\n return result;\n }\n\n private releaseDerivedCandidate(candidateId: string): void {\n const record = this.derivedCandidates.get(candidateId);\n if (record === undefined) return;\n this.derivedCandidateBytes = Math.max(0, this.derivedCandidateBytes - record.bytes);\n this.derivedCandidates.delete(candidateId);\n }\n\n private sourceForEntity(entity: number): DerivedBodySource {\n return (\n this.derivedBodySources.get(entity) ?? {\n sourceKey: `entity:${entity}`,\n revision: 0,\n }\n );\n }\n\n /**\n * Project the final source revision of every queued body. Constraint\n * dependencies are checked against this projection, not against whichever\n * queued candidate happens to be processed first.\n */\n private pendingDerivedSources(): Map<number, DerivedBodySource> {\n const sources = new Map<number, DerivedBodySource>();\n for (const candidateId of this.pendingDerivedCandidates) {\n const record = this.derivedCandidates.get(candidateId);\n if (record === undefined || record.state !== 'queued') continue;\n const current = sources.get(record.input.entity);\n if (current === undefined || record.input.revision > current.revision) {\n sources.set(record.input.entity, {\n sourceKey: record.input.sourceKey,\n revision: record.input.revision,\n });\n }\n }\n return sources;\n }\n\n private newestPendingRevision(entity: number): number | undefined {\n return this.pendingDerivedSources().get(entity)?.revision;\n }\n\n private recoveryBlocked(): boolean {\n return (\n this.derivedPoisonedEntities.size > 0 || this.syncState?.world.execution.health === 'poisoned'\n );\n }\n\n private validateConstraintDependencies(\n input: PhysicsConstraintInput,\n candidate?: DerivedPhysicsCandidateInput,\n sourceOverrides?: ReadonlyMap<number, DerivedBodySource>,\n ): DerivedPhysicsError | undefined {\n const endpoints = [\n [input.bodyA, input.bodyASource],\n [input.bodyB, input.bodyBSource],\n ] as const;\n for (const [entity, dependency] of endpoints) {\n if (this.derivedPoisonedEntities.has(entity)) {\n return new DerivedPhysicsError(\n 'derived-recovery-invalid',\n 'constraint endpoints belong to a healthy PhysicsWorld state',\n 'rebuild the PhysicsWorld before recreating constraints',\n { constraintId: input.id, entity },\n );\n }\n if (!this.entityMap.has(entity)) {\n return new DerivedPhysicsError(\n 'derived-body-not-found',\n 'both constraint endpoint entities have committed bodies',\n 'reconcile both endpoint entities before creating or migrating a constraint',\n { constraintId: input.id, entity },\n );\n }\n const expected =\n candidate !== undefined && entity === candidate.entity\n ? { sourceKey: candidate.sourceKey, revision: candidate.revision }\n : (sourceOverrides?.get(entity) ?? this.sourceForEntity(entity));\n if (\n dependency.sourceKey !== expected.sourceKey ||\n dependency.revision !== expected.revision\n ) {\n return new DerivedPhysicsError(\n 'derived-constraint-stale',\n 'constraint endpoint sourceKey and revision match the committed endpoint',\n 'refresh both endpoint dependencies and retry the complete candidate',\n {\n constraintId: input.id,\n entity,\n expected: `${expected.sourceKey}@${expected.revision}`,\n actual: `${dependency.sourceKey}@${dependency.revision}`,\n },\n );\n }\n }\n return undefined;\n }\n\n private constraintDependenciesMatch(\n input: PhysicsConstraintInput,\n sourceOverrides: ReadonlyMap<number, DerivedBodySource>,\n ): boolean {\n for (const [entity, dependency] of [\n [input.bodyA, input.bodyASource],\n [input.bodyB, input.bodyBSource],\n ] as const) {\n if (!this.entityMap.has(entity)) return false;\n const expected = sourceOverrides.get(entity) ?? this.sourceForEntity(entity);\n if (dependency.sourceKey !== expected.sourceKey || dependency.revision !== expected.revision)\n return false;\n }\n return true;\n }\n\n private validateDerivedAdmission(\n input: DerivedPhysicsCandidateInput,\n sourceOverrides?: ReadonlyMap<number, DerivedBodySource>,\n ): DerivedPhysicsError | undefined {\n if (\n input.bodyType !== undefined &&\n input.bodyType !== 'static' &&\n input.bodyType !== 'dynamic' &&\n input.bodyType !== 'kinematic'\n ) {\n return new DerivedPhysicsError(\n 'derived-candidate-invalid',\n 'candidate bodyType is one of static, dynamic, or kinematic',\n 'repair the motion type before admission',\n { entity: input.entity, actual: input.bodyType },\n );\n }\n const seen = new Set<string>();\n for (const constraint of input.constraints ?? []) {\n const validation = validateConstraintInput(constraint);\n if (!validation.ok) return validation.error;\n if (seen.has(constraint.id)) {\n return new DerivedPhysicsError(\n 'derived-constraint-invalid',\n 'candidate contains one constraint update per identity',\n 'merge duplicate updates before admission',\n { entity: input.entity, constraintId: constraint.id },\n );\n }\n seen.add(constraint.id);\n const dependencyError = this.validateConstraintDependencies(\n constraint,\n input,\n sourceOverrides,\n );\n if (dependencyError !== undefined) return dependencyError;\n const existing = this.derivedConstraints.get(constraint.id);\n if (existing !== undefined && constraint.revision <= existing.input.revision) {\n return new DerivedPhysicsError(\n 'derived-constraint-stale',\n 'migrated constraint revision advances the committed revision',\n 'submit both endpoint dependencies and a newer constraint revision',\n {\n entity: input.entity,\n constraintId: constraint.id,\n expected: `>${existing.input.revision}`,\n actual: constraint.revision,\n },\n );\n }\n }\n return undefined;\n }\n\n private constraintsForBody(entity: number): readonly PhysicsConstraintInput[] {\n return [...this.derivedConstraints.values()]\n .filter(\n (constraint) => constraint.input.bodyA === entity || constraint.input.bodyB === entity,\n )\n .map((constraint) => ({ ...constraint.input }));\n }\n\n private installDerivedConstraint(\n input: PhysicsConstraintInput,\n updating: boolean,\n ): ReturnType<NonNullable<PhysicsWorld['createDerivedConstraint']>> {\n this.assertActive(updating ? 'updateDerivedConstraint' : 'createDerivedConstraint');\n const validation = validateConstraintInput(input);\n if (!validation.ok) return validation;\n const dependencyError = this.validateConstraintDependencies(\n input,\n undefined,\n this.pendingDerivedSources(),\n );\n if (dependencyError !== undefined) return err(dependencyError);\n const existing = this.derivedConstraints.get(input.id);\n if (existing !== undefined && !updating) {\n return err(\n new DerivedPhysicsError(\n 'derived-constraint-stale',\n 'constraint identity is not already committed when creating it',\n 'call updateDerivedConstraint with a newer revision',\n { constraintId: input.id },\n ),\n );\n }\n if (existing !== undefined && input.revision <= existing.input.revision) {\n return err(\n new DerivedPhysicsError(\n 'derived-constraint-stale',\n 'constraint revision advances monotonically',\n 'submit a newer constraint revision',\n {\n constraintId: input.id,\n actual: input.revision,\n expected: `>${existing.input.revision}`,\n },\n ),\n );\n }\n const native = this.createNativeConstraint(input);\n if (!native.ok) return native;\n if (existing !== undefined) this.removeNativeConstraint(existing.handle);\n this.derivedConstraints.set(input.id, { input: { ...input }, handle: native.value.handle });\n return ok({ id: input.id, revision: input.revision });\n }\n\n private removeNativeConstraint(handle: number): void {\n try {\n const joint = (this.raw as RapierWorld).getImpulseJoint(handle);\n if (joint !== null && joint !== undefined)\n (this.raw as RapierWorld).removeImpulseJoint(joint, true);\n } catch {\n // Cleanup is idempotent across backend teardown and entity removal.\n }\n }\n\n getPendingTeleports(): readonly [\n number,\n { readonly x: number; readonly y: number; readonly z: number },\n ][] {\n return [...this.pendingTeleports].map(([entity, target]) => [entity, { ...target }]);\n }\n\n getKinematicControllerStates(): readonly Rapier3DKinematicControllerState[] {\n return [...this.kccOffsets]\n .sort(([first], [second]) => first - second)\n .map(([entity, offset]) => ({ entity, offset }));\n }\n\n dispose(): void {\n if (this.disposed) return;\n this.assertActive('dispose');\n this.invalidateDerivedShapeCandidates('physics-dispose');\n this.derivedCandidates.clear();\n this.pendingDerivedCandidates.clear();\n this.derivedBodies.clear();\n this.derivedBodySources.clear();\n this.derivedPublications.clear();\n this.derivedFailures.clear();\n this.derivedConstraints.clear();\n this.derivedContacts.length = 0;\n this.derivedPublicationPending = false;\n this.derivedPoisonedEntities.clear();\n this.derivedColliderToShape.clear();\n this.retiredDerivedBodies.length = 0;\n this.derivedCandidateBytes = 0;\n this.backendGeneration += 1;\n this.syncState = undefined;\n this.moveContext = undefined;\n if (typeof this.raw.free === 'function') this.raw.free();\n if (typeof this.eventQueue.free === 'function') this.eventQueue.free();\n this.entityMap.clear();\n this.pendingTeleports.clear();\n this.collisionPairs.clear();\n this.pendingCollisionEvents.length = 0;\n this.collisionEventHistory.length = 0;\n this.kccCache.clear();\n this.kccOffsets.clear();\n this.disposed = true;\n }\n\n getBodyCount(): number {\n return this.entityMap.size;\n }\n\n hasBody(entity: number): boolean {\n return this.entityMap.has(entity);\n }\n\n /**\n * Wire the ECS World + Transform / CharacterController components needed by\n * `moveAndSlide` to read tuning and write back pose + grounded. Called once by\n * `registerPhysicsSystems` (plan-strategy D-1/D-7).\n */\n setMoveContext(world: World, transform: Component, characterController: Component): void {\n this.assertActive('setMoveContext');\n this.moveContext = { world, transform, characterController };\n this.worldIdentity = world;\n }\n\n /** Release the persistent ECS readers owned by one system registration. */\n clearEcsContext(world: World): void {\n if (this.syncState?.world === world) this.syncState = undefined;\n if (this.moveContext?.world === world) this.moveContext = undefined;\n if (this.worldIdentity === world) this.worldIdentity = undefined;\n }\n\n moveAndSlide(entity: number, desiredDelta: Vec3): Vec3 {\n this.assertActive('moveAndSlide');\n return this.computeMove(entity, desiredDelta);\n }\n\n private assertActive(operation: string): void {\n if (this.activeDerivedAdmission !== undefined) {\n throw new DerivedPhysicsError(\n 'derived-candidate-pending',\n 'physics queries and mutations observe only complete fixed-step states',\n 'finish the paired geometry commit before querying or mutating physics',\n { entity: this.activeDerivedAdmission.input.entity, reason: operation },\n );\n }\n if (this.disposed) {\n throw new Error(`RapierPhysicsWorld3D.${operation} cannot run on a disposed instance`);\n }\n }\n\n /**\n * Shared moveAndSlide core (plan-strategy D-1/D-2/D-4/D-6/D-7).\n *\n * The three Fail-Fast entry checks (body / collider / kinematic) throw\n * structured PhysicsError before the World is read, so error-path tests can\n * call this without registered systems.\n */\n private computeMove(entity: number, desiredDelta: Vec3): Vec3 {\n // ── Fail-Fast entry checks (charter P3) ──\n const record = this.entityMap.get(entity);\n if (!record) {\n throw new PhysicsError({\n code: 'body-not-found',\n expected: 'a registered Rapier body for this entity',\n hint: PHYSICS_ERROR_HINTS['body-not-found'],\n detail: { code: 'body-not-found', entity },\n });\n }\n // biome-ignore lint/suspicious/noExplicitAny: Rapier bodies API needs any-cast\n const body = (this.raw as any).bodies.get(record.bodyHandle) as RapierRigidBody | null;\n if (!body) {\n throw new PhysicsError({\n code: 'body-not-found',\n expected: 'a registered Rapier body for this entity',\n hint: PHYSICS_ERROR_HINTS['body-not-found'],\n detail: { code: 'body-not-found', entity },\n });\n }\n if (body.numColliders() === 0) {\n // D-2: body exists but carries no collider — more precise than body-not-found.\n throw new PhysicsError({\n code: 'collider-not-found',\n expected: 'a Collider attached to this entity body',\n hint: PHYSICS_ERROR_HINTS['collider-not-found'],\n detail: { code: 'collider-not-found', entity },\n });\n }\n const RAPIER = this.rapierModule;\n if (body.bodyType() !== RAPIER.RigidBodyType.KinematicPositionBased) {\n throw new PhysicsError({\n code: 'controller-requires-kinematic',\n expected: \"RigidBody.type === 'kinematic'\",\n hint: PHYSICS_ERROR_HINTS['controller-requires-kinematic'],\n detail: {\n code: 'controller-requires-kinematic',\n entity,\n bodyType: rapierBodyTypeToString(RAPIER, body.bodyType()),\n },\n });\n }\n\n const collider = body.collider(0); // D-4: zero-schema reverse lookup\n\n // ── Read CharacterController tuning + lazily build/configure the KCC ──\n const cc = this.readCharacterController(entity);\n const ctrl = this.ensureKcc(entity, cc.offset);\n applyKccTuning(ctrl, cc);\n\n // ── Step 1: solve collisions (D-1 self-exclude predicate) ──\n // Rapier's filter predicate returns true to INCLUDE a collider as a\n // potential obstacle, false to skip it; this excludes the character's own\n // collider so it never collides with itself. EXCLUDE_SENSORS makes the KCC\n // treat sensor colliders as non-solid (their purpose is overlap detection,\n // not blocking) -- without it any sensor overlapping the character (e.g. a\n // pickup/attack trigger volume) walls the KCC and freezes it in place.\n const delta = { x: desiredDelta[0] ?? 0, y: desiredDelta[1] ?? 0, z: desiredDelta[2] ?? 0 };\n ctrl.computeColliderMovement(\n collider,\n delta,\n RAPIER.QueryFilterFlags.EXCLUDE_SENSORS,\n undefined,\n // biome-ignore lint/suspicious/noExplicitAny: Rapier Collider in filter predicate\n (other: any) => other.handle !== collider.handle,\n );\n\n // ── Step 2/3: read corrected movement + grounded ──\n const movement = ctrl.computedMovement() as { x: number; y: number; z: number };\n const grounded = ctrl.computedGrounded() as boolean;\n\n // ── Write back: push the kinematic body + ECS Transform + grounded ──\n const t = body.translation();\n const next = { x: t.x + movement.x, y: t.y + movement.y, z: t.z + movement.z };\n // setNextKinematicTranslation feeds the physics step pipeline; setTranslation\n // advances the body + its collider immediately so consecutive moveAndSlide\n // calls (without an intervening world.step) see the updated pose for the next\n // collision solve + grounded check. The query structures are refreshed so the\n // next computeColliderMovement reads the new position.\n body.setNextKinematicTranslation(next);\n body.setTranslation(next, true);\n // setTranslation marks the body modified but does not re-place its collider\n // in the collider set; propagate so the next computeColliderMovement\n // shape-casts the character from its updated pose.\n // biome-ignore lint/suspicious/noExplicitAny: Rapier World.propagateModifiedBodyPositionsToColliders\n (this.raw as any).propagateModifiedBodyPositionsToColliders();\n\n const ctx = this.moveContext;\n if (ctx) {\n // D-6: writeback Result ignored — entry checks already guard liveness.\n ctx.world.set(entity as EntityHandle, ctx.transform, {\n pos: [next.x, next.y, next.z],\n });\n ctx.world.set(entity as EntityHandle, ctx.characterController, { grounded });\n }\n\n return vec3.create(movement.x, movement.y, movement.z);\n }\n\n /**\n * Read CharacterController tuning fields for an entity from the ECS World,\n * falling back to schema defaults when the World is not wired (defensive;\n * the kinematic check upstream means a valid character always has the World).\n */\n private readCharacterController(entity: number): CharacterControllerTuning {\n const ctx = this.moveContext;\n if (ctx) {\n const r = ctx.world.get(entity as EntityHandle, ctx.characterController);\n if (r.ok) {\n const v = r.value as Record<string, number>;\n return {\n offset: v.offset as number,\n maxSlopeClimbDeg: v.maxSlopeClimbDeg as number,\n minSlopeSlideDeg: v.minSlopeSlideDeg as number,\n autoStepMaxHeight: v.autoStepMaxHeight as number,\n autoStepMinWidth: v.autoStepMinWidth as number,\n snapToGroundDist: v.snapToGroundDist as number,\n };\n }\n }\n // The ECS token owns the defaults; keep the defensive no-context path on\n // that projection so 3D cannot drift from the shared CharacterController schema.\n return componentDefinition(CharacterController)\n .defaults as unknown as CharacterControllerTuning;\n }\n\n /**\n * Lazily build a Rapier KinematicCharacterController for `entity` (cached).\n */\n // biome-ignore lint/suspicious/noExplicitAny: Rapier KinematicCharacterController from dynamic module\n private ensureKcc(entity: number, offset: number): any {\n const cached = this.kccCache.get(entity);\n if (cached) return cached;\n // biome-ignore lint/suspicious/noExplicitAny: Rapier World.createCharacterController\n const ctrl = (this.raw as any).createCharacterController(offset);\n this.kccCache.set(entity, ctrl);\n this.kccOffsets.set(entity, offset);\n return ctrl;\n }\n\n /** Remove backend rows whose Collider disappeared from the World query. */\n pruneMissingEntities(active: ReadonlySet<number>): void {\n for (const entity of this.entityMap.keys()) {\n if (!active.has(entity)) this.removeEntity(entity);\n }\n }\n\n private bodyForEntity(entity: number): RapierRigidBody | undefined {\n const record = this.entityMap.get(entity);\n if (!record) return undefined;\n // biome-ignore lint/suspicious/noExplicitAny: Rapier bodies API needs any-cast\n return ((this.raw as any).bodies.get(record.bodyHandle) as RapierRigidBody | null) ?? undefined;\n }\n\n private isCommittedFixedBody(entity: number): boolean {\n return this.bodyForEntity(entity)?.bodyType() === this.rapierModule.RigidBodyType.Fixed;\n }\n\n private reconcileTransformlessCompatibility(entity: number, staticByEcs: boolean): void {\n if (!staticByEcs || !this.isCommittedFixedBody(entity)) {\n this.removeEntity(entity);\n return;\n }\n // A fixed body cannot be controller-owned. Clear stale KCC state defensively\n // while retaining the already-committed body and collider receipt.\n this.removeKccController(entity);\n }\n\n private resetForFullReconcile(transformlessStatic: ReadonlySet<number>): void {\n // Without a descriptor/hash mirror, an overflow cannot prove which existing\n // Transform-backed body changed. Recreate those bodies from the final ECS\n // combination. Dynamic velocity/contact state is intentionally reset during\n // this recovery path so stale motion type or collider data cannot survive.\n for (const entity of [...this.entityMap.keys()]) {\n if (transformlessStatic.has(entity) && this.isCommittedFixedBody(entity)) {\n this.removeKccController(entity);\n continue;\n }\n this.removeEntity(entity);\n }\n }\n\n private fullReconcilePhysicsState(state: PhysicsSyncState): void {\n const descriptors: PhysicsSyncDescriptor[] = [];\n const transformlessStatic = new Set<number>();\n const committedDerived =\n this.derivedBodies.size > 0 ? this.captureDerivedPhysicsState() : undefined;\n for (const query of state.queries)\n for (const row of query) {\n if (!row.has(state.transformComponent)) {\n if (physicsRowIsStatic(row)) transformlessStatic.add(row.entity);\n continue;\n }\n const descriptor = readPhysicsSyncDescriptor(\n row,\n state.transformComponent,\n state.globalTransformComponent,\n );\n if (descriptor !== undefined) descriptors.push(descriptor);\n }\n\n this.resetForFullReconcile(transformlessStatic);\n for (const descriptor of descriptors) {\n this.ensureBody(\n descriptor.entity,\n descriptor.transform,\n descriptor.rigidBody,\n descriptor.collider,\n );\n }\n if (committedDerived !== undefined) {\n const restorableBodies = committedDerived.bodies.filter(\n (body) => this.entityMap.has(body.entity) && !this.derivedBodies.has(body.entity),\n );\n if (restorableBodies.length > 0) {\n const restorable = Object.freeze({\n ...committedDerived,\n bodies: Object.freeze(restorableBodies),\n });\n const restored = this.restoreDerivedPhysicsState(restorable);\n if (!restored.ok) {\n // A full ECS rebuild has already replaced native bodies. Keep the\n // rebuilt ordinary state queryable, but do not expose a mixed derived\n // result: pending candidates are invalidated and the next consumer\n // submission is the explicit recovery boundary.\n this.invalidateDerivedShapeCandidates('full-reconcile-restore-failed');\n }\n }\n }\n drainPhysicsChangeQueries(state.changeQueries);\n state.structuralCursor = readStructuralEvidence(state.world, state.structuralCursor).cursor;\n state.structureEpoch = state.world.getStructureEpoch();\n state.initialized = true;\n }\n\n private reconcilePhysicsDelta(\n state: PhysicsSyncState,\n entity: EntityHandle,\n delta: PhysicsEntityDelta,\n ): void {\n const row = state.queries.map((query) => query.at(entity)).find((entry) => entry !== undefined);\n if (row === undefined) {\n this.removeEntity(entity);\n return;\n }\n if (!row.has(state.transformComponent)) {\n // A lifecycle mutation cannot be applied without a pose. Keep only the\n // narrow migration case where Transform alone disappeared from an already\n // committed fixed body; never create or reshape a Transform-less row.\n if (delta.colliderChanged || delta.rigidBodyChanged) {\n this.removeEntity(entity);\n return;\n }\n this.reconcileTransformlessCompatibility(entity, physicsRowIsStatic(row));\n return;\n }\n\n const descriptor = readPhysicsSyncDescriptor(\n row,\n state.transformComponent,\n state.globalTransformComponent,\n );\n if (descriptor === undefined) {\n this.removeEntity(entity);\n return;\n }\n\n if (this.hasBody(entity) && (delta.colliderChanged || delta.rigidBodyChanged)) {\n // Derived shapes share this body and must survive ordinary authored\n // component changes. Update the base collider/body in place; entities\n // without a derived publication retain the legacy replacement path.\n if (this.derivedBodies.has(entity)) {\n this.syncDerivedCompatibleEcsMutation(entity, descriptor);\n } else {\n this.removeEntity(entity);\n }\n }\n if (!this.hasBody(entity)) {\n this.ensureBody(entity, descriptor.transform, descriptor.rigidBody, descriptor.collider);\n return;\n }\n\n if (delta.characterControllerChanged) {\n const cachedOffset = this.kccOffsets.get(entity);\n const hadCachedReceipt = this.kccCache.has(entity);\n const finalOffset = descriptor.characterControllerOffset;\n if (!descriptor.hasCharacterController) {\n this.removeKccController(entity);\n } else if (\n hadCachedReceipt &&\n (finalOffset === undefined || !Object.is(cachedOffset, finalOffset))\n ) {\n // Component removal is structural and reaches the full reconcile path.\n // A value change only rebuilds the receipt when its effective offset changed.\n this.removeKccController(entity);\n if (finalOffset !== undefined) this.ensureKcc(entity, finalOffset);\n }\n }\n if (\n !delta.transformChanged &&\n !(delta.characterControllerStructureChanged && !descriptor.hasCharacterController)\n ) {\n return;\n }\n\n const bodyType = rigidBodyTypeFromF32(descriptor.rigidBody.type);\n if (bodyType === 'static') {\n this.syncAuthoredPose(entity, descriptor.transform, descriptor.collider, 'static');\n } else if (bodyType === 'kinematic' && !descriptor.hasCharacterController) {\n this.syncAuthoredPose(entity, descriptor.transform, descriptor.collider, 'kinematic');\n }\n }\n\n private syncDerivedCompatibleEcsMutation(\n entity: number,\n descriptor: PhysicsSyncDescriptor,\n ): void {\n const body = this.bodyForEntity(entity);\n if (body === undefined) return;\n const bodyType = rigidBodyTypeFromF32(descriptor.rigidBody.type);\n const RAPIER = this.rapierModule as RapierWorld;\n // The native body is shared, but authored and derived colliders have\n // distinct owners. Never address an authored collider by array position.\n for (const collider of this.bodyColliders(body)) {\n if (!this.derivedColliderToShape.has(collider.handle)) {\n (this.raw as RapierWorld).removeCollider(collider, true);\n }\n }\n const committed = this.derivedBodies.get(entity);\n const record = this.entityMap.get(entity);\n if (record !== undefined) record.authoredDensity = descriptor.collider?.density;\n if (descriptor.collider !== undefined) {\n this.createAuthoredCollider(body, descriptor.transform, {\n ...descriptor.collider,\n density: committed?.massProperties?.mode === 'explicit' ? 0 : descriptor.collider.density,\n });\n }\n if (bodyType === 'static') {\n body.setBodyType(RAPIER.RigidBodyType.Fixed, true);\n this.syncAuthoredPose(entity, descriptor.transform, descriptor.collider, 'static');\n } else if (bodyType === 'kinematic') {\n body.setBodyType(RAPIER.RigidBodyType.KinematicPositionBased, true);\n this.syncAuthoredPose(entity, descriptor.transform, descriptor.collider, 'kinematic');\n } else {\n body.setBodyType(RAPIER.RigidBodyType.Dynamic, true);\n if (record !== undefined) record.additionalMass = Math.max(0, descriptor.rigidBody.mass);\n if (committed?.massProperties?.mode !== 'explicit') {\n this.restoreAutomaticMass(body, record?.additionalMass ?? 0);\n if (record !== undefined) record.automaticAdditionalMass = record.additionalMass;\n }\n body.setGravityScale(descriptor.rigidBody.gravityScale, true);\n body.setLinearDamping(descriptor.rigidBody.linearDamping);\n body.setAngularDamping(descriptor.rigidBody.angularDamping);\n }\n body.enableCcd(Boolean(descriptor.rigidBody.ccdEnabled));\n if (committed?.massProperties?.mode === 'explicit') {\n this.restoreCommittedMass(body, committed, 0);\n }\n }\n\n /** @internal ECS system bridge; consumers should register PhysicsSyncBackend. */\n _syncFromEcs(\n world: World,\n transformComponent: Component,\n globalTransformComponent = world.components.resolve('GlobalTransform'),\n ): void {\n this.assertActive('syncFromEcs');\n this.worldIdentity = world;\n if (globalTransformComponent === undefined) return;\n let state = this.syncState;\n if (\n state === undefined ||\n state.world !== world ||\n state.transformComponent !== transformComponent ||\n state.globalTransformComponent !== globalTransformComponent\n ) {\n const queryResult = world.query({\n read: [Collider],\n optional: [\n transformComponent,\n globalTransformComponent,\n RigidBody,\n CharacterController,\n ChildOf,\n ],\n });\n if (!queryResult.ok) return;\n const bodyQuery = world.query({\n read: [RigidBody],\n without: [Collider],\n optional: [transformComponent, globalTransformComponent, CharacterController, ChildOf],\n });\n if (!bodyQuery.ok) throw bodyQuery.error;\n state = {\n world,\n transformComponent,\n globalTransformComponent,\n queries: [queryResult.value, bodyQuery.value] as unknown as readonly PhysicsSyncQuery[],\n changeQueries: createPhysicsChangeQueries(world, [\n transformComponent,\n globalTransformComponent,\n Collider,\n RigidBody,\n CharacterController,\n ChildOf,\n ]),\n structuralCursor: readStructuralEvidence(world, 0).cursor,\n structureEpoch: world.getStructureEpoch(),\n initialized: false,\n };\n this.syncState = state;\n }\n\n if (!state.initialized) {\n this.fullReconcilePhysicsState(state);\n return;\n }\n\n const deltas = new Map<EntityHandle, PhysicsEntityDelta>();\n if (state.structureEpoch !== world.getStructureEpoch()) {\n const structural = readStructuralEvidence(world, state.structuralCursor);\n state.structuralCursor = structural.cursor;\n state.structureEpoch = world.getStructureEpoch();\n if (structural.status === 'overflow') {\n this.fullReconcilePhysicsState(state);\n return;\n }\n\n const transformId = componentId(transformComponent);\n const globalTransformId = componentId(globalTransformComponent);\n const colliderId = componentId(Collider);\n const rigidBodyId = componentId(RigidBody);\n const characterControllerId = componentId(CharacterController);\n const childOfId = componentId(ChildOf);\n const disabledId = componentId(Disabled);\n for (const evidence of structural.events) {\n const id = evidence.componentId;\n if (\n evidence.kind !== 'spawn' &&\n evidence.kind !== 'despawn' &&\n id !== transformId &&\n id !== globalTransformId &&\n id !== colliderId &&\n id !== rigidBodyId &&\n id !== characterControllerId &&\n id !== childOfId &&\n id !== disabledId\n ) {\n continue;\n }\n const delta = ensurePhysicsDelta(deltas, evidence.entity);\n if (evidence.kind === 'spawn' || evidence.kind === 'despawn') {\n delta.transformChanged = true;\n delta.colliderChanged = true;\n delta.rigidBodyChanged = true;\n delta.characterControllerChanged = true;\n delta.characterControllerStructureChanged = true;\n } else if (id === transformId || id === globalTransformId || id === childOfId) {\n delta.transformChanged = true;\n } else if (id === colliderId || id === disabledId) {\n delta.colliderChanged = true;\n } else if (id === rigidBodyId) {\n delta.rigidBodyChanged = true;\n } else if (id === characterControllerId) {\n delta.characterControllerChanged = true;\n delta.characterControllerStructureChanged = true;\n }\n }\n }\n\n for (const entry of state.changeQueries) {\n for (const span of entry.query.spans().unwrap()) {\n for (const rawEntity of span.entities) {\n const entity = rawEntity as EntityHandle;\n const delta = ensurePhysicsDelta(deltas, entity);\n if (\n entry.component === transformComponent ||\n entry.component === globalTransformComponent ||\n entry.component === ChildOf\n ) {\n delta.transformChanged = true;\n } else if (entry.component === Collider) {\n delta.colliderChanged = true;\n } else if (entry.component === RigidBody) {\n delta.rigidBodyChanged = true;\n } else if (entry.component === CharacterController) {\n delta.characterControllerChanged = true;\n }\n }\n }\n }\n\n if (deltas.size === 0) return;\n\n for (const [entity, delta] of deltas) this.reconcilePhysicsDelta(state, entity, delta);\n }\n\n /**\n * Remove an entity's cached KCC and unregister it from the Rapier world\n * (plan-strategy D-3). Idempotent — safe for entities that never moved.\n */\n removeKccController(entity: number): void {\n const ctrl = this.kccCache.get(entity);\n this.kccOffsets.delete(entity);\n if (!ctrl) return;\n // biome-ignore lint/suspicious/noExplicitAny: Rapier World.removeCharacterController\n (this.raw as any).removeCharacterController(ctrl);\n this.kccCache.delete(entity);\n }\n\n // ─── ECS→Rapier bridge (D-2) ──────────────────────────────────────────\n\n /**\n * Ensure a Rapier body and collider exist for an ECS entity (idempotent).\n *\n * When `entityMap` already contains the entity this returns immediately.\n * Otherwise creates a Rapier RigidBody (dynamic / fixed / kinematic) +\n * Collider (cuboid / ball / capsule) from the ECS component data, sets\n * `body.userData = entity`, and registers the pairing via `registerBody`.\n *\n * @param entity Raw ECS entity number (stored in Rapier body.userData).\n * @param transform ECS Transform fields: { posX, posY, posZ, ... }.\n * @param rigidBody ECS RigidBody fields: { type (enum num), mass, ... }.\n * @param collider ECS Collider fields: { shape (enum num), radius, ... }.\n *\n * Plan-strategy D-2 + D-3: enum→Rapier desc mapping consumes\n * rigidBodyTypeFromF32 / colliderShapeFromF32 helpers; closed switch with\n * no default — TypeScript enforces exhaustiveness on the string-union arms.\n */\n ensureBody(\n entity: number,\n transform: PhysicsTransform3D,\n rigidBody: {\n type: number;\n mass: number;\n linearDamping: number;\n angularDamping: number;\n gravityScale: number;\n ccdEnabled: number;\n },\n collider: PhysicsCollider3D | undefined,\n ): void {\n this.assertActive('ensureBody');\n if (this.entityMap.has(entity)) return; // M1 idempotent guard (D-2)\n\n const RAPIER = this.rapierModule;\n\n // ── Create RigidBodyDesc ──\n const rbType = rigidBodyTypeFromF32(rigidBody.type);\n let body: RapierRigidBody;\n switch (rbType) {\n case 'dynamic': {\n // biome-ignore lint/suspicious/noExplicitAny: Rapier RigidBodyDesc\n const desc = (RAPIER as any).RigidBodyDesc.dynamic()\n .setTranslation(transform.position.x, transform.position.y, transform.position.z)\n .setRotation(transform.rotation)\n .setLinearDamping(rigidBody.linearDamping)\n .setAngularDamping(rigidBody.angularDamping)\n .setGravityScale(rigidBody.gravityScale);\n if (rigidBody.mass > 0) {\n desc.setAdditionalMass(rigidBody.mass);\n }\n if (rigidBody.ccdEnabled) {\n desc.setCcdEnabled(true);\n }\n // biome-ignore lint/suspicious/noExplicitAny: Rapier World.createRigidBody\n body = (this.raw as any).createRigidBody(desc);\n break;\n }\n case 'static': {\n // biome-ignore lint/suspicious/noExplicitAny: Rapier RigidBodyDesc\n const desc = (RAPIER as any).RigidBodyDesc.fixed()\n .setTranslation(transform.position.x, transform.position.y, transform.position.z)\n .setRotation(transform.rotation);\n // biome-ignore lint/suspicious/noExplicitAny: Rapier World.createRigidBody\n body = (this.raw as any).createRigidBody(desc);\n break;\n }\n case 'kinematic': {\n // biome-ignore lint/suspicious/noExplicitAny: Rapier RigidBodyDesc\n const desc = (RAPIER as any).RigidBodyDesc.kinematicPositionBased()\n .setTranslation(transform.position.x, transform.position.y, transform.position.z)\n .setRotation(transform.rotation);\n // CCD sweeps the collider along its per-step kinematic translation so a\n // fast mover (player, bullet) reliably contacts dynamics instead of\n // tunneling through them on discrete steps.\n if (rigidBody.ccdEnabled) {\n desc.setCcdEnabled(true);\n }\n // biome-ignore lint/suspicious/noExplicitAny: Rapier World.createRigidBody\n body = (this.raw as any).createRigidBody(desc);\n break;\n }\n // No default — rigidBodyTypeFromF32 ensures only 3 arms; TS guards completeness.\n }\n\n body.userData = entity;\n this.registerBody(\n entity,\n body.handle,\n rbType === 'dynamic' ? Math.max(0, rigidBody.mass) : 0,\n collider?.density,\n );\n if (collider === undefined) {\n const record = this.entityMap.get(entity);\n // A new fragment can admit derived shapes in this same fixed step.\n // Resolve Rapier's deferred descriptor mass before rollback captures the\n // baseline, rather than comparing an uninitialized zero to restored mass.\n this.restoreAutomaticMass(body, record?.additionalMass ?? 0);\n if (record !== undefined) record.automaticAdditionalMass = record.additionalMass;\n return;\n }\n\n this.createAuthoredCollider(body, transform, collider);\n }\n\n private createAuthoredCollider(\n body: RapierRigidBody,\n transform: PhysicsTransform3D,\n collider: PhysicsCollider3D,\n ): void {\n const RAPIER = this.rapierModule;\n // ── Create ColliderDesc ──\n const scaleX = Math.abs(transform.scale.x);\n const scaleY = Math.abs(transform.scale.y);\n const scaleZ = Math.abs(transform.scale.z);\n // Enable collision events + all body-type combinations so sensors register\n // overlaps against kinematic/fixed bodies too (the default omits non-dynamic\n // pairs, which would silence kinematic-sensor-vs-kinematic-body pickup).\n // biome-ignore lint/suspicious/noExplicitAny: Rapier enums from dynamic module\n const activeEvents = (RAPIER as any).ActiveEvents.COLLISION_EVENTS as number;\n // biome-ignore lint/suspicious/noExplicitAny: Rapier enums from dynamic module\n const activeCollisionTypes = (RAPIER as any).ActiveCollisionTypes.ALL as number;\n const cShape = colliderShapeFromF32(collider.shape);\n switch (cShape) {\n case 'cuboid': {\n // biome-ignore lint/suspicious/noExplicitAny: Rapier ColliderDesc\n const desc = (RAPIER as any).ColliderDesc.cuboid(\n collider.halfExtents[0] * scaleX,\n collider.halfExtents[1] * scaleY,\n collider.halfExtents[2] * scaleZ,\n )\n .setFriction(collider.friction)\n .setRestitution(collider.restitution)\n .setDensity(collider.density)\n .setCollisionGroups(collider.collisionGroups)\n .setSolverGroups(collider.solverGroups)\n .setActiveEvents(activeEvents)\n .setActiveCollisionTypes(activeCollisionTypes);\n if (collider.isSensor) desc.setSensor(true);\n // biome-ignore lint/suspicious/noExplicitAny: Rapier World.createCollider\n (this.raw as any).createCollider(desc, body);\n break;\n }\n case 'sphere': {\n // biome-ignore lint/suspicious/noExplicitAny: Rapier ColliderDesc\n const desc = (RAPIER as any).ColliderDesc.ball(\n collider.radius * Math.max(scaleX, scaleY, scaleZ),\n )\n .setFriction(collider.friction)\n .setRestitution(collider.restitution)\n .setDensity(collider.density)\n .setCollisionGroups(collider.collisionGroups)\n .setSolverGroups(collider.solverGroups)\n .setActiveEvents(activeEvents)\n .setActiveCollisionTypes(activeCollisionTypes);\n if (collider.isSensor) desc.setSensor(true);\n // biome-ignore lint/suspicious/noExplicitAny: Rapier World.createCollider\n (this.raw as any).createCollider(desc, body);\n break;\n }\n case 'capsule': {\n // biome-ignore lint/suspicious/noExplicitAny: Rapier ColliderDesc\n const desc = (RAPIER as any).ColliderDesc.capsule(\n collider.halfHeight * scaleY,\n collider.radius * Math.max(scaleX, scaleZ),\n )\n .setFriction(collider.friction)\n .setRestitution(collider.restitution)\n .setDensity(collider.density)\n .setCollisionGroups(collider.collisionGroups)\n .setSolverGroups(collider.solverGroups)\n .setActiveEvents(activeEvents)\n .setActiveCollisionTypes(activeCollisionTypes);\n if (collider.isSensor) desc.setSensor(true);\n // biome-ignore lint/suspicious/noExplicitAny: Rapier World.createCollider\n (this.raw as any).createCollider(desc, body);\n break;\n }\n // No default — colliderShapeFromF32 ensures only 3 arms; TS guards completeness.\n }\n }\n\n /**\n * Synchronize a static or kinematic body's Rapier pose and collider shape from\n * the resolved Transform pose. Dynamic bodies own their pose after creation.\n */\n syncAuthoredPose(\n entity: number,\n transform: PhysicsTransform3D,\n collider: PhysicsCollider3D | undefined,\n bodyType: 'static' | 'kinematic',\n ): void {\n this.assertActive('syncAuthoredPose');\n const record = this.entityMap.get(entity);\n if (!record) return;\n // biome-ignore lint/suspicious/noExplicitAny: Rapier bodies API needs any-cast\n const body = (this.raw as any).bodies.get(record.bodyHandle) as RapierRigidBody | null;\n if (!body) return;\n\n if (bodyType === 'static') {\n body.setTranslation(transform.position, true);\n body.setRotation(transform.rotation, true);\n } else {\n body.setNextKinematicTranslation(transform.position);\n body.setNextKinematicRotation(transform.rotation);\n }\n\n if (collider === undefined) return;\n const rapierCollider = this.bodyColliders(body).find(\n (shape) => !this.derivedColliderToShape.has(shape.handle),\n );\n if (!rapierCollider) return;\n const scaleX = Math.abs(transform.scale.x);\n const scaleY = Math.abs(transform.scale.y);\n const scaleZ = Math.abs(transform.scale.z);\n switch (colliderShapeFromF32(collider.shape)) {\n case 'cuboid':\n rapierCollider.setHalfExtents({\n x: collider.halfExtents[0] * scaleX,\n y: collider.halfExtents[1] * scaleY,\n z: collider.halfExtents[2] * scaleZ,\n });\n break;\n case 'sphere':\n rapierCollider.setRadius(collider.radius * Math.max(scaleX, scaleY, scaleZ));\n break;\n case 'capsule':\n rapierCollider.setHalfHeight(collider.halfHeight * scaleY);\n rapierCollider.setRadius(collider.radius * Math.max(scaleX, scaleZ));\n break;\n }\n }\n\n // ─── ECS integration helpers ───────────────────────────────────────────\n\n /**\n * Register an ECS entity with its Rapier body handle.\n */\n registerBody(\n entity: number,\n bodyHandle: number,\n additionalMass = 0,\n authoredDensity?: number,\n ): void {\n this.entityMap.set(entity, {\n bodyHandle,\n additionalMass: Math.max(0, additionalMass),\n // `ensureBody` registers before its authored collider is attached.\n // Rapier recomputes the body from that collider and clears the\n // descriptor-only additional mass, so the native baseline is zero.\n // A later automatic derived admission records the actual additional\n // contribution after it has been applied. Keeping this separate from\n // `additionalMass` lets rollback restore native state rather than an\n // authored value that Rapier has not applied yet.\n automaticAdditionalMass: 0,\n authoredDensity:\n authoredDensity !== undefined && Number.isFinite(authoredDensity) && authoredDensity >= 0\n ? authoredDensity\n : undefined,\n });\n if (!this.derivedBodySources.has(entity)) {\n this.derivedBodySources.set(entity, { sourceKey: `entity:${entity}`, revision: 0 });\n }\n }\n\n /**\n * Apply all pending teleports to their respective bodies.\n */\n applyPendingTeleports(): void {\n for (const [entity, target] of this.pendingTeleports) {\n const record = this.entityMap.get(entity);\n if (!record) continue;\n // biome-ignore lint/suspicious/noExplicitAny: Rapier bodies API needs any-cast\n const body = (this.raw as any).bodies.get(record.bodyHandle) as RapierRigidBody | null;\n if (!body) continue;\n\n body.setTranslation({ x: target.x, y: target.y, z: target.z }, true);\n body.setLinvel({ x: 0, y: 0, z: 0 }, false);\n body.setAngvel({ x: 0, y: 0, z: 0 }, false);\n }\n this.pendingTeleports.clear();\n }\n\n /**\n * Set a kinematic body's next position from ECS transform.\n */\n setKinematicPosition(entity: number, pos: { x: number; y: number; z: number }): void {\n const record = this.entityMap.get(entity);\n if (!record) return;\n // biome-ignore lint/suspicious/noExplicitAny: Rapier bodies API needs any-cast\n const body = (this.raw as any).bodies.get(record.bodyHandle) as RapierRigidBody | null;\n if (!body) return;\n body.setNextKinematicTranslation({ x: pos.x, y: pos.y, z: pos.z });\n }\n\n /**\n * Write Rapier dynamic body poses back.\n */\n writebackDynamicBodies(): Array<{\n entity: number;\n pos: { x: number; y: number; z: number };\n rotation: { x: number; y: number; z: number; w: number };\n }> {\n const results: Array<{\n entity: number;\n pos: { x: number; y: number; z: number };\n rotation: { x: number; y: number; z: number; w: number };\n }> = [];\n for (const [entity, record] of this.entityMap) {\n // biome-ignore lint/suspicious/noExplicitAny: Rapier bodies API needs any-cast\n const body = (this.raw as any).bodies.get(record.bodyHandle) as RapierRigidBody | null;\n if (!body) continue;\n if (body.bodyType() !== this.rapierModule.RigidBodyType.Dynamic) continue;\n const translation = body.translation();\n const rotation = body.rotation();\n results.push({\n entity,\n pos: { x: translation.x, y: translation.y, z: translation.z },\n rotation: { x: rotation.x, y: rotation.y, z: rotation.z, w: rotation.w },\n });\n }\n return results;\n }\n\n /**\n * Remove a Rapier body and its colliders when the ECS entity is despawned.\n */\n removeEntity(entity: number): void {\n const record = this.entityMap.get(entity);\n if (!record) return;\n for (const candidate of this.derivedCandidates.values()) {\n if (\n candidate.input.entity !== entity ||\n candidate.batch === undefined ||\n (candidate.state !== 'ready' && candidate.state !== 'queued')\n )\n continue;\n this.rejectPreparedCandidate(\n candidate,\n new DerivedPhysicsError(\n 'derived-body-not-found',\n 'all grouped bodies remain live until admission',\n 'prepare a new complete group after entity reconciliation',\n { entity },\n ),\n );\n }\n const derived = this.derivedBodies.get(entity);\n if (derived !== undefined) {\n for (const shape of derived.shapes) this.removeNativeCollider(shape.colliderHandle);\n this.derivedBodies.delete(entity);\n this.derivedPublications.delete(entity);\n }\n this.derivedFailures.delete(entity);\n this.derivedPoisonedEntities.delete(entity);\n for (const [id, constraint] of this.derivedConstraints) {\n if (constraint.input.bodyA === entity || constraint.input.bodyB === entity) {\n this.removeNativeConstraint(constraint.handle);\n this.derivedConstraints.delete(id);\n }\n }\n for (const [id, candidate] of this.derivedCandidates) {\n if (candidate.input.entity !== entity) continue;\n for (const collider of candidate.nativeColliders) this.removeNativeCollider(collider.handle);\n this.pendingDerivedCandidates.delete(id);\n this.releaseDerivedCandidate(id);\n }\n const ownPairs = [...(this.collisionPairs.get(entity) ?? [])];\n for (const other of ownPairs) {\n if (this.removePair(entity, other)) {\n this.pushCollisionEvent({ type: 'stopped', entityA: entity, entityB: other });\n }\n }\n this.removeKccController(entity); // D-3: clear cached KCC before body removal\n // biome-ignore lint/suspicious/noExplicitAny: Rapier World.removeRigidBody\n (this.raw as any).removeRigidBody({ handle: record.bodyHandle } as RapierRigidBody);\n this.entityMap.delete(entity);\n this.derivedBodySources.delete(entity);\n // Clear the despawned entity from every overlap set so a collected Core does\n // not linger in the player's CollidingEntities (Rapier emits no `stopped`\n // event when a collider is removed mid-overlap).\n const own = this.collisionPairs.get(entity);\n if (own) {\n for (const other of own) this.collisionPairs.get(other)?.delete(entity);\n this.collisionPairs.delete(entity);\n }\n }\n}\n\n/**\n * Create a new RapierPhysicsWorld3D instance.\n */\nexport function createRapier3DPhysicsWorld(rapier: Rapier3DModule): RapierPhysicsWorld3D {\n return new RapierPhysicsWorld3D(rapier);\n}\n\nfunction hasReadableWorldPose(world: Float32Array | undefined): world is Float32Array {\n return world !== undefined && world.length >= 16;\n}\n\n/** dt upper bound (plan-strategy D-4): skip step if dt exceeds this. */\nconst PHYSICS_DT_MAX = 0.1;\nconst poseScratchPosition = vec3.create();\nconst poseScratchRotation = quat.create();\nconst poseScratchScale = vec3.create();\nconst poseScratchWorld = new Float32Array(16);\n\nfunction physicsRowIsStatic(row: PhysicsSyncQueryRow): boolean {\n if (!row.has(RigidBody)) return true;\n const rigidBody = row.get(RigidBody) as { readonly type: number } | undefined;\n return rigidBody !== undefined && rigidBodyTypeFromF32(rigidBody.type) === 'static';\n}\n\nfunction readPhysicsSyncDescriptor(\n row: PhysicsSyncQueryRow,\n transformComponent: Component,\n globalTransformComponent: Component,\n): PhysicsSyncDescriptor | undefined {\n const transformData = row.get(transformComponent) as\n | {\n readonly pos: Float32Array;\n readonly quat: Float32Array;\n readonly scale: Float32Array;\n }\n | undefined;\n const globalTransformData = row.get(globalTransformComponent) as\n | { readonly world: Float32Array }\n | undefined;\n const colliderData = (row.has(Collider) ? row.get(Collider) : undefined) as\n | {\n readonly shape: number;\n readonly halfExtents: Float32Array;\n readonly radius: number;\n readonly halfHeight: number;\n readonly friction: number;\n readonly restitution: number;\n readonly density: number;\n readonly isSensor: number | boolean;\n readonly collisionGroups: number;\n readonly solverGroups: number;\n }\n | undefined;\n if (transformData === undefined || (colliderData === undefined && !row.has(RigidBody)))\n return undefined;\n\n // Root-local TRS is already a world pose. A ChildOf row, however, must use\n // Scene's derived GlobalTransform world matrix. Matrix contents cannot be a\n // validity sentinel: a legitimate parent/local composition can resolve to\n // identity.\n const useWorldPose = row.has(ChildOf) && hasReadableWorldPose(globalTransformData?.world);\n if (useWorldPose) {\n poseScratchWorld.set(globalTransformData.world);\n mat4.decompose(poseScratchPosition, poseScratchRotation, poseScratchScale, poseScratchWorld);\n } else {\n poseScratchPosition[0] = transformData.pos[0] ?? 0;\n poseScratchPosition[1] = transformData.pos[1] ?? 0;\n poseScratchPosition[2] = transformData.pos[2] ?? 0;\n poseScratchRotation[0] = transformData.quat[0] ?? 0;\n poseScratchRotation[1] = transformData.quat[1] ?? 0;\n poseScratchRotation[2] = transformData.quat[2] ?? 0;\n poseScratchRotation[3] = transformData.quat[3] ?? 1;\n poseScratchScale[0] = transformData.scale[0] ?? 1;\n poseScratchScale[1] = transformData.scale[1] ?? 1;\n poseScratchScale[2] = transformData.scale[2] ?? 1;\n }\n\n const rigidBodyData = row.has(RigidBody)\n ? (row.get(RigidBody) as\n | {\n readonly type: number;\n readonly mass: number;\n readonly linearDamping: number;\n readonly angularDamping: number;\n readonly gravityScale: number;\n readonly ccdEnabled: number | boolean;\n }\n | undefined)\n : undefined;\n const characterControllerData = row.has(CharacterController)\n ? (row.get(CharacterController) as { readonly offset: number } | undefined)\n : undefined;\n\n return {\n entity: row.entity,\n transform: {\n position: {\n x: poseScratchPosition[0] ?? 0,\n y: poseScratchPosition[1] ?? 0,\n z: poseScratchPosition[2] ?? 0,\n },\n rotation: {\n x: poseScratchRotation[0] ?? 0,\n y: poseScratchRotation[1] ?? 0,\n z: poseScratchRotation[2] ?? 0,\n w: poseScratchRotation[3] ?? 1,\n },\n scale: {\n x: poseScratchScale[0] ?? 1,\n y: poseScratchScale[1] ?? 1,\n z: poseScratchScale[2] ?? 1,\n },\n },\n rigidBody:\n rigidBodyData === undefined\n ? {\n type: RIGID_BODY_TYPE_STATIC,\n mass: 0,\n linearDamping: 0,\n angularDamping: 0,\n gravityScale: 1,\n ccdEnabled: 0,\n }\n : {\n type: rigidBodyData.type,\n mass: rigidBodyData.mass,\n linearDamping: rigidBodyData.linearDamping,\n angularDamping: rigidBodyData.angularDamping,\n gravityScale: rigidBodyData.gravityScale,\n ccdEnabled: Number(rigidBodyData.ccdEnabled),\n },\n collider:\n colliderData === undefined\n ? undefined\n : {\n shape: colliderData.shape,\n halfExtents: [\n colliderData.halfExtents[0] ?? 0,\n colliderData.halfExtents[1] ?? 0,\n colliderData.halfExtents[2] ?? 0,\n ],\n radius: colliderData.radius,\n halfHeight: colliderData.halfHeight,\n friction: colliderData.friction,\n restitution: colliderData.restitution,\n density: colliderData.density,\n isSensor: Number(colliderData.isSensor),\n collisionGroups: colliderData.collisionGroups,\n solverGroups: colliderData.solverGroups,\n },\n hasCharacterController: row.has(CharacterController),\n characterControllerOffset: characterControllerData?.offset,\n };\n}\n\n// ── System name constants ──\nconst PHYSICS_SYNC_BACKEND = 'physicsSyncBackend' as const;\nconst PHYSICS_STEP_SIMULATION = 'physicsStepSimulation' as const;\nconst PHYSICS_WRITEBACK = 'physicsWriteback' as const;\nconst PHYSICS_COLLISION_SYNC = 'physicsCollisionSync' as const;\n\n/**\n * Resolve the runtime `Transform` component token from the World-local ECS\n * registry (M2 — full resource-ification, D-3). physics already depends on\n * `@forgeax/engine-ecs`, so the catalog introduces no new dependency\n * and replaces the closure-captured `transformComponent` second parameter.\n * Returns `undefined` when Transform is not yet defined (the runtime package\n * defines it on import); callers early-out.\n */\nfunction resolveTransform(world: World): Component | undefined {\n return world.components.resolve('Transform');\n}\n\n/**\n * `physicsSyncBackend` system token (M2 — full resource-ification, D-4).\n *\n * After propagateTransforms, bootstrap/recovery performs one complete Collider\n * reconcile. Warm ticks poll the existing ECS projection and identity-read only\n * final changed rows. Bare Colliders remain implicit static bodies; Transform-less\n * fixed bodies are retained only as a migration defense and are never created.\n * Reads `world` from its first parameter; resolves Transform via the global\n * registry. Labelled `'physics'`.\n */\nexport const PhysicsSyncBackend: SystemHandle<readonly []> = defineSystem({\n name: PHYSICS_SYNC_BACKEND,\n queries: [],\n after: ['propagateTransformsFixed'],\n fn: (world) => {\n const transformComponent = resolveTransform(world);\n const globalTransformComponent = world.components.resolve('GlobalTransform');\n if (transformComponent === undefined || globalTransformComponent === undefined) return;\n let pw: RapierPhysicsWorld3D;\n try {\n pw = world.getResource<RapierPhysicsWorld3D>('PhysicsWorld');\n } catch {\n return; // C-2: PhysicsWorld resource not yet ready — safe early out\n }\n\n pw.applyPendingTeleports();\n pw._syncFromEcs(world, transformComponent, globalTransformComponent);\n },\n});\n\n/**\n * `physicsStepSimulation` system token (M2 — full resource-ification, D-4).\n *\n * After physicsSyncBackend — read FixedTime.delta and call pw.step() with dt-gating.\n */\nexport const PhysicsStepSimulation: SystemHandle<readonly []> = defineSystem({\n name: PHYSICS_STEP_SIMULATION,\n queries: [],\n after: [PHYSICS_SYNC_BACKEND],\n fn: (world) => {\n let pw: RapierPhysicsWorld3D;\n try {\n pw = world.getResource<RapierPhysicsWorld3D>('PhysicsWorld');\n } catch {\n return; // C-2: safe early out\n }\n\n const dt = world.getResource(FixedTime).delta;\n if (dt <= 0 || dt > PHYSICS_DT_MAX) return; // D-4: skip abnormal delta\n\n pw.step(dt);\n },\n});\n\n/**\n * `physicsWriteback` system token (M2 — full resource-ification, D-4).\n *\n * After physicsStepSimulation — call pw.writebackDynamicBodies() and write\n * positions back to ECS Transform (resolved via the global registry, D-3).\n */\nexport const PhysicsWriteback: SystemHandle<readonly []> = defineSystem({\n name: PHYSICS_WRITEBACK,\n queries: [],\n after: [PHYSICS_STEP_SIMULATION],\n fn: (world) => {\n const transformComponent = resolveTransform(world);\n if (transformComponent === undefined) return;\n let pw: RapierPhysicsWorld3D;\n try {\n pw = world.getResource<RapierPhysicsWorld3D>('PhysicsWorld');\n } catch {\n return; // C-2: safe early out\n }\n\n const results = pw.writebackDynamicBodies();\n for (const r of results) {\n const entity = r.entity as EntityHandle;\n world.set(entity, transformComponent, {\n pos: [r.pos.x, r.pos.y, r.pos.z],\n quat: [r.rotation.x, r.rotation.y, r.rotation.z, r.rotation.w],\n });\n }\n },\n});\n\n/**\n * `physicsCollisionSync` system token — writes the drained overlap set into each\n * entity's `CollidingEntities` component (the contact/sensor set-query path).\n *\n * Runs after writeback so the component reflects this step's contacts. Without\n * it the `CollidingEntities` component documented in the physics README never\n * updates (the event queue was drained-on-overflow only), so sensor pickup +\n * proximity queries silently saw an empty set.\n */\nexport const PhysicsCollisionSync: SystemHandle<readonly []> = defineSystem({\n name: PHYSICS_COLLISION_SYNC,\n queries: [],\n after: [PHYSICS_WRITEBACK],\n fn: (world) => {\n let pw: RapierPhysicsWorld3D;\n try {\n pw = world.getResource<RapierPhysicsWorld3D>('PhysicsWorld');\n } catch {\n return; // C-2: safe early out\n }\n pw.writebackCollidingEntities(world, CollidingEntities as unknown as Component);\n pw.finalizeDerivedFixedStep();\n },\n});\n\n/**\n * Register the physics tick systems into an ECS World.\n *\n * The systems ({@link PhysicsSyncBackend} / {@link PhysicsStepSimulation} /\n * {@link PhysicsWriteback} / {@link PhysicsCollisionSync}) are module-level\n * `defineSystem` tokens; this helper wires the moveAndSlide context + despawn\n * cleanup hook, then adds the tokens to the schedule.\n *\n * Transform is resolved from the World-local ECS component catalog,\n * D-3) — the previous `transformComponent` second parameter was redundant once\n * the system fns and moveContext resolve Transform themselves, so it is gone.\n *\n * @param world ECS World instance.\n */\nexport function registerPhysicsSystems(world: World): () => void {\n const releaseComponents = registerPhysicsComponents(world);\n // ── moveAndSlide context + despawn cleanup wiring (D-1/D-3) ──\n // Wire the World + Transform/CharacterController components into the backend\n // so moveAndSlide can read tuning and write pose/grounded back, and register\n // the backend for the global Collider.onRemove dispatch (despawn cleanup).\n const transformComponent = resolveTransform(world);\n try {\n const pw = world.getResource<RapierPhysicsWorld3D>('PhysicsWorld');\n if (transformComponent !== undefined) {\n pw.setMoveContext(world, transformComponent, CharacterController);\n }\n } catch {\n // PhysicsWorld resource not yet inserted — moveAndSlide falls back to\n // CharacterController schema defaults until a later registration wires it.\n }\n\n world\n .addSystems(FixedUpdate, PhysicsSet, [\n PhysicsSyncBackend,\n PhysicsStepSimulation,\n PhysicsWriteback,\n PhysicsCollisionSync,\n ])\n .unwrap();\n return () => {\n world.removeSystem(FixedUpdate, PHYSICS_COLLISION_SYNC);\n world.removeSystem(FixedUpdate, PHYSICS_WRITEBACK);\n world.removeSystem(FixedUpdate, PHYSICS_STEP_SIMULATION);\n world.removeSystem(FixedUpdate, PHYSICS_SYNC_BACKEND);\n try {\n world.getResource<RapierPhysicsWorld3D>('PhysicsWorld').clearEcsContext(world);\n } catch {\n // PhysicsWorld may already have been removed as part of outer teardown.\n }\n releaseComponents();\n };\n}\n","// @forgeax/engine-physics-rapier3d — WASM loader for Rapier 3D compat variant.\n//\n// Dynamic import of @dimforge/rapier3d-compat (plan-strategy D-4: compat variant,\n// zero Vite configuration).\n//\n// Usage:\n// const rapier = await loadRapier3D();\n// if ('code' in rapier) { /* handle PhysicsError */ }\n// const world = new rapier.World({ x: 0, y: -9.81, z: 0 });\n\nimport type { PhysicsErrorCode } from '@forgeax/engine-types';\nimport { PhysicsError } from '@forgeax/engine-types';\n\n/**\n * The RAPIER module namespace — all constructors, types, and helpers exposed\n * by @dimforge/rapier3d-compat after init(). This is the shape of the default\n * export of the compat package.\n */\n// biome-ignore lint/suspicious/noExplicitAny: Rapier compat namespace type\nexport type Rapier3DModule = any;\n\n/** Cached RAPIER instance — loaded once, reused across frames. */\nlet rapierInstance: Rapier3DModule | null = null;\n\n/** Loading promise — ensures concurrent callers share one init. */\nlet loadingPromise: Promise<Rapier3DModule | PhysicsError> | null = null;\n\n/**\n * Load the Rapier 3D WASM module and initialise it.\n *\n * Uses dynamic import of the compat variant (zero Vite configuration per\n * plan-strategy D-4). The init() call is async but self-hosted — no external\n * .wasm file needed (Base64-inlined JS).\n *\n * Concurrent callers share a single loading promise; after the first\n * successful load the cached instance is returned synchronously.\n *\n * @returns the RAPIER module namespace on success, or a PhysicsError with\n * code 'wasm-load-failed' if dynamic import or init() rejects.\n */\nexport async function loadRapier3D(): Promise<Rapier3DModule | PhysicsError> {\n if (rapierInstance !== null) return rapierInstance;\n if (loadingPromise !== null) return loadingPromise;\n\n loadingPromise = _doLoad();\n return loadingPromise;\n}\n\nasync function _doLoad(): Promise<Rapier3DModule | PhysicsError> {\n try {\n const RAPIER = await import('@dimforge/rapier3d-compat');\n await RAPIER.default.init();\n rapierInstance = RAPIER.default;\n loadingPromise = null;\n return RAPIER.default;\n } catch (cause) {\n const reason = cause instanceof Error ? cause.message : String(cause);\n loadingPromise = null;\n return new PhysicsError({\n code: 'wasm-load-failed' as PhysicsErrorCode,\n expected: 'successful dynamic import and init of @dimforge/rapier3d-compat',\n hint: `dynamic import or init() failed: ${reason}. Check network, file path, and that @dimforge/rapier3d-compat is installed.`,\n detail: { code: 'wasm-load-failed', reason },\n });\n }\n}\n"]}
|