@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
- if (transformComponent === void 0) return;
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 = transformData.world;
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
  }
@@ -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":";;;;;;AAoFA,IAAM,UAAA,GAAa,KAAK,EAAA,GAAK,GAAA;AAU7B,SAAS,cAAA,CAAe,MAAW,EAAA,EAAqC;AACtE,EAAA,IAAA,CAAK,qBAAA,CAAsB,EAAA,CAAG,gBAAA,GAAmB,UAAU,CAAA;AAC3D,EAAA,IAAA,CAAK,qBAAA,CAAsB,EAAA,CAAG,gBAAA,GAAmB,UAAU,CAAA;AAC3D,EAAA,IAAA,CAAK,gBAAgB,IAAI,CAAA;AACzB,EAAA,IAAI,EAAA,CAAG,sBAAsB,CAAA,EAAG;AAC9B,IAAA,IAAA,CAAK,eAAA,EAAgB;AAAA,EACvB,CAAA,MAAO;AACL,IAAA,IAAA,CAAK,cAAA,CAAe,EAAA,CAAG,iBAAA,EAAmB,EAAA,CAAG,kBAAkB,KAAK,CAAA;AAAA,EACtE;AACA,EAAA,IAAI,EAAA,CAAG,qBAAqB,CAAA,EAAG;AAC7B,IAAA,IAAA,CAAK,mBAAA,EAAoB;AAAA,EAC3B,CAAA,MAAO;AACL,IAAA,IAAA,CAAK,kBAAA,CAAmB,GAAG,gBAAgB,CAAA;AAAA,EAC7C;AACF;AAOA,SAAS,sBAAA,CAAuB,QAAa,QAAA,EAA0B;AACrE,EAAA,IAAI,QAAA,KAAa,MAAA,CAAO,aAAA,CAAc,OAAA,EAAS,OAAO,SAAA;AACtD,EAAA,IAAI,QAAA,KAAa,MAAA,CAAO,aAAA,CAAc,KAAA,EAAO,OAAO,QAAA;AACpD,EAAA,OAAO,WAAA;AACT;AAEO,IAAM,uBAAN,MAAqD;AAAA,EAC1D,GAAA;AAAA,EAEiB,YAAA;AAAA;AAAA,EAGA,SAAA,uBAAgB,GAAA,EAAiC;AAAA;AAAA,EAGjD,gBAAA,uBAAuB,GAAA,EAAwD;AAAA,EAExF,UAAA;AAAA,EAES,cAAA,uBAAqB,GAAA,EAAyB;AAAA,EAE9C,yBAAmD,EAAC;AAAA,EAEpD,wBAAkD,EAAC;AAAA,EAE5D,cAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EASC,QAAA,uBAAe,GAAA,EAAiB;AAAA,EAExB,UAAA,uBAAiB,GAAA,EAAoB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAS9C,WAAA;AAAA,EAIR,YAAY,MAAA,EAAwB;AAClC,IAAA,IAAA,CAAK,YAAA,GAAe,MAAA;AAEpB,IAAA,IAAA,CAAK,GAAA,GAAM,IAAK,MAAA,CAAe,KAAA,CAAM,EAAE,CAAA,EAAG,CAAA,EAAG,CAAA,EAAG,KAAA,EAAO,CAAA;AAEvD,IAAA,IAAA,CAAK,UAAA,GAAa,IAAK,MAAA,CAAe,UAAA,CAAW,IAAI,CAAA;AACrD,IAAA,IAAA,CAAK,cAAA,GAAiB,EAAE,CAAA,EAAG,CAAA,EAAG,GAAG,KAAA,EAAM;AAAA,EACzC;AAAA;AAAA,EAIA,WAAW,OAAA,EAAqB;AAC9B,IAAA,MAAM,CAAA,GAAI,OAAA,CAAQ,CAAC,CAAA,IAAK,CAAA;AACxB,IAAA,MAAM,CAAA,GAAI,OAAA,CAAQ,CAAC,CAAA,IAAK,CAAA;AACxB,IAAA,IAAA,CAAK,GAAA,CAAI,OAAA,GAAU,EAAE,CAAA,EAAG,CAAA,EAAE;AAC1B,IAAA,IAAA,CAAK,cAAA,GAAiB,EAAE,CAAA,EAAG,CAAA,EAAE;AAAA,EAC/B;AAAA,EAEA,UAAA,GAAmB;AACjB,IAAA,MAAM,EAAE,CAAA,EAAG,CAAA,EAAE,GAAI,IAAA,CAAK,cAAA;AACtB,IAAA,OAAO,IAAA,CAAK,MAAA,CAAO,CAAA,EAAG,CAAC,CAAA;AAAA,EACzB;AAAA,EAEA,OAAA,CACE,MAAA,EACA,SAAA,EACA,OAAA,EACA,UAAA,EAC0B;AAC1B,IAAA,MAAM,SAAS,IAAA,CAAK,YAAA;AAEpB,IAAA,MAAM,UAAW,MAAA,CAAe,GAAA;AAIhC,IAAA,MAAM,MAAM,IAAI,OAAA;AAAA,MACd,EAAE,CAAA,EAAG,MAAA,CAAO,CAAC,CAAA,IAAK,GAAG,CAAA,EAAG,MAAA,CAAO,CAAC,CAAA,IAAK,CAAA,EAAE;AAAA,MACvC,EAAE,CAAA,EAAG,SAAA,CAAU,CAAC,CAAA,IAAK,GAAG,CAAA,EAAG,SAAA,CAAU,CAAC,CAAA,IAAK,CAAA;AAAE,KAC/C;AAEA,IAAA,MAAM,GAAA,GAAO,KAAK,GAAA,CAAY,mBAAA;AAAA,MAC5B,GAAA;AAAA,MACA,OAAA;AAAA,MACA,IAAA;AAAA,MACA,MAAA;AAAA,MACA;AAAA,KACF;AAMA,IAAA,IAAI,GAAA,KAAQ,MAAM,OAAO,MAAA;AAEzB,IAAA,MAAM,KAAA,GAAQ,GAAA,CAAI,OAAA,CAAQ,GAAA,CAAI,YAAY,CAAA;AAM1C,IAAA,MAAM,kBAAA,GAAqB,GAAA,CAAI,QAAA,CAAS,MAAA,EAAO;AAC/C,IAAA,MAAM,MAAA,GAAS,kBAAA,KAAuB,IAAA,GAAO,kBAAA,CAAmB,QAAA,GAAW,CAAA;AAE3E,IAAA,OAAO;AAAA,MACL,MAAA;AAAA,MACA,OAAO,IAAA,CAAK,MAAA,CAAO,KAAA,CAAM,CAAA,EAAG,MAAM,CAAC,CAAA;AAAA,MACnC,MAAA,EAAQ,KAAK,MAAA,CAAO,GAAA,CAAI,OAAO,CAAA,EAAG,GAAA,CAAI,OAAO,CAAC,CAAA;AAAA,MAC9C,cAAc,GAAA,CAAI;AAAA,KACpB;AAAA,EACF;AAAA,EAEA,QAAA,CAAS,MAAA,EAAgB,QAAA,EAAgB,QAAA,EAAwB;AAC/D,IAAA,IAAA,CAAK,gBAAA,CAAiB,IAAI,MAAA,EAAQ;AAAA,MAChC,CAAA,EAAG,QAAA,CAAS,CAAC,CAAA,IAAK,CAAA;AAAA,MAClB,CAAA,EAAG,QAAA,CAAS,CAAC,CAAA,IAAK,CAAA;AAAA,MAClB;AAAA,KACD,CAAA;AAAA,EACH;AAAA,EAEA,KAAK,SAAA,EAAyB;AAG5B,IAAC,IAAA,CAAK,GAAA,CAAY,IAAA,CAAK,IAAA,CAAK,UAAU,CAAA;AACtC,IAAA,IAAA,CAAK,0BAAA,EAA2B;AAAA,EAClC;AAAA,EAEQ,0BAAA,GAAmC;AACzC,IAAA,IAAA,CAAK,UAAA,CAAW,oBAAA,CAAqB,CAAC,OAAA,EAAiB,SAAiB,OAAA,KAAqB;AAC3F,MAAA,MAAM,OAAA,GAAU,IAAA,CAAK,sBAAA,CAAuB,OAAO,CAAA;AACnD,MAAA,MAAM,OAAA,GAAU,IAAA,CAAK,sBAAA,CAAuB,OAAO,CAAA;AACnD,MAAA,IAAI,OAAA,KAAY,MAAA,IAAa,OAAA,KAAY,MAAA,EAAW;AACpD,MAAA,MAAM,OAAA,GAAU,OAAA,GACZ,IAAA,CAAK,gBAAA,CAAiB,OAAA,EAAS,OAAO,CAAA,GACtC,IAAA,CAAK,mBAAA,CAAoB,OAAA,EAAS,OAAO,CAAA;AAC7C,MAAA,IAAI,CAAC,OAAA,EAAS;AACd,MAAA,IAAA,CAAK,kBAAA,CAAmB;AAAA,QACtB,IAAA,EAAM,UAAU,SAAA,GAAY,SAAA;AAAA,QAC5B,OAAA;AAAA,QACA;AAAA,OACD,CAAA;AAAA,IACH,CAAC,CAAA;AAAA,EACH;AAAA,EAEQ,uBAAuB,cAAA,EAA4C;AAEzE,IAAA,MAAM,QAAA,GAAY,IAAA,CAAK,GAAA,CAAY,WAAA,CAAY,cAAc,CAAA;AAG7D,IAAA,MAAM,IAAA,GAAO,UAAU,MAAA,EAAO;AAC9B,IAAA,OAAO,IAAA,EAAM,QAAA;AAAA,EACf;AAAA,EAEQ,gBAAA,CAAiB,SAAiB,OAAA,EAA0B;AAClE,IAAA,IAAI,KAAA,GAAQ,IAAA,CAAK,cAAA,CAAe,GAAA,CAAI,OAAO,CAAA;AAC3C,IAAA,IAAI,CAAC,KAAA,EAAO;AACV,MAAA,KAAA,uBAAY,GAAA,EAAY;AACxB,MAAA,IAAA,CAAK,cAAA,CAAe,GAAA,CAAI,OAAA,EAAS,KAAK,CAAA;AAAA,IACxC;AACA,IAAA,IAAI,KAAA,CAAM,GAAA,CAAI,OAAO,CAAA,EAAG,OAAO,KAAA;AAC/B,IAAA,KAAA,CAAM,IAAI,OAAO,CAAA;AACjB,IAAA,IAAI,MAAA,GAAS,IAAA,CAAK,cAAA,CAAe,GAAA,CAAI,OAAO,CAAA;AAC5C,IAAA,IAAI,CAAC,MAAA,EAAQ;AACX,MAAA,MAAA,uBAAa,GAAA,EAAY;AACzB,MAAA,IAAA,CAAK,cAAA,CAAe,GAAA,CAAI,OAAA,EAAS,MAAM,CAAA;AAAA,IACzC;AACA,IAAA,MAAA,CAAO,IAAI,OAAO,CAAA;AAClB,IAAA,OAAO,IAAA;AAAA,EACT;AAAA,EAEQ,mBAAA,CAAoB,SAAiB,OAAA,EAA0B;AACrE,IAAA,MAAM,KAAA,GAAQ,IAAA,CAAK,cAAA,CAAe,GAAA,CAAI,OAAO,CAAA;AAC7C,IAAA,MAAM,MAAA,GAAS,IAAA,CAAK,cAAA,CAAe,GAAA,CAAI,OAAO,CAAA;AAC9C,IAAA,MAAM,YAAA,GAAe,KAAA,EAAO,MAAA,CAAO,OAAO,CAAA,KAAM,IAAA;AAChD,IAAA,MAAM,aAAA,GAAgB,MAAA,EAAQ,MAAA,CAAO,OAAO,CAAA,KAAM,IAAA;AAClD,IAAA,IAAI,CAAC,OAAO,IAAA,CAAK,cAAA,CAAe,IAAI,OAAA,kBAAS,IAAI,KAAK,CAAA;AACtD,IAAA,IAAI,CAAC,QAAQ,IAAA,CAAK,cAAA,CAAe,IAAI,OAAA,kBAAS,IAAI,KAAK,CAAA;AACvD,IAAA,OAAO,YAAA,IAAgB,aAAA;AAAA,EACzB;AAAA,EAEQ,mBAAmB,KAAA,EAAqC;AAC9D,IAAA,IAAA,CAAK,sBAAA,CAAuB,KAAK,KAAK,CAAA;AACtC,IAAA,IAAA,CAAK,qBAAA,CAAsB,KAAK,KAAK,CAAA;AAAA,EACvC;AAAA,EAEA,oBAAA,GAAiD;AAC/C,IAAA,OAAO,IAAA,CAAK,sBAAA,CAAuB,MAAA,CAAO,CAAC,CAAA;AAAA,EAC7C;AAAA,EAEA,iBAAA,GAA8C;AAC5C,IAAA,OAAO,IAAI,IAAI,CAAC,GAAG,KAAK,cAAc,CAAA,CAAE,IAAI,CAAC,CAAC,QAAQ,MAAM,CAAA,KAAM,CAAC,MAAA,EAAQ,IAAI,IAAI,MAAM,CAAC,CAAC,CAAC,CAAA;AAAA,EAC9F;AAAA,EAEA,wBAAA,GAA8D;AAC5D,IAAA,OAAO,CAAC,GAAG,IAAA,CAAK,qBAAqB,CAAA;AAAA,EACvC;AAAA,EAEA,mBAAA,GAGI;AACF,IAAA,OAAO,CAAC,GAAG,IAAA,CAAK,gBAAgB,CAAA,CAAE,IAAI,CAAC,CAAC,MAAA,EAAQ,MAAM,MAAM,CAAC,MAAA,EAAQ,EAAE,GAAG,MAAA,EAAQ,CAAC,CAAA;AAAA,EACrF;AAAA,EAEA,4BAAA,GAA4E;AAC1E,IAAA,OAAO,CAAC,GAAG,IAAA,CAAK,UAAU,CAAA,CACvB,KAAK,CAAC,CAAC,KAAK,CAAA,EAAG,CAAC,MAAM,MAAM,KAAA,GAAQ,MAAM,CAAA,CAC1C,GAAA,CAAI,CAAC,CAAC,MAAA,EAAQ,MAAM,CAAA,MAAO,EAAE,MAAA,EAAQ,MAAA,EAAO,CAAE,CAAA;AAAA,EACnD;AAAA,EAEA,OAAA,GAAgB;AACd,IAAA,IAAI,OAAO,IAAA,CAAK,GAAA,CAAI,SAAS,UAAA,EAAY,IAAA,CAAK,IAAI,IAAA,EAAK;AACvD,IAAA,IAAI,OAAO,IAAA,CAAK,UAAA,CAAW,SAAS,UAAA,EAAY,IAAA,CAAK,WAAW,IAAA,EAAK;AACrE,IAAA,IAAA,CAAK,SAAS,KAAA,EAAM;AACpB,IAAA,IAAA,CAAK,WAAW,KAAA,EAAM;AAAA,EACxB;AAAA,EAEA,0BAAA,CAA2B,KAAA,EAAc,SAAA,GAAuB,iBAAA,EAAyB;AACvF,IAAA,KAAA,MAAW,CAAC,MAAA,EAAQ,MAAM,CAAA,IAAK,KAAK,cAAA,EAAgB;AAClD,MAAA,MAAM,MAAA,GAAS,MAAA;AACf,MAAA,IAAI,KAAA,CAAM,GAAA,CAAI,MAAA,EAAQ,SAAS,EAAE,EAAA,EAAI;AACnC,QAAA,KAAA,CAAM,GAAA,CAAI,QAAQ,SAAA,EAAW,EAAE,UAAU,CAAC,GAAG,MAAM,CAAA,EAAG,CAAA;AAAA,MACxD;AAAA,IACF;AAAA,EACF;AAAA,EAEA,YAAA,GAAuB;AACrB,IAAA,OAAO,KAAK,SAAA,CAAU,IAAA;AAAA,EACxB;AAAA,EAEA,QAAQ,MAAA,EAAyB;AAC/B,IAAA,OAAO,IAAA,CAAK,SAAA,CAAU,GAAA,CAAI,MAAM,CAAA;AAAA,EAClC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,cAAA,CAAe,KAAA,EAAc,SAAA,EAAsB,mBAAA,EAAsC;AACvF,IAAA,IAAA,CAAK,WAAA,GAAc,EAAE,KAAA,EAAO,SAAA,EAAW,mBAAA,EAAoB;AAAA,EAC7D;AAAA,EAEA,YAAA,CAAa,QAAgB,YAAA,EAA0B;AACrD,IAAA,OAAO,IAAA,CAAK,WAAA,CAAY,MAAA,EAAQ,YAAY,CAAA;AAAA,EAC9C;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAUQ,WAAA,CAAY,QAAgB,YAAA,EAA8B;AAEhE,IAAA,MAAM,MAAA,GAAS,IAAA,CAAK,SAAA,CAAU,GAAA,CAAI,MAAM,CAAA;AACxC,IAAA,IAAI,CAAC,MAAA,EAAQ;AACX,MAAA,MAAM,IAAI,YAAA,CAAa;AAAA,QACrB,IAAA,EAAM,gBAAA;AAAA,QACN,QAAA,EAAU,0CAAA;AAAA,QACV,IAAA,EAAM,oBAAoB,gBAAgB,CAAA;AAAA,QAC1C,MAAA,EAAQ,EAAE,IAAA,EAAM,gBAAA,EAAkB,MAAA;AAAO,OAC1C,CAAA;AAAA,IACH;AAEA,IAAA,MAAM,OAAQ,IAAA,CAAK,GAAA,CAAY,MAAA,CAAO,GAAA,CAAI,OAAO,UAAU,CAAA;AAC3D,IAAA,IAAI,CAAC,IAAA,EAAM;AACT,MAAA,MAAM,IAAI,YAAA,CAAa;AAAA,QACrB,IAAA,EAAM,gBAAA;AAAA,QACN,QAAA,EAAU,0CAAA;AAAA,QACV,IAAA,EAAM,oBAAoB,gBAAgB,CAAA;AAAA,QAC1C,MAAA,EAAQ,EAAE,IAAA,EAAM,gBAAA,EAAkB,MAAA;AAAO,OAC1C,CAAA;AAAA,IACH;AACA,IAAA,IAAI,IAAA,CAAK,YAAA,EAAa,KAAM,CAAA,EAAG;AAE7B,MAAA,MAAM,IAAI,YAAA,CAAa;AAAA,QACrB,IAAA,EAAM,oBAAA;AAAA,QACN,QAAA,EAAU,yCAAA;AAAA,QACV,IAAA,EAAM,oBAAoB,oBAAoB,CAAA;AAAA,QAC9C,MAAA,EAAQ,EAAE,IAAA,EAAM,oBAAA,EAAsB,MAAA;AAAO,OAC9C,CAAA;AAAA,IACH;AACA,IAAA,MAAM,SAAS,IAAA,CAAK,YAAA;AACpB,IAAA,IAAI,IAAA,CAAK,QAAA,EAAS,KAAM,MAAA,CAAO,cAAc,sBAAA,EAAwB;AACnE,MAAA,MAAM,IAAI,YAAA,CAAa;AAAA,QACrB,IAAA,EAAM,+BAAA;AAAA,QACN,QAAA,EAAU,gCAAA;AAAA,QACV,IAAA,EAAM,oBAAoB,+BAA+B,CAAA;AAAA,QACzD,MAAA,EAAQ;AAAA,UACN,IAAA,EAAM,+BAAA;AAAA,UACN,MAAA;AAAA,UACA,QAAA,EAAU,sBAAA,CAAuB,MAAA,EAAQ,IAAA,CAAK,UAAU;AAAA;AAC1D,OACD,CAAA;AAAA,IACH;AAEA,IAAA,MAAM,QAAA,GAAW,IAAA,CAAK,QAAA,CAAS,CAAC,CAAA;AAGhC,IAAA,MAAM,EAAA,GAAK,IAAA,CAAK,uBAAA,CAAwB,MAAM,CAAA;AAC9C,IAAA,MAAM,IAAA,GAAO,IAAA,CAAK,SAAA,CAAU,MAAA,EAAQ,GAAG,MAAM,CAAA;AAC7C,IAAA,cAAA,CAAe,MAAM,EAAE,CAAA;AAMvB,IAAA,MAAM,KAAA,GAAQ,EAAE,CAAA,EAAG,YAAA,CAAa,CAAC,CAAA,IAAK,CAAA,EAAG,CAAA,EAAG,YAAA,CAAa,CAAC,CAAA,IAAK,CAAA,EAAE;AACjE,IAAA,IAAA,CAAK,uBAAA;AAAA,MACH,QAAA;AAAA,MACA,KAAA;AAAA,MACA,MAAA;AAAA,MACA,MAAA;AAAA;AAAA,MAEA,CAAC,KAAA,KAAe,KAAA,CAAM,MAAA,KAAW,QAAA,CAAS;AAAA,KAC5C;AAGA,IAAA,MAAM,QAAA,GAAW,KAAK,gBAAA,EAAiB;AACvC,IAAA,MAAM,QAAA,GAAW,KAAK,gBAAA,EAAiB;AAGvC,IAAA,MAAM,CAAA,GAAI,KAAK,WAAA,EAAY;AAC3B,IAAA,MAAM,IAAA,GAAO,EAAE,CAAA,EAAG,CAAA,CAAE,CAAA,GAAI,QAAA,CAAS,CAAA,EAAG,CAAA,EAAG,CAAA,CAAE,CAAA,GAAI,QAAA,CAAS,CAAA,EAAE;AAKxD,IAAA,IAAA,CAAK,4BAA4B,IAAI,CAAA;AACrC,IAAA,IAAA,CAAK,cAAA,CAAe,MAAM,IAAI,CAAA;AAK9B,IAAC,IAAA,CAAK,IAAY,yCAAA,EAA0C;AAE5D,IAAA,MAAM,MAAM,IAAA,CAAK,WAAA;AACjB,IAAA,IAAI,GAAA,EAAK;AAEP,MAAA,GAAA,CAAI,KAAA,CAAM,GAAA,CAAI,MAAA,EAAwB,GAAA,CAAI,SAAA,EAAW;AAAA,QACnD,GAAA,EAAK,CAAC,IAAA,CAAK,CAAA,EAAG,IAAA,CAAK,CAAA,EAAG,iBAAA,CAAkB,GAAA,CAAI,KAAA,EAAO,MAAA,EAAwB,GAAA,CAAI,SAAS,CAAC;AAAA,OAC1F,CAAA;AACD,MAAA,GAAA,CAAI,MAAM,GAAA,CAAI,MAAA,EAAwB,IAAI,mBAAA,EAAqB,EAAE,UAAU,CAAA;AAAA,IAC7E;AAEA,IAAA,OAAO,IAAA,CAAK,MAAA,CAAO,QAAA,CAAS,CAAA,EAAG,SAAS,CAAC,CAAA;AAAA,EAC3C;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOQ,wBAAwB,MAAA,EAA2C;AACzE,IAAA,MAAM,MAAM,IAAA,CAAK,WAAA;AACjB,IAAA,IAAI,GAAA,EAAK;AACP,MAAA,MAAM,IAAI,GAAA,CAAI,KAAA,CAAM,GAAA,CAAI,MAAA,EAAwB,IAAI,mBAAmB,CAAA;AACvE,MAAA,IAAI,EAAE,EAAA,EAAI;AACR,QAAA,MAAM,IAAI,CAAA,CAAE,KAAA;AACZ,QAAA,OAAO;AAAA,UACL,QAAQ,CAAA,CAAE,MAAA;AAAA,UACV,kBAAkB,CAAA,CAAE,gBAAA;AAAA,UACpB,kBAAkB,CAAA,CAAE,gBAAA;AAAA,UACpB,mBAAmB,CAAA,CAAE,iBAAA;AAAA,UACrB,kBAAkB,CAAA,CAAE,gBAAA;AAAA,UACpB,kBAAkB,CAAA,CAAE;AAAA,SACtB;AAAA,MACF;AAAA,IACF;AAGA,IAAA,OAAO,mBAAA,CAAoB,mBAAmB,CAAA,CAC3C,QAAA;AAAA,EACL;AAAA;AAAA;AAAA;AAAA;AAAA,EAMQ,SAAA,CAAU,QAAgB,MAAA,EAAqB;AACrD,IAAA,MAAM,MAAA,GAAS,IAAA,CAAK,QAAA,CAAS,GAAA,CAAI,MAAM,CAAA;AACvC,IAAA,IAAI,QAAQ,OAAO,MAAA;AAEnB,IAAA,MAAM,IAAA,GAAQ,IAAA,CAAK,GAAA,CAAY,yBAAA,CAA0B,MAAM,CAAA;AAC/D,IAAA,IAAA,CAAK,QAAA,CAAS,GAAA,CAAI,MAAA,EAAQ,IAAI,CAAA;AAC9B,IAAA,IAAA,CAAK,UAAA,CAAW,GAAA,CAAI,MAAA,EAAQ,MAAM,CAAA;AAClC,IAAA,OAAO,IAAA;AAAA,EACT;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,oBAAoB,MAAA,EAAsB;AACxC,IAAA,MAAM,IAAA,GAAO,IAAA,CAAK,QAAA,CAAS,GAAA,CAAI,MAAM,CAAA;AACrC,IAAA,IAAA,CAAK,UAAA,CAAW,OAAO,MAAM,CAAA;AAC7B,IAAA,IAAI,CAAC,IAAA,EAAM;AAEX,IAAC,IAAA,CAAK,GAAA,CAAY,yBAAA,CAA0B,IAAI,CAAA;AAChD,IAAA,IAAA,CAAK,QAAA,CAAS,OAAO,MAAM,CAAA;AAAA,EAC7B;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAaA,UAAA,CACE,MAAA,EACA,SAAA,EACA,SAAA,EAQA,QAAA,EACM;AACN,IAAA,IAAI,IAAA,CAAK,SAAA,CAAU,GAAA,CAAI,MAAM,CAAA,EAAG;AAEhC,IAAA,MAAM,SAAS,IAAA,CAAK,YAAA;AAGpB,IAAA,MAAM,MAAA,GAAS,oBAAA,CAAqB,SAAA,CAAU,IAAI,CAAA;AAClD,IAAA,IAAI,IAAA;AACJ,IAAA,QAAQ,MAAA;AAAQ,MACd,KAAK,SAAA,EAAW;AAEd,QAAA,MAAM,IAAA,GAAQ,MAAA,CAAe,aAAA,CAAc,OAAA,EAAQ,CAChD,cAAA,CAAe,SAAA,CAAU,QAAA,CAAS,CAAA,EAAG,SAAA,CAAU,QAAA,CAAS,CAAC,CAAA,CACzD,WAAA,CAAY,SAAA,CAAU,QAAQ,CAAA,CAC9B,gBAAA,CAAiB,SAAA,CAAU,aAAa,CAAA,CACxC,iBAAA,CAAkB,SAAA,CAAU,cAAc,CAAA,CAC1C,eAAA,CAAgB,SAAA,CAAU,YAAY,CAAA;AACzC,QAAA,IAAI,SAAA,CAAU,OAAO,CAAA,EAAG;AACtB,UAAA,IAAA,CAAK,iBAAA,CAAkB,UAAU,IAAI,CAAA;AAAA,QACvC;AACA,QAAA,IAAI,UAAU,UAAA,EAAY;AACxB,UAAA,IAAA,CAAK,cAAc,IAAI,CAAA;AAAA,QACzB;AAEA,QAAA,IAAA,GAAQ,IAAA,CAAK,GAAA,CAAY,eAAA,CAAgB,IAAI,CAAA;AAC7C,QAAA;AAAA,MACF;AAAA,MACA,KAAK,QAAA,EAAU;AAEb,QAAA,MAAM,IAAA,GAAQ,MAAA,CAAe,aAAA,CAAc,KAAA,GACxC,cAAA,CAAe,SAAA,CAAU,QAAA,CAAS,CAAA,EAAG,UAAU,QAAA,CAAS,CAAC,CAAA,CACzD,WAAA,CAAY,UAAU,QAAQ,CAAA;AAEjC,QAAA,IAAA,GAAQ,IAAA,CAAK,GAAA,CAAY,eAAA,CAAgB,IAAI,CAAA;AAC7C,QAAA;AAAA,MACF;AAAA,MACA,KAAK,WAAA,EAAa;AAEhB,QAAA,MAAM,IAAA,GAAQ,MAAA,CAAe,aAAA,CAAc,sBAAA,GACxC,cAAA,CAAe,SAAA,CAAU,QAAA,CAAS,CAAA,EAAG,UAAU,QAAA,CAAS,CAAC,CAAA,CACzD,WAAA,CAAY,UAAU,QAAQ,CAAA;AAIjC,QAAA,IAAI,UAAU,UAAA,EAAY;AACxB,UAAA,IAAA,CAAK,cAAc,IAAI,CAAA;AAAA,QACzB;AAEA,QAAA,IAAA,GAAQ,IAAA,CAAK,GAAA,CAAY,eAAA,CAAgB,IAAI,CAAA;AAC7C,QAAA;AAAA,MACF;AAAA;AAGF,IAAA,IAAA,CAAK,QAAA,GAAW,MAAA;AAChB,IAAA,IAAA,CAAK,YAAA,CAAa,MAAA,EAAQ,IAAA,CAAK,MAAM,CAAA;AAGrC,IAAA,MAAM,MAAA,GAAS,IAAA,CAAK,GAAA,CAAI,SAAA,CAAU,MAAM,CAAC,CAAA;AACzC,IAAA,MAAM,MAAA,GAAS,IAAA,CAAK,GAAA,CAAI,SAAA,CAAU,MAAM,CAAC,CAAA;AACzC,IAAA,MAAM,MAAA,GAAS,oBAAA,CAAqB,QAAA,CAAS,KAAK,CAAA;AAClD,IAAA,QAAQ,MAAA;AAAQ,MACd,KAAK,QAAA,EAAU;AAEb,QAAA,MAAM,IAAA,GAAQ,OAAe,YAAA,CAAa,MAAA;AAAA,UACxC,QAAA,CAAS,WAAA,CAAY,CAAC,CAAA,GAAI,MAAA;AAAA,UAC1B,QAAA,CAAS,WAAA,CAAY,CAAC,CAAA,GAAI;AAAA,UAEzB,WAAA,CAAY,QAAA,CAAS,QAAQ,CAAA,CAC7B,cAAA,CAAe,SAAS,WAAW,CAAA,CACnC,WAAW,QAAA,CAAS,OAAO,EAC3B,kBAAA,CAAmB,QAAA,CAAS,eAAe,CAAA,CAC3C,eAAA,CAAgB,SAAS,YAAY,CAAA;AACxC,QAAA,IAAI,QAAA,CAAS,QAAA,EAAU,IAAA,CAAK,SAAA,CAAU,IAAI,CAAA;AAE1C,QAAC,IAAA,CAAK,GAAA,CAAY,cAAA,CAAe,IAAA,EAAM,IAAI,CAAA;AAC3C,QAAA;AAAA,MACF;AAAA,MACA,KAAK,QAAA,EAAU;AAEb,QAAA,MAAM,IAAA,GAAQ,MAAA,CAAe,YAAA,CAAa,IAAA,CAAK,QAAA,CAAS,MAAA,GAAS,IAAA,CAAK,GAAA,CAAI,MAAA,EAAQ,MAAM,CAAC,CAAA,CACtF,YAAY,QAAA,CAAS,QAAQ,CAAA,CAC7B,cAAA,CAAe,QAAA,CAAS,WAAW,CAAA,CACnC,UAAA,CAAW,QAAA,CAAS,OAAO,CAAA,CAC3B,kBAAA,CAAmB,QAAA,CAAS,eAAe,CAAA,CAC3C,eAAA,CAAgB,SAAS,YAAY,CAAA;AACxC,QAAA,IAAI,QAAA,CAAS,QAAA,EAAU,IAAA,CAAK,SAAA,CAAU,IAAI,CAAA;AAE1C,QAAC,IAAA,CAAK,GAAA,CAAY,cAAA,CAAe,IAAA,EAAM,IAAI,CAAA;AAC3C,QAAA;AAAA,MACF;AAAA,MACA,KAAK,SAAA,EAAW;AAEd,QAAA,MAAM,IAAA,GAAQ,OAAe,YAAA,CAAa,OAAA;AAAA,UACxC,SAAS,UAAA,GAAa,MAAA;AAAA,UACtB,SAAS,MAAA,GAAS;AAAA,UAEjB,WAAA,CAAY,QAAA,CAAS,QAAQ,CAAA,CAC7B,cAAA,CAAe,SAAS,WAAW,CAAA,CACnC,WAAW,QAAA,CAAS,OAAO,EAC3B,kBAAA,CAAmB,QAAA,CAAS,eAAe,CAAA,CAC3C,eAAA,CAAgB,SAAS,YAAY,CAAA;AACxC,QAAA,IAAI,QAAA,CAAS,QAAA,EAAU,IAAA,CAAK,SAAA,CAAU,IAAI,CAAA;AAE1C,QAAC,IAAA,CAAK,GAAA,CAAY,cAAA,CAAe,IAAA,EAAM,IAAI,CAAA;AAC3C,QAAA;AAAA,MACF;AAAA;AACF,EACF;AAAA;AAAA,EAGA,gBAAA,CACE,MAAA,EACA,SAAA,EACA,QAAA,EACA,QAAA,EACM;AACN,IAAA,MAAM,MAAA,GAAS,IAAA,CAAK,SAAA,CAAU,GAAA,CAAI,MAAM,CAAA;AACxC,IAAA,IAAI,CAAC,MAAA,EAAQ;AAEb,IAAA,MAAM,OAAQ,IAAA,CAAK,GAAA,CAAY,MAAA,CAAO,GAAA,CAAI,OAAO,UAAU,CAAA;AAC3D,IAAA,IAAI,CAAC,IAAA,EAAM;AAEX,IAAA,IAAI,aAAa,QAAA,EAAU;AACzB,MAAA,IAAA,CAAK,cAAA,CAAe,SAAA,CAAU,QAAA,EAAU,IAAI,CAAA;AAC5C,MAAA,IAAA,CAAK,WAAA,CAAY,SAAA,CAAU,QAAA,EAAU,IAAI,CAAA;AAAA,IAC3C,CAAA,MAAO;AACL,MAAA,IAAA,CAAK,2BAAA,CAA4B,UAAU,QAAQ,CAAA;AACnD,MAAA,IAAA,CAAK,wBAAA,CAAyB,UAAU,QAAQ,CAAA;AAAA,IAClD;AAEA,IAAA,MAAM,cAAA,GAAiB,IAAA,CAAK,QAAA,CAAS,CAAC,CAAA;AACtC,IAAA,IAAI,CAAC,cAAA,EAAgB;AACrB,IAAA,MAAM,MAAA,GAAS,IAAA,CAAK,GAAA,CAAI,SAAA,CAAU,MAAM,CAAC,CAAA;AACzC,IAAA,MAAM,MAAA,GAAS,IAAA,CAAK,GAAA,CAAI,SAAA,CAAU,MAAM,CAAC,CAAA;AACzC,IAAA,QAAQ,oBAAA,CAAqB,QAAA,CAAS,KAAK,CAAA;AAAG,MAC5C,KAAK,QAAA;AACH,QAAA,cAAA,CAAe,cAAA,CAAe;AAAA,UAC5B,CAAA,EAAG,QAAA,CAAS,WAAA,CAAY,CAAC,CAAA,GAAI,MAAA;AAAA,UAC7B,CAAA,EAAG,QAAA,CAAS,WAAA,CAAY,CAAC,CAAA,GAAI;AAAA,SAC9B,CAAA;AACD,QAAA;AAAA,MACF,KAAK,QAAA;AACH,QAAA,cAAA,CAAe,UAAU,QAAA,CAAS,MAAA,GAAS,KAAK,GAAA,CAAI,MAAA,EAAQ,MAAM,CAAC,CAAA;AACnE,QAAA;AAAA,MACF,KAAK,SAAA;AACH,QAAA,cAAA,CAAe,aAAA,CAAc,QAAA,CAAS,UAAA,GAAa,MAAM,CAAA;AACzD,QAAA,cAAA,CAAe,SAAA,CAAU,QAAA,CAAS,MAAA,GAAS,MAAM,CAAA;AACjD,QAAA;AAAA;AACJ,EACF;AAAA;AAAA,EAIA,YAAA,CAAa,QAAgB,UAAA,EAA0B;AACrD,IAAA,IAAA,CAAK,SAAA,CAAU,GAAA,CAAI,MAAA,EAAQ,EAAE,YAAY,CAAA;AAAA,EAC3C;AAAA,EAEA,qBAAA,GAA8B;AAC5B,IAAA,KAAA,MAAW,CAAC,MAAA,EAAQ,MAAM,CAAA,IAAK,KAAK,gBAAA,EAAkB;AACpD,MAAA,MAAM,MAAA,GAAS,IAAA,CAAK,SAAA,CAAU,GAAA,CAAI,MAAM,CAAA;AACxC,MAAA,IAAI,CAAC,MAAA,EAAQ;AAEb,MAAA,MAAM,OAAQ,IAAA,CAAK,GAAA,CAAY,MAAA,CAAO,GAAA,CAAI,OAAO,UAAU,CAAA;AAC3D,MAAA,IAAI,CAAC,IAAA,EAAM;AAEX,MAAA,IAAA,CAAK,cAAA,CAAe,EAAE,CAAA,EAAG,MAAA,CAAO,GAAG,CAAA,EAAG,MAAA,CAAO,CAAA,EAAE,EAAG,IAAI,CAAA;AACtD,MAAA,IAAA,CAAK,UAAU,EAAE,CAAA,EAAG,GAAG,CAAA,EAAG,CAAA,IAAK,KAAK,CAAA;AACpC,MAAA,IAAA,CAAK,SAAA,CAAU,GAAG,KAAK,CAAA;AACvB,MAAA,IAAI,MAAA,CAAO,aAAa,MAAA,EAAW;AACjC,QAAA,IAAA,CAAK,WAAA,CAAY,MAAA,CAAO,QAAA,EAAU,IAAI,CAAA;AAAA,MACxC;AAAA,IACF;AACA,IAAA,IAAA,CAAK,iBAAiB,KAAA,EAAM;AAAA,EAC9B;AAAA,EAEA,oBAAA,CAAqB,MAAA,EAAgB,GAAA,EAA+B,QAAA,EAAyB;AAC3F,IAAA,MAAM,MAAA,GAAS,IAAA,CAAK,SAAA,CAAU,GAAA,CAAI,MAAM,CAAA;AACxC,IAAA,IAAI,CAAC,MAAA,EAAQ;AAEb,IAAA,MAAM,OAAQ,IAAA,CAAK,GAAA,CAAY,MAAA,CAAO,GAAA,CAAI,OAAO,UAAU,CAAA;AAC3D,IAAA,IAAI,CAAC,IAAA,EAAM;AACX,IAAA,IAAA,CAAK,2BAAA,CAA4B,EAAE,CAAA,EAAG,GAAA,CAAI,GAAG,CAAA,EAAG,GAAA,CAAI,GAAG,CAAA;AACvD,IAAA,IAAI,aAAa,MAAA,EAAW;AAC1B,MAAA,IAAA,CAAK,yBAAyB,QAAQ,CAAA;AAAA,IACxC;AAAA,EACF;AAAA,EAEA,sBAAA,GAIG;AACD,IAAA,MAAM,UAID,EAAC;AACN,IAAA,KAAA,MAAW,CAAC,MAAA,EAAQ,MAAM,CAAA,IAAK,KAAK,SAAA,EAAW;AAE7C,MAAA,MAAM,OAAQ,IAAA,CAAK,GAAA,CAAY,MAAA,CAAO,GAAA,CAAI,OAAO,UAAU,CAAA;AAC3D,MAAA,IAAI,CAAC,IAAA,EAAM;AACX,MAAA,IAAI,KAAK,QAAA,EAAS,KAAM,IAAA,CAAK,YAAA,CAAa,cAAc,OAAA,EAAS;AACjE,MAAA,MAAM,WAAA,GAAc,KAAK,WAAA,EAAY;AACrC,MAAA,MAAM,QAAA,GAAW,KAAK,QAAA,EAAS;AAC/B,MAAA,OAAA,CAAQ,IAAA,CAAK;AAAA,QACX,MAAA;AAAA,QACA,KAAK,EAAE,CAAA,EAAG,YAAY,CAAA,EAAG,CAAA,EAAG,YAAY,CAAA,EAAE;AAAA,QAC1C;AAAA,OACD,CAAA;AAAA,IACH;AACA,IAAA,OAAO,OAAA;AAAA,EACT;AAAA;AAAA,EAGA,qBAAqB,MAAA,EAAmC;AACtD,IAAA,KAAA,MAAW,MAAA,IAAU,IAAA,CAAK,SAAA,CAAU,IAAA,EAAK,EAAG;AAC1C,MAAA,IAAI,CAAC,MAAA,CAAO,GAAA,CAAI,MAAM,CAAA,EAAG,IAAA,CAAK,aAAa,MAAM,CAAA;AAAA,IACnD;AAAA,EACF;AAAA,EAEA,aAAa,MAAA,EAAsB;AACjC,IAAA,MAAM,MAAA,GAAS,IAAA,CAAK,SAAA,CAAU,GAAA,CAAI,MAAM,CAAA;AACxC,IAAA,IAAI,CAAC,MAAA,EAAQ;AACb,IAAA,MAAM,QAAA,GAAW,CAAC,GAAI,IAAA,CAAK,eAAe,GAAA,CAAI,MAAM,CAAA,IAAK,EAAG,CAAA;AAC5D,IAAA,KAAA,MAAW,SAAS,QAAA,EAAU;AAC5B,MAAA,IAAI,IAAA,CAAK,mBAAA,CAAoB,MAAA,EAAQ,KAAK,CAAA,EAAG;AAC3C,QAAA,IAAA,CAAK,kBAAA,CAAmB,EAAE,IAAA,EAAM,SAAA,EAAW,SAAS,MAAA,EAAQ,OAAA,EAAS,OAAO,CAAA;AAAA,MAC9E;AAAA,IACF;AACA,IAAA,IAAA,CAAK,oBAAoB,MAAM,CAAA;AAE/B,IAAC,IAAA,CAAK,IAAY,eAAA,CAAgB;AAAA,MAChC,QAAQ,MAAA,CAAO;AAAA,KACK,CAAA;AACtB,IAAA,IAAA,CAAK,SAAA,CAAU,OAAO,MAAM,CAAA;AAC5B,IAAA,IAAA,CAAK,cAAA,CAAe,OAAO,MAAM,CAAA;AAAA,EACnC;AACF;AAEO,SAAS,2BAA2B,MAAA,EAA8C;AACvF,EAAA,OAAO,IAAI,qBAAqB,MAAM,CAAA;AACxC;AASA,SAAS,iBAAA,CAAkB,CAAA,EAAU,MAAA,EAAsB,SAAA,EAA8B;AACvF,EAAA,MAAM,MAAA,GAAS,CAAA,CAAE,GAAA,CAAI,MAAA,EAAQ,SAAS,CAAA;AACtC,EAAA,IAAI,CAAC,MAAA,CAAO,EAAA,EAAI,OAAO,CAAA;AACvB,EAAA,MAAM,GAAA,GAAO,OAAO,KAAA,CAAiD,GAAA;AACrE,EAAA,OAAO,GAAA,GAAM,CAAC,CAAA,IAAK,CAAA;AACrB;AAEA,SAAS,oBAAA,CAAqB,OAAiC,IAAA,EAAuB;AACpF,EAAA,IAAI,CAAC,OAAO,OAAO,KAAA;AACnB,EAAA,OACE,KAAA,CAAM,IAAI,CAAA,KAAM,CAAA,IAChB,KAAA,CAAM,IAAA,GAAO,CAAC,CAAA,KAAM,CAAA,IACpB,KAAA,CAAM,IAAA,GAAO,EAAE,CAAA,KAAM,CAAA,IACrB,KAAA,CAAM,IAAA,GAAO,EAAE,CAAA,KAAM,CAAA,IACrB,KAAA,CAAM,IAAA,GAAO,CAAC,CAAA,KAAM,CAAA,IACpB,KAAA,CAAM,IAAA,GAAO,CAAC,CAAA,KAAM,KACpB,KAAA,CAAM,IAAA,GAAO,CAAC,CAAA,KAAM,CAAA,IACpB,KAAA,CAAM,IAAA,GAAO,CAAC,CAAA,KAAM,CAAA,IACpB,KAAA,CAAM,IAAA,GAAO,CAAC,CAAA,KAAM,CAAA,IACpB,KAAA,CAAM,IAAA,GAAO,CAAC,CAAA,KAAM,CAAA,IACpB,KAAA,CAAM,IAAA,GAAO,EAAE,CAAA,KAAM,CAAA,IACrB,KAAA,CAAM,IAAA,GAAO,EAAE,CAAA,KAAM,CAAA,IACrB,KAAA,CAAM,IAAA,GAAO,EAAE,CAAA,KAAM,CAAA;AAEzB;AAGA,IAAM,cAAA,GAAiB,GAAA;AACvB,IAAM,qBAAA,GAAwB,KAAK,MAAA,EAAO;AAC1C,IAAM,qBAAA,GAAwB,KAAK,MAAA,EAAO;AAC1C,IAAM,kBAAA,GAAqB,KAAK,MAAA,EAAO;AACvC,IAAM,kBAAA,GAAqB,IAAI,YAAA,CAAa,EAAE,CAAA;AAqB9C,IAAM,uBAAA,GAA0B,sBAAA;AAChC,IAAM,0BAAA,GAA6B,yBAAA;AACnC,IAAM,oBAAA,GAAuB,oBAAA;AAC7B,IAAM,yBAAA,GAA4B,wBAAA;AASlC,SAAS,iBAAiB,KAAA,EAAqC;AAC7D,EAAA,OAAO,KAAA,CAAM,UAAA,CAAW,OAAA,CAAQ,WAAW,CAAA;AAC7C;AAYO,IAAM,uBAAkD,YAAA,CAAa;AAAA,EAC1E,IAAA,EAAM,uBAAA;AAAA,EACN,SAAS,EAAC;AAAA,EACV,KAAA,EAAO,CAAC,0BAA0B,CAAA;AAAA,EAClC,EAAA,EAAI,CAAC,KAAA,KAAU;AACb,IAAA,MAAM,kBAAA,GAAqB,iBAAiB,KAAK,CAAA;AACjD,IAAA,MAAM,wBAAA,GAA2B,KAAA,CAAM,UAAA,CAAW,OAAA,CAAQ,iBAAiB,CAAA;AAC3E,IAAA,IAAI,kBAAA,KAAuB,MAAA,IAAa,wBAAA,KAA6B,MAAA,EAAW;AAChF,IAAA,IAAI,EAAA;AACJ,IAAA,IAAI;AACF,MAAA,EAAA,GAAK,KAAA,CAAM,YAAkC,cAAc,CAAA;AAAA,IAC7D,CAAA,CAAA,MAAQ;AACN,MAAA;AAAA,IACF;AAEA,IAAA,EAAA,CAAG,qBAAA,EAAsB;AAEzB,IAAA,MAAM,WAAA,GAAc,MAAM,KAAA,CAAM;AAAA,MAC9B,IAAA,EAAM,CAAC,QAAA,EAAU,kBAAA,EAAoB,wBAAwB,CAAA;AAAA,MAC7D,QAAA,EAAU,CAAC,SAAA,EAAW,mBAAmB;AAAA,KAC1C,CAAA;AACD,IAAA,IAAI,CAAC,YAAY,EAAA,EAAI;AAErB,IAAA,MAAM,cAAA,uBAAqB,GAAA,EAAY;AACvC,IAAA,KAAA,MAAW,QAAA,IAAY,YAAY,KAAA,EAAO;AACxC,MAAA,MAAM,OAAA,GAAU,QAAA;AAKhB,MAAA,MAAM,YAAA,GAAe,OAAA,CAAQ,GAAA,CAAI,QAAQ,CAAA;AAYzC,MAAA,MAAM,aAAA,GAAgB,OAAA,CAAQ,GAAA,CAAI,kBAAkB,CAAA;AAKpD,MAAA,MAAM,mBAAA,GAAsB,OAAA,CAAQ,GAAA,CAAI,wBAAwB,CAAA;AAGhE,MAAA,MAAM,aAAA,GAAgB,QAAQ,GAAA,CAAI,SAAS,IACtC,OAAA,CAAQ,GAAA,CAAI,SAAS,CAAA,GAQtB,MAAA;AACJ,MAAA,MAAM,sBAAA,GAAyB,OAAA,CAAQ,GAAA,CAAI,mBAAmB,CAAA;AAC9D,MAAA,MAAM,MAAA,GACJ,kBAAkB,MAAA,GAAY,MAAA,GAAY,IAAI,YAAA,CAAa,CAAC,aAAA,CAAc,IAAI,CAAC,CAAA;AACjF,MAAA,MAAM,MAAA,GACJ,kBAAkB,MAAA,GAAY,MAAA,GAAY,IAAI,YAAA,CAAa,CAAC,aAAA,CAAc,IAAI,CAAC,CAAA;AACjF,MAAA,MAAM,SAAA,GACJ,kBAAkB,MAAA,GAAY,MAAA,GAAY,IAAI,YAAA,CAAa,CAAC,aAAA,CAAc,aAAa,CAAC,CAAA;AAC1F,MAAA,MAAM,SAAA,GACJ,kBAAkB,MAAA,GAAY,MAAA,GAAY,IAAI,YAAA,CAAa,CAAC,aAAA,CAAc,cAAc,CAAC,CAAA;AAC3F,MAAA,MAAM,WAAA,GACJ,kBAAkB,MAAA,GAAY,MAAA,GAAY,IAAI,YAAA,CAAa,CAAC,aAAA,CAAc,YAAY,CAAC,CAAA;AACzF,MAAA,MAAM,KAAA,GACJ,kBAAkB,MAAA,GAAY,MAAA,GAAY,IAAI,WAAA,CAAY,CAAC,aAAA,CAAc,UAAU,CAAC,CAAA;AACtF,MAAA,MAAM,SAAS,IAAI,WAAA,CAAY,CAAC,YAAA,CAAa,KAAK,CAAC,CAAA;AACnD,MAAA,MAAM,eAAe,YAAA,CAAa,WAAA;AAClC,MAAA,MAAM,UAAU,IAAI,YAAA,CAAa,CAAC,YAAA,CAAa,MAAM,CAAC,CAAA;AACtD,MAAA,MAAM,SAAS,IAAI,YAAA,CAAa,CAAC,YAAA,CAAa,UAAU,CAAC,CAAA;AACzD,MAAA,MAAM,QAAQ,IAAI,YAAA,CAAa,CAAC,YAAA,CAAa,QAAQ,CAAC,CAAA;AACtD,MAAA,MAAM,QAAQ,IAAI,YAAA,CAAa,CAAC,YAAA,CAAa,WAAW,CAAC,CAAA;AACzD,MAAA,MAAM,QAAQ,IAAI,YAAA,CAAa,CAAC,YAAA,CAAa,OAAO,CAAC,CAAA;AACrD,MAAA,MAAM,UAAU,IAAI,WAAA,CAAY,CAAC,YAAA,CAAa,QAAQ,CAAC,CAAA;AACvD,MAAA,MAAM,WAAW,IAAI,WAAA,CAAY,CAAC,YAAA,CAAa,eAAe,CAAC,CAAA;AAC/D,MAAA,MAAM,WAAW,IAAI,WAAA,CAAY,CAAC,YAAA,CAAa,YAAY,CAAC,CAAA;AAC5D,MAAA,MAAM,QAAQ,aAAA,CAAc,GAAA;AAC5B,MAAA,MAAM,SAAS,aAAA,CAAc,IAAA;AAC7B,MAAA,MAAM,UAAU,aAAA,CAAc,KAAA;AAC9B,MAAA,MAAM,UAAU,mBAAA,CAAoB,KAAA;AAMpC,MAAA,IACE,CAAC,MAAA,IACD,CAAC,YAAA,IACD,CAAC,WACD,CAAC,MAAA,IACD,CAAC,KAAA,IACD,CAAC,KAAA,IACD,CAAC,KAAA,IACD,CAAC,OAAA,IACD,CAAC,QAAA,IACD,CAAC,QAAA,IACD,CAAC,KAAA,IACD,CAAC,MAAA,IACD,CAAC,OAAA,EACD;AACA,QAAA;AAAA,MACF;AAEA,MAAA;AACE,QAAA,MAAM,GAAA,GAAM,CAAA;AACZ,QAAA,MAAM,SAAS,OAAA,CAAQ,MAAA;AACvB,QAAA,cAAA,CAAe,IAAI,MAAM,CAAA;AAEzB,QAAA,MAAM,YAAY,GAAA,GAAM,CAAA;AACxB,QAAA,MAAM,WAAW,GAAA,GAAM,CAAA;AACvB,QAAA,MAAM,YAAY,GAAA,GAAM,EAAA;AACxB,QAAA,MAAM,YAAA,GAAe,oBAAA,CAAqB,OAAA,EAAS,SAAS,CAAA;AAC5D,QAAA,IAAI,gBAAgB,OAAA,EAAS;AAC3B,UAAA,KAAA,IAAS,IAAA,GAAO,CAAA,EAAG,IAAA,GAAO,EAAA,EAAI,IAAA,EAAA,EAAQ;AACpC,YAAA,kBAAA,CAAmB,IAAI,CAAA,GAAI,OAAA,CAAQ,SAAA,GAAY,IAAI,CAAA,IAAK,CAAA;AAAA,UAC1D;AACA,UAAA,IAAA,CAAK,SAAA;AAAA,YACH,qBAAA;AAAA,YACA,qBAAA;AAAA,YACA,kBAAA;AAAA,YACA;AAAA,WACF;AAAA,QACF,CAAA,MAAO;AACL,UAAA,qBAAA,CAAsB,CAAC,CAAA,GAAI,KAAA,CAAM,SAAS,CAAA,IAAK,CAAA;AAC/C,UAAA,qBAAA,CAAsB,CAAC,CAAA,GAAI,KAAA,CAAM,SAAA,GAAY,CAAC,CAAA,IAAK,CAAA;AACnD,UAAA,qBAAA,CAAsB,CAAC,CAAA,GAAI,KAAA,CAAM,SAAA,GAAY,CAAC,CAAA,IAAK,CAAA;AACnD,UAAA,qBAAA,CAAsB,CAAC,CAAA,GAAI,MAAA,CAAO,QAAQ,CAAA,IAAK,CAAA;AAC/C,UAAA,qBAAA,CAAsB,CAAC,CAAA,GAAI,MAAA,CAAO,QAAA,GAAW,CAAC,CAAA,IAAK,CAAA;AACnD,UAAA,qBAAA,CAAsB,CAAC,CAAA,GAAI,MAAA,CAAO,QAAA,GAAW,CAAC,CAAA,IAAK,CAAA;AACnD,UAAA,qBAAA,CAAsB,CAAC,CAAA,GAAI,MAAA,CAAO,QAAA,GAAW,CAAC,CAAA,IAAK,CAAA;AACnD,UAAA,kBAAA,CAAmB,CAAC,CAAA,GAAI,OAAA,CAAQ,SAAS,CAAA,IAAK,CAAA;AAC9C,UAAA,kBAAA,CAAmB,CAAC,CAAA,GAAI,OAAA,CAAQ,SAAA,GAAY,CAAC,CAAA,IAAK,CAAA;AAClD,UAAA,kBAAA,CAAmB,CAAC,CAAA,GAAI,OAAA,CAAQ,SAAA,GAAY,CAAC,CAAA,IAAK,CAAA;AAAA,QACpD;AACA,QAAA,MAAM,SAAA,GAAgC;AAAA,UACpC,QAAA,EAAU,EAAE,CAAA,EAAG,qBAAA,CAAsB,CAAC,CAAA,IAAK,CAAA,EAAG,CAAA,EAAG,qBAAA,CAAsB,CAAC,CAAA,IAAK,CAAA,EAAE;AAAA,UAC/E,QAAA,EAAU,CAAA,GAAI,IAAA,CAAK,KAAA,CAAM,qBAAA,CAAsB,CAAC,CAAA,IAAK,CAAA,EAAG,qBAAA,CAAsB,CAAC,CAAA,IAAK,CAAC,CAAA;AAAA,UACrF,KAAA,EAAO,EAAE,CAAA,EAAG,kBAAA,CAAmB,CAAC,CAAA,IAAK,CAAA,EAAG,CAAA,EAAG,kBAAA,CAAmB,CAAC,CAAA,IAAK,CAAA;AAAE,SACxE;AAMA,QAAA,MAAM,YAOF,MAAA,GACA;AAAA,UACE,IAAA,EAAM,OAAO,GAAG,CAAA;AAAA,UAChB,IAAA,EAAO,MAAA,GAAS,GAAG,CAAA,IAAK,CAAA;AAAA,UACxB,aAAA,EAAgB,SAAA,GAAY,GAAG,CAAA,IAAK,CAAA;AAAA,UACpC,cAAA,EAAiB,SAAA,GAAY,GAAG,CAAA,IAAK,CAAA;AAAA,UACrC,YAAA,EAAe,WAAA,GAAc,GAAG,CAAA,IAAK,CAAA;AAAA,UACrC,UAAA,EAAa,KAAA,GAAQ,GAAG,CAAA,IAAK;AAAA,SAC/B,GACA;AAAA,UACE,IAAA,EAAM,sBAAA;AAAA,UACN,IAAA,EAAM,CAAA;AAAA,UACN,aAAA,EAAe,CAAA;AAAA,UACf,cAAA,EAAgB,CAAA;AAAA,UAChB,YAAA,EAAc,CAAA;AAAA,UACd,UAAA,EAAY;AAAA,SACd;AAEJ,QAAA,MAAM,QAAA,GAWF;AAAA,UACF,KAAA,EAAO,OAAO,GAAG,CAAA;AAAA,UACjB,WAAA,EAAa;AAAA,YACX,YAAA,CAAa,MAAM,CAAC,CAAA;AAAA,YACpB,YAAA,CAAa,GAAA,GAAM,CAAA,GAAI,CAAC,CAAA;AAAA,YACxB,YAAA,CAAa,GAAA,GAAM,CAAA,GAAI,CAAC;AAAA,WAC1B;AAAA,UACA,MAAA,EAAQ,QAAQ,GAAG,CAAA;AAAA,UACnB,UAAA,EAAY,OAAO,GAAG,CAAA;AAAA,UACtB,QAAA,EAAU,MAAM,GAAG,CAAA;AAAA,UACnB,WAAA,EAAa,MAAM,GAAG,CAAA;AAAA,UACtB,OAAA,EAAS,MAAM,GAAG,CAAA;AAAA,UAClB,QAAA,EAAU,QAAQ,GAAG,CAAA;AAAA,UACrB,eAAA,EAAiB,SAAS,GAAG,CAAA;AAAA,UAC7B,YAAA,EAAc,SAAS,GAAG;AAAA,SAC5B;AAEA,QAAA,EAAA,CAAG,UAAA,CAAW,MAAA,EAAQ,SAAA,EAAW,SAAA,EAAW,QAAQ,CAAA;AAEpD,QAAA,MAAM,SAAA,GAAY,oBAAA,CAAqB,SAAA,CAAU,IAAI,CAAA;AACrD,QAAA,IAAI,cAAc,QAAA,EAAU;AAC1B,UAAA,EAAA,CAAG,gBAAA,CAAiB,MAAA,EAAQ,SAAA,EAAW,QAAA,EAAU,QAAQ,CAAA;AAAA,QAC3D,CAAA,MAAA,IAAW,SAAA,KAAc,WAAA,IAAe,CAAC,sBAAA,EAAwB;AAC/D,UAAA,EAAA,CAAG,gBAAA,CAAiB,MAAA,EAAQ,SAAA,EAAW,QAAA,EAAU,WAAW,CAAA;AAAA,QAC9D;AAAA,MACF;AAAA,IACF;AACA,IAAA,EAAA,CAAG,qBAAqB,cAAc,CAAA;AAAA,EACxC;AACF,CAAC;AAOM,IAAM,0BAAqD,YAAA,CAAa;AAAA,EAC7E,IAAA,EAAM,0BAAA;AAAA,EACN,SAAS,EAAC;AAAA,EACV,KAAA,EAAO,CAAC,uBAAuB,CAAA;AAAA,EAC/B,EAAA,EAAI,CAAC,KAAA,KAAU;AACb,IAAA,IAAI,EAAA;AACJ,IAAA,IAAI;AACF,MAAA,EAAA,GAAK,KAAA,CAAM,YAAkC,cAAc,CAAA;AAAA,IAC7D,CAAA,CAAA,MAAQ;AACN,MAAA;AAAA,IACF;AAEA,IAAA,MAAM,EAAA,GAAK,KAAA,CAAM,WAAA,CAAY,SAAS,CAAA,CAAE,KAAA;AACxC,IAAA,IAAI,EAAA,IAAM,CAAA,IAAK,EAAA,GAAK,cAAA,EAAgB;AAEpC,IAAA,EAAA,CAAG,KAAK,EAAE,CAAA;AAAA,EACZ;AACF,CAAC;AASM,IAAM,qBAAgD,YAAA,CAAa;AAAA,EACxE,IAAA,EAAM,oBAAA;AAAA,EACN,SAAS,EAAC;AAAA,EACV,KAAA,EAAO,CAAC,0BAA0B,CAAA;AAAA,EAClC,EAAA,EAAI,CAAC,KAAA,KAAU;AACb,IAAA,MAAM,kBAAA,GAAqB,iBAAiB,KAAK,CAAA;AACjD,IAAA,IAAI,uBAAuB,MAAA,EAAW;AACtC,IAAA,IAAI,EAAA;AACJ,IAAA,IAAI;AACF,MAAA,EAAA,GAAK,KAAA,CAAM,YAAkC,cAAc,CAAA;AAAA,IAC7D,CAAA,CAAA,MAAQ;AACN,MAAA;AAAA,IACF;AAEA,IAAA,MAAM,OAAA,GAAU,GAAG,sBAAA,EAAuB;AAC1C,IAAA,KAAA,MAAW,KAAK,OAAA,EAAS;AACvB,MAAA,MAAM,SAAS,CAAA,CAAE,MAAA;AAEjB,MAAA,MAAM,OAAA,GAAU,KAAK,MAAA,EAAO;AAE5B,MAAA,IAAA,CAAK,aAAA,CAAc,SAAS,CAAC,CAAA,EAAG,GAAG,CAAC,CAAA,EAAsB,EAAE,QAAQ,CAAA;AACpE,MAAA,KAAA,CAAM,GAAA,CAAI,QAAQ,kBAAA,EAAoB;AAAA,QACpC,GAAA,EAAK,CAAC,CAAA,CAAE,GAAA,CAAI,CAAA,EAAG,CAAA,CAAE,GAAA,CAAI,CAAA,EAAG,iBAAA,CAAkB,KAAA,EAAO,MAAA,EAAQ,kBAAkB,CAAC,CAAA;AAAA;AAAA;AAAA,QAG5E,MAAM,CAAC,OAAA,CAAQ,CAAC,CAAA,IAAK,GAAG,OAAA,CAAQ,CAAC,CAAA,IAAK,CAAA,EAAG,QAAQ,CAAC,CAAA,IAAK,GAAG,OAAA,CAAQ,CAAC,KAAK,CAAC;AAAA,OAC1E,CAAA;AAAA,IACH;AAAA,EACF;AACF,CAAC;AAEM,IAAM,yBAAoD,YAAA,CAAa;AAAA,EAC5E,IAAA,EAAM,yBAAA;AAAA,EACN,SAAS,EAAC;AAAA,EACV,KAAA,EAAO,CAAC,oBAAoB,CAAA;AAAA,EAC5B,EAAA,EAAI,CAAC,KAAA,KAAU;AACb,IAAA,IAAI,EAAA;AACJ,IAAA,IAAI;AACF,MAAA,EAAA,GAAK,KAAA,CAAM,YAAkC,cAAc,CAAA;AAAA,IAC7D,CAAA,CAAA,MAAQ;AACN,MAAA;AAAA,IACF;AACA,IAAA,EAAA,CAAG,2BAA2B,KAAK,CAAA;AAAA,EACrC;AACF,CAAC;AAiBM,SAAS,yBAAyB,KAAA,EAA0B;AACjE,EAAA,MAAM,iBAAA,GAAoB,0BAA0B,KAAK,CAAA;AAKzD,EAAA,MAAM,kBAAA,GAAqB,iBAAiB,KAAK,CAAA;AACjD,EAAA,IAAI;AACF,IAAA,MAAM,EAAA,GAAK,KAAA,CAAM,WAAA,CAAkC,cAAc,CAAA;AACjE,IAAA,IAAI,uBAAuB,KAAA,CAAA,EAAW;AACpC,MAAA,EAAA,CAAG,cAAA,CAAe,KAAA,EAAO,kBAAA,EAAoB,mBAAmB,CAAA;AAAA,IAClE;AAAA,EACF,CAAA,CAAA,MAAQ;AAAA,EAGR;AAEA,EAAA,KAAA,CACG,UAAA,CAAW,aAAa,UAAA,EAAY;AAAA,IACnC,oBAAA;AAAA,IACA,uBAAA;AAAA,IACA,kBAAA;AAAA,IACA;AAAA,GACD,EACA,MAAA,EAAO;AACV,EAAA,OAAO,MAAM;AACX,IAAA,KAAA,CAAM,YAAA,CAAa,aAAa,yBAAyB,CAAA;AACzD,IAAA,KAAA,CAAM,YAAA,CAAa,aAAa,oBAAoB,CAAA;AACpD,IAAA,KAAA,CAAM,YAAA,CAAa,aAAa,0BAA0B,CAAA;AAC1D,IAAA,KAAA,CAAM,YAAA,CAAa,aAAa,uBAAuB,CAAA;AACvD,IAAA,iBAAA,EAAkB;AAAA,EACpB,CAAA;AACF;ACrrCA,IAAI,cAAA,GAAwC,IAAA;AAC5C,IAAI,cAAA,GAAgE,IAAA;AAEpE,eAAsB,YAAA,GAAuD;AAC3E,EAAA,IAAI,cAAA,KAAmB,MAAM,OAAO,cAAA;AACpC,EAAA,IAAI,cAAA,KAAmB,MAAM,OAAO,cAAA;AAEpC,EAAA,cAAA,GAAiB,OAAA,EAAQ;AACzB,EAAA,OAAO,cAAA;AACT;AAEA,eAAe,OAAA,GAAkD;AAC/D,EAAA,IAAI;AACF,IAAA,MAAM,MAAA,GAAS,MAAM,OAAO,2BAA2B,CAAA;AACvD,IAAA,MAAM,MAAA,CAAO,QAAQ,IAAA,EAAK;AAC1B,IAAA,cAAA,GAAiB,MAAA,CAAO,OAAA;AACxB,IAAA,cAAA,GAAiB,IAAA;AACjB,IAAA,OAAO,MAAA,CAAO,OAAA;AAAA,EAChB,SAAS,KAAA,EAAO;AACd,IAAA,MAAM,SAAS,KAAA,YAAiB,KAAA,GAAQ,KAAA,CAAM,OAAA,GAAU,OAAO,KAAK,CAAA;AACpE,IAAA,cAAA,GAAiB,IAAA;AACjB,IAAA,OAAO,IAAIA,cAAAA,CAAa;AAAA,MACtB,IAAA,EAAM,kBAAA;AAAA,MACN,QAAA,EAAU,iEAAA;AAAA,MACV,IAAA,EAAM,oCAAoC,MAAM,CAAA,4EAAA,CAAA;AAAA,MAChD,MAAA,EAAQ,EAAE,IAAA,EAAM,kBAAA,EAAoB,MAAA;AAAO,KAC5C,CAAA;AAAA,EACH;AACF","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.21",
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.21",
27
- "@forgeax/engine-math": "0.1.21",
28
- "@forgeax/engine-physics": "0.1.21",
29
- "@forgeax/engine-types": "0.1.21"
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.21"
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
- if (transformComponent === undefined) return;
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
- world?: Float32Array;
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 = transformData.world;
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"}