@forgeax/engine-physics-rapier2d 0.1.21 → 0.1.23
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/index.mjs
CHANGED
|
@@ -529,7 +529,8 @@ var PhysicsSyncBackend2D = defineSystem({
|
|
|
529
529
|
after: ["propagateTransformsFixed"],
|
|
530
530
|
fn: (world) => {
|
|
531
531
|
const transformComponent = resolveTransform(world);
|
|
532
|
-
|
|
532
|
+
const globalTransformComponent = world.components.resolve("GlobalTransform");
|
|
533
|
+
if (transformComponent === void 0 || globalTransformComponent === void 0) return;
|
|
533
534
|
let pw;
|
|
534
535
|
try {
|
|
535
536
|
pw = world.getResource("PhysicsWorld");
|
|
@@ -538,7 +539,7 @@ var PhysicsSyncBackend2D = defineSystem({
|
|
|
538
539
|
}
|
|
539
540
|
pw.applyPendingTeleports();
|
|
540
541
|
const queryResult = world.query({
|
|
541
|
-
read: [Collider, transformComponent],
|
|
542
|
+
read: [Collider, transformComponent, globalTransformComponent],
|
|
542
543
|
optional: [RigidBody, CharacterController]
|
|
543
544
|
});
|
|
544
545
|
if (!queryResult.ok) return;
|
|
@@ -547,6 +548,7 @@ var PhysicsSyncBackend2D = defineSystem({
|
|
|
547
548
|
const rowView = queryRow;
|
|
548
549
|
const colliderData = rowView.get(Collider);
|
|
549
550
|
const transformData = rowView.get(transformComponent);
|
|
551
|
+
const globalTransformData = rowView.get(globalTransformComponent);
|
|
550
552
|
const rigidBodyData = rowView.has(RigidBody) ? rowView.get(RigidBody) : void 0;
|
|
551
553
|
const hasCharacterController = rowView.has(CharacterController);
|
|
552
554
|
const rbType = rigidBodyData === void 0 ? void 0 : new Float32Array([rigidBodyData.type]);
|
|
@@ -568,7 +570,7 @@ var PhysicsSyncBackend2D = defineSystem({
|
|
|
568
570
|
const tfPos = transformData.pos;
|
|
569
571
|
const tfQuat = transformData.quat;
|
|
570
572
|
const tfScale = transformData.scale;
|
|
571
|
-
const tfWorld =
|
|
573
|
+
const tfWorld = globalTransformData.world;
|
|
572
574
|
if (!cShape || !cHalfExtents || !cRadius || !cHalfH || !cFric || !cRest || !cDens || !cSensor || !cCGroups || !cSGroups || !tfPos || !tfQuat || !tfScale) {
|
|
573
575
|
continue;
|
|
574
576
|
}
|
package/dist/index.mjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/rapier-physics-world-2d.ts","../src/wasm-loader.ts"],"names":["PhysicsError"],"mappings":"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","file":"index.mjs","sourcesContent":["import { componentDefinition, FixedTime, FixedUpdate } from '@forgeax/engine-ecs';\n// @forgeax/engine-physics-rapier2d — RapierPhysicsWorld2D class and three-phase\n// tick systems (syncBackend / stepSimulation / writeback).\n//\n// Mirrors packages/physics-rapier3d/ with 2D adaptations (research Finding 12):\n// - Vec2 instead of Vec3 for translations\n// - scalar angle instead of Quat for rotation\n// - Rapier2D world.step() (no z-axis)\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\nimport type { Component, EntityHandle, SystemHandle, World } from '@forgeax/engine-ecs';\nimport { defineSystem } from '@forgeax/engine-ecs';\nimport { mat4, quat, type Vec2, type Vec3Like, vec2, vec3 } from '@forgeax/engine-math';\nimport type { PhysicsWorld2D, RaycastHit2D } from '@forgeax/engine-physics';\nimport {\n CharacterController,\n Collider,\n CollidingEntities,\n colliderShapeFromF32,\n PHYSICS_ERROR_HINTS,\n PhysicsError,\n PhysicsSet,\n RIGID_BODY_TYPE_STATIC,\n RigidBody,\n registerPhysicsComponents,\n rigidBodyTypeFromF32,\n} from '@forgeax/engine-physics';\nimport type { Rapier2DModule } from './wasm-loader';\n\ninterface Rapier2DKinematicControllerState {\n readonly entity: number;\n readonly offset: number;\n}\n\ninterface PhysicsEntityRecord {\n bodyHandle: number;\n}\n\ninterface PhysicsTransform2D {\n readonly position: { readonly x: number; readonly y: number };\n readonly rotation: number;\n readonly scale: { readonly x: number; readonly y: number };\n}\n\ninterface PhysicsCollider2D {\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\nexport interface Rapier2DCollisionEvent {\n readonly type: 'started' | 'stopped';\n readonly entityA: number;\n readonly entityB: number;\n}\n\n// biome-ignore lint/suspicious/noExplicitAny: Rapier types from dynamically loaded module\ntype RapierWorld2D = 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 RapierRigidBody2D = 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). Mirrors the 3D applyKccTuning; the KCC\n * API is dimension-agnostic. Degrees -> radians for the two slope setters;\n * offset / autostep / snap pass through as world units. A zero value for\n * 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 2D RigidBodyType enum value to the engine's string union for the\n * `controller-requires-kinematic` error detail.\n */\n// biome-ignore lint/suspicious/noExplicitAny: Rapier module enum from dynamic module\nfunction rapierBodyTypeToString(rapier: any, bodyType: number): string {\n if (bodyType === rapier.RigidBodyType.Dynamic) return 'dynamic';\n if (bodyType === rapier.RigidBodyType.Fixed) return 'static';\n return 'kinematic';\n}\n\nexport class RapierPhysicsWorld2D implements PhysicsWorld2D {\n raw: RapierWorld2D;\n\n private readonly rapierModule: Rapier2DModule;\n\n /** Entity (raw number) -> PhysicsEntityRecord mapping. */\n private readonly entityMap = new Map<number, PhysicsEntityRecord>();\n\n /** Pending teleports: entity -> target position and rotation. */\n private readonly pendingTeleports = new Map<number, { x: number; y: number; rotation: number }>();\n\n private eventQueue: RapierEventQueue;\n\n private readonly collisionPairs = new Map<number, Set<number>>();\n\n private readonly pendingCollisionEvents: Rapier2DCollisionEvent[] = [];\n\n private readonly collisionEventHistory: Rapier2DCollisionEvent[] = [];\n\n private currentGravity: { x: number; y: number };\n\n /**\n * Lazily-built Rapier KinematicCharacterController per character entity\n * (plan-strategy D-1/D-3, 2D variant). `moveAndSlide` creates one on first\n * call; the `Collider.onRemove` hook clears it on despawn. Public so AC-12\n * 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 `registerPhysicsSystems2D`, so\n * `moveAndSlide` can read CharacterController tuning and write Transform +\n * grounded back. Undefined until systems are registered — the input-validation\n * error paths fire before these are read, so direct `pw.moveAndSlide()` calls\n * in error tests need no World.\n */\n private moveContext:\n | { world: World; transform: Component; characterController: Component }\n | undefined;\n\n constructor(rapier: Rapier2DModule) {\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 }) as RapierWorld2D;\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 };\n }\n\n // ─── PhysicsWorld2D interface ──────────────────────────────────────────\n\n setGravity(gravity: Vec2): void {\n const x = gravity[0] ?? 0;\n const y = gravity[1] ?? 0;\n this.raw.gravity = { x, y };\n this.currentGravity = { x, y };\n }\n\n getGravity(): Vec2 {\n const { x, y } = this.currentGravity;\n return vec2.create(x, y);\n }\n\n raycast(\n origin: Vec2,\n direction: Vec2,\n maxDist: number,\n filterMask?: number,\n ): RaycastHit2D | undefined {\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 },\n dir: { x: number; y: number },\n ) => { pointAt(t: number): { x: number; y: number } };\n const ray = new RayCtor(\n { x: origin[0] ?? 0, y: origin[1] ?? 0 },\n { x: direction[0] ?? 0, y: direction[1] ?? 0 },\n );\n // biome-ignore lint/suspicious/noExplicitAny: Rapier World castRayAndGetNormal (2D)\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 };\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. The prior\n // code treated the object as a body HANDLE and re-resolved it via\n // `bodies.get(...)`, which returned a DIFFERENT body → the wrong entity\n // (identical bug + fix as the 3D backend, solo round-22).\n const colliderParentBody = hit.collider.parent();\n const entity = colliderParentBody !== null ? colliderParentBody.userData : 0;\n\n return {\n entity,\n point: vec2.create(point.x, point.y),\n normal: vec2.create(hit.normal.x, hit.normal.y),\n timeOfImpact: hit.timeOfImpact,\n };\n }\n\n teleport(entity: number, position: Vec2, rotation: number): void {\n this.pendingTeleports.set(entity, {\n x: position[0] ?? 0,\n y: position[1] ?? 0,\n rotation,\n });\n }\n\n step(deltaTime: number): void {\n void deltaTime;\n // biome-ignore lint/suspicious/noExplicitAny: Rapier World.step\n (this.raw as any).step(this.eventQueue);\n this.drainRapierCollisionEvents();\n }\n\n private drainRapierCollisionEvents(): void {\n this.eventQueue.drainCollisionEvents((handle1: number, handle2: number, started: boolean) => {\n const entityA = this.colliderHandleToEntity(handle1);\n const entityB = this.colliderHandleToEntity(handle2);\n if (entityA === undefined || entityB === undefined) return;\n const changed = started\n ? this.addCollisionPair(entityA, entityB)\n : this.removeCollisionPair(entityA, entityB);\n if (!changed) return;\n this.pushCollisionEvent({\n type: started ? 'started' : 'stopped',\n entityA,\n entityB,\n });\n });\n }\n\n private colliderHandleToEntity(colliderHandle: number): number | undefined {\n // biome-ignore lint/suspicious/noExplicitAny: Rapier World.getCollider from dynamically loaded module\n const collider = (this.raw as any).getCollider(colliderHandle) as {\n parent(): { userData: number } | null;\n } | null;\n const body = collider?.parent();\n return body?.userData;\n }\n\n private addCollisionPair(entityA: number, entityB: number): boolean {\n let first = this.collisionPairs.get(entityA);\n if (!first) {\n first = new Set<number>();\n this.collisionPairs.set(entityA, first);\n }\n if (first.has(entityB)) return false;\n first.add(entityB);\n let second = this.collisionPairs.get(entityB);\n if (!second) {\n second = new Set<number>();\n this.collisionPairs.set(entityB, second);\n }\n second.add(entityA);\n return true;\n }\n\n private removeCollisionPair(entityA: number, entityB: number): boolean {\n const first = this.collisionPairs.get(entityA);\n const second = this.collisionPairs.get(entityB);\n const firstChanged = first?.delete(entityB) === true;\n const secondChanged = second?.delete(entityA) === true;\n if (!first) this.collisionPairs.set(entityA, new Set());\n if (!second) this.collisionPairs.set(entityB, new Set());\n return firstChanged || secondChanged;\n }\n\n private pushCollisionEvent(event: Rapier2DCollisionEvent): void {\n this.pendingCollisionEvents.push(event);\n this.collisionEventHistory.push(event);\n }\n\n drainCollisionEvents(): Rapier2DCollisionEvent[] {\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 Rapier2DCollisionEvent[] {\n return [...this.collisionEventHistory];\n }\n\n getPendingTeleports(): readonly [\n number,\n { readonly x: number; readonly y: number; readonly rotation: number },\n ][] {\n return [...this.pendingTeleports].map(([entity, target]) => [entity, { ...target }]);\n }\n\n getKinematicControllerStates(): readonly Rapier2DKinematicControllerState[] {\n return [...this.kccOffsets]\n .sort(([first], [second]) => first - second)\n .map(([entity, offset]) => ({ entity, offset }));\n }\n\n dispose(): void {\n if (typeof this.raw.free === 'function') this.raw.free();\n if (typeof this.eventQueue.free === 'function') this.eventQueue.free();\n this.kccCache.clear();\n this.kccOffsets.clear();\n }\n\n writebackCollidingEntities(world: World, component: Component = CollidingEntities): void {\n for (const [entity, others] of this.collisionPairs) {\n const handle = entity as EntityHandle;\n if (world.get(handle, component).ok) {\n world.set(handle, component, { entities: [...others] });\n }\n }\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 * `registerPhysicsSystems2D` (plan-strategy D-1/D-7).\n */\n setMoveContext(world: World, transform: Component, characterController: Component): void {\n this.moveContext = { world, transform, characterController };\n }\n\n moveAndSlide(entity: number, desiredDelta: Vec2): Vec2 {\n return this.computeMove(entity, desiredDelta);\n }\n\n /**\n * Shared moveAndSlide core (plan-strategy D-1/D-2/D-4/D-6/D-7), 2D variant.\n * Mirrors the 3D computeMove with Vec2 movement (x, y only — no z).\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: Vec3Like): Vec2 {\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 RapierRigidBody2D | 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.\n const delta = { x: desiredDelta[0] ?? 0, y: desiredDelta[1] ?? 0 };\n ctrl.computeColliderMovement(\n collider,\n delta,\n undefined,\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 };\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 };\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.\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, readTransformPosZ(ctx.world, entity as EntityHandle, ctx.transform)],\n });\n ctx.world.set(entity as EntityHandle, ctx.characterController, { grounded });\n }\n\n return vec2.create(movement.x, movement.y);\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 2D 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 2D 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 /**\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, 2D variant) ────────────────────────────\n\n /**\n * Ensure a Rapier 2D body and collider exist for an ECS entity (idempotent).\n *\n * 2D variant of the M1 3D ensureBody: Vec2 {x,y} instead of Vec3 {x,y,z},\n * Rapier2D ColliderDesc.{cuboid(hx,hy), ball(radius), capsule(halfHeight,radius)},\n * scalar rotation from transform quat (extracted via atan2 for z-axis angle).\n *\n * Plan-strategy C-3 symmetry with M1, D-2 + D-5 2D adaptations.\n */\n ensureBody(\n entity: number,\n transform: PhysicsTransform2D,\n rigidBody: {\n type: number;\n mass: number;\n linearDamping: number;\n angularDamping: number;\n gravityScale: number;\n ccdEnabled: number;\n },\n collider: PhysicsCollider2D,\n ): void {\n if (this.entityMap.has(entity)) return;\n\n const RAPIER = this.rapierModule;\n\n // ── Create RigidBodyDesc (2D) ──\n const rbType = rigidBodyTypeFromF32(rigidBody.type);\n let body: RapierRigidBody2D;\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)\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)\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)\n .setRotation(transform.rotation);\n // CCD sweeps the collider along its per-step kinematic translation so a\n // fast mover reliably contacts dynamics instead of tunneling through\n // 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 }\n\n body.userData = entity;\n this.registerBody(entity, body.handle);\n\n // ── Create ColliderDesc (2D) ──\n const scaleX = Math.abs(transform.scale.x);\n const scaleY = Math.abs(transform.scale.y);\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 )\n .setFriction(collider.friction)\n .setRestitution(collider.restitution)\n .setDensity(collider.density)\n .setCollisionGroups(collider.collisionGroups)\n .setSolverGroups(collider.solverGroups);\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(collider.radius * Math.max(scaleX, scaleY))\n .setFriction(collider.friction)\n .setRestitution(collider.restitution)\n .setDensity(collider.density)\n .setCollisionGroups(collider.collisionGroups)\n .setSolverGroups(collider.solverGroups);\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 * scaleX,\n )\n .setFriction(collider.friction)\n .setRestitution(collider.restitution)\n .setDensity(collider.density)\n .setCollisionGroups(collider.collisionGroups)\n .setSolverGroups(collider.solverGroups);\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 }\n }\n\n /** Synchronize a static or kinematic Rapier body from its resolved 2D Transform pose. */\n syncAuthoredPose(\n entity: number,\n transform: PhysicsTransform2D,\n collider: PhysicsCollider2D,\n bodyType: 'static' | 'kinematic',\n ): 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 RapierRigidBody2D | 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 const rapierCollider = body.collider(0);\n if (!rapierCollider) return;\n const scaleX = Math.abs(transform.scale.x);\n const scaleY = Math.abs(transform.scale.y);\n switch (colliderShapeFromF32(collider.shape)) {\n case 'cuboid':\n rapierCollider.setHalfExtents({\n x: collider.halfExtents[0] * scaleX,\n y: collider.halfExtents[1] * scaleY,\n });\n break;\n case 'sphere':\n rapierCollider.setRadius(collider.radius * Math.max(scaleX, scaleY));\n break;\n case 'capsule':\n rapierCollider.setHalfHeight(collider.halfHeight * scaleY);\n rapierCollider.setRadius(collider.radius * scaleX);\n break;\n }\n }\n\n // ─── ECS integration helpers ───────────────────────────────────────────\n\n registerBody(entity: number, bodyHandle: number): void {\n this.entityMap.set(entity, { bodyHandle });\n }\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 RapierRigidBody2D | null;\n if (!body) continue;\n\n body.setTranslation({ x: target.x, y: target.y }, true);\n body.setLinvel({ x: 0, y: 0 }, false);\n body.setAngvel(0, false);\n if (target.rotation !== undefined) {\n body.setRotation(target.rotation, true);\n }\n }\n this.pendingTeleports.clear();\n }\n\n setKinematicPosition(entity: number, pos: { x: number; y: number }, rotation?: 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 RapierRigidBody2D | null;\n if (!body) return;\n body.setNextKinematicTranslation({ x: pos.x, y: pos.y });\n if (rotation !== undefined) {\n body.setNextKinematicRotation(rotation);\n }\n }\n\n writebackDynamicBodies(): Array<{\n entity: number;\n pos: { x: number; y: number };\n rotation: number;\n }> {\n const results: Array<{\n entity: number;\n pos: { x: number; y: number };\n rotation: 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 RapierRigidBody2D | 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 },\n rotation,\n });\n }\n return results;\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 removeEntity(entity: number): void {\n const record = this.entityMap.get(entity);\n if (!record) return;\n const ownPairs = [...(this.collisionPairs.get(entity) ?? [])];\n for (const other of ownPairs) {\n if (this.removeCollisionPair(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({\n handle: record.bodyHandle,\n } as RapierRigidBody2D);\n this.entityMap.delete(entity);\n this.collisionPairs.delete(entity);\n }\n}\n\nexport function createRapier2DPhysicsWorld(rapier: Rapier2DModule): RapierPhysicsWorld2D {\n return new RapierPhysicsWorld2D(rapier);\n}\n\n/**\n * Read the entity's current `Transform.pos` z lane. Transform.pos is one\n * `array<f32, 3>` column row (feat-20260709 M2) so per-axis partial writes no\n * longer exist; 2D physics owns only the xy lanes and must carry the authored\n * z (sprite layering / camera depth) through its full-row `world.set` writes.\n * Falls back to 0 when the row is unreachable (entity died mid-frame).\n */\nfunction readTransformPosZ(w: World, entity: EntityHandle, transform: Component): number {\n const result = w.get(entity, transform);\n if (!result.ok) return 0;\n const pos = (result.value as unknown as { pos?: ArrayLike<number> }).pos;\n return pos?.[2] ?? 0;\n}\n\nfunction hasResolvedWorldPose(world: Float32Array | undefined, base: number): boolean {\n if (!world) return false;\n return (\n world[base] !== 1 ||\n world[base + 5] !== 1 ||\n world[base + 10] !== 1 ||\n world[base + 15] !== 1 ||\n world[base + 1] !== 0 ||\n world[base + 2] !== 0 ||\n world[base + 4] !== 0 ||\n world[base + 6] !== 0 ||\n world[base + 8] !== 0 ||\n world[base + 9] !== 0 ||\n world[base + 12] !== 0 ||\n world[base + 13] !== 0 ||\n world[base + 14] !== 0\n );\n}\n\n/** dt upper bound (plan-strategy D-4): skip step if dt exceeds this. */\nconst PHYSICS_DT_MAX = 0.1;\nconst poseScratchPosition2D = vec3.create();\nconst poseScratchRotation2D = quat.create();\nconst poseScratchScale2D = vec3.create();\nconst poseScratchWorld2D = new Float32Array(16);\n\n/**\n * Register three-phase physics tick systems into an ECS World (2D variant).\n *\n * Mirrors registerPhysicsSystems from physics-rapier3d with 2D adaptations\n * (plan-strategy C-3 symmetry):\n * - physicsSyncBackend2D: after propagateTransforms — query (Transform,\n * RigidBody, Collider) and call RapierPhysicsWorld2D.ensureBody for each.\n * - physicsStepSimulation2D: after physicsSyncBackend2D — read FixedTime.delta and\n * call pw.step() with dt-gating.\n * - physicsWriteback2D: after physicsStepSimulation2D — call\n * pw.writebackDynamicBodies() and write positions + rotation back to ECS\n * Transform (2D scalar angle -> quat via quat.fromAxisAngle z-axis).\n *\n * @param world ECS World instance.\n * @param transformComponent The Transform component schema (from\n * @forgeax/engine-runtime, passed by caller to\n * avoid adding a runtime dependency to this package).\n */\n// ── System name constants (2D suffix keeps diagnostics distinct from 3D) ──\nconst PHYSICS_SYNC_BACKEND_2D = 'physicsSyncBackend2D' as const;\nconst PHYSICS_STEP_SIMULATION_2D = 'physicsStepSimulation2D' as const;\nconst PHYSICS_WRITEBACK_2D = 'physicsWriteback2D' as const;\nconst PHYSICS_COLLISION_SYNC_2D = 'physicsCollisionSync2D' as const;\n\n/**\n * Resolve the runtime `Transform` component token from the ECS component\n * vocabulary (M2 — full resource-ification, D-3). Mirrors the 3D variant:\n * physics already depends on `@forgeax/engine-ecs`, so the token lookup\n * introduces no new dependency and replaces the closure-captured\n * `transformComponent` second parameter.\n */\nfunction resolveTransform(world: World): Component | undefined {\n return world.components.resolve('Transform');\n}\n\n/**\n * `physicsSyncBackend2D` system token (M2 — full resource-ification, D-4).\n *\n * After propagateTransforms — query entities with (Transform, Collider) and\n * call ensureBody for each. `RigidBody` is OPTIONAL: an entity with a Collider\n * but no RigidBody is treated as a STATIC collider (Rapier-native — a collider\n * without a parent body is fixed), matching the Collider docstring and how\n * static level geometry is authored. The 2D suffix keeps the name distinct from\n * the 3D system in the shared schedule (D-5).\n */\nexport const PhysicsSyncBackend2D: SystemHandle<readonly []> = defineSystem({\n name: PHYSICS_SYNC_BACKEND_2D,\n queries: [],\n after: ['propagateTransformsFixed'],\n fn: (world) => {\n const transformComponent = resolveTransform(world);\n if (transformComponent === undefined) return;\n let pw: RapierPhysicsWorld2D;\n try {\n pw = world.getResource<RapierPhysicsWorld2D>('PhysicsWorld');\n } catch {\n return; // C-2: PhysicsWorld resource not yet ready — safe early out\n }\n\n pw.applyPendingTeleports();\n\n const queryResult = world.query({\n read: [Collider, transformComponent],\n optional: [RigidBody, CharacterController],\n });\n if (!queryResult.ok) return;\n\n const activeEntities = new Set<number>();\n for (const queryRow of queryResult.value) {\n const rowView = queryRow as unknown as {\n readonly entity: EntityHandle;\n has(component: Component): boolean;\n get(component: Component): Record<string, unknown>;\n };\n const colliderData = rowView.get(Collider) as unknown as {\n shape: number;\n halfExtents: Float32Array;\n radius: number;\n halfHeight: number;\n friction: number;\n restitution: number;\n density: number;\n isSensor: number;\n collisionGroups: number;\n solverGroups: number;\n };\n const transformData = rowView.get(transformComponent) as unknown as {\n pos: Float32Array;\n quat: Float32Array;\n scale: Float32Array;\n world?: Float32Array;\n };\n const rigidBodyData = rowView.has(RigidBody)\n ? (rowView.get(RigidBody) as unknown as {\n type: number;\n mass: number;\n linearDamping: number;\n angularDamping: number;\n gravityScale: number;\n ccdEnabled: number;\n })\n : undefined;\n const hasCharacterController = rowView.has(CharacterController);\n const rbType =\n rigidBodyData === undefined ? undefined : new Float32Array([rigidBodyData.type]);\n const rbMass =\n rigidBodyData === undefined ? undefined : new Float32Array([rigidBodyData.mass]);\n const rbLinDamp =\n rigidBodyData === undefined ? undefined : new Float32Array([rigidBodyData.linearDamping]);\n const rbAngDamp =\n rigidBodyData === undefined ? undefined : new Float32Array([rigidBodyData.angularDamping]);\n const rbGravScale =\n rigidBodyData === undefined ? undefined : new Float32Array([rigidBodyData.gravityScale]);\n const rbCcd =\n rigidBodyData === undefined ? undefined : new Uint32Array([rigidBodyData.ccdEnabled]);\n const cShape = new Uint32Array([colliderData.shape]);\n const cHalfExtents = colliderData.halfExtents;\n const cRadius = new Float32Array([colliderData.radius]);\n const cHalfH = new Float32Array([colliderData.halfHeight]);\n const cFric = new Float32Array([colliderData.friction]);\n const cRest = new Float32Array([colliderData.restitution]);\n const cDens = new Float32Array([colliderData.density]);\n const cSensor = new Uint32Array([colliderData.isSensor]);\n const cCGroups = new Uint32Array([colliderData.collisionGroups]);\n const cSGroups = new Uint32Array([colliderData.solverGroups]);\n const tfPos = transformData.pos;\n const tfQuat = transformData.quat;\n const tfScale = transformData.scale;\n const tfWorld = transformData.world;\n\n // rb* views are intentionally NOT guarded here: a bare-Collider archetype\n // has no RigidBody column, so they are legitimately undefined and the\n // per-row rigidBody below falls back to a static default. Only the\n // Collider + Transform columns are required.\n if (\n !cShape ||\n !cHalfExtents ||\n !cRadius ||\n !cHalfH ||\n !cFric ||\n !cRest ||\n !cDens ||\n !cSensor ||\n !cCGroups ||\n !cSGroups ||\n !tfPos ||\n !tfQuat ||\n !tfScale\n ) {\n continue;\n }\n\n {\n const row = 0;\n const entity = rowView.entity;\n activeEntities.add(entity);\n\n const localBase = row * 3;\n const quatBase = row * 4;\n const worldBase = row * 16;\n const useWorldPose = hasResolvedWorldPose(tfWorld, worldBase);\n if (useWorldPose && tfWorld) {\n for (let lane = 0; lane < 16; lane++) {\n poseScratchWorld2D[lane] = tfWorld[worldBase + lane] ?? 0;\n }\n mat4.decompose(\n poseScratchPosition2D,\n poseScratchRotation2D,\n poseScratchScale2D,\n poseScratchWorld2D,\n );\n } else {\n poseScratchPosition2D[0] = tfPos[localBase] ?? 0;\n poseScratchPosition2D[1] = tfPos[localBase + 1] ?? 0;\n poseScratchPosition2D[2] = tfPos[localBase + 2] ?? 0;\n poseScratchRotation2D[0] = tfQuat[quatBase] ?? 0;\n poseScratchRotation2D[1] = tfQuat[quatBase + 1] ?? 0;\n poseScratchRotation2D[2] = tfQuat[quatBase + 2] ?? 0;\n poseScratchRotation2D[3] = tfQuat[quatBase + 3] ?? 1;\n poseScratchScale2D[0] = tfScale[localBase] ?? 1;\n poseScratchScale2D[1] = tfScale[localBase + 1] ?? 1;\n poseScratchScale2D[2] = tfScale[localBase + 2] ?? 1;\n }\n const transform: PhysicsTransform2D = {\n position: { x: poseScratchPosition2D[0] ?? 0, y: poseScratchPosition2D[1] ?? 0 },\n rotation: 2 * Math.atan2(poseScratchRotation2D[2] ?? 0, poseScratchRotation2D[3] ?? 1),\n scale: { x: poseScratchScale2D[0] ?? 1, y: poseScratchScale2D[1] ?? 1 },\n };\n\n // Bare-Collider (no RigidBody) → synthesize a STATIC body. The `static`\n // ensureBody arm reads only `type`, so mass/damping/gravity/ccd defaults\n // are inert; this matches Rapier's \"collider without a parent body is\n // fixed\" semantics and the Collider component docstring.\n const rigidBody: {\n type: number;\n mass: number;\n linearDamping: number;\n angularDamping: number;\n gravityScale: number;\n ccdEnabled: number;\n } = rbType\n ? {\n type: rbType[row] as number,\n mass: (rbMass?.[row] ?? 0) as number,\n linearDamping: (rbLinDamp?.[row] ?? 0) as number,\n angularDamping: (rbAngDamp?.[row] ?? 0) as number,\n gravityScale: (rbGravScale?.[row] ?? 1) as number,\n ccdEnabled: (rbCcd?.[row] ?? 0) as number,\n }\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 const collider: {\n shape: number;\n halfExtents: readonly [number, number, number];\n radius: number;\n halfHeight: number;\n friction: number;\n restitution: number;\n density: number;\n isSensor: number;\n collisionGroups: number;\n solverGroups: number;\n } = {\n shape: cShape[row] as number,\n halfExtents: [\n cHalfExtents[row * 3] as number,\n cHalfExtents[row * 3 + 1] as number,\n cHalfExtents[row * 3 + 2] as number,\n ],\n radius: cRadius[row] as number,\n halfHeight: cHalfH[row] as number,\n friction: cFric[row] as number,\n restitution: cRest[row] as number,\n density: cDens[row] as number,\n isSensor: cSensor[row] as number,\n collisionGroups: cCGroups[row] as number,\n solverGroups: cSGroups[row] as number,\n };\n\n pw.ensureBody(entity, transform, rigidBody, collider);\n\n const rbTypeVal = rigidBodyTypeFromF32(rigidBody.type);\n if (rbTypeVal === 'static') {\n pw.syncAuthoredPose(entity, transform, collider, 'static');\n } else if (rbTypeVal === 'kinematic' && !hasCharacterController) {\n pw.syncAuthoredPose(entity, transform, collider, 'kinematic');\n }\n }\n }\n pw.pruneMissingEntities(activeEntities);\n },\n});\n\n/**\n * `physicsStepSimulation2D` system token (M2 — full resource-ification, D-4).\n *\n * After physicsSyncBackend2D — read FixedTime.delta and call pw.step() with dt-gating.\n */\nexport const PhysicsStepSimulation2D: SystemHandle<readonly []> = defineSystem({\n name: PHYSICS_STEP_SIMULATION_2D,\n queries: [],\n after: [PHYSICS_SYNC_BACKEND_2D],\n fn: (world) => {\n let pw: RapierPhysicsWorld2D;\n try {\n pw = world.getResource<RapierPhysicsWorld2D>('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 * `physicsWriteback2D` system token (M2 — full resource-ification, D-4).\n *\n * After physicsStepSimulation2D — call pw.writebackDynamicBodies() and write\n * positions + rotation back to ECS Transform (resolved from the ECS\n * component vocabulary, D-3; 2D scalar angle -> quat via quat.fromAxisAngle z-axis).\n */\nexport const PhysicsWriteback2D: SystemHandle<readonly []> = defineSystem({\n name: PHYSICS_WRITEBACK_2D,\n queries: [],\n after: [PHYSICS_STEP_SIMULATION_2D],\n fn: (world) => {\n const transformComponent = resolveTransform(world);\n if (transformComponent === undefined) return;\n let pw: RapierPhysicsWorld2D;\n try {\n pw = world.getResource<RapierPhysicsWorld2D>('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 // D-5 2D variant: pos from {x,y}, rotation from scalar angle -> quat\n const outQuat = quat.create();\n // biome-ignore lint/suspicious/noExplicitAny: quat accepts Vec3 array\n quat.fromAxisAngle(outQuat, [0, 0, 1] as any as Vec3Like, r.rotation);\n world.set(entity, transformComponent, {\n pos: [r.pos.x, r.pos.y, readTransformPosZ(world, entity, transformComponent)],\n // Component order [x, y, z, w] (E6). `?? 0/1` narrows the\n // noUncheckedIndexedAccess undefined out of the quat elements.\n quat: [outQuat[0] ?? 0, outQuat[1] ?? 0, outQuat[2] ?? 0, outQuat[3] ?? 1],\n });\n }\n },\n});\n\nexport const PhysicsCollisionSync2D: SystemHandle<readonly []> = defineSystem({\n name: PHYSICS_COLLISION_SYNC_2D,\n queries: [],\n after: [PHYSICS_WRITEBACK_2D],\n fn: (world) => {\n let pw: RapierPhysicsWorld2D;\n try {\n pw = world.getResource<RapierPhysicsWorld2D>('PhysicsWorld');\n } catch {\n return;\n }\n pw.writebackCollidingEntities(world);\n },\n});\n\n/**\n * Register three-phase physics tick systems into an ECS World (2D variant).\n *\n * Mirrors registerPhysicsSystems from physics-rapier3d with 2D adaptations\n * (plan-strategy C-3 symmetry). The three systems\n * ({@link PhysicsSyncBackend2D} / {@link PhysicsStepSimulation2D} /\n * {@link PhysicsWriteback2D}) are module-level `defineSystem` tokens; this\n * helper wires the moveAndSlide context + despawn cleanup hook, then adds the\n * three tokens to the schedule.\n *\n * Transform is resolved from the World-local ECS component catalog,\n * D-3) — the previous `transformComponent` second parameter is gone.\n *\n * @param world ECS World instance.\n */\nexport function registerPhysicsSystems2D(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<RapierPhysicsWorld2D>('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 PhysicsSyncBackend2D,\n PhysicsStepSimulation2D,\n PhysicsWriteback2D,\n PhysicsCollisionSync2D,\n ])\n .unwrap();\n return () => {\n world.removeSystem(FixedUpdate, PHYSICS_COLLISION_SYNC_2D);\n world.removeSystem(FixedUpdate, PHYSICS_WRITEBACK_2D);\n world.removeSystem(FixedUpdate, PHYSICS_STEP_SIMULATION_2D);\n world.removeSystem(FixedUpdate, PHYSICS_SYNC_BACKEND_2D);\n releaseComponents();\n };\n}\n","// @forgeax/engine-physics-rapier2d — WASM loader for Rapier 2D compat variant.\n//\n// Dynamic import of @dimforge/rapier2d-compat (plan-strategy D-4: compat variant,\n// zero Vite configuration).\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/rapier2d-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 Rapier2DModule = any;\n\nlet rapierInstance: Rapier2DModule | null = null;\nlet loadingPromise: Promise<Rapier2DModule | PhysicsError> | null = null;\n\nexport async function loadRapier2D(): Promise<Rapier2DModule | 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<Rapier2DModule | PhysicsError> {\n try {\n const RAPIER = await import('@dimforge/rapier2d-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/rapier2d-compat',\n hint: `dynamic import or init() failed: ${reason}. Check network, file path, and that @dimforge/rapier2d-compat is installed.`,\n detail: { code: 'wasm-load-failed', reason },\n });\n }\n}\n"]}
|
|
1
|
+
{"version":3,"sources":["../src/rapier-physics-world-2d.ts","../src/wasm-loader.ts"],"names":["PhysicsError"],"mappings":"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","file":"index.mjs","sourcesContent":["import { componentDefinition, FixedTime, FixedUpdate } from '@forgeax/engine-ecs';\n// @forgeax/engine-physics-rapier2d — RapierPhysicsWorld2D class and three-phase\n// tick systems (syncBackend / stepSimulation / writeback).\n//\n// Mirrors packages/physics-rapier3d/ with 2D adaptations (research Finding 12):\n// - Vec2 instead of Vec3 for translations\n// - scalar angle instead of Quat for rotation\n// - Rapier2D world.step() (no z-axis)\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\nimport type { Component, EntityHandle, SystemHandle, World } from '@forgeax/engine-ecs';\nimport { defineSystem } from '@forgeax/engine-ecs';\nimport { mat4, quat, type Vec2, type Vec3Like, vec2, vec3 } from '@forgeax/engine-math';\nimport type { PhysicsWorld2D, RaycastHit2D } from '@forgeax/engine-physics';\nimport {\n CharacterController,\n Collider,\n CollidingEntities,\n colliderShapeFromF32,\n PHYSICS_ERROR_HINTS,\n PhysicsError,\n PhysicsSet,\n RIGID_BODY_TYPE_STATIC,\n RigidBody,\n registerPhysicsComponents,\n rigidBodyTypeFromF32,\n} from '@forgeax/engine-physics';\nimport type { Rapier2DModule } from './wasm-loader';\n\ninterface Rapier2DKinematicControllerState {\n readonly entity: number;\n readonly offset: number;\n}\n\ninterface PhysicsEntityRecord {\n bodyHandle: number;\n}\n\ninterface PhysicsTransform2D {\n readonly position: { readonly x: number; readonly y: number };\n readonly rotation: number;\n readonly scale: { readonly x: number; readonly y: number };\n}\n\ninterface PhysicsCollider2D {\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\nexport interface Rapier2DCollisionEvent {\n readonly type: 'started' | 'stopped';\n readonly entityA: number;\n readonly entityB: number;\n}\n\n// biome-ignore lint/suspicious/noExplicitAny: Rapier types from dynamically loaded module\ntype RapierWorld2D = 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 RapierRigidBody2D = 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). Mirrors the 3D applyKccTuning; the KCC\n * API is dimension-agnostic. Degrees -> radians for the two slope setters;\n * offset / autostep / snap pass through as world units. A zero value for\n * 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 2D RigidBodyType enum value to the engine's string union for the\n * `controller-requires-kinematic` error detail.\n */\n// biome-ignore lint/suspicious/noExplicitAny: Rapier module enum from dynamic module\nfunction rapierBodyTypeToString(rapier: any, bodyType: number): string {\n if (bodyType === rapier.RigidBodyType.Dynamic) return 'dynamic';\n if (bodyType === rapier.RigidBodyType.Fixed) return 'static';\n return 'kinematic';\n}\n\nexport class RapierPhysicsWorld2D implements PhysicsWorld2D {\n raw: RapierWorld2D;\n\n private readonly rapierModule: Rapier2DModule;\n\n /** Entity (raw number) -> PhysicsEntityRecord mapping. */\n private readonly entityMap = new Map<number, PhysicsEntityRecord>();\n\n /** Pending teleports: entity -> target position and rotation. */\n private readonly pendingTeleports = new Map<number, { x: number; y: number; rotation: number }>();\n\n private eventQueue: RapierEventQueue;\n\n private readonly collisionPairs = new Map<number, Set<number>>();\n\n private readonly pendingCollisionEvents: Rapier2DCollisionEvent[] = [];\n\n private readonly collisionEventHistory: Rapier2DCollisionEvent[] = [];\n\n private currentGravity: { x: number; y: number };\n\n /**\n * Lazily-built Rapier KinematicCharacterController per character entity\n * (plan-strategy D-1/D-3, 2D variant). `moveAndSlide` creates one on first\n * call; the `Collider.onRemove` hook clears it on despawn. Public so AC-12\n * 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 `registerPhysicsSystems2D`, so\n * `moveAndSlide` can read CharacterController tuning and write Transform +\n * grounded back. Undefined until systems are registered — the input-validation\n * error paths fire before these are read, so direct `pw.moveAndSlide()` calls\n * in error tests need no World.\n */\n private moveContext:\n | { world: World; transform: Component; characterController: Component }\n | undefined;\n\n constructor(rapier: Rapier2DModule) {\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 }) as RapierWorld2D;\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 };\n }\n\n // ─── PhysicsWorld2D interface ──────────────────────────────────────────\n\n setGravity(gravity: Vec2): void {\n const x = gravity[0] ?? 0;\n const y = gravity[1] ?? 0;\n this.raw.gravity = { x, y };\n this.currentGravity = { x, y };\n }\n\n getGravity(): Vec2 {\n const { x, y } = this.currentGravity;\n return vec2.create(x, y);\n }\n\n raycast(\n origin: Vec2,\n direction: Vec2,\n maxDist: number,\n filterMask?: number,\n ): RaycastHit2D | undefined {\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 },\n dir: { x: number; y: number },\n ) => { pointAt(t: number): { x: number; y: number } };\n const ray = new RayCtor(\n { x: origin[0] ?? 0, y: origin[1] ?? 0 },\n { x: direction[0] ?? 0, y: direction[1] ?? 0 },\n );\n // biome-ignore lint/suspicious/noExplicitAny: Rapier World castRayAndGetNormal (2D)\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 };\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. The prior\n // code treated the object as a body HANDLE and re-resolved it via\n // `bodies.get(...)`, which returned a DIFFERENT body → the wrong entity\n // (identical bug + fix as the 3D backend, solo round-22).\n const colliderParentBody = hit.collider.parent();\n const entity = colliderParentBody !== null ? colliderParentBody.userData : 0;\n\n return {\n entity,\n point: vec2.create(point.x, point.y),\n normal: vec2.create(hit.normal.x, hit.normal.y),\n timeOfImpact: hit.timeOfImpact,\n };\n }\n\n teleport(entity: number, position: Vec2, rotation: number): void {\n this.pendingTeleports.set(entity, {\n x: position[0] ?? 0,\n y: position[1] ?? 0,\n rotation,\n });\n }\n\n step(deltaTime: number): void {\n void deltaTime;\n // biome-ignore lint/suspicious/noExplicitAny: Rapier World.step\n (this.raw as any).step(this.eventQueue);\n this.drainRapierCollisionEvents();\n }\n\n private drainRapierCollisionEvents(): void {\n this.eventQueue.drainCollisionEvents((handle1: number, handle2: number, started: boolean) => {\n const entityA = this.colliderHandleToEntity(handle1);\n const entityB = this.colliderHandleToEntity(handle2);\n if (entityA === undefined || entityB === undefined) return;\n const changed = started\n ? this.addCollisionPair(entityA, entityB)\n : this.removeCollisionPair(entityA, entityB);\n if (!changed) return;\n this.pushCollisionEvent({\n type: started ? 'started' : 'stopped',\n entityA,\n entityB,\n });\n });\n }\n\n private colliderHandleToEntity(colliderHandle: number): number | undefined {\n // biome-ignore lint/suspicious/noExplicitAny: Rapier World.getCollider from dynamically loaded module\n const collider = (this.raw as any).getCollider(colliderHandle) as {\n parent(): { userData: number } | null;\n } | null;\n const body = collider?.parent();\n return body?.userData;\n }\n\n private addCollisionPair(entityA: number, entityB: number): boolean {\n let first = this.collisionPairs.get(entityA);\n if (!first) {\n first = new Set<number>();\n this.collisionPairs.set(entityA, first);\n }\n if (first.has(entityB)) return false;\n first.add(entityB);\n let second = this.collisionPairs.get(entityB);\n if (!second) {\n second = new Set<number>();\n this.collisionPairs.set(entityB, second);\n }\n second.add(entityA);\n return true;\n }\n\n private removeCollisionPair(entityA: number, entityB: number): boolean {\n const first = this.collisionPairs.get(entityA);\n const second = this.collisionPairs.get(entityB);\n const firstChanged = first?.delete(entityB) === true;\n const secondChanged = second?.delete(entityA) === true;\n if (!first) this.collisionPairs.set(entityA, new Set());\n if (!second) this.collisionPairs.set(entityB, new Set());\n return firstChanged || secondChanged;\n }\n\n private pushCollisionEvent(event: Rapier2DCollisionEvent): void {\n this.pendingCollisionEvents.push(event);\n this.collisionEventHistory.push(event);\n }\n\n drainCollisionEvents(): Rapier2DCollisionEvent[] {\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 Rapier2DCollisionEvent[] {\n return [...this.collisionEventHistory];\n }\n\n getPendingTeleports(): readonly [\n number,\n { readonly x: number; readonly y: number; readonly rotation: number },\n ][] {\n return [...this.pendingTeleports].map(([entity, target]) => [entity, { ...target }]);\n }\n\n getKinematicControllerStates(): readonly Rapier2DKinematicControllerState[] {\n return [...this.kccOffsets]\n .sort(([first], [second]) => first - second)\n .map(([entity, offset]) => ({ entity, offset }));\n }\n\n dispose(): void {\n if (typeof this.raw.free === 'function') this.raw.free();\n if (typeof this.eventQueue.free === 'function') this.eventQueue.free();\n this.kccCache.clear();\n this.kccOffsets.clear();\n }\n\n writebackCollidingEntities(world: World, component: Component = CollidingEntities): void {\n for (const [entity, others] of this.collisionPairs) {\n const handle = entity as EntityHandle;\n if (world.get(handle, component).ok) {\n world.set(handle, component, { entities: [...others] });\n }\n }\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 * `registerPhysicsSystems2D` (plan-strategy D-1/D-7).\n */\n setMoveContext(world: World, transform: Component, characterController: Component): void {\n this.moveContext = { world, transform, characterController };\n }\n\n moveAndSlide(entity: number, desiredDelta: Vec2): Vec2 {\n return this.computeMove(entity, desiredDelta);\n }\n\n /**\n * Shared moveAndSlide core (plan-strategy D-1/D-2/D-4/D-6/D-7), 2D variant.\n * Mirrors the 3D computeMove with Vec2 movement (x, y only — no z).\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: Vec3Like): Vec2 {\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 RapierRigidBody2D | 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.\n const delta = { x: desiredDelta[0] ?? 0, y: desiredDelta[1] ?? 0 };\n ctrl.computeColliderMovement(\n collider,\n delta,\n undefined,\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 };\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 };\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.\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, readTransformPosZ(ctx.world, entity as EntityHandle, ctx.transform)],\n });\n ctx.world.set(entity as EntityHandle, ctx.characterController, { grounded });\n }\n\n return vec2.create(movement.x, movement.y);\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 2D 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 2D 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 /**\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, 2D variant) ────────────────────────────\n\n /**\n * Ensure a Rapier 2D body and collider exist for an ECS entity (idempotent).\n *\n * 2D variant of the M1 3D ensureBody: Vec2 {x,y} instead of Vec3 {x,y,z},\n * Rapier2D ColliderDesc.{cuboid(hx,hy), ball(radius), capsule(halfHeight,radius)},\n * scalar rotation from transform quat (extracted via atan2 for z-axis angle).\n *\n * Plan-strategy C-3 symmetry with M1, D-2 + D-5 2D adaptations.\n */\n ensureBody(\n entity: number,\n transform: PhysicsTransform2D,\n rigidBody: {\n type: number;\n mass: number;\n linearDamping: number;\n angularDamping: number;\n gravityScale: number;\n ccdEnabled: number;\n },\n collider: PhysicsCollider2D,\n ): void {\n if (this.entityMap.has(entity)) return;\n\n const RAPIER = this.rapierModule;\n\n // ── Create RigidBodyDesc (2D) ──\n const rbType = rigidBodyTypeFromF32(rigidBody.type);\n let body: RapierRigidBody2D;\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)\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)\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)\n .setRotation(transform.rotation);\n // CCD sweeps the collider along its per-step kinematic translation so a\n // fast mover reliably contacts dynamics instead of tunneling through\n // 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 }\n\n body.userData = entity;\n this.registerBody(entity, body.handle);\n\n // ── Create ColliderDesc (2D) ──\n const scaleX = Math.abs(transform.scale.x);\n const scaleY = Math.abs(transform.scale.y);\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 )\n .setFriction(collider.friction)\n .setRestitution(collider.restitution)\n .setDensity(collider.density)\n .setCollisionGroups(collider.collisionGroups)\n .setSolverGroups(collider.solverGroups);\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(collider.radius * Math.max(scaleX, scaleY))\n .setFriction(collider.friction)\n .setRestitution(collider.restitution)\n .setDensity(collider.density)\n .setCollisionGroups(collider.collisionGroups)\n .setSolverGroups(collider.solverGroups);\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 * scaleX,\n )\n .setFriction(collider.friction)\n .setRestitution(collider.restitution)\n .setDensity(collider.density)\n .setCollisionGroups(collider.collisionGroups)\n .setSolverGroups(collider.solverGroups);\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 }\n }\n\n /** Synchronize a static or kinematic Rapier body from its resolved 2D Transform pose. */\n syncAuthoredPose(\n entity: number,\n transform: PhysicsTransform2D,\n collider: PhysicsCollider2D,\n bodyType: 'static' | 'kinematic',\n ): 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 RapierRigidBody2D | 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 const rapierCollider = body.collider(0);\n if (!rapierCollider) return;\n const scaleX = Math.abs(transform.scale.x);\n const scaleY = Math.abs(transform.scale.y);\n switch (colliderShapeFromF32(collider.shape)) {\n case 'cuboid':\n rapierCollider.setHalfExtents({\n x: collider.halfExtents[0] * scaleX,\n y: collider.halfExtents[1] * scaleY,\n });\n break;\n case 'sphere':\n rapierCollider.setRadius(collider.radius * Math.max(scaleX, scaleY));\n break;\n case 'capsule':\n rapierCollider.setHalfHeight(collider.halfHeight * scaleY);\n rapierCollider.setRadius(collider.radius * scaleX);\n break;\n }\n }\n\n // ─── ECS integration helpers ───────────────────────────────────────────\n\n registerBody(entity: number, bodyHandle: number): void {\n this.entityMap.set(entity, { bodyHandle });\n }\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 RapierRigidBody2D | null;\n if (!body) continue;\n\n body.setTranslation({ x: target.x, y: target.y }, true);\n body.setLinvel({ x: 0, y: 0 }, false);\n body.setAngvel(0, false);\n if (target.rotation !== undefined) {\n body.setRotation(target.rotation, true);\n }\n }\n this.pendingTeleports.clear();\n }\n\n setKinematicPosition(entity: number, pos: { x: number; y: number }, rotation?: 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 RapierRigidBody2D | null;\n if (!body) return;\n body.setNextKinematicTranslation({ x: pos.x, y: pos.y });\n if (rotation !== undefined) {\n body.setNextKinematicRotation(rotation);\n }\n }\n\n writebackDynamicBodies(): Array<{\n entity: number;\n pos: { x: number; y: number };\n rotation: number;\n }> {\n const results: Array<{\n entity: number;\n pos: { x: number; y: number };\n rotation: 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 RapierRigidBody2D | 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 },\n rotation,\n });\n }\n return results;\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 removeEntity(entity: number): void {\n const record = this.entityMap.get(entity);\n if (!record) return;\n const ownPairs = [...(this.collisionPairs.get(entity) ?? [])];\n for (const other of ownPairs) {\n if (this.removeCollisionPair(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({\n handle: record.bodyHandle,\n } as RapierRigidBody2D);\n this.entityMap.delete(entity);\n this.collisionPairs.delete(entity);\n }\n}\n\nexport function createRapier2DPhysicsWorld(rapier: Rapier2DModule): RapierPhysicsWorld2D {\n return new RapierPhysicsWorld2D(rapier);\n}\n\n/**\n * Read the entity's current `Transform.pos` z lane. Transform.pos is one\n * `array<f32, 3>` column row (feat-20260709 M2) so per-axis partial writes no\n * longer exist; 2D physics owns only the xy lanes and must carry the authored\n * z (sprite layering / camera depth) through its full-row `world.set` writes.\n * Falls back to 0 when the row is unreachable (entity died mid-frame).\n */\nfunction readTransformPosZ(w: World, entity: EntityHandle, transform: Component): number {\n const result = w.get(entity, transform);\n if (!result.ok) return 0;\n const pos = (result.value as unknown as { pos?: ArrayLike<number> }).pos;\n return pos?.[2] ?? 0;\n}\n\nfunction hasResolvedWorldPose(world: Float32Array | undefined, base: number): boolean {\n if (!world) return false;\n return (\n world[base] !== 1 ||\n world[base + 5] !== 1 ||\n world[base + 10] !== 1 ||\n world[base + 15] !== 1 ||\n world[base + 1] !== 0 ||\n world[base + 2] !== 0 ||\n world[base + 4] !== 0 ||\n world[base + 6] !== 0 ||\n world[base + 8] !== 0 ||\n world[base + 9] !== 0 ||\n world[base + 12] !== 0 ||\n world[base + 13] !== 0 ||\n world[base + 14] !== 0\n );\n}\n\n/** dt upper bound (plan-strategy D-4): skip step if dt exceeds this. */\nconst PHYSICS_DT_MAX = 0.1;\nconst poseScratchPosition2D = vec3.create();\nconst poseScratchRotation2D = quat.create();\nconst poseScratchScale2D = vec3.create();\nconst poseScratchWorld2D = new Float32Array(16);\n\n/**\n * Register three-phase physics tick systems into an ECS World (2D variant).\n *\n * Mirrors registerPhysicsSystems from physics-rapier3d with 2D adaptations\n * (plan-strategy C-3 symmetry):\n * - physicsSyncBackend2D: after propagateTransforms — query (Transform,\n * RigidBody, Collider) and call RapierPhysicsWorld2D.ensureBody for each.\n * - physicsStepSimulation2D: after physicsSyncBackend2D — read FixedTime.delta and\n * call pw.step() with dt-gating.\n * - physicsWriteback2D: after physicsStepSimulation2D — call\n * pw.writebackDynamicBodies() and write positions + rotation back to ECS\n * Transform (2D scalar angle -> quat via quat.fromAxisAngle z-axis).\n *\n * @param world ECS World instance.\n * @param transformComponent The Transform component schema (from\n * @forgeax/engine-runtime, passed by caller to\n * avoid adding a runtime dependency to this package).\n */\n// ── System name constants (2D suffix keeps diagnostics distinct from 3D) ──\nconst PHYSICS_SYNC_BACKEND_2D = 'physicsSyncBackend2D' as const;\nconst PHYSICS_STEP_SIMULATION_2D = 'physicsStepSimulation2D' as const;\nconst PHYSICS_WRITEBACK_2D = 'physicsWriteback2D' as const;\nconst PHYSICS_COLLISION_SYNC_2D = 'physicsCollisionSync2D' as const;\n\n/**\n * Resolve the runtime `Transform` component token from the ECS component\n * vocabulary (M2 — full resource-ification, D-3). Mirrors the 3D variant:\n * physics already depends on `@forgeax/engine-ecs`, so the token lookup\n * introduces no new dependency and replaces the closure-captured\n * `transformComponent` second parameter.\n */\nfunction resolveTransform(world: World): Component | undefined {\n return world.components.resolve('Transform');\n}\n\n/**\n * `physicsSyncBackend2D` system token (M2 — full resource-ification, D-4).\n *\n * After propagateTransforms — query entities with (Transform, Collider) and\n * call ensureBody for each. `RigidBody` is OPTIONAL: an entity with a Collider\n * but no RigidBody is treated as a STATIC collider (Rapier-native — a collider\n * without a parent body is fixed), matching the Collider docstring and how\n * static level geometry is authored. The 2D suffix keeps the name distinct from\n * the 3D system in the shared schedule (D-5).\n */\nexport const PhysicsSyncBackend2D: SystemHandle<readonly []> = defineSystem({\n name: PHYSICS_SYNC_BACKEND_2D,\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: RapierPhysicsWorld2D;\n try {\n pw = world.getResource<RapierPhysicsWorld2D>('PhysicsWorld');\n } catch {\n return; // C-2: PhysicsWorld resource not yet ready — safe early out\n }\n\n pw.applyPendingTeleports();\n\n const queryResult = world.query({\n read: [Collider, transformComponent, globalTransformComponent],\n optional: [RigidBody, CharacterController],\n });\n if (!queryResult.ok) return;\n\n const activeEntities = new Set<number>();\n for (const queryRow of queryResult.value) {\n const rowView = queryRow as unknown as {\n readonly entity: EntityHandle;\n has(component: Component): boolean;\n get(component: Component): Record<string, unknown>;\n };\n const colliderData = rowView.get(Collider) as unknown as {\n shape: number;\n halfExtents: Float32Array;\n radius: number;\n halfHeight: number;\n friction: number;\n restitution: number;\n density: number;\n isSensor: number;\n collisionGroups: number;\n solverGroups: number;\n };\n const transformData = rowView.get(transformComponent) as unknown as {\n pos: Float32Array;\n quat: Float32Array;\n scale: Float32Array;\n };\n const globalTransformData = rowView.get(globalTransformComponent) as unknown as {\n world: Float32Array;\n };\n const rigidBodyData = rowView.has(RigidBody)\n ? (rowView.get(RigidBody) as unknown as {\n type: number;\n mass: number;\n linearDamping: number;\n angularDamping: number;\n gravityScale: number;\n ccdEnabled: number;\n })\n : undefined;\n const hasCharacterController = rowView.has(CharacterController);\n const rbType =\n rigidBodyData === undefined ? undefined : new Float32Array([rigidBodyData.type]);\n const rbMass =\n rigidBodyData === undefined ? undefined : new Float32Array([rigidBodyData.mass]);\n const rbLinDamp =\n rigidBodyData === undefined ? undefined : new Float32Array([rigidBodyData.linearDamping]);\n const rbAngDamp =\n rigidBodyData === undefined ? undefined : new Float32Array([rigidBodyData.angularDamping]);\n const rbGravScale =\n rigidBodyData === undefined ? undefined : new Float32Array([rigidBodyData.gravityScale]);\n const rbCcd =\n rigidBodyData === undefined ? undefined : new Uint32Array([rigidBodyData.ccdEnabled]);\n const cShape = new Uint32Array([colliderData.shape]);\n const cHalfExtents = colliderData.halfExtents;\n const cRadius = new Float32Array([colliderData.radius]);\n const cHalfH = new Float32Array([colliderData.halfHeight]);\n const cFric = new Float32Array([colliderData.friction]);\n const cRest = new Float32Array([colliderData.restitution]);\n const cDens = new Float32Array([colliderData.density]);\n const cSensor = new Uint32Array([colliderData.isSensor]);\n const cCGroups = new Uint32Array([colliderData.collisionGroups]);\n const cSGroups = new Uint32Array([colliderData.solverGroups]);\n const tfPos = transformData.pos;\n const tfQuat = transformData.quat;\n const tfScale = transformData.scale;\n const tfWorld = globalTransformData.world;\n\n // rb* views are intentionally NOT guarded here: a bare-Collider archetype\n // has no RigidBody column, so they are legitimately undefined and the\n // per-row rigidBody below falls back to a static default. Only the\n // Collider + Transform columns are required.\n if (\n !cShape ||\n !cHalfExtents ||\n !cRadius ||\n !cHalfH ||\n !cFric ||\n !cRest ||\n !cDens ||\n !cSensor ||\n !cCGroups ||\n !cSGroups ||\n !tfPos ||\n !tfQuat ||\n !tfScale\n ) {\n continue;\n }\n\n {\n const row = 0;\n const entity = rowView.entity;\n activeEntities.add(entity);\n\n const localBase = row * 3;\n const quatBase = row * 4;\n const worldBase = row * 16;\n const useWorldPose = hasResolvedWorldPose(tfWorld, worldBase);\n if (useWorldPose && tfWorld) {\n for (let lane = 0; lane < 16; lane++) {\n poseScratchWorld2D[lane] = tfWorld[worldBase + lane] ?? 0;\n }\n mat4.decompose(\n poseScratchPosition2D,\n poseScratchRotation2D,\n poseScratchScale2D,\n poseScratchWorld2D,\n );\n } else {\n poseScratchPosition2D[0] = tfPos[localBase] ?? 0;\n poseScratchPosition2D[1] = tfPos[localBase + 1] ?? 0;\n poseScratchPosition2D[2] = tfPos[localBase + 2] ?? 0;\n poseScratchRotation2D[0] = tfQuat[quatBase] ?? 0;\n poseScratchRotation2D[1] = tfQuat[quatBase + 1] ?? 0;\n poseScratchRotation2D[2] = tfQuat[quatBase + 2] ?? 0;\n poseScratchRotation2D[3] = tfQuat[quatBase + 3] ?? 1;\n poseScratchScale2D[0] = tfScale[localBase] ?? 1;\n poseScratchScale2D[1] = tfScale[localBase + 1] ?? 1;\n poseScratchScale2D[2] = tfScale[localBase + 2] ?? 1;\n }\n const transform: PhysicsTransform2D = {\n position: { x: poseScratchPosition2D[0] ?? 0, y: poseScratchPosition2D[1] ?? 0 },\n rotation: 2 * Math.atan2(poseScratchRotation2D[2] ?? 0, poseScratchRotation2D[3] ?? 1),\n scale: { x: poseScratchScale2D[0] ?? 1, y: poseScratchScale2D[1] ?? 1 },\n };\n\n // Bare-Collider (no RigidBody) → synthesize a STATIC body. The `static`\n // ensureBody arm reads only `type`, so mass/damping/gravity/ccd defaults\n // are inert; this matches Rapier's \"collider without a parent body is\n // fixed\" semantics and the Collider component docstring.\n const rigidBody: {\n type: number;\n mass: number;\n linearDamping: number;\n angularDamping: number;\n gravityScale: number;\n ccdEnabled: number;\n } = rbType\n ? {\n type: rbType[row] as number,\n mass: (rbMass?.[row] ?? 0) as number,\n linearDamping: (rbLinDamp?.[row] ?? 0) as number,\n angularDamping: (rbAngDamp?.[row] ?? 0) as number,\n gravityScale: (rbGravScale?.[row] ?? 1) as number,\n ccdEnabled: (rbCcd?.[row] ?? 0) as number,\n }\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 const collider: {\n shape: number;\n halfExtents: readonly [number, number, number];\n radius: number;\n halfHeight: number;\n friction: number;\n restitution: number;\n density: number;\n isSensor: number;\n collisionGroups: number;\n solverGroups: number;\n } = {\n shape: cShape[row] as number,\n halfExtents: [\n cHalfExtents[row * 3] as number,\n cHalfExtents[row * 3 + 1] as number,\n cHalfExtents[row * 3 + 2] as number,\n ],\n radius: cRadius[row] as number,\n halfHeight: cHalfH[row] as number,\n friction: cFric[row] as number,\n restitution: cRest[row] as number,\n density: cDens[row] as number,\n isSensor: cSensor[row] as number,\n collisionGroups: cCGroups[row] as number,\n solverGroups: cSGroups[row] as number,\n };\n\n pw.ensureBody(entity, transform, rigidBody, collider);\n\n const rbTypeVal = rigidBodyTypeFromF32(rigidBody.type);\n if (rbTypeVal === 'static') {\n pw.syncAuthoredPose(entity, transform, collider, 'static');\n } else if (rbTypeVal === 'kinematic' && !hasCharacterController) {\n pw.syncAuthoredPose(entity, transform, collider, 'kinematic');\n }\n }\n }\n pw.pruneMissingEntities(activeEntities);\n },\n});\n\n/**\n * `physicsStepSimulation2D` system token (M2 — full resource-ification, D-4).\n *\n * After physicsSyncBackend2D — read FixedTime.delta and call pw.step() with dt-gating.\n */\nexport const PhysicsStepSimulation2D: SystemHandle<readonly []> = defineSystem({\n name: PHYSICS_STEP_SIMULATION_2D,\n queries: [],\n after: [PHYSICS_SYNC_BACKEND_2D],\n fn: (world) => {\n let pw: RapierPhysicsWorld2D;\n try {\n pw = world.getResource<RapierPhysicsWorld2D>('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 * `physicsWriteback2D` system token (M2 — full resource-ification, D-4).\n *\n * After physicsStepSimulation2D — call pw.writebackDynamicBodies() and write\n * positions + rotation back to ECS Transform (resolved from the ECS\n * component vocabulary, D-3; 2D scalar angle -> quat via quat.fromAxisAngle z-axis).\n */\nexport const PhysicsWriteback2D: SystemHandle<readonly []> = defineSystem({\n name: PHYSICS_WRITEBACK_2D,\n queries: [],\n after: [PHYSICS_STEP_SIMULATION_2D],\n fn: (world) => {\n const transformComponent = resolveTransform(world);\n if (transformComponent === undefined) return;\n let pw: RapierPhysicsWorld2D;\n try {\n pw = world.getResource<RapierPhysicsWorld2D>('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 // D-5 2D variant: pos from {x,y}, rotation from scalar angle -> quat\n const outQuat = quat.create();\n // biome-ignore lint/suspicious/noExplicitAny: quat accepts Vec3 array\n quat.fromAxisAngle(outQuat, [0, 0, 1] as any as Vec3Like, r.rotation);\n world.set(entity, transformComponent, {\n pos: [r.pos.x, r.pos.y, readTransformPosZ(world, entity, transformComponent)],\n // Component order [x, y, z, w] (E6). `?? 0/1` narrows the\n // noUncheckedIndexedAccess undefined out of the quat elements.\n quat: [outQuat[0] ?? 0, outQuat[1] ?? 0, outQuat[2] ?? 0, outQuat[3] ?? 1],\n });\n }\n },\n});\n\nexport const PhysicsCollisionSync2D: SystemHandle<readonly []> = defineSystem({\n name: PHYSICS_COLLISION_SYNC_2D,\n queries: [],\n after: [PHYSICS_WRITEBACK_2D],\n fn: (world) => {\n let pw: RapierPhysicsWorld2D;\n try {\n pw = world.getResource<RapierPhysicsWorld2D>('PhysicsWorld');\n } catch {\n return;\n }\n pw.writebackCollidingEntities(world);\n },\n});\n\n/**\n * Register three-phase physics tick systems into an ECS World (2D variant).\n *\n * Mirrors registerPhysicsSystems from physics-rapier3d with 2D adaptations\n * (plan-strategy C-3 symmetry). The three systems\n * ({@link PhysicsSyncBackend2D} / {@link PhysicsStepSimulation2D} /\n * {@link PhysicsWriteback2D}) are module-level `defineSystem` tokens; this\n * helper wires the moveAndSlide context + despawn cleanup hook, then adds the\n * three tokens to the schedule.\n *\n * Transform is resolved from the World-local ECS component catalog,\n * D-3) — the previous `transformComponent` second parameter is gone.\n *\n * @param world ECS World instance.\n */\nexport function registerPhysicsSystems2D(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<RapierPhysicsWorld2D>('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 PhysicsSyncBackend2D,\n PhysicsStepSimulation2D,\n PhysicsWriteback2D,\n PhysicsCollisionSync2D,\n ])\n .unwrap();\n return () => {\n world.removeSystem(FixedUpdate, PHYSICS_COLLISION_SYNC_2D);\n world.removeSystem(FixedUpdate, PHYSICS_WRITEBACK_2D);\n world.removeSystem(FixedUpdate, PHYSICS_STEP_SIMULATION_2D);\n world.removeSystem(FixedUpdate, PHYSICS_SYNC_BACKEND_2D);\n releaseComponents();\n };\n}\n","// @forgeax/engine-physics-rapier2d — WASM loader for Rapier 2D compat variant.\n//\n// Dynamic import of @dimforge/rapier2d-compat (plan-strategy D-4: compat variant,\n// zero Vite configuration).\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/rapier2d-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 Rapier2DModule = any;\n\nlet rapierInstance: Rapier2DModule | null = null;\nlet loadingPromise: Promise<Rapier2DModule | PhysicsError> | null = null;\n\nexport async function loadRapier2D(): Promise<Rapier2DModule | 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<Rapier2DModule | PhysicsError> {\n try {\n const RAPIER = await import('@dimforge/rapier2d-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/rapier2d-compat',\n hint: `dynamic import or init() failed: ${reason}. Check network, file path, and that @dimforge/rapier2d-compat is installed.`,\n detail: { code: 'wasm-load-failed', reason },\n });\n }\n}\n"]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"rapier-physics-world-2d.d.ts","sourceRoot":"","sources":["../src/rapier-physics-world-2d.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"rapier-physics-world-2d.d.ts","sourceRoot":"","sources":["../src/rapier-physics-world-2d.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@forgeax/engine-physics-rapier2d",
|
|
3
|
-
"version": "0.1.
|
|
3
|
+
"version": "0.1.23",
|
|
4
4
|
"private": false,
|
|
5
5
|
"type": "module",
|
|
6
6
|
"license": "Apache-2.0",
|
|
@@ -23,14 +23,14 @@
|
|
|
23
23
|
],
|
|
24
24
|
"dependencies": {
|
|
25
25
|
"@dimforge/rapier2d-compat": "0.20.0",
|
|
26
|
-
"@forgeax/engine-ecs": "0.1.
|
|
27
|
-
"@forgeax/engine-math": "0.1.
|
|
28
|
-
"@forgeax/engine-physics": "0.1.
|
|
29
|
-
"@forgeax/engine-types": "0.1.
|
|
26
|
+
"@forgeax/engine-ecs": "0.1.23",
|
|
27
|
+
"@forgeax/engine-math": "0.1.23",
|
|
28
|
+
"@forgeax/engine-physics": "0.1.23",
|
|
29
|
+
"@forgeax/engine-types": "0.1.23"
|
|
30
30
|
},
|
|
31
31
|
"devDependencies": {
|
|
32
32
|
"@dimforge/rapier2d": "0.20.0",
|
|
33
|
-
"@forgeax/engine-runtime": "0.1.
|
|
33
|
+
"@forgeax/engine-runtime": "0.1.23"
|
|
34
34
|
},
|
|
35
35
|
"forgeax": {
|
|
36
36
|
"metrics": {
|
|
@@ -883,7 +883,8 @@ export const PhysicsSyncBackend2D: SystemHandle<readonly []> = defineSystem({
|
|
|
883
883
|
after: ['propagateTransformsFixed'],
|
|
884
884
|
fn: (world) => {
|
|
885
885
|
const transformComponent = resolveTransform(world);
|
|
886
|
-
|
|
886
|
+
const globalTransformComponent = world.components.resolve('GlobalTransform');
|
|
887
|
+
if (transformComponent === undefined || globalTransformComponent === undefined) return;
|
|
887
888
|
let pw: RapierPhysicsWorld2D;
|
|
888
889
|
try {
|
|
889
890
|
pw = world.getResource<RapierPhysicsWorld2D>('PhysicsWorld');
|
|
@@ -894,7 +895,7 @@ export const PhysicsSyncBackend2D: SystemHandle<readonly []> = defineSystem({
|
|
|
894
895
|
pw.applyPendingTeleports();
|
|
895
896
|
|
|
896
897
|
const queryResult = world.query({
|
|
897
|
-
read: [Collider, transformComponent],
|
|
898
|
+
read: [Collider, transformComponent, globalTransformComponent],
|
|
898
899
|
optional: [RigidBody, CharacterController],
|
|
899
900
|
});
|
|
900
901
|
if (!queryResult.ok) return;
|
|
@@ -922,7 +923,9 @@ export const PhysicsSyncBackend2D: SystemHandle<readonly []> = defineSystem({
|
|
|
922
923
|
pos: Float32Array;
|
|
923
924
|
quat: Float32Array;
|
|
924
925
|
scale: Float32Array;
|
|
925
|
-
|
|
926
|
+
};
|
|
927
|
+
const globalTransformData = rowView.get(globalTransformComponent) as unknown as {
|
|
928
|
+
world: Float32Array;
|
|
926
929
|
};
|
|
927
930
|
const rigidBodyData = rowView.has(RigidBody)
|
|
928
931
|
? (rowView.get(RigidBody) as unknown as {
|
|
@@ -960,7 +963,7 @@ export const PhysicsSyncBackend2D: SystemHandle<readonly []> = defineSystem({
|
|
|
960
963
|
const tfPos = transformData.pos;
|
|
961
964
|
const tfQuat = transformData.quat;
|
|
962
965
|
const tfScale = transformData.scale;
|
|
963
|
-
const tfWorld =
|
|
966
|
+
const tfWorld = globalTransformData.world;
|
|
964
967
|
|
|
965
968
|
// rb* views are intentionally NOT guarded here: a bare-Collider archetype
|
|
966
969
|
// has no RigidBody column, so they are legitimately undefined and the
|
package/dist/.tsbuildinfo
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"fileNames":["../../../node_modules/.pnpm/typescript@6.0.3/node_modules/typescript/lib/lib.es5.d.ts","../../../node_modules/.pnpm/typescript@6.0.3/node_modules/typescript/lib/lib.es2015.d.ts","../../../node_modules/.pnpm/typescript@6.0.3/node_modules/typescript/lib/lib.es2016.d.ts","../../../node_modules/.pnpm/typescript@6.0.3/node_modules/typescript/lib/lib.es2017.d.ts","../../../node_modules/.pnpm/typescript@6.0.3/node_modules/typescript/lib/lib.es2018.d.ts","../../../node_modules/.pnpm/typescript@6.0.3/node_modules/typescript/lib/lib.es2019.d.ts","../../../node_modules/.pnpm/typescript@6.0.3/node_modules/typescript/lib/lib.es2020.d.ts","../../../node_modules/.pnpm/typescript@6.0.3/node_modules/typescript/lib/lib.es2021.d.ts","../../../node_modules/.pnpm/typescript@6.0.3/node_modules/typescript/lib/lib.es2022.d.ts","../../../node_modules/.pnpm/typescript@6.0.3/node_modules/typescript/lib/lib.dom.d.ts","../../../node_modules/.pnpm/typescript@6.0.3/node_modules/typescript/lib/lib.dom.iterable.d.ts","../../../node_modules/.pnpm/typescript@6.0.3/node_modules/typescript/lib/lib.es2015.core.d.ts","../../../node_modules/.pnpm/typescript@6.0.3/node_modules/typescript/lib/lib.es2015.collection.d.ts","../../../node_modules/.pnpm/typescript@6.0.3/node_modules/typescript/lib/lib.es2015.generator.d.ts","../../../node_modules/.pnpm/typescript@6.0.3/node_modules/typescript/lib/lib.es2015.iterable.d.ts","../../../node_modules/.pnpm/typescript@6.0.3/node_modules/typescript/lib/lib.es2015.promise.d.ts","../../../node_modules/.pnpm/typescript@6.0.3/node_modules/typescript/lib/lib.es2015.proxy.d.ts","../../../node_modules/.pnpm/typescript@6.0.3/node_modules/typescript/lib/lib.es2015.reflect.d.ts","../../../node_modules/.pnpm/typescript@6.0.3/node_modules/typescript/lib/lib.es2015.symbol.d.ts","../../../node_modules/.pnpm/typescript@6.0.3/node_modules/typescript/lib/lib.es2015.symbol.wellknown.d.ts","../../../node_modules/.pnpm/typescript@6.0.3/node_modules/typescript/lib/lib.es2016.array.include.d.ts","../../../node_modules/.pnpm/typescript@6.0.3/node_modules/typescript/lib/lib.es2016.intl.d.ts","../../../node_modules/.pnpm/typescript@6.0.3/node_modules/typescript/lib/lib.es2017.arraybuffer.d.ts","../../../node_modules/.pnpm/typescript@6.0.3/node_modules/typescript/lib/lib.es2017.date.d.ts","../../../node_modules/.pnpm/typescript@6.0.3/node_modules/typescript/lib/lib.es2017.object.d.ts","../../../node_modules/.pnpm/typescript@6.0.3/node_modules/typescript/lib/lib.es2017.sharedmemory.d.ts","../../../node_modules/.pnpm/typescript@6.0.3/node_modules/typescript/lib/lib.es2017.string.d.ts","../../../node_modules/.pnpm/typescript@6.0.3/node_modules/typescript/lib/lib.es2017.intl.d.ts","../../../node_modules/.pnpm/typescript@6.0.3/node_modules/typescript/lib/lib.es2017.typedarrays.d.ts","../../../node_modules/.pnpm/typescript@6.0.3/node_modules/typescript/lib/lib.es2018.asyncgenerator.d.ts","../../../node_modules/.pnpm/typescript@6.0.3/node_modules/typescript/lib/lib.es2018.asynciterable.d.ts","../../../node_modules/.pnpm/typescript@6.0.3/node_modules/typescript/lib/lib.es2018.intl.d.ts","../../../node_modules/.pnpm/typescript@6.0.3/node_modules/typescript/lib/lib.es2018.promise.d.ts","../../../node_modules/.pnpm/typescript@6.0.3/node_modules/typescript/lib/lib.es2018.regexp.d.ts","../../../node_modules/.pnpm/typescript@6.0.3/node_modules/typescript/lib/lib.es2019.array.d.ts","../../../node_modules/.pnpm/typescript@6.0.3/node_modules/typescript/lib/lib.es2019.object.d.ts","../../../node_modules/.pnpm/typescript@6.0.3/node_modules/typescript/lib/lib.es2019.string.d.ts","../../../node_modules/.pnpm/typescript@6.0.3/node_modules/typescript/lib/lib.es2019.symbol.d.ts","../../../node_modules/.pnpm/typescript@6.0.3/node_modules/typescript/lib/lib.es2019.intl.d.ts","../../../node_modules/.pnpm/typescript@6.0.3/node_modules/typescript/lib/lib.es2020.bigint.d.ts","../../../node_modules/.pnpm/typescript@6.0.3/node_modules/typescript/lib/lib.es2020.date.d.ts","../../../node_modules/.pnpm/typescript@6.0.3/node_modules/typescript/lib/lib.es2020.promise.d.ts","../../../node_modules/.pnpm/typescript@6.0.3/node_modules/typescript/lib/lib.es2020.sharedmemory.d.ts","../../../node_modules/.pnpm/typescript@6.0.3/node_modules/typescript/lib/lib.es2020.string.d.ts","../../../node_modules/.pnpm/typescript@6.0.3/node_modules/typescript/lib/lib.es2020.symbol.wellknown.d.ts","../../../node_modules/.pnpm/typescript@6.0.3/node_modules/typescript/lib/lib.es2020.intl.d.ts","../../../node_modules/.pnpm/typescript@6.0.3/node_modules/typescript/lib/lib.es2020.number.d.ts","../../../node_modules/.pnpm/typescript@6.0.3/node_modules/typescript/lib/lib.es2021.promise.d.ts","../../../node_modules/.pnpm/typescript@6.0.3/node_modules/typescript/lib/lib.es2021.string.d.ts","../../../node_modules/.pnpm/typescript@6.0.3/node_modules/typescript/lib/lib.es2021.weakref.d.ts","../../../node_modules/.pnpm/typescript@6.0.3/node_modules/typescript/lib/lib.es2021.intl.d.ts","../../../node_modules/.pnpm/typescript@6.0.3/node_modules/typescript/lib/lib.es2022.array.d.ts","../../../node_modules/.pnpm/typescript@6.0.3/node_modules/typescript/lib/lib.es2022.error.d.ts","../../../node_modules/.pnpm/typescript@6.0.3/node_modules/typescript/lib/lib.es2022.intl.d.ts","../../../node_modules/.pnpm/typescript@6.0.3/node_modules/typescript/lib/lib.es2022.object.d.ts","../../../node_modules/.pnpm/typescript@6.0.3/node_modules/typescript/lib/lib.es2022.string.d.ts","../../../node_modules/.pnpm/typescript@6.0.3/node_modules/typescript/lib/lib.es2022.regexp.d.ts","../../../node_modules/.pnpm/typescript@6.0.3/node_modules/typescript/lib/lib.decorators.d.ts","../../../node_modules/.pnpm/typescript@6.0.3/node_modules/typescript/lib/lib.decorators.legacy.d.ts","../../types/dist/animation-target.d.ts","../../types/dist/asset-errors.d.ts","../../types/dist/result.d.ts","../../types/dist/asset-evidence.d.ts","../../types/dist/asset.d.ts","../../types/dist/material/color-space.d.ts","../../types/dist/material/asset.d.ts","../../types/dist/vfx.d.ts","../../types/dist/asset-runtime.d.ts","../../types/dist/handle.d.ts","../../types/dist/material/errors.d.ts","../../types/dist/material/resolve.d.ts","../../types/dist/material/index.d.ts","../../types/dist/asset-producer.d.ts","../../types/dist/catalog.d.ts","../../types/dist/runtime-scope.d.ts","../../types/dist/texture/asset.d.ts","../../types/dist/texture/errors.d.ts","../../types/dist/texture/layout.d.ts","../../types/dist/texture/index.d.ts","../../types/dist/derive-paramschema.d.ts","../../types/dist/import.d.ts","../../types/dist/index.d.ts","../../ecs/dist/entity-handle.d.ts","../../ecs/dist/storage/column.d.ts","../../ecs/dist/component-schema.d.ts","../../ecs/dist/component.d.ts","../../ecs/dist/entity.d.ts","../../ecs/dist/errors/query-and-component-errors.d.ts","../../ecs/dist/errors/relationship-errors.d.ts","../../ecs/dist/errors/sprite-and-shared-errors.d.ts","../../ecs/dist/errors/validation-errors.d.ts","../../ecs/dist/world-internal.d.ts","../../ecs/dist/query/query.d.ts","../../ecs/dist/relationship-index.d.ts","../../ecs/dist/shared-ref-store.d.ts","../../ecs/dist/world-change-journal.d.ts","../../ecs/dist/storage/table.d.ts","../../ecs/dist/storage/archetype.d.ts","../../ecs/dist/storage/archetype-graph.d.ts","../../ecs/dist/storage/change-detection.d.ts","../../ecs/dist/time.d.ts","../../ecs/dist/schedule-token.d.ts","../../ecs/dist/world.d.ts","../../ecs/dist/commands.d.ts","../../ecs/dist/schedule.d.ts","../../ecs/dist/execution/shared-kernel.d.ts","../../ecs/dist/errors.d.ts","../../../node_modules/.pnpm/@deepseek-ai+cosmokit@1.8.2/node_modules/@deepseek-ai/cosmokit/lib/types/array.d.ts","../../../node_modules/.pnpm/@deepseek-ai+cosmokit@1.8.2/node_modules/@deepseek-ai/cosmokit/lib/types/types.d.ts","../../../node_modules/.pnpm/@deepseek-ai+cosmokit@1.8.2/node_modules/@deepseek-ai/cosmokit/lib/types/misc.d.ts","../../../node_modules/.pnpm/@deepseek-ai+cosmokit@1.8.2/node_modules/@deepseek-ai/cosmokit/lib/types/string.d.ts","../../../node_modules/.pnpm/@deepseek-ai+cosmokit@1.8.2/node_modules/@deepseek-ai/cosmokit/lib/types/time.d.ts","../../../node_modules/.pnpm/@deepseek-ai+cosmokit@1.8.2/node_modules/@deepseek-ai/cosmokit/lib/types/index.d.ts","../../../node_modules/.pnpm/@standard-schema+spec@1.1.0/node_modules/@standard-schema/spec/dist/index.d.ts","../../../node_modules/.pnpm/@deepseek-ai+cordis@4.0.1_@deepseek-ai+cordis-plugin-loader@1.0.2/node_modules/@deepseek-ai/cordis/lib/types/utils.d.ts","../../../node_modules/.pnpm/@deepseek-ai+cordis@4.0.1_@deepseek-ai+cordis-plugin-loader@1.0.2/node_modules/@deepseek-ai/cordis/lib/types/registry.d.ts","../../../node_modules/.pnpm/@deepseek-ai+cordis@4.0.1_@deepseek-ai+cordis-plugin-loader@1.0.2/node_modules/@deepseek-ai/cordis/lib/types/reflect.d.ts","../../../node_modules/.pnpm/@deepseek-ai+cordis@4.0.1_@deepseek-ai+cordis-plugin-loader@1.0.2/node_modules/@deepseek-ai/cordis/lib/types/fiber.d.ts","../../../node_modules/.pnpm/@deepseek-ai+cordis@4.0.1_@deepseek-ai+cordis-plugin-loader@1.0.2/node_modules/@deepseek-ai/cordis/lib/types/events.d.ts","../../../node_modules/.pnpm/@deepseek-ai+cordis@4.0.1_@deepseek-ai+cordis-plugin-loader@1.0.2/node_modules/@deepseek-ai/cordis/lib/types/logger.d.ts","../../../node_modules/.pnpm/@deepseek-ai+cordis@4.0.1_@deepseek-ai+cordis-plugin-loader@1.0.2/node_modules/@deepseek-ai/cordis/lib/types/context.d.ts","../../../node_modules/.pnpm/@deepseek-ai+cordis@4.0.1_@deepseek-ai+cordis-plugin-loader@1.0.2/node_modules/@deepseek-ai/cordis/lib/types/service.d.ts","../../../node_modules/.pnpm/@deepseek-ai+cordis@4.0.1_@deepseek-ai+cordis-plugin-loader@1.0.2/node_modules/@deepseek-ai/cordis/lib/types/index.d.ts","../../tool-runtime/dist/types.d.ts","../../tool-runtime/dist/errors.d.ts","../../tool-runtime/dist/artifacts.d.ts","../../tool-runtime/dist/capability.d.ts","../../tool-runtime/dist/carrier.d.ts","../../tool-runtime/dist/lease.d.ts","../../tool-runtime/dist/migration.d.ts","../../tool-runtime/dist/runtime.d.ts","../../tool-runtime/dist/snapshot.d.ts","../../tool-runtime/dist/timing.d.ts","../../tool-runtime/dist/transport.d.ts","../../tool-runtime/dist/index.d.ts","../../plugin/dist/capability.d.ts","../../../node_modules/.pnpm/@deepseek-ai+cordis-plugin-loader@1.0.2_patch_hash=6e77a3b82171afbdac249c0e31290cc06386_1a14a168fdebad14b739afc92f305e1c/node_modules/@deepseek-ai/cordis-plugin-loader/lib/types/internal.d.ts","../../../node_modules/.pnpm/@deepseek-ai+cordis-plugin-loader@1.0.2_patch_hash=6e77a3b82171afbdac249c0e31290cc06386_1a14a168fdebad14b739afc92f305e1c/node_modules/@deepseek-ai/cordis-plugin-loader/lib/types/config/tree.d.ts","../../../node_modules/.pnpm/@deepseek-ai+cordis-plugin-loader@1.0.2_patch_hash=6e77a3b82171afbdac249c0e31290cc06386_1a14a168fdebad14b739afc92f305e1c/node_modules/@deepseek-ai/cordis-plugin-loader/lib/types/config/group.d.ts","../../../node_modules/.pnpm/@deepseek-ai+cordis-plugin-loader@1.0.2_patch_hash=6e77a3b82171afbdac249c0e31290cc06386_1a14a168fdebad14b739afc92f305e1c/node_modules/@deepseek-ai/cordis-plugin-loader/lib/types/config/entry.d.ts","../../../node_modules/.pnpm/@deepseek-ai+cordis-plugin-loader@1.0.2_patch_hash=6e77a3b82171afbdac249c0e31290cc06386_1a14a168fdebad14b739afc92f305e1c/node_modules/@deepseek-ai/cordis-plugin-loader/lib/types/config/isolate.d.ts","../../../node_modules/.pnpm/@deepseek-ai+cordis-plugin-loader@1.0.2_patch_hash=6e77a3b82171afbdac249c0e31290cc06386_1a14a168fdebad14b739afc92f305e1c/node_modules/@deepseek-ai/cordis-plugin-loader/lib/types/config/utils.d.ts","../../../node_modules/.pnpm/@deepseek-ai+cordis-plugin-loader@1.0.2_patch_hash=6e77a3b82171afbdac249c0e31290cc06386_1a14a168fdebad14b739afc92f305e1c/node_modules/@deepseek-ai/cordis-plugin-loader/lib/types/index.d.ts","../../plugin/dist/tool-plugin.d.ts","../../plugin/dist/loader.d.ts","../../plugin/dist/index.d.ts","../../ecs/dist/plugin-service.d.ts","../../ecs/dist/index.d.ts","../../math/dist/types.d.ts","../../math/dist/circle2.d.ts","../../math/dist/box2.d.ts","../../math/dist/box3.d.ts","../../math/dist/color.d.ts","../../math/dist/easing.d.ts","../../math/dist/euler.d.ts","../../math/dist/f32-to-f16-bytes.d.ts","../../math/dist/frustum.d.ts","../../math/dist/mat3.d.ts","../../math/dist/mat4.d.ts","../../math/dist/noise.d.ts","../../math/dist/quat.d.ts","../../math/dist/ray.d.ts","../../math/dist/ray2.d.ts","../../math/dist/sphere.d.ts","../../math/dist/vec2.d.ts","../../math/dist/vec3.d.ts","../../math/dist/vec4.d.ts","../../math/dist/index.d.ts","../../physics/dist/collision-event.d.ts","../../physics/dist/components.d.ts","../../physics/dist/errors.d.ts","../../physics/dist/physics-world.d.ts","../../physics/dist/plugin-factory.d.ts","../../physics/dist/system-set.d.ts","../../physics/dist/index.d.ts","../../../node_modules/.pnpm/@dimforge+rapier2d-compat@0.20.0/node_modules/@dimforge/rapier2d-compat/dist/rapier_wasm2d.d.ts","../../../node_modules/.pnpm/@dimforge+rapier2d-compat@0.20.0/node_modules/@dimforge/rapier2d-compat/dist/raw.d.ts","../../../node_modules/.pnpm/@dimforge+rapier2d-compat@0.20.0/node_modules/@dimforge/rapier2d-compat/dist/math.d.ts","../../../node_modules/.pnpm/@dimforge+rapier2d-compat@0.20.0/node_modules/@dimforge/rapier2d-compat/dist/pipeline/event_queue.d.ts","../../../node_modules/.pnpm/@dimforge+rapier2d-compat@0.20.0/node_modules/@dimforge/rapier2d-compat/dist/pipeline/physics_hooks.d.ts","../../../node_modules/.pnpm/@dimforge+rapier2d-compat@0.20.0/node_modules/@dimforge/rapier2d-compat/dist/pipeline/physics_pipeline.d.ts","../../../node_modules/.pnpm/@dimforge+rapier2d-compat@0.20.0/node_modules/@dimforge/rapier2d-compat/dist/pipeline/query_pipeline.d.ts","../../../node_modules/.pnpm/@dimforge+rapier2d-compat@0.20.0/node_modules/@dimforge/rapier2d-compat/dist/pipeline/serialization_pipeline.d.ts","../../../node_modules/.pnpm/@dimforge+rapier2d-compat@0.20.0/node_modules/@dimforge/rapier2d-compat/dist/pipeline/debug_render_pipeline.d.ts","../../../node_modules/.pnpm/@dimforge+rapier2d-compat@0.20.0/node_modules/@dimforge/rapier2d-compat/dist/control/character_controller.d.ts","../../../node_modules/.pnpm/@dimforge+rapier2d-compat@0.20.0/node_modules/@dimforge/rapier2d-compat/dist/control/pid_controller.d.ts","../../../node_modules/.pnpm/@dimforge+rapier2d-compat@0.20.0/node_modules/@dimforge/rapier2d-compat/dist/control/index.d.ts","../../../node_modules/.pnpm/@dimforge+rapier2d-compat@0.20.0/node_modules/@dimforge/rapier2d-compat/dist/pipeline/world.d.ts","../../../node_modules/.pnpm/@dimforge+rapier2d-compat@0.20.0/node_modules/@dimforge/rapier2d-compat/dist/pipeline/index.d.ts","../../../node_modules/.pnpm/@dimforge+rapier2d-compat@0.20.0/node_modules/@dimforge/rapier2d-compat/dist/geometry/interaction_groups.d.ts","../../../node_modules/.pnpm/@dimforge+rapier2d-compat@0.20.0/node_modules/@dimforge/rapier2d-compat/dist/geometry/contact.d.ts","../../../node_modules/.pnpm/@dimforge+rapier2d-compat@0.20.0/node_modules/@dimforge/rapier2d-compat/dist/geometry/feature.d.ts","../../../node_modules/.pnpm/@dimforge+rapier2d-compat@0.20.0/node_modules/@dimforge/rapier2d-compat/dist/geometry/point.d.ts","../../../node_modules/.pnpm/@dimforge+rapier2d-compat@0.20.0/node_modules/@dimforge/rapier2d-compat/dist/geometry/ray.d.ts","../../../node_modules/.pnpm/@dimforge+rapier2d-compat@0.20.0/node_modules/@dimforge/rapier2d-compat/dist/geometry/toi.d.ts","../../../node_modules/.pnpm/@dimforge+rapier2d-compat@0.20.0/node_modules/@dimforge/rapier2d-compat/dist/geometry/shape.d.ts","../../../node_modules/.pnpm/@dimforge+rapier2d-compat@0.20.0/node_modules/@dimforge/rapier2d-compat/dist/geometry/collider.d.ts","../../../node_modules/.pnpm/@dimforge+rapier2d-compat@0.20.0/node_modules/@dimforge/rapier2d-compat/dist/geometry/collider_set.d.ts","../../../node_modules/.pnpm/@dimforge+rapier2d-compat@0.20.0/node_modules/@dimforge/rapier2d-compat/dist/geometry/narrow_phase.d.ts","../../../node_modules/.pnpm/@dimforge+rapier2d-compat@0.20.0/node_modules/@dimforge/rapier2d-compat/dist/geometry/broad_phase.d.ts","../../../node_modules/.pnpm/@dimforge+rapier2d-compat@0.20.0/node_modules/@dimforge/rapier2d-compat/dist/geometry/index.d.ts","../../../node_modules/.pnpm/@dimforge+rapier2d-compat@0.20.0/node_modules/@dimforge/rapier2d-compat/dist/dynamics/rigid_body.d.ts","../../../node_modules/.pnpm/@dimforge+rapier2d-compat@0.20.0/node_modules/@dimforge/rapier2d-compat/dist/dynamics/impulse_joint.d.ts","../../../node_modules/.pnpm/@dimforge+rapier2d-compat@0.20.0/node_modules/@dimforge/rapier2d-compat/dist/dynamics/impulse_joint_set.d.ts","../../../node_modules/.pnpm/@dimforge+rapier2d-compat@0.20.0/node_modules/@dimforge/rapier2d-compat/dist/dynamics/multibody_joint.d.ts","../../../node_modules/.pnpm/@dimforge+rapier2d-compat@0.20.0/node_modules/@dimforge/rapier2d-compat/dist/dynamics/multibody_joint_set.d.ts","../../../node_modules/.pnpm/@dimforge+rapier2d-compat@0.20.0/node_modules/@dimforge/rapier2d-compat/dist/dynamics/island_manager.d.ts","../../../node_modules/.pnpm/@dimforge+rapier2d-compat@0.20.0/node_modules/@dimforge/rapier2d-compat/dist/dynamics/rigid_body_set.d.ts","../../../node_modules/.pnpm/@dimforge+rapier2d-compat@0.20.0/node_modules/@dimforge/rapier2d-compat/dist/dynamics/integration_parameters.d.ts","../../../node_modules/.pnpm/@dimforge+rapier2d-compat@0.20.0/node_modules/@dimforge/rapier2d-compat/dist/dynamics/coefficient_combine_rule.d.ts","../../../node_modules/.pnpm/@dimforge+rapier2d-compat@0.20.0/node_modules/@dimforge/rapier2d-compat/dist/dynamics/ccd_solver.d.ts","../../../node_modules/.pnpm/@dimforge+rapier2d-compat@0.20.0/node_modules/@dimforge/rapier2d-compat/dist/dynamics/index.d.ts","../../../node_modules/.pnpm/@dimforge+rapier2d-compat@0.20.0/node_modules/@dimforge/rapier2d-compat/dist/init.d.ts","../../../node_modules/.pnpm/@dimforge+rapier2d-compat@0.20.0/node_modules/@dimforge/rapier2d-compat/dist/exports.d.ts","../../../node_modules/.pnpm/@dimforge+rapier2d-compat@0.20.0/node_modules/@dimforge/rapier2d-compat/dist/rapier.d.ts","../src/wasm-loader.ts","../src/rapier-physics-world-2d.ts","../src/index.ts"],"fileIdsList":[[123,138,139,143,146],[123,138,140,141,143,146],[113,123,140,141,143,146],[113,123,139,140,141,143,146],[113,123,137,138,139,140,141,142,143,146],[113],[113,115,116,117,118,119,120],[113,116,117,118,119,120,121],[113,114,115,116,117,118,119,120,121],[115,116,117,118,119,120,121,122],[115,116,117,118,119,120,121],[123,143,146],[108,109,110,111,112],[178,189,201,212],[185,186],[178,212],[177],[177,178,202,208],[177,202,203,208],[202,203,204,205,206,207,208,209,210,211],[177,202],[177,202,203,205],[177,178,201],[177,201,202,204,206,207],[178,187,189,201,212,213],[177,178,189,190,193,194,195,196,197,198,199,212],[178,189,190,191,193,194,195,196,198,212],[177,197,212],[177,178],[190,191,192,193,194,195,196,197,198,199,200],[177,178,197,212],[177,178,192,197,198],[177,178,191,193,194,195,197],[178,197],[177,182,201,212],[179,180,181,182,183,184,188],[201,212],[177,178,179,180,201,212],[177,178,188,201,212],[177,178,179,180,181,182,183,184,187,201,212],[214],[176],[82,83,86,92,103,107],[86],[82,83,84,85],[88,89,90,91,106],[93,102,105],[83,85,86,87,93,94,95,101,102,103,104,105,107,147],[103,146,147,173],[82,83,86,92,107],[83,86],[82,86,93,102,103,104,107],[82,107],[86,97,98,100],[86,97],[83,86,96,97,99],[83,84,86,100],[83],[82,83,86,92,93,94,95,100,101,102,105,106,107],[149,150],[149],[149,151],[149,152],[149,150,151,152,153,154,155,156,157,158,159,160,161,162,163,164,165,166,167],[149,150,151],[216,217],[148,168,175,216],[82,215],[168],[148],[82],[169,170,171,172,173,174],[146,147,172,173],[123,135,143,146],[123,136,143,144,145,146],[123,135,136,143,144,146],[124,125],[124],[124,125,126,127,128,129,130,131,132,133,134],[124,128],[61,62,64],[61,62,64,82],[63],[62,64,73],[61,73,74,75,82],[60,61,62,64,66,67,68,69,72,73,74,75,76,79,80,81],[65,82],[66],[65,66,70,71],[62,66,70],[73,74],[62,76],[76,77,78],[62,76,77]],"fileInfos":[{"version":"bcd24271a113971ba9eb71ff8cb01bc6b0f872a85c23fdbe5d93065b375933cd","affectsGlobalScope":true,"impliedFormat":1},{"version":"3f88bedbeb09c6f5a6645cb24c7c55f1aa22d19ae96c8e6959cbd8b85a707bc6","impliedFormat":1},{"version":"7fe93b39b810eadd916be8db880dd7f0f7012a5cc6ffb62de8f62a2117fa6f1f","impliedFormat":1},{"version":"bb0074cc08b84a2374af33d8bf044b80851ccc9e719a5e202eacf40db2c31600","impliedFormat":1},{"version":"1a7daebe4f45fb03d9ec53d60008fbf9ac45a697fdc89e4ce218bc94b94f94d6","impliedFormat":1},{"version":"f94b133a3cb14a288803be545ac2683e0d0ff6661bcd37e31aaaec54fc382aed","impliedFormat":1},{"version":"f59d0650799f8782fd74cf73c19223730c6d1b9198671b1c5b3a38e1188b5953","impliedFormat":1},{"version":"8a15b4607d9a499e2dbeed9ec0d3c0d7372c850b2d5f1fb259e8f6d41d468a84","impliedFormat":1},{"version":"26e0fe14baee4e127f4365d1ae0b276f400562e45e19e35fd2d4c296684715e6","impliedFormat":1},{"version":"d6b1eba8496bdd0eed6fc8a685768fe01b2da4a0388b5fe7df558290bffcf32f","affectsGlobalScope":true,"impliedFormat":1},{"version":"7f57fc4404ff020bc45b9c620aff2b40f700b95fe31164024c453a5e3c163c54","impliedFormat":1},{"version":"eadcffda2aa84802c73938e589b9e58248d74c59cb7fcbca6474e3435ac15504","affectsGlobalScope":true,"impliedFormat":1},{"version":"105ba8ff7ba746404fe1a2e189d1d3d2e0eb29a08c18dded791af02f29fb4711","affectsGlobalScope":true,"impliedFormat":1},{"version":"00343ca5b2e3d48fa5df1db6e32ea2a59afab09590274a6cccb1dbae82e60c7c","affectsGlobalScope":true,"impliedFormat":1},{"version":"ebd9f816d4002697cb2864bea1f0b70a103124e18a8cd9645eeccc09bdf80ab4","affectsGlobalScope":true,"impliedFormat":1},{"version":"2c1afac30a01772cd2a9a298a7ce7706b5892e447bb46bdbeef720f7b5da77ad","affectsGlobalScope":true,"impliedFormat":1},{"version":"7b0225f483e4fa685625ebe43dd584bb7973bbd84e66a6ba7bbe175ee1048b4f","affectsGlobalScope":true,"impliedFormat":1},{"version":"c0a4b8ac6ce74679c1da2b3795296f5896e31c38e888469a8e0f99dc3305de60","affectsGlobalScope":true,"impliedFormat":1},{"version":"3084a7b5f569088e0146533a00830e206565de65cae2239509168b11434cd84f","affectsGlobalScope":true,"impliedFormat":1},{"version":"c5079c53f0f141a0698faa903e76cb41cd664e3efb01cc17a5c46ec2eb0bef42","affectsGlobalScope":true,"impliedFormat":1},{"version":"32cafbc484dea6b0ab62cf8473182bbcb23020d70845b406f80b7526f38ae862","affectsGlobalScope":true,"impliedFormat":1},{"version":"fca4cdcb6d6c5ef18a869003d02c9f0fd95df8cfaf6eb431cd3376bc034cad36","affectsGlobalScope":true,"impliedFormat":1},{"version":"b93ec88115de9a9dc1b602291b85baf825c85666bf25985cc5f698073892b467","affectsGlobalScope":true,"impliedFormat":1},{"version":"f5c06dcc3fe849fcb297c247865a161f995cc29de7aa823afdd75aaaddc1419b","affectsGlobalScope":true,"impliedFormat":1},{"version":"b77e16112127a4b169ef0b8c3a4d730edf459c5f25fe52d5e436a6919206c4d7","affectsGlobalScope":true,"impliedFormat":1},{"version":"fbffd9337146eff822c7c00acbb78b01ea7ea23987f6c961eba689349e744f8c","affectsGlobalScope":true,"impliedFormat":1},{"version":"a995c0e49b721312f74fdfb89e4ba29bd9824c770bbb4021d74d2bf560e4c6bd","affectsGlobalScope":true,"impliedFormat":1},{"version":"c7b3542146734342e440a84b213384bfa188835537ddbda50d30766f0593aff9","affectsGlobalScope":true,"impliedFormat":1},{"version":"ce6180fa19b1cccd07ee7f7dbb9a367ac19c0ed160573e4686425060b6df7f57","affectsGlobalScope":true,"impliedFormat":1},{"version":"3f02e2476bccb9dbe21280d6090f0df17d2f66b74711489415a8aa4df73c9675","affectsGlobalScope":true,"impliedFormat":1},{"version":"45e3ab34c1c013c8ab2dc1ba4c80c780744b13b5676800ae2e3be27ae862c40c","affectsGlobalScope":true,"impliedFormat":1},{"version":"805c86f6cca8d7702a62a844856dbaa2a3fd2abef0536e65d48732441dde5b5b","affectsGlobalScope":true,"impliedFormat":1},{"version":"e42e397f1a5a77994f0185fd1466520691456c772d06bf843e5084ceb879a0ad","affectsGlobalScope":true,"impliedFormat":1},{"version":"f4c2b41f90c95b1c532ecc874bd3c111865793b23aebcc1c3cbbabcd5d76ffb0","affectsGlobalScope":true,"impliedFormat":1},{"version":"ab26191cfad5b66afa11b8bf935ef1cd88fabfcb28d30b2dfa6fad877d050332","affectsGlobalScope":true,"impliedFormat":1},{"version":"2088bc26531e38fb05eedac2951480db5309f6be3fa4a08d2221abb0f5b4200d","affectsGlobalScope":true,"impliedFormat":1},{"version":"cb9d366c425fea79716a8fb3af0d78e6b22ebbab3bd64d25063b42dc9f531c1e","affectsGlobalScope":true,"impliedFormat":1},{"version":"500934a8089c26d57ebdb688fc9757389bb6207a3c8f0674d68efa900d2abb34","affectsGlobalScope":true,"impliedFormat":1},{"version":"689da16f46e647cef0d64b0def88910e818a5877ca5379ede156ca3afb780ac3","affectsGlobalScope":true,"impliedFormat":1},{"version":"bc21cc8b6fee4f4c2440d08035b7ea3c06b3511314c8bab6bef7a92de58a2593","affectsGlobalScope":true,"impliedFormat":1},{"version":"7ca53d13d2957003abb47922a71866ba7cb2068f8d154877c596d63c359fed25","affectsGlobalScope":true,"impliedFormat":1},{"version":"54725f8c4df3d900cb4dac84b64689ce29548da0b4e9b7c2de61d41c79293611","affectsGlobalScope":true,"impliedFormat":1},{"version":"e5594bc3076ac29e6c1ebda77939bc4c8833de72f654b6e376862c0473199323","affectsGlobalScope":true,"impliedFormat":1},{"version":"2f3eb332c2d73e729f3364fcc0c2b375e72a121e8157d25a82d67a138c83a95c","affectsGlobalScope":true,"impliedFormat":1},{"version":"6f4427f9642ce8d500970e4e69d1397f64072ab73b97e476b4002a646ac743b1","affectsGlobalScope":true,"impliedFormat":1},{"version":"48915f327cd1dea4d7bd358d9dc7732f58f9e1626a29cc0c05c8c692419d9bb7","affectsGlobalScope":true,"impliedFormat":1},{"version":"b7bf9377723203b5a6a4b920164df22d56a43f593269ba6ae1fdc97774b68855","affectsGlobalScope":true,"impliedFormat":1},{"version":"db9709688f82c9e5f65a119c64d835f906efe5f559d08b11642d56eb85b79357","affectsGlobalScope":true,"impliedFormat":1},{"version":"4b25b8c874acd1a4cf8444c3617e037d444d19080ac9f634b405583fd10ce1f7","affectsGlobalScope":true,"impliedFormat":1},{"version":"37be57d7c90cf1f8112ee2636a068d8fd181289f82b744160ec56a7dc158a9f5","affectsGlobalScope":true,"impliedFormat":1},{"version":"a917a49ac94cd26b754ab84e113369a75d1a47a710661d7cd25e961cc797065f","affectsGlobalScope":true,"impliedFormat":1},{"version":"6d3261badeb7843d157ef3e6f5d1427d0eeb0af0cf9df84a62cfd29fd47ac86e","affectsGlobalScope":true,"impliedFormat":1},{"version":"195daca651dde22f2167ac0d0a05e215308119a3100f5e6268e8317d05a92526","affectsGlobalScope":true,"impliedFormat":1},{"version":"8b11e4285cd2bb164a4dc09248bdec69e9842517db4ca47c1ba913011e44ff2f","affectsGlobalScope":true,"impliedFormat":1},{"version":"0508571a52475e245b02bc50fa1394065a0a3d05277fbf5120c3784b85651799","affectsGlobalScope":true,"impliedFormat":1},{"version":"8f9af488f510c3015af3cc8c267a9e9d96c4dd38a1fdff0e11dc5a544711415b","affectsGlobalScope":true,"impliedFormat":1},{"version":"fc611fea8d30ea72c6bbfb599c9b4d393ce22e2f5bfef2172534781e7d138104","affectsGlobalScope":true,"impliedFormat":1},{"version":"1ce14b81c5cc821994aa8ec1d42b220dd41b27fcc06373bce3958af7421b77d4","affectsGlobalScope":true,"impliedFormat":1},{"version":"b3a048b3e9302ef9a34ef4ebb9aecfb28b66abb3bce577206a79fee559c230da","affectsGlobalScope":true,"impliedFormat":1},"89fe170d9a59f81cd9a9d95de3278f108ff91491810b2529cc0ffb502a57b6c0","0b4928041c807c01b33b1fa028236df635c52f7acff5a40f2c2d0d677b53428b","5ad2e5b8b17893d0eb1f11a1b6e8c03b17344be03a6a72a624cd38ab05fe4d5c","6a1e553079e654a1771463e9eeb98ea4f7bb4b6417a5237d4fdf9b546d49647f","7f11be86b9ac5c2cd5127cd9d40ccc7694c58868a3157692a153d452fc171525","6e3488ee1183ea915eb43f08aebc5f75e30be25aef1f678d1965324bdd7506e1","08b2edc86cfd71fe5a832912df79e79040c90c9df60ed2af1dc50f7baef36aeb","a318d8734523d9e750681e7b8e685ef817d4049c5612451f4e849da8b2b572a9","8b52dd8be86f44f871db89a6c1f77f7585688d53141ff55b6c5fac3eb67b1241","beae2d03867dde9fdf8da461c7e7e84da71612842422d4b482ab1c2a15fe6b12","2aa457dd6699d3015c3c98457ac72a2dd47349f75a1edddbace0ee86dd7177c9","51342c51a9090c0bc8bae60c5ec1a0f46d6d44db84392f12a8cd46e6d8a9f617","ae777307a0baeb9b5d7ba18e6a029a54eb0b612b1491591dcedb020cc8d36f97","d7ba738e316b7baed10ca49cc156b57b8c973b747bec6612e62a925e9f7f33a4","1d5292578fcf0329a43ef19fe2481d7d1cde75e75610019a7897c70dcfff0b31","459b3765e622008ed590474ae6b61ab55107a7b9529a28d05087a6fef51d7248","d4acac107ca8b949e32947d9b5afa27721584f4ffd7ad7a4008fae892a4ec913","b52569fa5c5793a182d033b2fc7443e27205625dc67782a03d2e2e972a2918f3","097ebdc98e0de1205b1104df5038026ca5830b80faee3707b78e7c28ce6dde55","1ae177260d032e05e62f0432227af19a857b327fa604a9b34baa535f44db130e","e1f11ad703121f97a74001059d054aba25c9c4662af44da05ead0a247fe18742","d9c64d02dfe3a9c74da35fdbcc645cf4e8d4ca0f4162ec312de51474103ac3a7","ef30959e03d8e4ede695c8b400a9b9004a49ed6448214f087271d4f1e56352ba","b866405af1564f0690ea323f070c87509bfeb2ba8afa7c49c255dbe13c176bf8","ce648e4449eb59292b997226148647ce9ca22bc9ff9062959f5f1fe6bfe06cd8","ce3d7045ddbf0f8c968829a4e32d5064af66cba795f8c8490afec9eb677a4f45","6192bdb56ca09fde8176590331c36f3eec2fd5fb3ad7dd7401727efb2398d7fb","0810b73622b33b91f89f5d0f8b1fc0b92841e6b751a84d2c005508c563748d16","9a1b69540b9533e337c81d470724ebb054a15b994a11b759a969367b28e81368","854cbb22c44beb0fe44a46f5428521a27e8b9fb645e6ce803a5622ff44ec74ce","dd6776bc5480997847e4d3c495951de5f0401667e1880b6176f57584c49aa401","21f4110077118497558bb4ca8462c9cd1dfd391e6c1608bcac4b437a4ed77d7d","2278fcff8ca72dc791b3907ac363bd7370ec04e38653827c14c5dbd3fc99e335","ee7cd212dd2cfef9efd135a36a577fa35cb4af99f7e6fd3023cc9d2f7c6f438b","0bc016e4da8853d924fbfde9820db77121de75539641d02012232396b09e7dd6","6647e4b21b341f971ef92cbdbeaee6a42d77b291a43cdc73b970b2ad505bb912","2f9485d1b731e3d1d373c2a2a20e3ad41b55616b9fa13bf261d2a058cd23149b","d9df407e562a322f63c0cc3f1bcea9c1cbec38d0c92b3f49169291f22374cb6c","ba9d80c5b60b7708524491768da7d44a796042529ed945678f45356beb2504f9","7689fbecdcdb8f32296c94fe5cf5edef16a9db673d696a2aaa40ad54470e5965","2c2b0520a51bf2f420ec605fa5e327ea7d96732cc97a373c167e12ad71dda21f","5f15c8ce469d7e9da71f9ca502370c454eb29629d6c2e548fa722d00700dfb46","ce5251c882968a3ce8fc6c2e3b2c3b739a740f614eebf066b73e8ee7c5dc4f63","33652e868da0fef68b0f8622283a014fe66a21e409f4000e77778d9dc3edc8af","8f373e06438a141f82616c5e0b171e0bf613cc95aa1e6b8b41a8ae520dd2948e","5c9cf44d7fea3b0c9876102abc143967f2e7015dd0a89edcbe28a49906621206","6db8a395b3c5f988123adb6cc84b6410a82a060c4acde2491012b9b44b32b300","28d3e288a396ce5654f673fc8bc2330edb14e52dd33d75a3e999ecf68197de1a",{"version":"fb6f2007d60e8b519a2ef0c5a27026ddfe06418ae6261c4eb0cb670cca5e1bc2","impliedFormat":99},{"version":"a48f1b69ec0b94b16c7ece2cf6d6003cc8d0c329538117c1c364d8525a100850","impliedFormat":99},{"version":"cd5713ac354e4869fdf837e12d24d3ae14fd9d94a5bb2d340df63b899b74e6ca","impliedFormat":99},{"version":"56210599298d6eca6285eab99c7e9333d7e275c3a73a7f401b3055e8d55c67e8","impliedFormat":99},{"version":"2845576622e416da9871e1f3c788ba41dc4f24eb764362b10eceeb0dbaa67208","impliedFormat":99},{"version":"f0421e04e2a5238754cf444bf2a56fe7e7a94a08c14c1f9d063ff51c85825823","impliedFormat":99},{"version":"bdd14f07b4eca0b4b5203b85b8dbc4d084c749fa590bee5ea613e1641dcd3b29","impliedFormat":99},{"version":"967b227fad024ba8a7c32127534089bce5adc800840b0288f44d41c4c849278e","impliedFormat":99},{"version":"ffd229492af3cb444c01e8e51a78dfdbed670940bac40dde083675d57d6984fc","impliedFormat":99},{"version":"57cdef8252cb041b4b646cc9e80dcb27d2180bb78fcf95761136d99be4079cb3","impliedFormat":99},{"version":"eb5fd8d19b0330da4dccb6cab3eae0304f056ac8fbd5bd9589ce48f0920bff78","impliedFormat":99},{"version":"db565a086622cbe616a950186dc90e82a74060864b9cd1d0f25285860daea9b4","impliedFormat":99},{"version":"71087395cc862f52662ab2629a0f3838f8f2aaf84eb40c97f4f4004f2fcbbed6","impliedFormat":99},{"version":"1e2e6cfcab26ae01d7f2dd1f78a1d25ddb7f3b2e27f50c9eb3b54ee206a87884","impliedFormat":99},{"version":"489ec23ef8dc0e869cf3d8d77a39ba83ab24e5e71362320f5662491b3dc5bd04","impliedFormat":99},{"version":"c93dd79fae382105510c69cc8eef95a96c8c43e50b47e16efa98a3f9e76f304b","impliedFormat":99},"4a5b020726455dd70acdf34ccc435273e6333cbb1a3ff08b6c451148c61b21fd","eb4d76417ff2ac49726b2efaf83e5b9924f7040151293d092e1ba38905479a02","3bae912eb95706a507e668cdfe378bb612c81b46323aae337689fabc00c3ae29","129aaa58f8b8ed74d8ef3ab03d3219f1b5a7b2902c4e111e080abdaf043686ef","c0a9cb9a3fe662b66cf598c1e2e6bc799b423699b81249bb62586acbc817b1e7","7d3bbcb2ef65e80202188d77d2e06f30c5d5d2603ca49cde35a6b298565247e9","f90ae41777b29281dcd4aa3fafb9d84c6b328860d639114a8c3fcf36beb23817","eadfe727983087acea4f17095671faba65ba5233acaed7213f140269d4528c9a","6bbe3b367d76debfa83ec26a13d0013f8dad891cddd8909a1fbdcdb719b064d9","9fec96292881b3ee00f9b34d757887223221db25d0fb534b521743e9be298d9f","fbd59a37ab9b1a3a21f2e968b539f91453e560507d9e92748f0623f7118306be","92523b7353d096bd2464e1611035b284803894aa952541021922567dfe9f15aa","49ca23a8e2de57d49da1b5b5aa2f0e0d341b4230a899efe1a6078d3779e2ea53",{"version":"be53d0833468d1d4de05770f4af2d3ec465b7ef5d5181b748997a02bf362ebd0","impliedFormat":99},{"version":"4920f950330f6a8a00a084beb7998de838a15cd54f5c774962b75614c15f8bed","impliedFormat":99},{"version":"e892ea4cf5fc5e5ab078f265c617efa3ab44a1cbd477f91fd29a27698c45eb77","impliedFormat":99},{"version":"6a33bd0416049803becacbdccd852c02f342eedce7dea12956d1176966269eeb","impliedFormat":99},{"version":"f74c6749e3944913d8002c1dd30523c520de426e9113d47b6730565318349154","impliedFormat":99},{"version":"ac5d5fd3358d3f7491400869278ea288df297b4fbc1ba035c7fd09c8df822358","impliedFormat":99},{"version":"0ce13f49afeb385ad05698a5420580c7381d758779b730c1992be7386578e1e7","impliedFormat":99},"8fa74a106f75c2eed4b65fa571e4e9b78e9a3a68f65b6c70261e87f7f47b931d","d82719b8e8a552f66dea370df85e00f9473537bb9c35dcb711d7f48cb5e707cd","a3c435d1e1eb110bb7382103c522bf44e9abb8b6883a493360fc5859db0aee10","1487f3b04d5e9ed9c5d823ff91bedbd7a8ce7a4c44b7ef16fa64a2d930a731e9","18dfdac2f4092e68e453e7a9da3d0e800e597e82fa567c49c2c7bb4c4dfb26ff","728cc7c21f319d38b1dafdbdf1258350b675055a3fb61ae1a7c34562c58b8557","d474818de812636654d86a3f0f6f3b8f6ae725b5487f344a5d3a32decd68311f","87cb945db71dbb2cceac65375b84cc0c55bfe70a749b11e55b59a40df53503f6","dcadfb7e3411bb19e717855d891658f3d71c065248d25f09e027e4a6cdfa0e9f","1c3f1fae8db7ce0bb537e509ceb0243892e68a3b6e66ab1245c15932be41d037","b3b63929f7475d02520bde84913450bf633e86f6a5d51fcc13e95376ec3483a6","11fbb66f203aa1855d34dbb3d835879a75924cae9f08eb16997318fed41f9078","56d65795b8f53c0f68d66369fc42fb8f79f669f868fc8eda2f634297c47b156f","a35dc82e5a7955568d2883e308e7a3e138961dd3b40956b22fccd415dd307e4a","a10051e664b2713d31f07db5fdd71d0854732e57429cbfa00ebb329e89a27981","3cb9e3f85ef9f989394133fe2e4ef4f39da5578fe583124fc0cbb00474b471e8","8bbc25b37d24570dffba7209cb9e427a63c7eeed18412af5e57c450a37d6c059","27d3d1f171d4b7b86bdf1c352f22319c0915b17cfd919deb070bef13510a33a2","40a12a4c54a6564f2c1547a10bcafc9210fce809dc57d2a7815c918972f48895","a8f81f646b1bd12b6b0758d1f97cc6d26646d5ac72d92362cb3b340271589e8f","05d6d9fbf9c8fbb9fa36b4e0ad91292e57f6a9233dc407875d0fb06cdfd59bda","d08b909fffadfa1dece31aa587aca1c34782cafd9294c5c8b66cbab2aa897719","a49e93ed1861aa2493d363f26ee826ab71c7105b20c85cf8bd26bbb4e0b32cd6","9aca2738b7400d1d8c2d009ec6cbbaf3204e6413219edc962cea5bb6ef50db10","f23fc64dfc9c3e5b718eca7f1fdb0640d5c1f5c8993a599e66ce73ab33502036","7fd928b5878afe8cf4e2c90831c6b7a4157eb3883e904388e9ed6f8a95b689e5","a77a134c519e0c6f5ea4084ae80bd3a1e1251d3775418df3dcc999b08e27ae42","9555eb0e3961f4e1abbacaa2a15e5b1e89baa3760c5626846c1fab19c2d298b9","a4d9d3731891fb36913e88d9e963556f12a086dd32c112eb48fa50a776defdd1","c29024374b3a2b48cc77ee85a14061acca63c3e50a99cf826fc69da490f6c7aa","5c3d21d702aae26a76c0c00f31b2dea5a6b1847fc0a708b8605f6d1666b61cf7","4017633067696d68534e840bf946ec91c3243b8c49b6fe4979eecec59daedc60",{"version":"27a70e928d446090eee67a6b4b1fe8598846e732b70aab4e4bad2e3a9a84fdb3","impliedFormat":1},{"version":"f424a119b7f2e794c1375cc5e5072db3e105fd7867a24b9ee64b83663b44408f","impliedFormat":1},{"version":"227fb6084c2f0f5b2f1e8bb387f335ef84b7af007317c49da02f586041040a1e","impliedFormat":1},{"version":"acce6a44175a9982aed5c24619a30c415befafb9c856e3a6eb798a9f8919642a","impliedFormat":1},{"version":"b540920dc7cb3fcd9f337cb53c2e30e029d1dd0a7fe0529229302dff4248a70b","impliedFormat":1},{"version":"80a76464d55818ed0b60d42223d31143b5eb8767c631262e778d9f5f1fa6657b","impliedFormat":1},{"version":"d6f67708340458125b830c5c7ccbc99321a713fddea99e58077377dc15378010","impliedFormat":1},{"version":"dde5eaa431b5cd5915e9b87f6dab2ded875f473594d7784363e209b0a5225f18","impliedFormat":1},{"version":"aaae4945a5e6b6235c67fe021449a86d9495cec78cb8784d1dcc93096c403bd0","impliedFormat":1},{"version":"f8a25dc8af792143a505da6a9bba0840368a0e33a4d97d9c11bc92d1ebb7fe56","impliedFormat":1},{"version":"4d3ca11894f6f6cf521697c412a38e6cb5e6499008134aa2f85a1cf3290f09de","impliedFormat":1},{"version":"290729de47e533314f01024be16c8737b9f39bc3a68c3c0ef2ba5df46a324eaf","impliedFormat":1},{"version":"81401ab54bda8db98cd258876b3b0229e3c9e0be58e8e751c499858b28e91ee2","impliedFormat":1},{"version":"c4b89c3eeef14aa0c0fdf471ffc31918b2488ed751718cb67e5278f71d018b23","impliedFormat":1},{"version":"5f3f913e4942c29f5c924f12ba42661d4fe52ca21f8d00ab8b5cb58d402066fa","impliedFormat":1},{"version":"1766cb07e0fa8b0eadcc1f3c0431d4d400cf441c7eb1a9ded1f523ff6badfd3d","impliedFormat":1},{"version":"eb21f8bef18b29d45683d71356390c15ce680bb40047414a2e72af597374fbe5","impliedFormat":1},{"version":"6bee78f28570d268b7b850df501d88bb4f29791bd67bc9d015cab1472cfdbdf2","impliedFormat":1},{"version":"dcd44303a53f9345cc57728c1c31c7261966f59a6abfa9364b8e7d08215c4bab","impliedFormat":1},{"version":"1208b9effd2435b62b115711d1f42779223f467b4ab004c3a8117b56859f6b4f","impliedFormat":1},{"version":"f320a409c5f9ae0f83de9733b65573d4f278f63faa1b7b6bba5790feefb3355e","impliedFormat":1},{"version":"b99d4a493b31e57c6999eecd7fd67458419051ccd04fadf3821e55d9f9cb7c42","impliedFormat":1},{"version":"62c8ec46b3ed748077586127b631d54fe0866c2e7f234cf8fcbe6828e76aed0f","impliedFormat":1},{"version":"8b498f251063b70f87516c248619252e8a87de9c9daed99984e8cf1c2f4fe91e","impliedFormat":1},{"version":"08a9f5fba211806d3c3441405b22a1070d88eaf41979d1a7e0a1c2d915c6003b","impliedFormat":1},{"version":"c4901a47ca09589f782af8f7f73bf4102c53cf10f07f36f02c7fe5b81b0ab897","impliedFormat":1},{"version":"09626cade64afaab0ac2539ac15b64681905fd661c35e947039f7c9bc0de6b5c","impliedFormat":1},{"version":"58f09b9e8bd48799479e4402be993a373b991419c3c99e071ed38e5a4f4a59c1","impliedFormat":1},{"version":"707fc0e5443ef8f2bf62860060a65cf6c663692b2d5cbe25df5b99ddbf707b30","impliedFormat":1},{"version":"35e9ce81eb19e283f0a48ffbb1bee9115d99855ae9f8d7ac681e09b409adc5f5","impliedFormat":1},{"version":"0dcdfbfbf7e55475d94f3c82f4c37f834d9118afa845521c3fc206eba676a8f5","impliedFormat":1},{"version":"555d769b11e202f31d2ed3524300ee6c266b82920865456527731b5de7824170","impliedFormat":1},{"version":"52b6fdb0876c3b7bd8a0ce39f46630a1226a6c274139fb66d1d2e9b55c1ddd54","impliedFormat":1},{"version":"cef10f676a45729ed8b4279dcf3a443cb606df407c775a5a525bb38b7ec776ec","impliedFormat":1},{"version":"ff3b75425ae1a5e723087a077061883092b7c8b87ca39418ae9e901f19fe2338","impliedFormat":1},{"version":"f103aa89570932ae3d2257763cc9de257e608ed33ae052edf11aecdf2fe5c6c4","impliedFormat":1},{"version":"aaec5e36e9d3db48868d0f11bf728af91807d03ce1e948787af776422e08f924","impliedFormat":1},{"version":"eda2bd8fb187e2087babff76ef5b01a7cc8c563ee7d2749f9e3dc91245bc4f57","impliedFormat":1},{"version":"025e7d2d5951e63fdb1d32875f95a6afc5ffacc89255fc6544bb914ad0cc2898","impliedFormat":1},{"version":"d38a78daa72781b6fe046cd95e76c55924b4acde46409ca9705ca326642d2b10","impliedFormat":1},{"version":"7039b573fd44c303e163948711b7db7d2aab2385b1f518fa9fbb6ad4134c346e","signature":"b2cc3cef688a6f187d341d9d5f2fb2f920eb6474812aed715a4a279854851b7f"},{"version":"c58110077e78e0e288d4438d60c7bd811cdab84260d2a0eedabf61b320ec92e4","signature":"d370f40c669b007de99ecac1383c06350f7c016aed4c5e0daebca0b975f1416c"},{"version":"db43f7f1cf04222b89e3173957fb32aa59202ea54cf0c155a8e85619fdbfa564","signature":"5dc66e4cf608d9a6d3fca466b78ad094f81b486ab0e9d9ba775f770c5152ed7b"}],"root":[[216,218]],"options":{"composite":true,"declaration":true,"declarationMap":true,"emitDeclarationOnly":true,"exactOptionalPropertyTypes":true,"module":99,"noFallthroughCasesInSwitch":true,"noImplicitOverride":true,"noImplicitReturns":true,"noUncheckedIndexedAccess":true,"noUnusedLocals":true,"noUnusedParameters":true,"outDir":"./","rootDir":"../src","skipLibCheck":true,"strict":true,"target":9,"tsBuildInfoFile":"./.tsbuildinfo","useDefineForClassFields":true,"verbatimModuleSyntax":true},"referencedMap":[[140,1],[139,2],[141,3],[138,4],[143,5],[137,6],[121,7],[119,8],[118,9],[123,10],[120,11],[117,8],[116,9],[122,11],[115,12],[113,13],[185,14],[187,15],[186,16],[211,17],[203,18],[204,19],[212,20],[209,17],[207,21],[205,17],[206,22],[202,23],[208,24],[214,25],[200,26],[197,27],[198,28],[191,29],[201,30],[199,31],[193,32],[194,32],[196,33],[195,34],[178,17],[184,35],[179,23],[189,36],[180,37],[181,38],[183,39],[188,40],[215,41],[177,42],[104,43],[85,44],[86,45],[87,44],[107,46],[91,44],[106,47],[148,48],[147,49],[93,50],[94,51],[105,52],[95,53],[99,54],[98,55],[100,56],[84,44],[97,57],[96,58],[103,59],[151,60],[152,61],[150,62],[153,61],[155,61],[157,63],[168,64],[158,61],[159,61],[161,61],[162,63],[163,65],[164,63],[165,61],[166,61],[167,61],[218,66],[217,67],[216,68],[169,69],[170,70],[171,71],[175,72],[172,69],[173,73],[174,70],[136,74],[146,75],[145,76],[144,74],[126,77],[127,78],[125,78],[135,79],[130,78],[131,78],[132,78],[133,78],[134,80],[63,81],[68,82],[64,83],[74,84],[80,71],[69,71],[81,85],[82,86],[66,87],[65,88],[72,89],[71,90],[75,91],[77,92],[79,93],[78,94]],"latestChangedDtsFile":"./index.d.ts","version":"6.0.3"}
|